From 14d31417deaf715d5344fb48c812b5858dcfdd7c Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 27 Jan 2022 12:02:08 -0500 Subject: [PATCH 001/194] Revert "Revert "DEV: Run Ember CLI tests in random order" (#15717)" The worst of the flaky tests should be fixed now, so let's re-enable this. --- .github/workflows/tests.yml | 6 +++--- .../javascripts/discourse/tests/test-boot-ember-cli.js | 7 +++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cdd8fbe047..5625e71c9e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -232,15 +232,15 @@ jobs: - name: Core QUnit 1 working-directory: ./app/assets/javascripts/discourse - run: sudo -E -u discourse -H yarn ember exam --path /tmp/emberbuild --split=3 --partition=1 --launch "${{ matrix.browser }}" + run: sudo -E -u discourse -H yarn ember exam --path /tmp/emberbuild --split=3 --partition=1 --launch "${{ matrix.browser }}" --random timeout-minutes: 20 - name: Core QUnit 2 working-directory: ./app/assets/javascripts/discourse - run: sudo -E -u discourse -H yarn ember exam --path /tmp/emberbuild --split=3 --partition=2 --launch "${{ matrix.browser }}" + run: sudo -E -u discourse -H yarn ember exam --path /tmp/emberbuild --split=3 --partition=2 --launch "${{ matrix.browser }}" --random timeout-minutes: 20 - name: Core QUnit 3 working-directory: ./app/assets/javascripts/discourse - run: sudo -E -u discourse -H yarn ember exam --path /tmp/emberbuild --split=3 --partition=3 --launch "${{ matrix.browser }}" + run: sudo -E -u discourse -H yarn ember exam --path /tmp/emberbuild --split=3 --partition=3 --launch "${{ matrix.browser }}" --random timeout-minutes: 20 diff --git a/app/assets/javascripts/discourse/tests/test-boot-ember-cli.js b/app/assets/javascripts/discourse/tests/test-boot-ember-cli.js index e58bc312aa..58d25ada54 100644 --- a/app/assets/javascripts/discourse/tests/test-boot-ember-cli.js +++ b/app/assets/javascripts/discourse/tests/test-boot-ember-cli.js @@ -34,6 +34,13 @@ document.addEventListener("discourse-booted", () => { setup(QUnit.assert); setupTests(config.APP); let loader = loadEmberExam(); + + if (loader.urlParams.size === 0 && !QUnit.config.seed) { + // If we're running in browser, default to random order. Otherwise, let Ember Exam + // handle randomization. + QUnit.config.seed = true; + } + loader.loadModules(); start({ setupTestContainer: false, From 23d7fcf9a19b6484169e3d72fbe47d10dc640336 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 27 Jan 2022 11:07:22 -0500 Subject: [PATCH 002/194] FIX: remove duplicated word from client strings --- config/locales/client.en.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 2547c435d2..cbb3e1eda5 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -3359,7 +3359,7 @@ en: default_list_filter: "Default List Filter:" allow_badges_label: "Allow badges to be awarded in this category" edit_permissions: "Edit Permissions" - reviewable_by_group: "In addition to staff, content in this category can be also be reviewed by:" + reviewable_by_group: "In addition to staff, content in this category can also be reviewed by:" review_group_name: "group name" require_topic_approval: "Require moderator approval of all new topics" require_reply_approval: "Require moderator approval of all new replies" From 33506575533c269b2121f018d535b210a153d122 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 27 Jan 2022 15:53:53 -0500 Subject: [PATCH 003/194] DEV: Clean up HTML state between tests A bunch of tests were leaving leftovers in the DOM like class names, custom styles and scroll positions. This ensures they are cleared between tests. --- .../javascripts/discourse/tests/setup-tests.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/tests/setup-tests.js b/app/assets/javascripts/discourse/tests/setup-tests.js index 05702fe849..ee378e1ceb 100644 --- a/app/assets/javascripts/discourse/tests/setup-tests.js +++ b/app/assets/javascripts/discourse/tests/setup-tests.js @@ -342,8 +342,20 @@ function setupTestsCommon(application, container, config) { resetPretender(); clearPresenceState(); - // Destroy any modals - $(".modal-backdrop").remove(); + // Clean up the DOM. Some tests might leave extra classes or elements behind. + Array.from(document.getElementsByClassName("modal-backdrop")).forEach((e) => + e.remove() + ); + document.body.removeAttribute("class"); + let html = document.getElementsByTagName("html")[0]; + html.removeAttribute("class"); + html.removeAttribute("style"); + let testing = document.getElementById("ember-testing"); + testing.removeAttribute("class"); + testing.removeAttribute("style"); + let testContainer = document.getElementById("ember-testing-container"); + testContainer.scrollTop = 0; + flushMap(); MessageBus.unsubscribe("*"); From 5c694e62ba01a719dbffcdcbcc39bde27123d94f Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Thu, 27 Jan 2022 16:21:15 -0500 Subject: [PATCH 004/194] Update app/assets/javascripts/discourse/tests/setup-tests.js Co-authored-by: Jarek Radosz --- app/assets/javascripts/discourse/tests/setup-tests.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/tests/setup-tests.js b/app/assets/javascripts/discourse/tests/setup-tests.js index ee378e1ceb..79715c3cb6 100644 --- a/app/assets/javascripts/discourse/tests/setup-tests.js +++ b/app/assets/javascripts/discourse/tests/setup-tests.js @@ -347,7 +347,7 @@ function setupTestsCommon(application, container, config) { e.remove() ); document.body.removeAttribute("class"); - let html = document.getElementsByTagName("html")[0]; + let html = document.documentElement; html.removeAttribute("class"); html.removeAttribute("style"); let testing = document.getElementById("ember-testing"); From 68fe6903f7a26fcc96e3d2534e2021abcbf0c2fb Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Fri, 28 Jan 2022 10:21:59 +1000 Subject: [PATCH 005/194] DEV: Remove jQuery UI vendor dependencies (#15700) We no longer use jQuery UI for anything since getting rid of jQuery file uploader in 667a8a63b3b82f3d565f94d254347dfd13da7efa, so we can safely remove these now. --- .../javascripts/discourse/ember-cli-build.js | 1 - app/assets/javascripts/vendor-common.js | 2 - app/assets/javascripts/wizard-vendor.js | 1 - vendor/assets/javascripts/jquery.sortable.js | 85 -- vendor/assets/javascripts/jquery.ui.widget.js | 808 ------------------ 5 files changed, 897 deletions(-) delete mode 100644 vendor/assets/javascripts/jquery.sortable.js delete mode 100644 vendor/assets/javascripts/jquery.ui.widget.js diff --git a/app/assets/javascripts/discourse/ember-cli-build.js b/app/assets/javascripts/discourse/ember-cli-build.js index 39387cf7b0..64c4055808 100644 --- a/app/assets/javascripts/discourse/ember-cli-build.js +++ b/app/assets/javascripts/discourse/ember-cli-build.js @@ -104,7 +104,6 @@ module.exports = function (defaults) { // For example: our very specific version of bootstrap-modal. app.import(vendorJs + "bootbox.js"); app.import(vendorJs + "bootstrap-modal.js"); - app.import(vendorJs + "jquery.ui.widget.js"); app.import(vendorJs + "caret_position.js"); app.import("node_modules/ember-source/dist/ember-template-compiler.js", { type: "test", diff --git a/app/assets/javascripts/vendor-common.js b/app/assets/javascripts/vendor-common.js index 9ce43717d4..c4ea04921b 100644 --- a/app/assets/javascripts/vendor-common.js +++ b/app/assets/javascripts/vendor-common.js @@ -3,13 +3,11 @@ //= require template_include.js //= require message-bus -//= require jquery.ui.widget.js //= require Markdown.Converter.js //= require bootbox.js //= require popper.js //= require bootstrap-modal.js //= require caret_position -//= require jquery.sortable.js //= require lodash.js //= require itsatrap.js //= require rsvp.js diff --git a/app/assets/javascripts/wizard-vendor.js b/app/assets/javascripts/wizard-vendor.js index 0a72163b2c..fae10ff315 100644 --- a/app/assets/javascripts/wizard-vendor.js +++ b/app/assets/javascripts/wizard-vendor.js @@ -1,6 +1,5 @@ //= require ember_jquery //= require template_include.js -//= require jquery.ui.widget.js //= require uppy.js //= require bootstrap-modal.js //= require bootbox.js diff --git a/vendor/assets/javascripts/jquery.sortable.js b/vendor/assets/javascripts/jquery.sortable.js deleted file mode 100644 index 350d172efa..0000000000 --- a/vendor/assets/javascripts/jquery.sortable.js +++ /dev/null @@ -1,85 +0,0 @@ -/* - * HTML5 Sortable jQuery Plugin - * http://farhadi.ir/projects/html5sortable - * - * Copyright 2012, Ali Farhadi - * Released under the MIT license. - */ -(function($) { -var dragging, placeholders = $(); -$.fn.sortable = function(options) { - var method = String(options); - options = $.extend({ - connectWith: false - }, options); - return this.each(function() { - if (/^enable|disable|destroy$/.test(method)) { - var items = $(this).children($(this).data('items')).attr('draggable', method == 'enable'); - if (method == 'destroy') { - items.add(this).removeData('connectWith items') - .off('dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s'); - } - return; - } - var isHandle, index, items = $(this).children(options.items); - var placeholder = $('<' + (/^ul|ol$/i.test(this.tagName) ? 'li' : 'div') + ' class="sortable-placeholder">'); - items.find(options.handle).mousedown(function() { - isHandle = true; - }).mouseup(function() { - isHandle = false; - }); - $(this).data('items', options.items) - placeholders = placeholders.add(placeholder); - if (options.connectWith) { - $(options.connectWith).add(this).data('connectWith', options.connectWith); - } - items.attr('draggable', 'true').on('dragstart.h5s', function(e) { - if (options.handle && !isHandle) { - return false; - } - isHandle = false; - var dt = e.originalEvent.dataTransfer; - dt.effectAllowed = 'move'; - dt.setData('Text', 'dummy'); - index = (dragging = $(this)).addClass('sortable-dragging').index(); - }).on('dragend.h5s', function() { - if (!dragging) { - return; - } - dragging.removeClass('sortable-dragging').show(); - placeholders.detach(); - if (index != dragging.index()) { - dragging.parent().trigger('sortupdate', {item: dragging}); - } - dragging = null; - }).not('a[href], img').on('selectstart.h5s', function() { - this.dragDrop && this.dragDrop(); - return false; - }).end().add([this, placeholder]).on('dragover.h5s dragenter.h5s drop.h5s', function(e) { - if (!items.is(dragging) && options.connectWith !== $(dragging).parent().data('connectWith')) { - return true; - } - if (e.type == 'drop') { - e.stopPropagation(); - placeholders.filter(':visible').after(dragging); - dragging.trigger('dragend.h5s'); - return false; - } - e.preventDefault(); - e.originalEvent.dataTransfer.dropEffect = 'move'; - if (items.is(this)) { - if (options.forcePlaceholderSize) { - placeholder.height(dragging.outerHeight()); - } - dragging.hide(); - $(this)[placeholder.index() < $(this).index() ? 'after' : 'before'](placeholder); - placeholders.not(placeholder).detach(); - } else if (!placeholders.is(this) && !$(this).children(options.items).length) { - placeholders.detach(); - $(this).append(placeholder); - } - return false; - }); - }); -}; -})(jQuery); diff --git a/vendor/assets/javascripts/jquery.ui.widget.js b/vendor/assets/javascripts/jquery.ui.widget.js deleted file mode 100644 index 69096aaa35..0000000000 --- a/vendor/assets/javascripts/jquery.ui.widget.js +++ /dev/null @@ -1,808 +0,0 @@ -/*! jQuery UI - v1.12.1+0b7246b6eeadfa9e2696e22f3230f6452f8129dc - 2020-02-20 - * http://jqueryui.com - * Includes: widget.js - * Copyright jQuery Foundation and other contributors; Licensed MIT */ - -/* global define, require */ -/* eslint-disable no-param-reassign, new-cap, jsdoc/require-jsdoc */ - -(function (factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof exports === 'object') { - // Node/CommonJS - factory(require('jquery')); - } else { - // Browser globals - factory(window.jQuery); - } -})(function ($) { - ('use strict'); - - $.ui = $.ui || {}; - - $.ui.version = '1.12.1'; - - /*! - * jQuery UI Widget 1.12.1 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ - - //>>label: Widget - //>>group: Core - //>>description: Provides a factory for creating stateful widgets with a common API. - //>>docs: http://api.jqueryui.com/jQuery.widget/ - //>>demos: http://jqueryui.com/widget/ - - // Support: jQuery 1.9.x or older - // $.expr[ ":" ] is deprecated. - if (!$.expr.pseudos) { - $.expr.pseudos = $.expr[':']; - } - - // Support: jQuery 1.11.x or older - // $.unique has been renamed to $.uniqueSort - if (!$.uniqueSort) { - $.uniqueSort = $.unique; - } - - var widgetUuid = 0; - var widgetHasOwnProperty = Array.prototype.hasOwnProperty; - var widgetSlice = Array.prototype.slice; - - $.cleanData = (function (orig) { - return function (elems) { - var events, elem, i; - // eslint-disable-next-line eqeqeq - for (i = 0; (elem = elems[i]) != null; i++) { - // Only trigger remove when necessary to save time - events = $._data(elem, 'events'); - if (events && events.remove) { - $(elem).triggerHandler('remove'); - } - } - orig(elems); - }; - })($.cleanData); - - $.widget = function (name, base, prototype) { - var existingConstructor, constructor, basePrototype; - - // ProxiedPrototype allows the provided prototype to remain unmodified - // so that it can be used as a mixin for multiple widgets (#8876) - var proxiedPrototype = {}; - - var namespace = name.split('.')[0]; - name = name.split('.')[1]; - var fullName = namespace + '-' + name; - - if (!prototype) { - prototype = base; - base = $.Widget; - } - - if ($.isArray(prototype)) { - prototype = $.extend.apply(null, [{}].concat(prototype)); - } - - // Create selector for plugin - $.expr.pseudos[fullName.toLowerCase()] = function (elem) { - return !!$.data(elem, fullName); - }; - - $[namespace] = $[namespace] || {}; - existingConstructor = $[namespace][name]; - constructor = $[namespace][name] = function (options, element) { - // Allow instantiation without "new" keyword - if (!this._createWidget) { - return new constructor(options, element); - } - - // Allow instantiation without initializing for simple inheritance - // must use "new" keyword (the code above always passes args) - if (arguments.length) { - this._createWidget(options, element); - } - }; - - // Extend with the existing constructor to carry over any static properties - $.extend(constructor, existingConstructor, { - version: prototype.version, - - // Copy the object used to create the prototype in case we need to - // redefine the widget later - _proto: $.extend({}, prototype), - - // Track widgets that inherit from this widget in case this widget is - // redefined after a widget inherits from it - _childConstructors: [] - }); - - basePrototype = new base(); - - // We need to make the options hash a property directly on the new instance - // otherwise we'll modify the options hash on the prototype that we're - // inheriting from - basePrototype.options = $.widget.extend({}, basePrototype.options); - $.each(prototype, function (prop, value) { - if (!$.isFunction(value)) { - proxiedPrototype[prop] = value; - return; - } - proxiedPrototype[prop] = (function () { - function _super() { - return base.prototype[prop].apply(this, arguments); - } - - function _superApply(args) { - return base.prototype[prop].apply(this, args); - } - - return function () { - var __super = this._super; - var __superApply = this._superApply; - var returnValue; - - this._super = _super; - this._superApply = _superApply; - - returnValue = value.apply(this, arguments); - - this._super = __super; - this._superApply = __superApply; - - return returnValue; - }; - })(); - }); - constructor.prototype = $.widget.extend( - basePrototype, - { - // TODO: remove support for widgetEventPrefix - // always use the name + a colon as the prefix, e.g., draggable:start - // don't prefix for widgets that aren't DOM-based - widgetEventPrefix: existingConstructor - ? basePrototype.widgetEventPrefix || name - : name - }, - proxiedPrototype, - { - constructor: constructor, - namespace: namespace, - widgetName: name, - widgetFullName: fullName - } - ); - - // If this widget is being redefined then we need to find all widgets that - // are inheriting from it and redefine all of them so that they inherit from - // the new version of this widget. We're essentially trying to replace one - // level in the prototype chain. - if (existingConstructor) { - $.each(existingConstructor._childConstructors, function (i, child) { - var childPrototype = child.prototype; - - // Redefine the child widget using the same prototype that was - // originally used, but inherit from the new version of the base - $.widget( - childPrototype.namespace + '.' + childPrototype.widgetName, - constructor, - child._proto - ); - }); - - // Remove the list of existing child constructors from the old constructor - // so the old child constructors can be garbage collected - delete existingConstructor._childConstructors; - } else { - base._childConstructors.push(constructor); - } - - $.widget.bridge(name, constructor); - - return constructor; - }; - - $.widget.extend = function (target) { - var input = widgetSlice.call(arguments, 1); - var inputIndex = 0; - var inputLength = input.length; - var key; - var value; - - for (; inputIndex < inputLength; inputIndex++) { - for (key in input[inputIndex]) { - value = input[inputIndex][key]; - if ( - widgetHasOwnProperty.call(input[inputIndex], key) && - value !== undefined - ) { - // Clone objects - if ($.isPlainObject(value)) { - target[key] = $.isPlainObject(target[key]) - ? $.widget.extend({}, target[key], value) - : // Don't extend strings, arrays, etc. with objects - $.widget.extend({}, value); - - // Copy everything else by reference - } else { - target[key] = value; - } - } - } - } - return target; - }; - - $.widget.bridge = function (name, object) { - var fullName = object.prototype.widgetFullName || name; - $.fn[name] = function (options) { - var isMethodCall = typeof options === 'string'; - var args = widgetSlice.call(arguments, 1); - var returnValue = this; - - if (isMethodCall) { - // If this is an empty collection, we need to have the instance method - // return undefined instead of the jQuery instance - if (!this.length && options === 'instance') { - returnValue = undefined; - } else { - this.each(function () { - var methodValue; - var instance = $.data(this, fullName); - - if (options === 'instance') { - returnValue = instance; - return false; - } - - if (!instance) { - return $.error( - 'cannot call methods on ' + - name + - ' prior to initialization; ' + - "attempted to call method '" + - options + - "'" - ); - } - - if (!$.isFunction(instance[options]) || options.charAt(0) === '_') { - return $.error( - "no such method '" + - options + - "' for " + - name + - ' widget instance' - ); - } - - methodValue = instance[options].apply(instance, args); - - if (methodValue !== instance && methodValue !== undefined) { - returnValue = - methodValue && methodValue.jquery - ? returnValue.pushStack(methodValue.get()) - : methodValue; - return false; - } - }); - } - } else { - // Allow multiple hashes to be passed on init - if (args.length) { - options = $.widget.extend.apply(null, [options].concat(args)); - } - - this.each(function () { - var instance = $.data(this, fullName); - if (instance) { - instance.option(options || {}); - if (instance._init) { - instance._init(); - } - } else { - $.data(this, fullName, new object(options, this)); - } - }); - } - - return returnValue; - }; - }; - - $.Widget = function (/* options, element */) {}; - $.Widget._childConstructors = []; - - $.Widget.prototype = { - widgetName: 'widget', - widgetEventPrefix: '', - defaultElement: '
', - - options: { - classes: {}, - disabled: false, - - // Callbacks - create: null - }, - - _createWidget: function (options, element) { - element = $(element || this.defaultElement || this)[0]; - this.element = $(element); - this.uuid = widgetUuid++; - this.eventNamespace = '.' + this.widgetName + this.uuid; - - this.bindings = $(); - this.hoverable = $(); - this.focusable = $(); - this.classesElementLookup = {}; - - if (element !== this) { - $.data(element, this.widgetFullName, this); - this._on(true, this.element, { - remove: function (event) { - if (event.target === element) { - this.destroy(); - } - } - }); - this.document = $( - element.style - ? // Element within the document - element.ownerDocument - : // Element is window or document - element.document || element - ); - this.window = $( - this.document[0].defaultView || this.document[0].parentWindow - ); - } - - this.options = $.widget.extend( - {}, - this.options, - this._getCreateOptions(), - options - ); - - this._create(); - - if (this.options.disabled) { - this._setOptionDisabled(this.options.disabled); - } - - this._trigger('create', null, this._getCreateEventData()); - this._init(); - }, - - _getCreateOptions: function () { - return {}; - }, - - _getCreateEventData: $.noop, - - _create: $.noop, - - _init: $.noop, - - destroy: function () { - var that = this; - - this._destroy(); - $.each(this.classesElementLookup, function (key, value) { - that._removeClass(value, key); - }); - - // We can probably remove the unbind calls in 2.0 - // all event bindings should go through this._on() - this.element.off(this.eventNamespace).removeData(this.widgetFullName); - this.widget().off(this.eventNamespace).removeAttr('aria-disabled'); - - // Clean up events and states - this.bindings.off(this.eventNamespace); - }, - - _destroy: $.noop, - - widget: function () { - return this.element; - }, - - option: function (key, value) { - var options = key; - var parts; - var curOption; - var i; - - if (arguments.length === 0) { - // Don't return a reference to the internal hash - return $.widget.extend({}, this.options); - } - - if (typeof key === 'string') { - // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } - options = {}; - parts = key.split('.'); - key = parts.shift(); - if (parts.length) { - curOption = options[key] = $.widget.extend({}, this.options[key]); - for (i = 0; i < parts.length - 1; i++) { - curOption[parts[i]] = curOption[parts[i]] || {}; - curOption = curOption[parts[i]]; - } - key = parts.pop(); - if (arguments.length === 1) { - return curOption[key] === undefined ? null : curOption[key]; - } - curOption[key] = value; - } else { - if (arguments.length === 1) { - return this.options[key] === undefined ? null : this.options[key]; - } - options[key] = value; - } - } - - this._setOptions(options); - - return this; - }, - - _setOptions: function (options) { - var key; - - for (key in options) { - this._setOption(key, options[key]); - } - - return this; - }, - - _setOption: function (key, value) { - if (key === 'classes') { - this._setOptionClasses(value); - } - - this.options[key] = value; - - if (key === 'disabled') { - this._setOptionDisabled(value); - } - - return this; - }, - - _setOptionClasses: function (value) { - var classKey, elements, currentElements; - - for (classKey in value) { - currentElements = this.classesElementLookup[classKey]; - if ( - value[classKey] === this.options.classes[classKey] || - !currentElements || - !currentElements.length - ) { - continue; - } - - // We are doing this to create a new jQuery object because the _removeClass() call - // on the next line is going to destroy the reference to the current elements being - // tracked. We need to save a copy of this collection so that we can add the new classes - // below. - elements = $(currentElements.get()); - this._removeClass(currentElements, classKey); - - // We don't use _addClass() here, because that uses this.options.classes - // for generating the string of classes. We want to use the value passed in from - // _setOption(), this is the new value of the classes option which was passed to - // _setOption(). We pass this value directly to _classes(). - elements.addClass( - this._classes({ - element: elements, - keys: classKey, - classes: value, - add: true - }) - ); - } - }, - - _setOptionDisabled: function (value) { - this._toggleClass( - this.widget(), - this.widgetFullName + '-disabled', - null, - !!value - ); - - // If the widget is becoming disabled, then nothing is interactive - if (value) { - this._removeClass(this.hoverable, null, 'ui-state-hover'); - this._removeClass(this.focusable, null, 'ui-state-focus'); - } - }, - - enable: function () { - return this._setOptions({ disabled: false }); - }, - - disable: function () { - return this._setOptions({ disabled: true }); - }, - - _classes: function (options) { - var full = []; - var that = this; - - options = $.extend( - { - element: this.element, - classes: this.options.classes || {} - }, - options - ); - - function bindRemoveEvent() { - options.element.each(function (_, element) { - var isTracked = $.map(that.classesElementLookup, function (elements) { - return elements; - }).some(function (elements) { - return elements.is(element); - }); - - if (!isTracked) { - that._on($(element), { - remove: '_untrackClassesElement' - }); - } - }); - } - - function processClassString(classes, checkOption) { - var current, i; - for (i = 0; i < classes.length; i++) { - current = that.classesElementLookup[classes[i]] || $(); - if (options.add) { - bindRemoveEvent(); - current = $( - $.uniqueSort(current.get().concat(options.element.get())) - ); - } else { - current = $(current.not(options.element).get()); - } - that.classesElementLookup[classes[i]] = current; - full.push(classes[i]); - if (checkOption && options.classes[classes[i]]) { - full.push(options.classes[classes[i]]); - } - } - } - - if (options.keys) { - processClassString(options.keys.match(/\S+/g) || [], true); - } - if (options.extra) { - processClassString(options.extra.match(/\S+/g) || []); - } - - return full.join(' '); - }, - - _untrackClassesElement: function (event) { - var that = this; - $.each(that.classesElementLookup, function (key, value) { - if ($.inArray(event.target, value) !== -1) { - that.classesElementLookup[key] = $(value.not(event.target).get()); - } - }); - - this._off($(event.target)); - }, - - _removeClass: function (element, keys, extra) { - return this._toggleClass(element, keys, extra, false); - }, - - _addClass: function (element, keys, extra) { - return this._toggleClass(element, keys, extra, true); - }, - - _toggleClass: function (element, keys, extra, add) { - add = typeof add === 'boolean' ? add : extra; - var shift = typeof element === 'string' || element === null, - options = { - extra: shift ? keys : extra, - keys: shift ? element : keys, - element: shift ? this.element : element, - add: add - }; - options.element.toggleClass(this._classes(options), add); - return this; - }, - - _on: function (suppressDisabledCheck, element, handlers) { - var delegateElement; - var instance = this; - - // No suppressDisabledCheck flag, shuffle arguments - if (typeof suppressDisabledCheck !== 'boolean') { - handlers = element; - element = suppressDisabledCheck; - suppressDisabledCheck = false; - } - - // No element argument, shuffle and use this.element - if (!handlers) { - handlers = element; - element = this.element; - delegateElement = this.widget(); - } else { - element = delegateElement = $(element); - this.bindings = this.bindings.add(element); - } - - $.each(handlers, function (event, handler) { - function handlerProxy() { - // Allow widgets to customize the disabled handling - // - disabled as an array instead of boolean - // - disabled class as method for disabling individual parts - if ( - !suppressDisabledCheck && - (instance.options.disabled === true || - $(this).hasClass('ui-state-disabled')) - ) { - return; - } - return (typeof handler === 'string' - ? instance[handler] - : handler - ).apply(instance, arguments); - } - - // Copy the guid so direct unbinding works - if (typeof handler !== 'string') { - handlerProxy.guid = handler.guid = - handler.guid || handlerProxy.guid || $.guid++; - } - - var match = event.match(/^([\w:-]*)\s*(.*)$/); - var eventName = match[1] + instance.eventNamespace; - var selector = match[2]; - - if (selector) { - delegateElement.on(eventName, selector, handlerProxy); - } else { - element.on(eventName, handlerProxy); - } - }); - }, - - _off: function (element, eventName) { - eventName = - (eventName || '').split(' ').join(this.eventNamespace + ' ') + - this.eventNamespace; - element.off(eventName); - - // Clear the stack to avoid memory leaks (#10056) - this.bindings = $(this.bindings.not(element).get()); - this.focusable = $(this.focusable.not(element).get()); - this.hoverable = $(this.hoverable.not(element).get()); - }, - - _delay: function (handler, delay) { - var instance = this; - function handlerProxy() { - return (typeof handler === 'string' - ? instance[handler] - : handler - ).apply(instance, arguments); - } - return setTimeout(handlerProxy, delay || 0); - }, - - _hoverable: function (element) { - this.hoverable = this.hoverable.add(element); - this._on(element, { - mouseenter: function (event) { - this._addClass($(event.currentTarget), null, 'ui-state-hover'); - }, - mouseleave: function (event) { - this._removeClass($(event.currentTarget), null, 'ui-state-hover'); - } - }); - }, - - _focusable: function (element) { - this.focusable = this.focusable.add(element); - this._on(element, { - focusin: function (event) { - this._addClass($(event.currentTarget), null, 'ui-state-focus'); - }, - focusout: function (event) { - this._removeClass($(event.currentTarget), null, 'ui-state-focus'); - } - }); - }, - - _trigger: function (type, event, data) { - var prop, orig; - var callback = this.options[type]; - - data = data || {}; - event = $.Event(event); - event.type = (type === this.widgetEventPrefix - ? type - : this.widgetEventPrefix + type - ).toLowerCase(); - - // The original event may come from any element - // so we need to reset the target on the new event - event.target = this.element[0]; - - // Copy original event properties over to the new event - orig = event.originalEvent; - if (orig) { - for (prop in orig) { - if (!(prop in event)) { - event[prop] = orig[prop]; - } - } - } - - this.element.trigger(event, data); - return !( - ($.isFunction(callback) && - callback.apply(this.element[0], [event].concat(data)) === false) || - event.isDefaultPrevented() - ); - } - }; - - $.each({ show: 'fadeIn', hide: 'fadeOut' }, function (method, defaultEffect) { - $.Widget.prototype['_' + method] = function (element, options, callback) { - if (typeof options === 'string') { - options = { effect: options }; - } - - var hasOptions; - var effectName = !options - ? method - : options === true || typeof options === 'number' - ? defaultEffect - : options.effect || defaultEffect; - - options = options || {}; - if (typeof options === 'number') { - options = { duration: options }; - } - - hasOptions = !$.isEmptyObject(options); - options.complete = callback; - - if (options.delay) { - element.delay(options.delay); - } - - if (hasOptions && $.effects && $.effects.effect[effectName]) { - element[method](options); - } else if (effectName !== method && element[effectName]) { - element[effectName](options.duration, options.easing, callback); - } else { - element.queue(function (next) { - $(this)[method](); - if (callback) { - callback.call(element[0]); - } - next(); - }); - } - }; - }); -}); From 0b8d0a14d789b9a9fcd14e41e231546debf3a046 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Fri, 28 Jan 2022 13:02:02 +1000 Subject: [PATCH 006/194] DEV: Add markdown_additional_options to Site (#15738) Sometimes plugins need to have additional data or options available when rendering custom markdown features/rules that are not available on the default opts.discourse object. These additional options should be namespaced to the plugin adding them. ``` Site.markdown_additional_options["chat"] = { limited_pretty_text_markdown_rules: [] } ``` These are passed down to markdown rules on opts.discourse.additionalOptions. The main motivation for adding this is the chat plugin, which currently stores chat_pretty_text_features and chat_pretty_text_markdown_rules on the Site object via additions to the serializer, and the Site object is not accessible to import via markdown rules (either through Site.current() or through container.lookup). So, to have this working for both front + backend code, we need to attach these additional options from the Site object onto the markdown options object. --- app/assets/javascripts/discourse/app/lib/text.js | 1 + .../javascripts/pretty-text/addon/pretty-text.js | 2 ++ app/models/site.rb | 14 ++++++++++++++ app/serializers/site_serializer.rb | 7 ++++++- lib/pretty_text.rb | 1 + spec/requests/api/schemas/json/site_response.json | 3 +++ 6 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/lib/text.js b/app/assets/javascripts/discourse/app/lib/text.js index 6e7def0ecd..635a5c44b2 100644 --- a/app/assets/javascripts/discourse/app/lib/text.js +++ b/app/assets/javascripts/discourse/app/lib/text.js @@ -23,6 +23,7 @@ function getOpts(opts) { formatUsername, watchedWordsReplace: context.site.watched_words_replace, watchedWordsLink: context.site.watched_words_link, + additionalOptions: context.site.markdown_additional_options, }, opts ); diff --git a/app/assets/javascripts/pretty-text/addon/pretty-text.js b/app/assets/javascripts/pretty-text/addon/pretty-text.js index 6654f9cc24..80138a7ab3 100644 --- a/app/assets/javascripts/pretty-text/addon/pretty-text.js +++ b/app/assets/javascripts/pretty-text/addon/pretty-text.js @@ -40,6 +40,7 @@ export function buildOptions(state) { watchedWordsLink, featuresOverride, markdownItRules, + additionalOptions, } = state; let features = {}; @@ -80,6 +81,7 @@ export function buildOptions(state) { watchedWordsLink, featuresOverride, markdownItRules, + additionalOptions, }; // note, this will mutate options due to the way the API is designed diff --git a/app/models/site.rb b/app/models/site.rb index d8ba6cf083..4442a12e27 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -7,6 +7,20 @@ class Site cattr_accessor :preloaded_category_custom_fields self.preloaded_category_custom_fields = Set.new + ## + # Sometimes plugins need to have additional data or options available + # when rendering custom markdown features/rules that are not available + # on the default opts.discourse object. These additional options should + # be namespaced to the plugin adding them. + # + # ``` + # Site.markdown_additional_options["chat"] = { limited_pretty_text_markdown_rules: [] } + # ``` + # + # These are passed down to markdown rules on opts.discourse.additionalOptions. + cattr_accessor :markdown_additional_options + self.markdown_additional_options = {} + def self.add_categories_callbacks(&block) categories_callbacks << block end diff --git a/app/serializers/site_serializer.rb b/app/serializers/site_serializer.rb index c65628748f..7b16d6f1a6 100644 --- a/app/serializers/site_serializer.rb +++ b/app/serializers/site_serializer.rb @@ -32,7 +32,8 @@ class SiteSerializer < ApplicationSerializer :custom_emoji_translation, :watched_words_replace, :watched_words_link, - :categories + :categories, + :markdown_additional_options ) has_many :archetypes, embed: :objects, serializer: ArchetypeSerializer @@ -203,6 +204,10 @@ class SiteSerializer < ApplicationSerializer object.categories.map { |c| c.to_h } end + def markdown_additional_options + Site.markdown_additional_options + end + private def ordered_flags(flags) diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb index a5885ce22d..558a1880ea 100644 --- a/lib/pretty_text.rb +++ b/lib/pretty_text.rb @@ -201,6 +201,7 @@ module PrettyText __optInput.censoredRegexp = #{WordWatcher.word_matcher_regexp(:censor)&.source.to_json}; __optInput.watchedWordsReplace = #{WordWatcher.word_matcher_regexps(:replace).to_json}; __optInput.watchedWordsLink = #{WordWatcher.word_matcher_regexps(:link).to_json}; + __optInput.additionalOptions = #{Site.markdown_additional_options.to_json}; JS if opts[:topic_id] diff --git a/spec/requests/api/schemas/json/site_response.json b/spec/requests/api/schemas/json/site_response.json index b1a2a0c325..a65eea3cf6 100644 --- a/spec/requests/api/schemas/json/site_response.json +++ b/spec/requests/api/schemas/json/site_response.json @@ -466,6 +466,9 @@ "null" ] }, + "markdown_additional_options" : { + "type": "object" + }, "categories": { "type": "array", "items": [ From fe1e66ba9d8a1171186ebbf1638255516279ef3c Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 28 Jan 2022 11:31:19 +0000 Subject: [PATCH 007/194] DEV: Add backwards-compat for SiteSettings/User globals in ember-cli (#15719) --- .../app/initializers/inject-objects.js | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/app/assets/javascripts/discourse/app/initializers/inject-objects.js b/app/assets/javascripts/discourse/app/initializers/inject-objects.js index 533e9134af..b325542587 100644 --- a/app/assets/javascripts/discourse/app/initializers/inject-objects.js +++ b/app/assets/javascripts/discourse/app/initializers/inject-objects.js @@ -1,9 +1,40 @@ import { setDefaultOwner } from "discourse-common/lib/get-owner"; +import { isLegacyEmber } from "discourse-common/config/environment"; +import User from "discourse/models/user"; +import deprecated from "discourse-common/lib/deprecated"; export default { name: "inject-objects", initialize(container, app) { // This is required for Ember CLI tests to work setDefaultOwner(app.__container__); + + // Backwards compatibility for Discourse.SiteSettings and Discourse.User + if (!isLegacyEmber()) { + Object.defineProperty(app, "SiteSettings", { + get() { + deprecated( + `use injected siteSettings instead of Discourse.SiteSettings`, + { + since: "2.8", + dropFrom: "2.9", + } + ); + return container.lookup("site-settings:main"); + }, + }); + Object.defineProperty(app, "User", { + get() { + deprecated( + `import discourse/models/user instead of using Discourse.User`, + { + since: "2.8", + dropFrom: "2.9", + } + ); + return User; + }, + }); + } }, }; From 5cce39278a28d73b15a78f31ff1e2c1cc43127f2 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Fri, 28 Jan 2022 14:12:58 +0100 Subject: [PATCH 008/194] DEV: remove unused function in d-editor (#15680) --- app/assets/javascripts/discourse/app/components/d-editor.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/components/d-editor.js b/app/assets/javascripts/discourse/app/components/d-editor.js index 16d3796e42..64dc6fe91b 100644 --- a/app/assets/javascripts/discourse/app/components/d-editor.js +++ b/app/assets/javascripts/discourse/app/components/d-editor.js @@ -821,7 +821,6 @@ export default Component.extend(TextareaTextManipulation, { applyList: (head, exampleKey, opts) => this._applyList(selected, head, exampleKey, opts), addText: (text) => this._addText(selected, text), - replaceText: (text) => this._addText({ pre: "", post: "" }, text), getText: () => this.value, toggleDirection: () => this._toggleDirection(), }; From e1367cdea689d1883c3af28b2d15727190dce5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Hanol?= Date: Fri, 28 Jan 2022 17:12:35 +0100 Subject: [PATCH 009/194] I18N: Improve copy on blocked words error messages (#15741) --- config/locales/server.en.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 2d1bdc13b0..30671b0233 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -366,8 +366,8 @@ en: too_many_links: one: "Sorry, new users can only put one link in a post." other: "Sorry, new users can only put %{count} links in a post." - contains_blocked_word: "Your post contains a word that's not allowed: %{word}" - contains_blocked_words: "Your post contains multiple words that aren't allowed: %{words}" + contains_blocked_word: "Sorry, you can't post the word '%{word}'; it's not allowed." + contains_blocked_words: "Sorry, you can't post that. Not allowed: %{words}." spamming_host: "Sorry you cannot post a link to that host." user_is_suspended: "Suspended users are not allowed to post." From 30454b3f27deef91597278c90b3e965971a47f0c Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Mon, 31 Jan 2022 05:35:51 +0100 Subject: [PATCH 010/194] UX: try select-kit autocomplete Chrome fix (#15752) --- .../templates/components/select-kit/select-kit-filter.hbs | 3 ++- app/assets/stylesheets/common/base/discourse.scss | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/select-kit/addon/templates/components/select-kit/select-kit-filter.hbs b/app/assets/javascripts/select-kit/addon/templates/components/select-kit/select-kit-filter.hbs index 9dc5578a85..d213fed5a8 100644 --- a/app/assets/javascripts/select-kit/addon/templates/components/select-kit/select-kit-filter.hbs +++ b/app/assets/javascripts/select-kit/addon/templates/components/select-kit/select-kit-filter.hbs @@ -4,7 +4,7 @@ tabindex=0 class="filter-input" placeholder=placeholder - autocomplete="discourse" + autocomplete="off" autocorrect="off" autocapitalize="off" name="filter-input-search" @@ -14,6 +14,7 @@ paste=(action "onPaste") keyDown=(action "onKeydown") keyUp=(action "onKeyup") + type="search" }} {{#if selectKit.options.filterIcon}} diff --git a/app/assets/stylesheets/common/base/discourse.scss b/app/assets/stylesheets/common/base/discourse.scss index 6d79f84b53..9b253d36b8 100644 --- a/app/assets/stylesheets/common/base/discourse.scss +++ b/app/assets/stylesheets/common/base/discourse.scss @@ -230,6 +230,14 @@ input { } } +input[type="search"] { + &::-webkit-search-cancel-button, + &::-webkit-search-decoration { + -webkit-appearance: none; + appearance: none; + } +} + // Fixes Safari height inconsistency ::-webkit-datetime-edit { display: inline; From aac9f43038fc24acead1d1b853d93613afb59c4f Mon Sep 17 00:00:00 2001 From: Natalie Tay Date: Mon, 31 Jan 2022 15:35:12 +0800 Subject: [PATCH 011/194] Only block domains at the final destination (#15689) In an earlier PR, we decided that we only want to block a domain if the blocked domain in the SiteSetting is the final destination (/t/59305). That PR used `FinalDestination#get`. `resolve` however is used several places but blocks domains along the redirect chain when certain options are provided. This commit changes the default options for `resolve` to not do that. Existing users of `FinalDestination#resolve` are - `Oneboxer#external_onebox` - our onebox helper `fetch_html_doc`, which is used in amazon, standard embed and youtube - these folks already go through `Oneboxer#external_onebox` which already blocks correctly --- lib/final_destination.rb | 2 +- lib/inline_oneboxer.rb | 8 +-- lib/onebox/domain_checker.rb | 11 ++++ lib/oneboxer.rb | 7 +-- lib/retrieve_title.rb | 2 +- spec/components/oneboxer_spec.rb | 82 ++++++++++++++++++-------- spec/components/retrieve_title_spec.rb | 2 - spec/lib/onebox/domain_checker_spec.rb | 27 +++++++++ 8 files changed, 101 insertions(+), 40 deletions(-) create mode 100644 lib/onebox/domain_checker.rb create mode 100644 spec/lib/onebox/domain_checker_spec.rb diff --git a/lib/final_destination.rb b/lib/final_destination.rb index 09f4d0c58e..2fbc5711b1 100644 --- a/lib/final_destination.rb +++ b/lib/final_destination.rb @@ -44,9 +44,9 @@ class FinalDestination @opts[:max_redirects] ||= 5 @opts[:lookup_ip] ||= lambda { |host| FinalDestination.lookup_ip(host) } - @ignored = @opts[:ignore_hostnames] || [] @limit = @opts[:max_redirects] + @ignored = [] if @limit > 0 ignore_redirects = [Discourse.base_url_no_prefix] diff --git a/lib/inline_oneboxer.rb b/lib/inline_oneboxer.rb index 2e2dcf2c60..2ce9b34a32 100644 --- a/lib/inline_oneboxer.rb +++ b/lib/inline_oneboxer.rb @@ -61,7 +61,7 @@ class InlineOneboxer if uri.present? && uri.hostname.present? && (always_allow || allowed_domains.include?(uri.hostname)) && - !domain_is_blocked?(uri.hostname) + !Onebox::DomainChecker.is_blocked?(uri.hostname) title = RetrieveTitle.crawl(url) title = nil if title && title.length < MIN_TITLE_LENGTH return onebox_for(url, title, opts) @@ -73,12 +73,6 @@ class InlineOneboxer private - def self.domain_is_blocked?(hostname) - SiteSetting.blocked_onebox_domains&.split('|').any? do |blocked| - hostname == blocked || hostname.end_with?(".#{blocked}") - end - end - def self.onebox_for(url, title, opts) title = title && Emoji.gsub_emoji_to_unicode(title) if title && opts[:post_number] diff --git a/lib/onebox/domain_checker.rb b/lib/onebox/domain_checker.rb new file mode 100644 index 0000000000..1dd810491e --- /dev/null +++ b/lib/onebox/domain_checker.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module Onebox + class DomainChecker + def self.is_blocked?(hostname) + SiteSetting.blocked_onebox_domains&.split('|').any? do |blocked| + hostname == blocked || hostname.end_with?(".#{blocked}") + end + end + end +end diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb index 61393627af..132f30d6b2 100644 --- a/lib/oneboxer.rb +++ b/lib/oneboxer.rb @@ -379,10 +379,6 @@ module Oneboxer end end - def self.blocked_domains - SiteSetting.blocked_onebox_domains.split("|") - end - def self.preserve_fragment_url_hosts @preserve_fragment_url_hosts ||= ['http://github.com'] end @@ -420,7 +416,7 @@ module Oneboxer return error_box end - return blank_onebox if uri.blank? || blocked_domains.any? { |hostname| uri.hostname.match?(hostname) } + return blank_onebox if uri.blank? || Onebox::DomainChecker.is_blocked?(uri.hostname) onebox_options = { max_width: 695, @@ -538,7 +534,6 @@ module Oneboxer def self.get_final_destination_options(url, strategy = nil) fd_options = { ignore_redirects: ignore_redirects, - ignore_hostnames: blocked_domains, force_get_hosts: force_get_hosts, force_custom_user_agent_hosts: force_custom_user_agent_hosts, preserve_fragment_url_hosts: preserve_fragment_url_hosts, diff --git a/lib/retrieve_title.rb b/lib/retrieve_title.rb index 2fd361ca90..78a518e738 100644 --- a/lib/retrieve_title.rb +++ b/lib/retrieve_title.rb @@ -60,7 +60,7 @@ module RetrieveTitle encoding = nil fd.get do |_response, chunk, uri| - if (uri.present? && InlineOneboxer.domain_is_blocked?(uri.hostname)) + if (uri.present? && Onebox::DomainChecker.is_blocked?(uri.hostname)) throw :done end diff --git a/spec/components/oneboxer_spec.rb b/spec/components/oneboxer_spec.rb index 40ce9e49b8..562c06b311 100644 --- a/spec/components/oneboxer_spec.rb +++ b/spec/components/oneboxer_spec.rb @@ -160,28 +160,54 @@ describe Oneboxer do end end - it "does not crawl blocklisted URLs" do - SiteSetting.blocked_onebox_domains = "git.*.com|bitbucket.com" - url = 'https://github.com/discourse/discourse/commit/21b562852885f883be43032e03c709241e8e6d4f' - stub_request(:head, 'https://discourse.org/').to_return(status: 302, body: "", headers: { location: url }) + context ".external_onebox" do + html = <<~HTML + + + + + + +

body

+ + + HTML - expect(Oneboxer.external_onebox(url)[:onebox]).to be_empty - expect(Oneboxer.external_onebox('https://discourse.org/')[:onebox]).to be_empty - end + context "blacklisted domains" do - it "does not consider ignore_redirects domains as blocklisted" do - url = 'https://store.steampowered.com/app/271590/Grand_Theft_Auto_V/' - stub_request(:head, url).to_return(status: 200, body: "", headers: {}) - stub_request(:get, url).to_return(status: 200, body: "", headers: {}) + it "does not return a onebox if redirect uri final destination is in blacklist" do + SiteSetting.blocked_onebox_domains = "kitten.com" - expect(Oneboxer.external_onebox(url)[:onebox]).to be_present - end + stub_request(:get, "http://cat.com/meow").to_return(status: 301, body: "", headers: { "location" => "https://kitten.com" }) + stub_request(:head, "http://cat.com/meow").to_return(status: 301, body: "", headers: { "location" => "https://kitten.com" }) - it "censors external oneboxes" do - Fabricate(:watched_word, action: WatchedWord.actions[:censor], word: "bad word") + stub_request(:get, "https://kitten.com").to_return(status: 200, body: html, headers: {}) + stub_request(:head, "https://kitten.com").to_return(status: 200, body: "", headers: {}) - url = 'https://example.com/' - stub_request(:any, url).to_return(status: 200, body: <<~HTML, headers: {}) + expect(Oneboxer.external_onebox("http://cat.com/meow")[:onebox]).to be_empty + expect(Oneboxer.external_onebox("https://kitten.com")[:onebox]).to be_empty + end + + it "returns onebox if 'midway redirect' is blocked but final redirect uri is not blocked" do + SiteSetting.blocked_onebox_domains = "middle.com" + + stub_request(:get, "https://cat.com/start").to_return(status: 301, body: "a", headers: { "location" => "https://middle.com/midway" }) + stub_request(:head, "https://cat.com/start").to_return(status: 301, body: "a", headers: { "location" => "https://middle.com/midway" }) + + stub_request(:head, "https://middle.com/midway").to_return(status: 301, body: "b", headers: { "location" => "https://cat.com/end" }) + + stub_request(:get, "https://cat.com/end").to_return(status: 200, body: html) + stub_request(:head, "https://cat.com/end").to_return(status: 200, body: "", headers: {}) + + expect(Oneboxer.external_onebox("https://cat.com/start")[:onebox]).to be_present + end + end + + it "censors external oneboxes" do + Fabricate(:watched_word, action: WatchedWord.actions[:censor], word: "bad word") + + url = 'https://example.com/' + stub_request(:any, url).to_return(status: 200, body: <<~HTML, headers: {}) @@ -191,13 +217,23 @@ describe Oneboxer do

content with bad word

- HTML + HTML - onebox = Oneboxer.external_onebox(url) - expect(onebox[:onebox]).to include('title with') - expect(onebox[:onebox]).not_to include('bad word') - expect(onebox[:preview]).to include('title with') - expect(onebox[:preview]).not_to include('bad word') + onebox = Oneboxer.external_onebox(url) + expect(onebox[:onebox]).to include('title with') + expect(onebox[:onebox]).not_to include('bad word') + expect(onebox[:preview]).to include('title with') + expect(onebox[:preview]).not_to include('bad word') + end + + it "returns onebox" do + SiteSetting.blocked_onebox_domains = "not.me" + + stub_request(:get, "https://its.me").to_return(status: 200, body: html) + stub_request(:head, "https://its.me").to_return(status: 200, body: "", headers: {}) + + expect(Oneboxer.external_onebox("https://its.me")[:onebox]).to be_present + end end it "uses the Onebox custom user agent on specified hosts" do diff --git a/spec/components/retrieve_title_spec.rb b/spec/components/retrieve_title_spec.rb index 6b16a9174d..563a1da77a 100644 --- a/spec/components/retrieve_title_spec.rb +++ b/spec/components/retrieve_title_spec.rb @@ -110,7 +110,6 @@ describe RetrieveTitle do stub_request(:get, "https://wikipedia.com/amazing") .to_return(status: 200, body: "very amazing", headers: {}) - IPSocket.stubs(:getaddress).returns('100.2.3.4') expect(RetrieveTitle.crawl("http://foobar.com/amazing")).to eq(nil) end @@ -126,7 +125,6 @@ describe RetrieveTitle do stub_request(:get, "https://cat.com/meow") .to_return(status: 200, body: "very amazing", headers: {}) - IPSocket.stubs(:getaddress).returns('100.2.3.4') expect(RetrieveTitle.crawl("http://foobar.com/amazing")).to eq("very amazing") end end diff --git a/spec/lib/onebox/domain_checker_spec.rb b/spec/lib/onebox/domain_checker_spec.rb new file mode 100644 index 0000000000..0132babc74 --- /dev/null +++ b/spec/lib/onebox/domain_checker_spec.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe Onebox::DomainChecker do + describe '.is_blocked?' do + before do + SiteSetting.blocked_onebox_domains = "api.cat.org|kitten.cloud" + end + + describe "returns true when entirely matched" do + it { expect(described_class.is_blocked?("api.cat.org")).to be(true) } + it { expect(described_class.is_blocked?("kitten.cloud")).to be(true) } + it { expect(described_class.is_blocked?("api.dog.org")).to be(false) } + it { expect(described_class.is_blocked?("puppy.cloud")).to be(false) } + end + + describe "returns true when ends with ." do + it { expect(described_class.is_blocked?("dev.api.cat.org")).to be(true) } + it { expect(described_class.is_blocked?(".api.cat.org")).to be(true) } + it { expect(described_class.is_blocked?("dev.kitten.cloud")).to be(true) } + it { expect(described_class.is_blocked?(".kitten.cloud")).to be(true) } + it { expect(described_class.is_blocked?("xapi.cat.org")).to be(false) } + it { expect(described_class.is_blocked?("xkitten.cloud")).to be(false) } + end + end +end From 18116433ee97e90a27edb6aa70a1330b7673a9d4 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Mon, 31 Jan 2022 12:15:20 +0100 Subject: [PATCH 012/194] FIX: show the `Next Monday` label instead of `Monday` on Sundays (#15745) --- .../discourse/app/components/bookmark.js | 37 +-- .../app/components/edit-topic-timer-form.js | 7 +- .../app/components/time-shortcut-picker.js | 39 +-- .../discourse/app/lib/time-shortcut.js | 6 +- .../discourse/app/lib/time-utils.js | 1 + .../app/templates/components/bookmark.hbs | 1 - .../integration/components/bookmark-test.js | 175 +------------ .../components/time-shortcut-picker-test.js | 229 ++++++++++++++++++ 8 files changed, 262 insertions(+), 233 deletions(-) create mode 100644 app/assets/javascripts/discourse/tests/integration/components/time-shortcut-picker-test.js diff --git a/app/assets/javascripts/discourse/app/components/bookmark.js b/app/assets/javascripts/discourse/app/components/bookmark.js index deadd61cc9..0e1bbc1049 100644 --- a/app/assets/javascripts/discourse/app/components/bookmark.js +++ b/app/assets/javascripts/discourse/app/components/bookmark.js @@ -1,12 +1,4 @@ -import { - LATER_TODAY_CUTOFF_HOUR, - MOMENT_THURSDAY, - laterToday, - now, - parseCustomDatetime, - startOfDay, - tomorrow, -} from "discourse/lib/time-utils"; +import { now, parseCustomDatetime, startOfDay } from "discourse/lib/time-utils"; import { AUTO_DELETE_PREFERENCES } from "discourse/models/bookmark"; import Component from "@ember/component"; import I18n from "I18n"; @@ -330,38 +322,13 @@ export default Component.extend({ editingExistingBookmark, existingBookmarkHasReminder ) { - if (!editingExistingBookmark) { - return []; - } - - if (!existingBookmarkHasReminder) { + if (editingExistingBookmark && !existingBookmarkHasReminder) { return [TIME_SHORTCUT_TYPES.NONE]; } return []; }, - @discourseComputed() - additionalTimeShortcutOptions() { - let additional = []; - - if ( - !laterToday(this.userTimezone).isSame( - tomorrow(this.userTimezone), - "date" - ) && - now(this.userTimezone).hour() < LATER_TODAY_CUTOFF_HOUR - ) { - additional.push(TIME_SHORTCUT_TYPES.LATER_TODAY); - } - - if (now(this.userTimezone).day() < MOMENT_THURSDAY) { - additional.push(TIME_SHORTCUT_TYPES.LATER_THIS_WEEK); - } - - return additional; - }, - @discourseComputed("model.reminderAt") existingReminderAtFormatted(existingReminderAt) { return formattedReminderTime(existingReminderAt, this.userTimezone); diff --git a/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js b/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js index 1c07aceb5c..aa98c28bb8 100644 --- a/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js +++ b/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js @@ -21,6 +21,7 @@ import { thisWeekend, } from "discourse/lib/time-utils"; import KeyboardShortcuts from "discourse/lib/keyboard-shortcuts"; +import { TIME_SHORTCUT_TYPES } from "discourse/lib/time-shortcut"; import ItsATrap from "@discourse/itsatrap"; export default Component.extend({ @@ -113,7 +114,11 @@ export default Component.extend({ @discourseComputed hiddenTimeShortcutOptions() { - return ["none"]; + return [ + TIME_SHORTCUT_TYPES.NONE, + TIME_SHORTCUT_TYPES.LATER_TODAY, + TIME_SHORTCUT_TYPES.LATER_THIS_WEEK, + ]; }, isCustom: equal("timerType", "custom"), diff --git a/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js b/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js index a2ff789e43..caee171d91 100644 --- a/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js +++ b/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js @@ -1,4 +1,6 @@ import { + LATER_TODAY_CUTOFF_HOUR, + MOMENT_THURSDAY, START_OF_DAY_HOUR, laterToday, now, @@ -57,7 +59,6 @@ export default Component.extend({ selectedDatetime: null, prefilledDatetime: null, - additionalOptionsToShow: null, hiddenOptions: null, customOptions: null, @@ -76,7 +77,6 @@ export default Component.extend({ this.setProperties({ customTime: this.defaultCustomReminderTime, userTimezone: this.currentUser.resolvedTimezone(this.currentUser), - additionalOptionsToShow: this.additionalOptionsToShow || [], hiddenOptions: this.hiddenOptions || [], customOptions: this.customOptions || [], customLabels: this.customLabels || {}, @@ -168,38 +168,24 @@ export default Component.extend({ }, @discourseComputed( - "additionalOptionsToShow", "hiddenOptions", "customOptions", "customLabels", "userTimezone" ) - options( - additionalOptionsToShow, - hiddenOptions, - customOptions, - customLabels, - userTimezone - ) { + options(hiddenOptions, customOptions, customLabels, userTimezone) { this._loadLastUsedCustomDatetime(); let options = defaultShortcutOptions(userTimezone); - - if (additionalOptionsToShow.length > 0) { - options.forEach((opt) => { - if (additionalOptionsToShow.includes(opt.id)) { - opt.hidden = false; - } - }); - } + this._hideDynamicOptions(options); customOptions.forEach((opt) => { if (!opt.timeFormatted && opt.time) { opt.timeFormatted = opt.time.format(I18n.t(opt.timeFormatKey)); } }); - options = options.concat(customOptions); + options.sort((a, b) => { if (a.time < b.time) { return -1; @@ -288,4 +274,19 @@ export default Component.extend({ this.onTimeSelected(type, dateTime); } }, + + _hideDynamicOptions(options) { + if (now(this.userTimezone).hour() >= LATER_TODAY_CUTOFF_HOUR) { + this._hideOption(options, TIME_SHORTCUT_TYPES.LATER_TODAY); + } + + if (now(this.userTimezone).day() >= MOMENT_THURSDAY) { + this._hideOption(options, TIME_SHORTCUT_TYPES.LATER_THIS_WEEK); + } + }, + + _hideOption(options, optionId) { + const option = options.findBy("id", optionId); + option.hidden = true; + }, }); diff --git a/app/assets/javascripts/discourse/app/lib/time-shortcut.js b/app/assets/javascripts/discourse/app/lib/time-shortcut.js index d2eac0b9c7..5d6349afef 100644 --- a/app/assets/javascripts/discourse/app/lib/time-shortcut.js +++ b/app/assets/javascripts/discourse/app/lib/time-shortcut.js @@ -1,5 +1,6 @@ import { MOMENT_MONDAY, + MOMENT_SUNDAY, laterThisWeek, laterToday, nextBusinessWeekStart, @@ -30,7 +31,6 @@ export function defaultShortcutOptions(timezone) { label: "time_shortcut.later_today", time: laterToday(timezone), timeFormatted: laterToday(timezone).format(I18n.t("dates.time")), - hidden: true, }, { icon: "far-sun", @@ -47,13 +47,13 @@ export function defaultShortcutOptions(timezone) { timeFormatted: laterThisWeek(timezone).format( I18n.t("dates.time_short_day") ), - hidden: true, }, { icon: "briefcase", id: TIME_SHORTCUT_TYPES.START_OF_NEXT_BUSINESS_WEEK, label: - now(timezone).day() === MOMENT_MONDAY + now(timezone).day() === MOMENT_MONDAY || + now(timezone).day() === MOMENT_SUNDAY ? "time_shortcut.start_of_next_business_week_alt" : "time_shortcut.start_of_next_business_week", time: nextBusinessWeekStart(timezone), diff --git a/app/assets/javascripts/discourse/app/lib/time-utils.js b/app/assets/javascripts/discourse/app/lib/time-utils.js index 1f765ffdc0..114b151af4 100644 --- a/app/assets/javascripts/discourse/app/lib/time-utils.js +++ b/app/assets/javascripts/discourse/app/lib/time-utils.js @@ -3,6 +3,7 @@ import { isPresent } from "@ember/utils"; export const START_OF_DAY_HOUR = 8; export const LATER_TODAY_CUTOFF_HOUR = 17; export const LATER_TODAY_MAX_HOUR = 18; +export const MOMENT_SUNDAY = 0; export const MOMENT_MONDAY = 1; export const MOMENT_THURSDAY = 4; export const MOMENT_SATURDAY = 6; diff --git a/app/assets/javascripts/discourse/app/templates/components/bookmark.hbs b/app/assets/javascripts/discourse/app/templates/components/bookmark.hbs index bc75391e1b..9d95a1ca0c 100644 --- a/app/assets/javascripts/discourse/app/templates/components/bookmark.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/bookmark.hbs @@ -41,7 +41,6 @@ customOptions=customTimeShortcutOptions hiddenOptions=hiddenTimeShortcutOptions customLabels=customTimeShortcutLabels - additionalOptionsToShow=additionalTimeShortcutOptions _itsatrap=_itsatrap }} {{else}} diff --git a/app/assets/javascripts/discourse/tests/integration/components/bookmark-test.js b/app/assets/javascripts/discourse/tests/integration/components/bookmark-test.js index 0226bef7c4..36fb680dfa 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/bookmark-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/bookmark-test.js @@ -1,16 +1,8 @@ import componentTest, { setupRenderingTest, } from "discourse/tests/helpers/component-test"; -import { - discourseModule, - exists, - fakeTime, - query, - queryAll, -} from "discourse/tests/helpers/qunit-helpers"; -import I18n from "I18n"; +import { discourseModule, query } from "discourse/tests/helpers/qunit-helpers"; import hbs from "htmlbars-inline-precompile"; -import { click } from "@ember/test-helpers"; discourseModule("Integration | Component | bookmark", function (hooks) { setupRenderingTest(hooks); @@ -34,143 +26,6 @@ discourseModule("Integration | Component | bookmark", function (hooks) { }); }); - hooks.afterEach(function () { - if (this.clock) { - this.clock.restore(); - } - }); - - componentTest("shows correct options", { - template, - - beforeEach() { - const tuesday = "2100-06-08T08:00:00"; - this.clock = fakeTime(tuesday, this.currentUser._timezone, true); - }, - - async test(assert) { - const expected = [ - I18n.t("time_shortcut.later_today"), - I18n.t("time_shortcut.tomorrow"), - I18n.t("time_shortcut.later_this_week"), - I18n.t("time_shortcut.start_of_next_business_week"), - I18n.t("time_shortcut.next_month"), - I18n.t("time_shortcut.custom"), - I18n.t("time_shortcut.none"), - ]; - - const options = Array.from( - queryAll( - "div.control-group div.tap-tile-grid div.tap-tile-title" - ).map((_, div) => div.innerText.trim()) - ); - - assert.deepEqual(options, expected); - }, - }); - - componentTest("show later this week option if today is < Thursday", { - template, - - beforeEach() { - const monday = "2100-06-07T08:00:00"; - this.clock = fakeTime(monday, this.currentUser._timezone, true); - }, - - test(assert) { - assert.ok(exists("#tap_tile_later_this_week"), "it has later this week"); - }, - }); - - componentTest( - "does not show later this week option if today is >= Thursday", - { - template, - - beforeEach() { - const thursday = "2100-06-10T08:00:00"; - this.clock = fakeTime(thursday, this.currentUser._timezone, true); - }, - - test(assert) { - assert.notOk( - exists("#tap_tile_later_this_week"), - "it does not have later this week" - ); - }, - } - ); - - componentTest("later today does not show if later today is tomorrow", { - template, - - beforeEach() { - this.clock = fakeTime( - "2100-12-11T22:00:00", - this.currentUser._timezone, - true - ); - }, - - test(assert) { - assert.notOk( - exists("#tap_tile_later_today"), - "it does not have later today" - ); - }, - }); - - componentTest("later today shows if it is after 5pm but before 6pm", { - template, - - beforeEach() { - this.clock = fakeTime( - "2100-12-11T14:30:00", - this.currentUser._timezone, - true - ); - }, - - test(assert) { - assert.ok(exists("#tap_tile_later_today"), "it does have later today"); - }, - }); - - componentTest("later today does not show if it is after 5pm", { - template, - - beforeEach() { - this.clock = fakeTime( - "2100-12-11T17:00:00", - this.currentUser._timezone, - true - ); - }, - - test(assert) { - assert.notOk( - exists("#tap_tile_later_today"), - "it does not have later today" - ); - }, - }); - - componentTest("later today does show if it is before the end of the day", { - template, - - beforeEach() { - this.clock = fakeTime( - "2100-12-11T13:00:00", - this.currentUser._timezone, - true - ); - }, - - test(assert) { - assert.ok(exists("#tap_tile_later_today"), "it does have later today"); - }, - }); - componentTest("prefills the custom reminder type date and time", { template, @@ -189,32 +44,4 @@ discourseModule("Integration | Component | bookmark", function (hooks) { assert.strictEqual(query("#custom-time").value, "09:45"); }, }); - - componentTest("defaults to 08:00 for custom time", { - template, - - async test(assert) { - await click("#tap_tile_custom"); - assert.strictEqual(query("#custom-time").value, "08:00"); - }, - }); - - componentTest("Next Month points to the first day of the next month", { - template, - - beforeEach() { - this.clock = fakeTime( - "2100-01-01T08:00:00", - this.currentUser._timezone, - true - ); - }, - - async test(assert) { - assert.strictEqual( - query("div#tap_tile_next_month div.tap-tile-date").innerText, - "Feb 1, 8:00 am" - ); - }, - }); }); diff --git a/app/assets/javascripts/discourse/tests/integration/components/time-shortcut-picker-test.js b/app/assets/javascripts/discourse/tests/integration/components/time-shortcut-picker-test.js new file mode 100644 index 0000000000..66c4101ad5 --- /dev/null +++ b/app/assets/javascripts/discourse/tests/integration/components/time-shortcut-picker-test.js @@ -0,0 +1,229 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; +import { + discourseModule, + exists, + fakeTime, + query, + queryAll, +} from "discourse/tests/helpers/qunit-helpers"; +import I18n from "I18n"; +import hbs from "htmlbars-inline-precompile"; +import { click } from "@ember/test-helpers"; + +discourseModule( + "Integration | Component | time-shortcut-picker", + function (hooks) { + setupRenderingTest(hooks); + + const template = hbs`{{time-shortcut-picker _itsatrap=itsatrap}}`; + + hooks.beforeEach(function () { + const itsatrapStub = { + bind: () => {}, + unbind: () => {}, + }; + + this.set("itsatrap", itsatrapStub); + }); + + hooks.afterEach(function () { + if (this.clock) { + this.clock.restore(); + } + }); + + componentTest("shows default options", { + template, + + beforeEach() { + const tuesday = "2100-06-08T08:00:00"; + this.clock = fakeTime(tuesday, this.currentUser._timezone, true); + }, + + async test(assert) { + const expected = [ + I18n.t("time_shortcut.later_today"), + I18n.t("time_shortcut.tomorrow"), + I18n.t("time_shortcut.later_this_week"), + I18n.t("time_shortcut.start_of_next_business_week"), + I18n.t("time_shortcut.next_month"), + I18n.t("time_shortcut.custom"), + I18n.t("time_shortcut.none"), + ]; + + const options = Array.from( + queryAll("div.tap-tile-grid div.tap-tile-title").map((_, div) => + div.innerText.trim() + ) + ); + + assert.deepEqual(options, expected); + }, + }); + + componentTest("show 'Later This Week' if today is < Thursday", { + template, + + beforeEach() { + const monday = "2100-06-07T08:00:00"; + this.clock = fakeTime(monday, this.currentUser._timezone, true); + }, + + test(assert) { + assert.ok( + exists("#tap_tile_later_this_week"), + "it has later this week" + ); + }, + }); + + componentTest("does not show 'Later This Week' if today is >= Thursday", { + template, + + beforeEach() { + const thursday = "2100-06-10T08:00:00"; + this.clock = fakeTime(thursday, this.currentUser._timezone, true); + }, + + test(assert) { + assert.notOk( + exists("#tap_tile_later_this_week"), + "it does not have later this week" + ); + }, + }); + + componentTest("does not show 'Later Today' if 'Later Today' is tomorrow", { + template, + + beforeEach() { + this.clock = fakeTime( + "2100-12-11T22:00:00", // + 3 hours is tomorrow + this.currentUser._timezone, + true + ); + }, + + test(assert) { + assert.notOk( + exists("#tap_tile_later_today"), + "it does not have later today" + ); + }, + }); + + componentTest("shows 'Later Today' if it is before 5pm", { + template, + + beforeEach() { + this.clock = fakeTime( + "2100-12-11T16:50:00", + this.currentUser._timezone, + true + ); + }, + + test(assert) { + assert.ok(exists("#tap_tile_later_today"), "it does have later today"); + }, + }); + + componentTest("does not show 'Later Today' if it is after 5pm", { + template, + + beforeEach() { + this.clock = fakeTime( + "2100-12-11T17:00:00", + this.currentUser._timezone, + true + ); + }, + + test(assert) { + assert.notOk( + exists("#tap_tile_later_today"), + "it does not have later today" + ); + }, + }); + + componentTest("defaults to 08:00 for custom time", { + template, + + async test(assert) { + await click("#tap_tile_custom"); + assert.strictEqual(query("#custom-time").value, "08:00"); + }, + }); + + componentTest("shows 'Next Monday' instead of 'Monday' on Sundays", { + template, + + beforeEach() { + const sunday = "2100-01-24T08:00:00"; + this.clock = fakeTime(sunday, this.currentUser._timezone, true); + }, + + async test(assert) { + assert.equal( + query("#tap_tile_start_of_next_business_week .tap-tile-title") + .innerText, + "Next Monday" + ); + + assert.equal( + query("div#tap_tile_start_of_next_business_week div.tap-tile-date") + .innerText, + "Feb 1, 8:00 am" + ); + }, + }); + + componentTest("shows 'Next Monday' instead of 'Monday' on Mondays", { + template, + + beforeEach() { + const monday = "2100-01-25T08:00:00"; + this.clock = fakeTime(monday, this.currentUser._timezone, true); + }, + + async test(assert) { + assert.equal( + query("#tap_tile_start_of_next_business_week .tap-tile-title") + .innerText, + "Next Monday" + ); + + assert.equal( + query("div#tap_tile_start_of_next_business_week div.tap-tile-date") + .innerText, + "Feb 1, 8:00 am" + ); + }, + }); + + componentTest( + "the 'Next Month' option points to the first day of the next month", + { + template, + + beforeEach() { + this.clock = fakeTime( + "2100-01-01T08:00:00", + this.currentUser._timezone, + true + ); + }, + + async test(assert) { + assert.strictEqual( + query("div#tap_tile_next_month div.tap-tile-date").innerText, + "Feb 1, 8:00 am" + ); + }, + } + ); + } +); From e3c5a4043279a82137779d02e358931844dbed55 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Mon, 31 Jan 2022 15:31:13 -0500 Subject: [PATCH 013/194] DEV: Clean up skipped tests (#15747) Many of the tests work now that other, general fixes have been made. I've deleted some that seem to have lost functionality. --- .../discourse-common/addon/lib/get-url.js | 34 +++++- .../tests/acceptance/bookmarks-test.js | 36 +++--- .../tests/acceptance/composer-actions-test.js | 10 +- .../acceptance/composer-edit-conflict-test.js | 23 +--- .../tests/acceptance/composer-test.js | 36 ++---- .../discourse/tests/acceptance/topic-test.js | 103 ++++++++++-------- .../discourse/tests/helpers/qunit-helpers.js | 2 + .../discourse/tests/setup-tests.js | 6 +- 8 files changed, 128 insertions(+), 122 deletions(-) diff --git a/app/assets/javascripts/discourse-common/addon/lib/get-url.js b/app/assets/javascripts/discourse-common/addon/lib/get-url.js index fa1ba6b5c1..4a5a0f1715 100644 --- a/app/assets/javascripts/discourse-common/addon/lib/get-url.js +++ b/app/assets/javascripts/discourse-common/addon/lib/get-url.js @@ -1,6 +1,8 @@ let cdn, baseUrl, baseUri, baseUriMatcher; let S3BaseUrl, S3CDN; +let snapshot; + export default function getURL(url) { if (baseUri === undefined) { setPrefix($('meta[name="discourse-base-uri"]').attr("content") || ""); @@ -59,15 +61,43 @@ export function setPrefix(configBaseUri) { baseUriMatcher = new RegExp(`^${baseUri}(/|$)`); } -export function setupURL(configCdn, configBaseUrl, configBaseUri) { +export function setupURL(configCdn, configBaseUrl, configBaseUri, opts) { + opts = opts || {}; cdn = configCdn; baseUrl = configBaseUrl; setPrefix(configBaseUri); + + if (opts?.snapshot) { + snapshot = { + cdn, + baseUri, + baseUrl, + configBaseUrl, + baseUriMatcher, + }; + } } -export function setupS3CDN(configS3BaseUrl, configS3CDN) { +// In a test environment we might change these values and, after tests, want to restore them. +export function restoreBaseUri() { + if (snapshot) { + cdn = snapshot.cdn; + baseUri = snapshot.baseUri; + baseUrl = snapshot.baseUrl; + baseUriMatcher = snapshot.baseUriMatcher; + S3BaseUrl = snapshot.S3BaseUrl; + S3CDN = snapshot.S3CDN; + } +} + +export function setupS3CDN(configS3BaseUrl, configS3CDN, opts) { S3BaseUrl = configS3BaseUrl; S3CDN = configS3CDN; + if (opts?.snapshot) { + snapshot = snapshot || {}; + snapshot.S3BaseUrl = S3BaseUrl; + snapshot.S3CDN = S3CDN; + } } // We can use this to identify when navigating on the same host but outside of the diff --git a/app/assets/javascripts/discourse/tests/acceptance/bookmarks-test.js b/app/assets/javascripts/discourse/tests/acceptance/bookmarks-test.js index 7672f1a8ad..aae3996900 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/bookmarks-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/bookmarks-test.js @@ -8,7 +8,7 @@ import { import { click, fillIn, visit } from "@ember/test-helpers"; import I18n from "I18n"; import selectKit from "discourse/tests/helpers/select-kit-helper"; -import { skip } from "qunit"; +import { test } from "qunit"; import topicFixtures from "discourse/tests/fixtures/topic"; import { cloneJSON } from "discourse-common/lib/object"; @@ -104,7 +104,7 @@ acceptance("Bookmarking", function (needs) { server.get("/t/280.json", () => helper.response(topicResponse)); }); - skip("Bookmarks modal opening", async function (assert) { + test("Bookmarks modal opening", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(); assert.ok( @@ -113,7 +113,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Bookmarks modal selecting reminder type", async function (assert) { + test("Bookmarks modal selecting reminder type", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(); @@ -133,7 +133,7 @@ acceptance("Bookmarking", function (needs) { await click("#save-bookmark"); }); - skip("Saving a bookmark with a reminder", async function (assert) { + test("Saving a bookmark with a reminder", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(); await fillIn("input#bookmark-name", "Check this out later"); @@ -151,7 +151,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Opening the options panel and remembering the option", async function (assert) { + test("Opening the options panel and remembering the option", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(); await click(".bookmark-options-button"); @@ -174,7 +174,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Saving a bookmark with no reminder or name", async function (assert) { + test("Saving a bookmark with no reminder or name", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(); await click("#save-bookmark"); @@ -191,7 +191,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Deleting a bookmark with a reminder", async function (assert) { + test("Deleting a bookmark with a reminder", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(); await click("#tap_tile_tomorrow"); @@ -221,7 +221,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Cancelling saving a bookmark", async function (assert) { + test("Cancelling saving a bookmark", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(); await click(".d-modal-cancel"); @@ -231,7 +231,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Editing a bookmark", async function (assert) { + test("Editing a bookmark", async function (assert) { await visit("/t/internationalization-localization/280"); let now = moment.tz(loggedInUser().resolvedTimezone(loggedInUser())); let tomorrow = now.add(1, "day").format("YYYY-MM-DD"); @@ -257,7 +257,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Using a post date for the reminder date", async function (assert) { + test("Using a post date for the reminder date", async function (assert) { await visit("/t/internationalization-localization/280"); let postDate = moment.tz( "2036-01-15", @@ -286,7 +286,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Cannot use the post date for a reminder when the post date is in the past", async function (assert) { + test("Cannot use the post date for a reminder when the post date is in the past", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(2); assert.notOk( @@ -295,7 +295,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("The topic level bookmark button deletes all bookmarks if several posts on the topic are bookmarked", async function (assert) { + test("The topic level bookmark button deletes all bookmarks if several posts on the topic are bookmarked", async function (assert) { const yesButton = "a.btn-primary"; const noButton = "a.btn-default"; @@ -341,7 +341,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("The topic level bookmark button opens the edit modal if only the first post on the topic is bookmarked", async function (assert) { + test("The topic level bookmark button opens the edit modal if only the first post on the topic is bookmarked", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(1); await click("#save-bookmark"); @@ -360,7 +360,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Creating and editing a topic level bookmark", async function (assert) { + test("Creating and editing a topic level bookmark", async function (assert) { await visit("/t/internationalization-localization/280"); await click("#topic-footer-button-bookmark"); @@ -432,7 +432,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("Deleting a topic_level bookmark with a reminder", async function (assert) { + test("Deleting a topic_level bookmark with a reminder", async function (assert) { await visit("/t/internationalization-localization/280"); await click("#topic-footer-button-bookmark"); await click("#save-bookmark"); @@ -467,7 +467,7 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("The topic level bookmark button opens the edit modal if only one post in the post stream is bookmarked", async function (assert) { + test("The topic level bookmark button opens the edit modal if only one post in the post stream is bookmarked", async function (assert) { await visit("/t/internationalization-localization/280"); await openBookmarkModal(2); await click("#save-bookmark"); @@ -486,12 +486,12 @@ acceptance("Bookmarking", function (needs) { ); }); - skip("The topic level bookmark button shows an icon with a clock if there is a bookmark with a reminder on the first post", async function (assert) { + test("The topic level bookmark button shows an icon with a clock if there is a bookmark with a reminder on the first post", async function (assert) { const postNumber = 1; await testTopicLevelBookmarkButtonIcon(assert, postNumber); }); - skip("The topic level bookmark button shows an icon with a clock if there is a bookmark with a reminder on the second post", async function (assert) { + test("The topic level bookmark button shows an icon with a clock if there is a bookmark with a reminder on the second post", async function (assert) { const postNumber = 2; await testTopicLevelBookmarkButtonIcon(assert, postNumber); }); diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js index e620fc8809..acc54f4a38 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js @@ -13,7 +13,7 @@ import { Promise } from "rsvp"; import { _clearSnapshots } from "select-kit/components/composer-actions"; import selectKit from "discourse/tests/helpers/select-kit-helper"; import sinon from "sinon"; -import { skip, test } from "qunit"; +import { test } from "qunit"; import { toggleCheckDraftPopup } from "discourse/controllers/composer"; acceptance("Composer Actions", function (needs) { @@ -35,7 +35,7 @@ acceptance("Composer Actions", function (needs) { assert.ok(queryAll(".d-editor-input").val(), "this is the reply"); }); - skip("replying to post", async function (assert) { + test("replying to post", async function (assert) { const composerActions = selectKit(".composer-actions"); await visit("/t/internationalization-localization/280"); @@ -76,7 +76,7 @@ acceptance("Composer Actions", function (needs) { ); }); - skip("replying to post - reply_to_topic", async function (assert) { + test("replying to post - reply_to_topic", async function (assert) { const composerActions = selectKit(".composer-actions"); await visit("/t/internationalization-localization/280"); @@ -103,7 +103,7 @@ acceptance("Composer Actions", function (needs) { ); }); - skip("replying to post - toggle_whisper", async function (assert) { + test("replying to post - toggle_whisper", async function (assert) { const composerActions = selectKit(".composer-actions"); await visit("/t/internationalization-localization/280"); @@ -405,7 +405,7 @@ acceptance("Composer Actions", function (needs) { ); }); - skip("replying to post as TL3 user", async function (assert) { + test("replying to post as TL3 user", async function (assert) { const composerActions = selectKit(".composer-actions"); updateCurrentUser({ moderator: false, admin: false, trust_level: 3 }); diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-edit-conflict-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-edit-conflict-test.js index 651951bd0b..312a295489 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-edit-conflict-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-edit-conflict-test.js @@ -1,7 +1,6 @@ -import { acceptance, queryAll } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import I18n from "I18n"; -import { skip, test } from "qunit"; +import { test } from "qunit"; acceptance("Composer - Edit conflict", function (needs) { needs.user(); @@ -14,24 +13,6 @@ acceptance("Composer - Edit conflict", function (needs) { }); }); - skip("Edit a post that causes an edit conflict", async function (assert) { - await visit("/t/internationalization-localization/280"); - await click(".topic-post:nth-of-type(1) button.show-more-actions"); - await click(".topic-post:nth-of-type(1) button.edit"); - await fillIn(".d-editor-input", "this will 409"); - await click("#reply-control button.create"); - assert.strictEqual( - queryAll("#reply-control button.create").text().trim(), - I18n.t("composer.overwrite_edit"), - "it shows the overwrite button" - ); - assert.ok( - queryAll("#draft-status .d-icon-user-edit"), - "error icon should be there" - ); - await click(".modal .btn-primary"); - }); - test("Should not send originalText when posting a new reply", async function (assert) { await visit("/t/internationalization-localization/280"); await click(".topic-post:nth-of-type(1) button.reply"); diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js index 25e4a0fa46..36af0bda53 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js @@ -17,7 +17,7 @@ import { } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; import I18n from "I18n"; -import { skip, test } from "qunit"; +import { test } from "qunit"; import { Promise } from "rsvp"; import sinon from "sinon"; @@ -43,7 +43,7 @@ acceptance("Composer", function (needs) { }); }); - skip("Tests the Composer controls", async function (assert) { + test("Tests the Composer controls", async function (assert) { await visit("/"); assert.ok(exists("#create-topic"), "the create button is visible"); @@ -58,13 +58,13 @@ acceptance("Composer", function (needs) { "body errors are hidden by default" ); - await click("a.toggle-preview"); + await click(".toggle-preview"); assert.ok( !exists(".d-editor-preview:visible"), "clicking the toggle hides the preview" ); - await click("a.toggle-preview"); + await click(".toggle-preview"); assert.ok( exists(".d-editor-preview:visible"), "clicking the toggle shows the preview again" @@ -116,9 +116,9 @@ acceptance("Composer", function (needs) { ); await click("#reply-control a.cancel"); - assert.ok(exists(".bootbox.modal"), "it pops up a confirmation dialog"); + assert.ok(exists(".d-modal"), "it pops up a confirmation dialog"); - await click(".modal-footer a:nth-of-type(2)"); + await click(".modal-footer .discard-draft"); assert.ok(!exists(".bootbox.modal"), "the confirmation can be cancelled"); }); @@ -234,7 +234,7 @@ acceptance("Composer", function (needs) { ); }); - skip("Posting on a different topic", async function (assert) { + test("Posting on a different topic", async function (assert) { await visit("/t/internationalization-localization/280"); await click("#topic-footer-buttons .btn.create"); await fillIn( @@ -386,24 +386,6 @@ acceptance("Composer", function (needs) { assert.strictEqual(count(".topic-post.staged"), 0); }); - skip("Editing a post can rollback to old content", async function (assert) { - await visit("/t/internationalization-localization/280"); - await click(".topic-post:nth-of-type(1) button.show-more-actions"); - await click(".topic-post:nth-of-type(1) button.edit"); - - await fillIn(".d-editor-input", "this will 409"); - await fillIn("#reply-title", "This is the new text for the title"); - await click("#reply-control button.create"); - - assert.ok(!exists(".topic-post.staged")); - assert.strictEqual( - query(".topic-post .cooked").innerText, - "Any plans to support localization of UI elements, so that I (for example) could set up a completely German speaking forum?" - ); - - await click(".bootbox.modal .btn-primary"); - }); - test("Composer can switch between edits", async function (assert) { await visit("/t/this-is-a-test-topic/9"); @@ -686,7 +668,7 @@ acceptance("Composer", function (needs) { } }); - skip("Can switch states without abandon popup", async function (assert) { + test("Can switch states without abandon popup", async function (assert) { try { toggleCheckDraftPopup(true); @@ -834,7 +816,7 @@ acceptance("Composer", function (needs) { ); }); - skip("Shows duplicate_link notice", async function (assert) { + test("Shows duplicate_link notice", async function (assert) { await visit("/t/internationalization-localization/280"); await click("#topic-footer-buttons .create"); diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-test.js index 8d0a61ca49..da2305ba7d 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-test.js @@ -1,5 +1,6 @@ import { acceptance, + chromeTest, count, exists, query, @@ -16,7 +17,7 @@ import { } from "@ember/test-helpers"; import I18n from "I18n"; import selectKit from "discourse/tests/helpers/select-kit-helper"; -import { skip, test } from "qunit"; +import { test } from "qunit"; import { withPluginApi } from "discourse/lib/plugin-api"; import topicFixtures from "discourse/tests/fixtures/topic"; import { cloneJSON } from "discourse-common/lib/object"; @@ -354,59 +355,69 @@ acceptance("Topic featured links", function (needs) { assert.ok(!exists(".gap"), "it hides gap"); }); - // quote related skip tests were chromeTest before + chromeTest( + "Quoting a quote keeps the original poster name", + async function (assert) { + await visit("/t/internationalization-localization/280"); + await selectText("#post_5 blockquote"); + await click(".quote-button .insert-quote"); - skip("Quoting a quote keeps the original poster name", async function (assert) { - await visit("/t/internationalization-localization/280"); - await selectText("#post_5 blockquote"); - await click(".quote-button .insert-quote"); + assert.ok( + queryAll(".d-editor-input") + .val() + .indexOf('quote="codinghorror said, post:3, topic:280"') !== -1 + ); + } + ); - assert.ok( - queryAll(".d-editor-input") - .val() - .indexOf('quote="codinghorror said, post:3, topic:280"') !== -1 - ); - }); + chromeTest( + "Quoting a quote of a different topic keeps the original topic title", + async function (assert) { + await visit("/t/internationalization-localization/280"); + await selectText("#post_9 blockquote"); + await click(".quote-button .insert-quote"); - skip("Quoting a quote of a different topic keeps the original topic title", async function (assert) { - await visit("/t/internationalization-localization/280"); - await selectText("#post_9 blockquote"); - await click(".quote-button .insert-quote"); + assert.ok( + queryAll(".d-editor-input") + .val() + .indexOf( + 'quote="A new topic with a link to another topic, post:3, topic:62"' + ) !== -1 + ); + } + ); - assert.ok( - queryAll(".d-editor-input") - .val() - .indexOf( - 'quote="A new topic with a link to another topic, post:3, topic:62"' - ) !== -1 - ); - }); + chromeTest( + "Quoting a quote with the Reply button keeps the original poster name", + async function (assert) { + await visit("/t/internationalization-localization/280"); + await selectText("#post_5 blockquote"); + await click(".reply"); - skip("Quoting a quote with the Reply button keeps the original poster name", async function (assert) { - await visit("/t/internationalization-localization/280"); - await selectText("#post_5 blockquote"); - await click(".reply"); - - assert.ok( - queryAll(".d-editor-input") - .val() - .indexOf('quote="codinghorror said, post:3, topic:280"') !== -1 - ); - }); + assert.ok( + queryAll(".d-editor-input") + .val() + .indexOf('quote="codinghorror said, post:3, topic:280"') !== -1 + ); + } + ); // Using J/K on Firefox clean the text selection, so this won't work there - skip("Quoting a quote with replyAsNewTopic keeps the original poster name", async function (assert) { - await visit("/t/internationalization-localization/280"); - await selectText("#post_5 blockquote"); - await triggerKeyEvent(document, "keypress", "j".charCodeAt(0)); - await triggerKeyEvent(document, "keypress", "t".charCodeAt(0)); + chromeTest( + "Quoting a quote with replyAsNewTopic keeps the original poster name", + async function (assert) { + await visit("/t/internationalization-localization/280"); + await selectText("#post_5 blockquote"); + await triggerKeyEvent(document, "keypress", "j".charCodeAt(0)); + await triggerKeyEvent(document, "keypress", "t".charCodeAt(0)); - assert.ok( - queryAll(".d-editor-input") - .val() - .indexOf('quote="codinghorror said, post:3, topic:280"') !== -1 - ); - }); + assert.ok( + queryAll(".d-editor-input") + .val() + .indexOf('quote="codinghorror said, post:3, topic:280"') !== -1 + ); + } + ); test("Quoting by selecting text can mark the quote as full", async function (assert) { await visit("/t/internationalization-localization/280"); diff --git a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js index f99e83fea6..336b6e2491 100644 --- a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js +++ b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js @@ -21,6 +21,7 @@ import { _clearSnapshots } from "select-kit/components/composer-actions"; import { clearHTMLCache } from "discourse/helpers/custom-html"; import createStore from "discourse/tests/helpers/create-store"; import deprecated from "discourse-common/lib/deprecated"; +import { restoreBaseUri } from "discourse-common/lib/get-url"; import { flushMap } from "discourse/services/store"; import { initSearchData } from "discourse/widgets/search-menu"; import { resetPostMenuExtraButtons } from "discourse/widgets/post-menu"; @@ -177,6 +178,7 @@ function testCleanup(container, app) { if (!LEGACY_ENV) { clearPresenceCallbacks(); } + restoreBaseUri(); } export function discourseModule(name, options) { diff --git a/app/assets/javascripts/discourse/tests/setup-tests.js b/app/assets/javascripts/discourse/tests/setup-tests.js index 79715c3cb6..fc589b7d97 100644 --- a/app/assets/javascripts/discourse/tests/setup-tests.js +++ b/app/assets/javascripts/discourse/tests/setup-tests.js @@ -269,11 +269,11 @@ function setupTestsCommon(application, container, config) { const cdn = setupData ? setupData.cdn : null; const baseUri = setupData ? setupData.baseUri : ""; - setupURL(cdn, "http://localhost:3000", baseUri); + setupURL(cdn, "http://localhost:3000", baseUri, { snapshot: true }); if (setupData && setupData.s3BaseUrl) { - setupS3CDN(setupData.s3BaseUrl, setupData.s3Cdn); + setupS3CDN(setupData.s3BaseUrl, setupData.s3Cdn, { snapshot: true }); } else { - setupS3CDN(null, null); + setupS3CDN(null, null, { snapshot: true }); } server = pretender; From 89a051eac16e891c657c8269e2956d0b07c956ca Mon Sep 17 00:00:00 2001 From: "Kyle E. Mitchell" Date: Mon, 31 Jan 2022 14:42:14 -0800 Subject: [PATCH 014/194] UX: Add text-decoration to and (#15726) --- app/assets/stylesheets/common/base/topic-post.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss index 2d4783b1a4..4ca310e6c4 100644 --- a/app/assets/stylesheets/common/base/topic-post.scss +++ b/app/assets/stylesheets/common/base/topic-post.scss @@ -144,17 +144,17 @@ $quote-share-maxwidth: 150px; word-wrap: break-word; } - del, - ins, mark { text-decoration: none; } ins { background-color: var(--success-low); + text-decoration: underline; } del { background-color: var(--danger-low); + text-decoration: line-through; } mark { background-color: var(--highlight); From b1d7a8c3e24e7d5f8fcacaf96f28685f49997e34 Mon Sep 17 00:00:00 2001 From: Noah Gibbs Date: Mon, 31 Jan 2022 22:45:10 +0000 Subject: [PATCH 015/194] FEATURE: Update cppjieba_rb to latest (#15718) --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3faaace264..43e91f371d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -97,7 +97,7 @@ GEM cose (1.2.0) cbor (~> 0.5.9) openssl-signature_algorithm (~> 1.0) - cppjieba_rb (0.3.3) + cppjieba_rb (0.4.2) crack (0.4.5) rexml crass (1.0.6) From fb25333b7f86cdf8c750ab191c64bcd6c9627b0f Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Mon, 31 Jan 2022 23:45:52 +0100 Subject: [PATCH 016/194] DEV: Update oj gem (#15713) https://github.com/ohler55/oj/issues/699 was fixed back in September 2021. --- Gemfile | 4 +--- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 9cdfbf21a9..17f81262cf 100644 --- a/Gemfile +++ b/Gemfile @@ -105,9 +105,7 @@ gem 'omniauth-oauth2', require: false gem 'omniauth-google-oauth2' -# Pinning oj until https://github.com/ohler55/oj/issues/699 is resolved. -# Segfaults and stuck processes after upgrading. -gem 'oj', '3.13.2' +gem 'oj' gem 'pg' gem 'mini_sql' diff --git a/Gemfile.lock b/Gemfile.lock index 43e91f371d..1ef1259fbc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -265,7 +265,7 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 3) - oj (3.13.2) + oj (3.13.11) omniauth (1.9.1) hashie (>= 3.4.6) rack (>= 1.6.2, < 3) @@ -558,7 +558,7 @@ DEPENDENCIES multi_json mustache nokogiri - oj (= 3.13.2) + oj omniauth omniauth-facebook omniauth-github From 48cf5e2fbc7f09ed58892aa822c81ba115b606e6 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Tue, 1 Feb 2022 10:08:58 +0100 Subject: [PATCH 017/194] A11Y: Use `autocomplete="off"` for composer title (#15758) --- .../discourse/app/templates/components/composer-title.hbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/templates/components/composer-title.hbs b/app/assets/javascripts/discourse/app/templates/components/composer-title.hbs index 56674525f1..55f7302f1e 100644 --- a/app/assets/javascripts/discourse/app/templates/components/composer-title.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/composer-title.hbs @@ -5,7 +5,7 @@ placeholderKey=composer.titlePlaceholder aria-label=(I18n composer.titlePlaceholder) disabled=disabled - autocomplete="discourse" + autocomplete="off" }} {{popup-input-tip validation=validation}} From c46b55dc3bd7df0c03bdd959c5e18b01b22938cf Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Tue, 1 Feb 2022 11:28:07 +0100 Subject: [PATCH 018/194] PERF: prevents any fast edit work if you can't edit (#15759) --- .../discourse/app/components/quote-button.js | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/quote-button.js b/app/assets/javascripts/discourse/app/components/quote-button.js index f3af1940fd..0c1ba275ca 100644 --- a/app/assets/javascripts/discourse/app/components/quote-button.js +++ b/app/assets/javascripts/discourse/app/components/quote-button.js @@ -192,22 +192,24 @@ export default Component.extend(KeyEnterEscape, { this.topic.postStream.findLoadedPost(postId)?.can_edit ); - const regexp = new RegExp(regexSafeStr(quoteState.buffer), "gi"); - const matches = postBody.match(regexp); + if (this._canEditPost) { + const regexp = new RegExp(regexSafeStr(quoteState.buffer), "gi"); + const matches = postBody.match(regexp); - if ( - quoteState.buffer.length < 1 || - quoteState.buffer.includes("|") || // tables are too complex - quoteState.buffer.match(/\n/g) || // linebreaks are too complex - matches?.length > 1 // duplicates are too complex - ) { - this.set("_isFastEditable", false); - this.set("_fastEditInitalSelection", null); - this.set("_fastEditNewSelection", null); - } else if (matches?.length === 1) { - this.set("_isFastEditable", true); - this.set("_fastEditInitalSelection", quoteState.buffer); - this.set("_fastEditNewSelection", quoteState.buffer); + if ( + quoteState.buffer.length < 1 || + quoteState.buffer.includes("|") || // tables are too complex + quoteState.buffer.match(/\n/g) || // linebreaks are too complex + matches?.length > 1 // duplicates are too complex + ) { + this.set("_isFastEditable", false); + this.set("_fastEditInitalSelection", null); + this.set("_fastEditNewSelection", null); + } else if (matches?.length === 1) { + this.set("_isFastEditable", true); + this.set("_fastEditInitalSelection", quoteState.buffer); + this.set("_fastEditNewSelection", quoteState.buffer); + } } } From dad2e5e513ae6d0b0103154ef7f4536f29504341 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Tue, 1 Feb 2022 11:55:17 +0100 Subject: [PATCH 019/194] FEATURE: make the use_email_for_username_and_name_suggestions setting visible and on by default on existing sites (#15751) --- config/locales/server.en.yml | 1 + config/site_settings.yml | 1 - ..._and_name_suggestions_on_existing_sites.rb | 25 +++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20220130192155_set_use_email_for_username_and_name_suggestions_on_existing_sites.rb diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 30671b0233..6b2a4ef217 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -2344,6 +2344,7 @@ en: create_revision_on_bulk_topic_moves: "Create revision for first posts when topics are moved into a new category in bulk." allow_changing_staged_user_tracking: "Allow a staged user's category and tag notification preferences to be changed by an admin user." + use_email_for_username_and_name_suggestions: "Use the first part of email addresses for username and name suggestions. Note that this makes it easier for the public to guess full user email addresses (because a large proportion of people share common services like `gmail.com`)." errors: invalid_css_color: "Invalid color. Enter a color name or hex value." diff --git a/config/site_settings.yml b/config/site_settings.yml index 560ad131b8..897a2c6d0f 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -686,7 +686,6 @@ users: default: 2000 hidden: true use_email_for_username_and_name_suggestions: - hidden: true default: false groups: diff --git a/db/migrate/20220130192155_set_use_email_for_username_and_name_suggestions_on_existing_sites.rb b/db/migrate/20220130192155_set_use_email_for_username_and_name_suggestions_on_existing_sites.rb new file mode 100644 index 0000000000..22b19c60db --- /dev/null +++ b/db/migrate/20220130192155_set_use_email_for_username_and_name_suggestions_on_existing_sites.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +class SetUseEmailForUsernameAndNameSuggestionsOnExistingSites < ActiveRecord::Migration[6.1] + def up + result = execute <<~SQL + SELECT created_at + FROM schema_migration_details + ORDER BY created_at + LIMIT 1 + SQL + + # make setting enabled for existing sites + if result.first['created_at'].to_datetime < 1.hour.ago + execute <<~SQL + INSERT INTO site_settings(name, data_type, value, created_at, updated_at) + VALUES('use_email_for_username_and_name_suggestions', 5, 't', NOW(), NOW()) + ON CONFLICT (name) DO NOTHING + SQL + end + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end From bb9015e8116f569f8b25555195fea9977c4b490d Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Tue, 1 Feb 2022 11:58:04 +0100 Subject: [PATCH 020/194] DEV: uses innerHTML to decide if fast-edit is possible (#15760) We don't need raw to decide if we can fast edit or not, we will fetch the raw later when we do the replacement, but this step can be done directly from innerHTML. --- app/assets/javascripts/discourse/app/components/quote-button.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/components/quote-button.js b/app/assets/javascripts/discourse/app/components/quote-button.js index 0c1ba275ca..b4002f8604 100644 --- a/app/assets/javascripts/discourse/app/components/quote-button.js +++ b/app/assets/javascripts/discourse/app/components/quote-button.js @@ -194,7 +194,7 @@ export default Component.extend(KeyEnterEscape, { if (this._canEditPost) { const regexp = new RegExp(regexSafeStr(quoteState.buffer), "gi"); - const matches = postBody.match(regexp); + const matches = cooked.innerHTML.match(regexp); if ( quoteState.buffer.length < 1 || From cd2e7d5436f947cd87fc64ac2039a33fdc3f7abb Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Tue, 1 Feb 2022 13:10:09 +0100 Subject: [PATCH 021/194] FEATURE: show the this weekend option on the bookmark modal (#15755) --- .../app/components/edit-topic-timer-form.js | 14 +------------- .../app/components/time-shortcut-picker.js | 5 +++++ .../javascripts/discourse/app/lib/time-shortcut.js | 11 +++++++++++ .../javascripts/discourse/app/lib/time-utils.js | 1 + .../components/time-shortcut-picker-test.js | 1 + 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js b/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js index aa98c28bb8..f7a726d848 100644 --- a/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js +++ b/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js @@ -14,12 +14,7 @@ import I18n from "I18n"; import { action } from "@ember/object"; import Component from "@ember/component"; import { isEmpty } from "@ember/utils"; -import { - MOMENT_MONDAY, - now, - startOfDay, - thisWeekend, -} from "discourse/lib/time-utils"; +import { MOMENT_MONDAY, now, startOfDay } from "discourse/lib/time-utils"; import KeyboardShortcuts from "discourse/lib/keyboard-shortcuts"; import { TIME_SHORTCUT_TYPES } from "discourse/lib/time-shortcut"; import ItsATrap from "@discourse/itsatrap"; @@ -88,13 +83,6 @@ export default Component.extend({ @discourseComputed() customTimeShortcutOptions() { return [ - { - icon: "bed", - id: "this_weekend", - label: "time_shortcut.this_weekend", - time: thisWeekend(), - timeFormatKey: "dates.time_short_day", - }, { icon: "far-clock", id: "two_weeks", diff --git a/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js b/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js index caee171d91..10219e71fc 100644 --- a/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js +++ b/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js @@ -1,5 +1,6 @@ import { LATER_TODAY_CUTOFF_HOUR, + MOMENT_FRIDAY, MOMENT_THURSDAY, START_OF_DAY_HOUR, laterToday, @@ -283,6 +284,10 @@ export default Component.extend({ if (now(this.userTimezone).day() >= MOMENT_THURSDAY) { this._hideOption(options, TIME_SHORTCUT_TYPES.LATER_THIS_WEEK); } + + if (now(this.userTimezone).day() >= MOMENT_FRIDAY) { + this._hideOption(options, TIME_SHORTCUT_TYPES.THIS_WEEKEND); + } }, _hideOption(options, optionId) { diff --git a/app/assets/javascripts/discourse/app/lib/time-shortcut.js b/app/assets/javascripts/discourse/app/lib/time-shortcut.js index 5d6349afef..7ee30b041c 100644 --- a/app/assets/javascripts/discourse/app/lib/time-shortcut.js +++ b/app/assets/javascripts/discourse/app/lib/time-shortcut.js @@ -6,6 +6,7 @@ import { nextBusinessWeekStart, nextMonth, now, + thisWeekend, tomorrow, } from "discourse/lib/time-utils"; import I18n from "I18n"; @@ -13,6 +14,7 @@ import I18n from "I18n"; export const TIME_SHORTCUT_TYPES = { LATER_TODAY: "later_today", TOMORROW: "tomorrow", + THIS_WEEKEND: "this_weekend", NEXT_MONTH: "next_month", CUSTOM: "custom", RELATIVE: "relative", @@ -48,6 +50,15 @@ export function defaultShortcutOptions(timezone) { I18n.t("dates.time_short_day") ), }, + { + icon: "bed", + id: TIME_SHORTCUT_TYPES.THIS_WEEKEND, + label: "time_shortcut.this_weekend", + time: thisWeekend(timezone), + timeFormatted: thisWeekend(timezone).format( + I18n.t("dates.time_short_day") + ), + }, { icon: "briefcase", id: TIME_SHORTCUT_TYPES.START_OF_NEXT_BUSINESS_WEEK, diff --git a/app/assets/javascripts/discourse/app/lib/time-utils.js b/app/assets/javascripts/discourse/app/lib/time-utils.js index 114b151af4..5266362e5b 100644 --- a/app/assets/javascripts/discourse/app/lib/time-utils.js +++ b/app/assets/javascripts/discourse/app/lib/time-utils.js @@ -6,6 +6,7 @@ export const LATER_TODAY_MAX_HOUR = 18; export const MOMENT_SUNDAY = 0; export const MOMENT_MONDAY = 1; export const MOMENT_THURSDAY = 4; +export const MOMENT_FRIDAY = 5; export const MOMENT_SATURDAY = 6; export function now(timezone) { diff --git a/app/assets/javascripts/discourse/tests/integration/components/time-shortcut-picker-test.js b/app/assets/javascripts/discourse/tests/integration/components/time-shortcut-picker-test.js index 66c4101ad5..443e886669 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/time-shortcut-picker-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/time-shortcut-picker-test.js @@ -47,6 +47,7 @@ discourseModule( I18n.t("time_shortcut.later_today"), I18n.t("time_shortcut.tomorrow"), I18n.t("time_shortcut.later_this_week"), + I18n.t("time_shortcut.this_weekend"), I18n.t("time_shortcut.start_of_next_business_week"), I18n.t("time_shortcut.next_month"), I18n.t("time_shortcut.custom"), From 810391f47416bdeeb31beb6d22fa7c6ad50932a2 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Tue, 1 Feb 2022 13:55:26 +0100 Subject: [PATCH 022/194] FIX: some options on the topic timer modal weren't timezone aware (#15749) These options weren't timezone aware: - Two Weeks - Six Months --- .../discourse/app/components/edit-topic-timer-form.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js b/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js index f7a726d848..f3d984bcd5 100644 --- a/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js +++ b/app/assets/javascripts/discourse/app/components/edit-topic-timer-form.js @@ -82,19 +82,20 @@ export default Component.extend({ @discourseComputed() customTimeShortcutOptions() { + const timezone = this.currentUser.resolvedTimezone(this.currentUser); return [ { icon: "far-clock", id: "two_weeks", label: "time_shortcut.two_weeks", - time: startOfDay(now().add(2, "weeks").day(MOMENT_MONDAY)), + time: startOfDay(now(timezone).add(2, "weeks").day(MOMENT_MONDAY)), timeFormatKey: "dates.long_no_year", }, { icon: "far-calendar-plus", id: "six_months", label: "time_shortcut.six_months", - time: startOfDay(now().add(6, "months").startOf("month")), + time: startOfDay(now(timezone).add(6, "months").startOf("month")), timeFormatKey: "dates.long_no_year", }, ]; From 3f694e4ab595f1646f726b5487a8eb9c892587da Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Tue, 1 Feb 2022 11:18:13 -0300 Subject: [PATCH 023/194] FEATURE: Use native color-picker (#15748) --- .../admin/addon/components/color-input.js | 60 +-- .../discourse/app/lib/public-js-versions.js | 2 - .../app/templates/components/color-input.hbs | 4 +- .../components/edit-category-general.hbs | 4 +- .../stylesheets/common/admin/customize.scss | 3 +- .../stylesheets/common/admin/settings.scss | 9 - .../stylesheets/common/base/colorpicker.scss | 8 - .../stylesheets/common/components/_index.scss | 1 + .../common/components/color-input.scss | 31 ++ lib/tasks/javascript.rake | 7 - package.json | 1 - .../spectrum-colorpicker/1.8.0/spectrum.css | 507 ------------------ .../spectrum-colorpicker/1.8.0/spectrum.js | 1 - public/javascripts/spectrum.css | 507 ------------------ public/javascripts/spectrum.js | 1 - yarn.lock | 5 - 16 files changed, 60 insertions(+), 1091 deletions(-) create mode 100644 app/assets/stylesheets/common/components/color-input.scss delete mode 100644 public/javascripts/spectrum-colorpicker/1.8.0/spectrum.css delete mode 100644 public/javascripts/spectrum-colorpicker/1.8.0/spectrum.js delete mode 100644 public/javascripts/spectrum.css delete mode 100644 public/javascripts/spectrum.js diff --git a/app/assets/javascripts/admin/addon/components/color-input.js b/app/assets/javascripts/admin/addon/components/color-input.js index c7a8da4b78..2974b43871 100644 --- a/app/assets/javascripts/admin/addon/components/color-input.js +++ b/app/assets/javascripts/admin/addon/components/color-input.js @@ -1,8 +1,6 @@ import { action, computed } from "@ember/object"; -import loadScript, { loadCSS } from "discourse/lib/load-script"; import Component from "@ember/component"; import { observes } from "discourse-common/utils/decorators"; -import { schedule } from "@ember/runloop"; /** An input field for a color. @@ -22,13 +20,25 @@ export default Component.extend({ return this.onlyHex ? 6 : null; }), + normalizedHexValue: computed("hexValue", function () { + return this.normalize(this.hexValue); + }), + normalize(color) { - if (/^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(color)) { + if (this._valid(color)) { if (!color.startsWith("#")) { color = "#" + color; } + if (color.length === 4) { + color = + "#" + + color + .slice(1) + .split("") + .map((hex) => hex + hex) + .join(""); + } } - return color; }, @@ -39,49 +49,25 @@ export default Component.extend({ } }, + @action + onPickerInput(event) { + this.set("hexValue", event.target.value.replace("#", "")); + }, + @observes("hexValue", "brightnessValue", "valid") hexValueChanged() { const hex = this.hexValue; - let text = this.element.querySelector("input.hex-input"); if (this.attrs.onChangeColor) { this.attrs.onChangeColor(this.normalize(hex)); } - if (this.valid) { - this.styleSelection && - text.setAttribute( - "style", - "color: " + - (this.brightnessValue > 125 ? "black" : "white") + - "; background-color: #" + - hex + - ";" - ); - - if (this.pickerLoaded) { - $(this.element.querySelector(".picker")).spectrum({ - color: "#" + hex, - }); - } - } else { - this.styleSelection && text.setAttribute("style", ""); + if (this._valid()) { + this.element.querySelector(".picker").value = this.normalize(hex); } }, - didInsertElement() { - loadScript("/javascripts/spectrum.js").then(() => { - loadCSS("/javascripts/spectrum.css").then(() => { - schedule("afterRender", () => { - $(this.element.querySelector(".picker")) - .spectrum({ color: "#" + this.hexValue }) - .on("change.spectrum", (me, color) => { - this.set("hexValue", color.toHexString().replace("#", "")); - }); - this.set("pickerLoaded", true); - }); - }); - }); - schedule("afterRender", () => this.hexValueChanged()); + _valid(color = this.hexValue) { + return /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(color); }, }); diff --git a/app/assets/javascripts/discourse/app/lib/public-js-versions.js b/app/assets/javascripts/discourse/app/lib/public-js-versions.js index 4c3d3160d1..393052736c 100644 --- a/app/assets/javascripts/discourse/app/lib/public-js-versions.js +++ b/app/assets/javascripts/discourse/app/lib/public-js-versions.js @@ -11,6 +11,4 @@ export const PUBLIC_JS_VERSIONS = { "jquery.magnific-popup.min.js": "magnific-popup/1.1.0/jquery.magnific-popup.min.js", "pikaday.js": "pikaday/1.8.0/pikaday.js", - "spectrum.js": "spectrum-colorpicker/1.8.0/spectrum.js", - "spectrum.css": "spectrum-colorpicker/1.8.0/spectrum.css", }; diff --git a/app/assets/javascripts/discourse/app/templates/components/color-input.hbs b/app/assets/javascripts/discourse/app/templates/components/color-input.hbs index f8d8503a38..2d6a1bf703 100644 --- a/app/assets/javascripts/discourse/app/templates/components/color-input.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/color-input.hbs @@ -1,7 +1,7 @@ -{{text-field +{{#if onlyHex}}#{{/if}}{{text-field class="hex-input" value=hexValue maxlength=maxlength input=(action "onHexInput" value="target.value") }} - + diff --git a/app/assets/javascripts/discourse/app/templates/components/edit-category-general.hbs b/app/assets/javascripts/discourse/app/templates/components/edit-category-general.hbs index ce5b09c68d..8e16ab00a9 100644 --- a/app/assets/javascripts/discourse/app/templates/components/edit-category-general.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/edit-category-general.hbs @@ -64,7 +64,7 @@
{{i18n "category.background_color"}}:
- #{{text-field value=category.color placeholderKey="category.color_placeholder" maxlength="6"}} + {{color-input hexValue=category.color valid=category.colorValid}} {{color-picker colors=backgroundColors usedColors=usedBackgroundColors value=category.color}}
@@ -72,7 +72,7 @@
{{i18n "category.foreground_color"}}:
- #{{text-field value=category.text_color placeholderKey="category.color_placeholder" maxlength="6"}} + {{color-input hexValue=category.text_color}} {{color-picker colors=foregroundColors value=category.text_color id="edit-text-color"}}
diff --git a/app/assets/stylesheets/common/admin/customize.scss b/app/assets/stylesheets/common/admin/customize.scss index dfeff7a4a7..c134aa3452 100644 --- a/app/assets/stylesheets/common/admin/customize.scss +++ b/app/assets/stylesheets/common/admin/customize.scss @@ -557,10 +557,9 @@ td.actions { width: 200px; } - .hex-input { + .color-picker input { width: 80px; margin-bottom: 0; - margin-right: 6px; } th.overriden { text-align: right; diff --git a/app/assets/stylesheets/common/admin/settings.scss b/app/assets/stylesheets/common/admin/settings.scss index 6fb4134d8a..c27a0606a3 100644 --- a/app/assets/stylesheets/common/admin/settings.scss +++ b/app/assets/stylesheets/common/admin/settings.scss @@ -107,15 +107,6 @@ font-size: $font-0; font-weight: normal; } - - &.color { - .color-picker { - display: flex; - .picker + .sp-replacer { - border-left: none; - } - } - } } .setting.overridden { h3 { diff --git a/app/assets/stylesheets/common/base/colorpicker.scss b/app/assets/stylesheets/common/base/colorpicker.scss index 4ebb76ae78..47f8329019 100644 --- a/app/assets/stylesheets/common/base/colorpicker.scss +++ b/app/assets/stylesheets/common/base/colorpicker.scss @@ -14,14 +14,6 @@ .colorpicker-wrapper { display: flex; align-items: flex-start; - .add-on { - @include form-item-sizing; - background-color: var(--primary-low); - border-color: var(--primary-medium); - border-right-color: transparent; - padding-left: 0.5em; - padding-right: 0.5em; - } } .colors-container { diff --git a/app/assets/stylesheets/common/components/_index.scss b/app/assets/stylesheets/common/components/_index.scss index 3329133022..0e58e6cb64 100644 --- a/app/assets/stylesheets/common/components/_index.scss +++ b/app/assets/stylesheets/common/components/_index.scss @@ -3,6 +3,7 @@ @import "bookmark-list"; @import "bookmark-modal"; @import "buttons"; +@import "color-input"; @import "conditional-loading-section"; @import "convert-to-public-topic-modal"; @import "date-input"; diff --git a/app/assets/stylesheets/common/components/color-input.scss b/app/assets/stylesheets/common/components/color-input.scss new file mode 100644 index 0000000000..60462b499e --- /dev/null +++ b/app/assets/stylesheets/common/components/color-input.scss @@ -0,0 +1,31 @@ +.color-picker { + display: flex; + * { + height: 35px; + } + .add-on { + @include form-item-sizing; + background-color: var(--primary-low); + border-color: var(--primary-medium); + border-right-color: transparent; + padding-left: 0.5em; + padding-right: 0.5em; + } + .hex-input { + margin-right: 0; + } + .picker { + padding: 0; + border-left: none; + cursor: pointer; + margin-bottom: 0; + } + // Reset webkit/blink default style + input[type="color"]::-webkit-color-swatch-wrapper { + padding: 0; + } + input[type="color"]::-webkit-color-swatch { + border: none; + border-radius: 0; // Reset webkit specific style + } +} diff --git a/lib/tasks/javascript.rake b/lib/tasks/javascript.rake index 70570efe0b..b7751a4962 100644 --- a/lib/tasks/javascript.rake +++ b/lib/tasks/javascript.rake @@ -89,13 +89,6 @@ def dependencies }, { source: 'pikaday/pikaday.js', public: true - }, { - source: 'spectrum-colorpicker/spectrum.js', - uglify: true, - public: true - }, { - source: 'spectrum-colorpicker/spectrum.css', - public: true }, { source: 'handlebars/dist/handlebars.js' }, { diff --git a/package.json b/package.json index 366bd58e0e..94dd81290e 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "moment-timezone": "0.5.31", "moment-timezone-names-translations": "https://github.com/discourse/moment-timezone-names-translations", "pikaday": "1.8.0", - "spectrum-colorpicker": "1.8.0", "workbox-cacheable-response": "^4.3.1", "workbox-core": "^4.3.1", "workbox-expiration": "^4.3.1", diff --git a/public/javascripts/spectrum-colorpicker/1.8.0/spectrum.css b/public/javascripts/spectrum-colorpicker/1.8.0/spectrum.css deleted file mode 100644 index a8ad9e4f82..0000000000 --- a/public/javascripts/spectrum-colorpicker/1.8.0/spectrum.css +++ /dev/null @@ -1,507 +0,0 @@ -/*** -Spectrum Colorpicker v1.8.0 -https://github.com/bgrins/spectrum -Author: Brian Grinstead -License: MIT -***/ - -.sp-container { - position:absolute; - top:0; - left:0; - display:inline-block; - *display: inline; - *zoom: 1; - /* https://github.com/bgrins/spectrum/issues/40 */ - z-index: 9999994; - overflow: hidden; -} -.sp-container.sp-flat { - position: relative; -} - -/* Fix for * { box-sizing: border-box; } */ -.sp-container, -.sp-container * { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */ -.sp-top { - position:relative; - width: 100%; - display:inline-block; -} -.sp-top-inner { - position:absolute; - top:0; - left:0; - bottom:0; - right:0; -} -.sp-color { - position: absolute; - top:0; - left:0; - bottom:0; - right:20%; -} -.sp-hue { - position: absolute; - top:0; - right:0; - bottom:0; - left:84%; - height: 100%; -} - -.sp-clear-enabled .sp-hue { - top:33px; - height: 77.5%; -} - -.sp-fill { - padding-top: 80%; -} -.sp-sat, .sp-val { - position: absolute; - top:0; - left:0; - right:0; - bottom:0; -} - -.sp-alpha-enabled .sp-top { - margin-bottom: 18px; -} -.sp-alpha-enabled .sp-alpha { - display: block; -} -.sp-alpha-handle { - position:absolute; - top:-4px; - bottom: -4px; - width: 6px; - left: 50%; - cursor: pointer; - border: 1px solid black; - background: white; - opacity: .8; -} -.sp-alpha { - display: none; - position: absolute; - bottom: -14px; - right: 0; - left: 0; - height: 8px; -} -.sp-alpha-inner { - border: solid 1px #333; -} - -.sp-clear { - display: none; -} - -.sp-clear.sp-clear-display { - background-position: center; -} - -.sp-clear-enabled .sp-clear { - display: block; - position:absolute; - top:0px; - right:0; - bottom:0; - left:84%; - height: 28px; -} - -/* Don't allow text selection */ -.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button { - -webkit-user-select:none; - -moz-user-select: -moz-none; - -o-user-select:none; - user-select: none; -} - -.sp-container.sp-input-disabled .sp-input-container { - display: none; -} -.sp-container.sp-buttons-disabled .sp-button-container { - display: none; -} -.sp-container.sp-palette-buttons-disabled .sp-palette-button-container { - display: none; -} -.sp-palette-only .sp-picker-container { - display: none; -} -.sp-palette-disabled .sp-palette-container { - display: none; -} - -.sp-initial-disabled .sp-initial { - display: none; -} - - -/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */ -.sp-sat { - background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)"; - filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81'); -} -.sp-val { - background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)"; - filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000'); -} - -.sp-hue { - background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000)); - background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); -} - -/* IE filters do not support multiple color stops. - Generate 6 divs, line them up, and do two color gradients for each. - Yes, really. - */ -.sp-1 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00'); -} -.sp-2 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00'); -} -.sp-3 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff'); -} -.sp-4 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff'); -} -.sp-5 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff'); -} -.sp-6 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000'); -} - -.sp-hidden { - display: none !important; -} - -/* Clearfix hack */ -.sp-cf:before, .sp-cf:after { content: ""; display: table; } -.sp-cf:after { clear: both; } -.sp-cf { *zoom: 1; } - -/* Mobile devices, make hue slider bigger so it is easier to slide */ -@media (max-device-width: 480px) { - .sp-color { right: 40%; } - .sp-hue { left: 63%; } - .sp-fill { padding-top: 60%; } -} -.sp-dragger { - border-radius: 5px; - height: 5px; - width: 5px; - border: 1px solid #fff; - background: #000; - cursor: pointer; - position:absolute; - top:0; - left: 0; -} -.sp-slider { - position: absolute; - top:0; - cursor:pointer; - height: 3px; - left: -1px; - right: -1px; - border: 1px solid #000; - background: white; - opacity: .8; -} - -/* -Theme authors: -Here are the basic themeable display options (colors, fonts, global widths). -See http://bgrins.github.io/spectrum/themes/ for instructions. -*/ - -.sp-container { - border-radius: 0; - background-color: #ECECEC; - border: solid 1px #f0c49B; - padding: 0; -} -.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear { - font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.sp-top { - margin-bottom: 3px; -} -.sp-color, .sp-hue, .sp-clear { - border: solid 1px #666; -} - -/* Input */ -.sp-input-container { - float:right; - width: 100px; - margin-bottom: 4px; -} -.sp-initial-disabled .sp-input-container { - width: 100%; -} -.sp-input { - font-size: 12px !important; - border: 1px inset; - padding: 4px 5px; - margin: 0; - width: 100%; - background:transparent; - border-radius: 3px; - color: #222; -} -.sp-input:focus { - border: 1px solid orange; -} -.sp-input.sp-validation-error { - border: 1px solid red; - background: #fdd; -} -.sp-picker-container , .sp-palette-container { - float:left; - position: relative; - padding: 10px; - padding-bottom: 300px; - margin-bottom: -290px; -} -.sp-picker-container { - width: 172px; - border-left: solid 1px #fff; -} - -/* Palettes */ -.sp-palette-container { - border-right: solid 1px #ccc; -} - -.sp-palette-only .sp-palette-container { - border: 0; -} - -.sp-palette .sp-thumb-el { - display: block; - position:relative; - float:left; - width: 24px; - height: 15px; - margin: 3px; - cursor: pointer; - border:solid 2px transparent; -} -.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active { - border-color: orange; -} -.sp-thumb-el { - position:relative; -} - -/* Initial */ -.sp-initial { - float: left; - border: solid 1px #333; -} -.sp-initial span { - width: 30px; - height: 25px; - border:none; - display:block; - float:left; - margin:0; -} - -.sp-initial .sp-clear-display { - background-position: center; -} - -/* Buttons */ -.sp-palette-button-container, -.sp-button-container { - float: right; -} - -/* Replacer (the little preview div that shows up instead of the ) */ -.sp-replacer { - margin:0; - overflow:hidden; - cursor:pointer; - padding: 4px; - display:inline-block; - *zoom: 1; - *display: inline; - border: solid 1px #91765d; - background: #eee; - color: #333; - vertical-align: middle; -} -.sp-replacer:hover, .sp-replacer.sp-active { - border-color: #F0C49B; - color: #111; -} -.sp-replacer.sp-disabled { - cursor:default; - border-color: silver; - color: silver; -} -.sp-dd { - padding: 2px 0; - height: 16px; - line-height: 16px; - float:left; - font-size:10px; -} -.sp-preview { - position:relative; - width:25px; - height: 20px; - border: solid 1px #222; - margin-right: 5px; - float:left; - z-index: 0; -} - -.sp-palette { - *width: 220px; - max-width: 220px; -} -.sp-palette .sp-thumb-el { - width:16px; - height: 16px; - margin:2px 1px; - border: solid 1px #d0d0d0; -} - -.sp-container { - padding-bottom:0; -} - - -/* Buttons: http://hellohappy.org/css3-buttons/ */ -.sp-container button { - background-color: #eeeeee; - background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc); - background-image: -moz-linear-gradient(top, #eeeeee, #cccccc); - background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); - background-image: -o-linear-gradient(top, #eeeeee, #cccccc); - background-image: linear-gradient(to bottom, #eeeeee, #cccccc); - border: 1px solid #ccc; - border-bottom: 1px solid #bbb; - border-radius: 3px; - color: #333; - font-size: 14px; - line-height: 1; - padding: 5px 4px; - text-align: center; - text-shadow: 0 1px 0 #eee; - vertical-align: middle; -} -.sp-container button:hover { - background-color: #dddddd; - background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -o-linear-gradient(top, #dddddd, #bbbbbb); - background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); - border: 1px solid #bbb; - border-bottom: 1px solid #999; - cursor: pointer; - text-shadow: 0 1px 0 #ddd; -} -.sp-container button:active { - border: 1px solid #aaa; - border-bottom: 1px solid #888; - -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; -} -.sp-cancel { - font-size: 11px; - color: #d93f3f !important; - margin:0; - padding:2px; - margin-right: 5px; - vertical-align: middle; - text-decoration:none; - -} -.sp-cancel:hover { - color: #d93f3f !important; - text-decoration: underline; -} - - -.sp-palette span:hover, .sp-palette span.sp-thumb-active { - border-color: #000; -} - -.sp-preview, .sp-alpha, .sp-thumb-el { - position:relative; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); -} -.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner { - display:block; - position:absolute; - top:0;left:0;bottom:0;right:0; -} - -.sp-palette .sp-thumb-inner { - background-position: 50% 50%; - background-repeat: no-repeat; -} - -.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); -} - -.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); -} - -.sp-clear-display { - background-repeat:no-repeat; - background-position: center; - background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==); -} diff --git a/public/javascripts/spectrum-colorpicker/1.8.0/spectrum.js b/public/javascripts/spectrum-colorpicker/1.8.0/spectrum.js deleted file mode 100644 index cf74825511..0000000000 --- a/public/javascripts/spectrum-colorpicker/1.8.0/spectrum.js +++ /dev/null @@ -1 +0,0 @@ -!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof exports&&"object"==typeof module?module.exports=t(require("jquery")):t(jQuery)}(function(jt,Et){"use strict";function Dt(t,e,r,n){for(var a=[],i=0;i')}else{var u="sp-clear-display";a.push(jt("
").append(jt('').attr("title",n.noColorSelectedText)).html())}}return"
"+a.join("")+"
"}function It(){for(var t=0;tMath.abs(e-a);nt=i?"x":"y"}}else nt=null;var o=!nt||"y"===nt;(!nt||"x"===nt)&&(Y=parseFloat(t/z)),o&&(G=parseFloat((B-e)/B)),Ot=!1,F.showAlpha||(Q=1),_()},s,l),Rt?(m(Rt),x(),Ft=F.preferredFormat||tinycolor(Rt).format,i(Rt)):x(),T&&d();var r=Xt?"mousedown.spectrum":"click.spectrum touchstart.spectrum";vt.delegate(".sp-thumb-el",r,t),mt.delegate(".sp-thumb-el:nth-child(1)",r,{ignore:!0},t)}function a(){if(q&&window.localStorage){try{var t=window.localStorage[q].split(",#");1et;)tt.shift();if(q&&window.localStorage)try{window.localStorage[q]=tt.join(";")}catch(r){}}}function o(){var t=[];if(F.showPalette)for(var e=0;el&&nc&&a","
","
","
"].join(""),Qt=function(){var t="";if(Xt)for(var e=1;e<=6;e++)t+="
";return["
","
","
","
","","
","
","
","
","
","
","
","
","
","
","
","
","
","
","
","
","
",t,"
","
","
","
","
","","
","
","
","","","
","
","
"].join("")}(),i="spectrum.id";jt.fn.spectrum=function(r){if("string"!=typeof r)return this.spectrum("destroy").each(function(){var t=e(this,jt.extend({},r,jt(this).data()));jt(this).data(i,t.id)});var n=this,a=Array.prototype.slice.call(arguments,1);return this.each(function(){var t=Wt[jt(this).data(i)];if(t){var e=t[r];if(!e)throw new Error("Spectrum: no such method: '"+r+"'");"get"==r?n=t.get():"container"==r?n=t.container:"option"==r?n=t.option.apply(t,a):"destroy"==r?(t.destroy(),jt(this).removeData(i)):e.apply(t,a)}}),n},jt.fn.spectrum.load=!0,jt.fn.spectrum.loadOpts={},jt.fn.spectrum.draggable=Kt,jt.fn.spectrum.defaults=a,jt.fn.spectrum.inputTypeColorSupport=function $t(){if("undefined"==typeof $t._cachedResult){var t=jt("")[0];$t._cachedResult="color"===t.type&&""!==t.value}return $t._cachedResult},jt.spectrum={},jt.spectrum.localization={},jt.spectrum.palettes={},jt.fn.spectrum.processNativeColorInputs=function(){var t=jt("input[type=color]");t.length&&!$t()&&t.spectrum({preferredFormat:"hex6"})},function(){function n(t){var e={r:0,g:0,b:0},r=1,n=!1,a=!1;return"string"==typeof t&&(t=T(t)),"object"==typeof t&&(t.hasOwnProperty("r")&&t.hasOwnProperty("g")&&t.hasOwnProperty("b")?(e=i(t.r,t.g,t.b),n=!0,a="%"===String(t.r).substr(-1)?"prgb":"rgb"):t.hasOwnProperty("h")&&t.hasOwnProperty("s")&&t.hasOwnProperty("v")?(t.s=R(t.s),t.v=R(t.v),e=l(t.h,t.s,t.v),n=!0,a="hsv"):t.hasOwnProperty("h")&&t.hasOwnProperty("s")&&t.hasOwnProperty("l")&&(t.s=R(t.s),t.l=R(t.l),e=o(t.h,t.s,t.l),n=!0,a="hsl"),t.hasOwnProperty("a")&&(r=t.a)),r=x(r),{ok:n,format:t.format||a,r:D(255,I(e.r,0)),g:D(255,I(e.g,0)),b:D(255,I(e.b,0)),a:r}}function i(t,e,r){return{r:255*k(t,255),g:255*k(e,255),b:255*k(r,255)}}function a(t,e,r){t=k(t,255),e=k(e,255),r=k(r,255);var n,a,i=I(t,e,r),o=D(t,e,r),s=(i+o)/2;if(i==o)n=a=0;else{var l=i-o;switch(a=.5>1)+720)%360;--e;)n.h=(n.h+a)%360,i.push(B(n));return i}function w(t,e){e=e||6;for(var r=B(t).toHsv(),n=r.h,a=r.s,i=r.v,o=[],s=1/e;e--;)o.push(B({h:n,s:a,v:i})),i=(i+s)%1;return o}function _(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}function x(t){return t=parseFloat(t),(isNaN(t)||t<0||1) */ -.sp-replacer { - margin:0; - overflow:hidden; - cursor:pointer; - padding: 4px; - display:inline-block; - *zoom: 1; - *display: inline; - border: solid 1px #91765d; - background: #eee; - color: #333; - vertical-align: middle; -} -.sp-replacer:hover, .sp-replacer.sp-active { - border-color: #F0C49B; - color: #111; -} -.sp-replacer.sp-disabled { - cursor:default; - border-color: silver; - color: silver; -} -.sp-dd { - padding: 2px 0; - height: 16px; - line-height: 16px; - float:left; - font-size:10px; -} -.sp-preview { - position:relative; - width:25px; - height: 20px; - border: solid 1px #222; - margin-right: 5px; - float:left; - z-index: 0; -} - -.sp-palette { - *width: 220px; - max-width: 220px; -} -.sp-palette .sp-thumb-el { - width:16px; - height: 16px; - margin:2px 1px; - border: solid 1px #d0d0d0; -} - -.sp-container { - padding-bottom:0; -} - - -/* Buttons: http://hellohappy.org/css3-buttons/ */ -.sp-container button { - background-color: #eeeeee; - background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc); - background-image: -moz-linear-gradient(top, #eeeeee, #cccccc); - background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); - background-image: -o-linear-gradient(top, #eeeeee, #cccccc); - background-image: linear-gradient(to bottom, #eeeeee, #cccccc); - border: 1px solid #ccc; - border-bottom: 1px solid #bbb; - border-radius: 3px; - color: #333; - font-size: 14px; - line-height: 1; - padding: 5px 4px; - text-align: center; - text-shadow: 0 1px 0 #eee; - vertical-align: middle; -} -.sp-container button:hover { - background-color: #dddddd; - background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -o-linear-gradient(top, #dddddd, #bbbbbb); - background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); - border: 1px solid #bbb; - border-bottom: 1px solid #999; - cursor: pointer; - text-shadow: 0 1px 0 #ddd; -} -.sp-container button:active { - border: 1px solid #aaa; - border-bottom: 1px solid #888; - -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; -} -.sp-cancel { - font-size: 11px; - color: #d93f3f !important; - margin:0; - padding:2px; - margin-right: 5px; - vertical-align: middle; - text-decoration:none; - -} -.sp-cancel:hover { - color: #d93f3f !important; - text-decoration: underline; -} - - -.sp-palette span:hover, .sp-palette span.sp-thumb-active { - border-color: #000; -} - -.sp-preview, .sp-alpha, .sp-thumb-el { - position:relative; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); -} -.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner { - display:block; - position:absolute; - top:0;left:0;bottom:0;right:0; -} - -.sp-palette .sp-thumb-inner { - background-position: 50% 50%; - background-repeat: no-repeat; -} - -.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); -} - -.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); -} - -.sp-clear-display { - background-repeat:no-repeat; - background-position: center; - background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==); -} diff --git a/public/javascripts/spectrum.js b/public/javascripts/spectrum.js deleted file mode 100644 index cf74825511..0000000000 --- a/public/javascripts/spectrum.js +++ /dev/null @@ -1 +0,0 @@ -!function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof exports&&"object"==typeof module?module.exports=t(require("jquery")):t(jQuery)}(function(jt,Et){"use strict";function Dt(t,e,r,n){for(var a=[],i=0;i')}else{var u="sp-clear-display";a.push(jt("
").append(jt('').attr("title",n.noColorSelectedText)).html())}}return"
"+a.join("")+"
"}function It(){for(var t=0;tMath.abs(e-a);nt=i?"x":"y"}}else nt=null;var o=!nt||"y"===nt;(!nt||"x"===nt)&&(Y=parseFloat(t/z)),o&&(G=parseFloat((B-e)/B)),Ot=!1,F.showAlpha||(Q=1),_()},s,l),Rt?(m(Rt),x(),Ft=F.preferredFormat||tinycolor(Rt).format,i(Rt)):x(),T&&d();var r=Xt?"mousedown.spectrum":"click.spectrum touchstart.spectrum";vt.delegate(".sp-thumb-el",r,t),mt.delegate(".sp-thumb-el:nth-child(1)",r,{ignore:!0},t)}function a(){if(q&&window.localStorage){try{var t=window.localStorage[q].split(",#");1et;)tt.shift();if(q&&window.localStorage)try{window.localStorage[q]=tt.join(";")}catch(r){}}}function o(){var t=[];if(F.showPalette)for(var e=0;el&&nc&&a","
","
","
"].join(""),Qt=function(){var t="";if(Xt)for(var e=1;e<=6;e++)t+="
";return["
","
","
","
","","
","
","
","
","
","
","
","
","
","
","
","
","
","
","
","
","
",t,"
","
","
","
","
","","
","
","
","","","
","
","
"].join("")}(),i="spectrum.id";jt.fn.spectrum=function(r){if("string"!=typeof r)return this.spectrum("destroy").each(function(){var t=e(this,jt.extend({},r,jt(this).data()));jt(this).data(i,t.id)});var n=this,a=Array.prototype.slice.call(arguments,1);return this.each(function(){var t=Wt[jt(this).data(i)];if(t){var e=t[r];if(!e)throw new Error("Spectrum: no such method: '"+r+"'");"get"==r?n=t.get():"container"==r?n=t.container:"option"==r?n=t.option.apply(t,a):"destroy"==r?(t.destroy(),jt(this).removeData(i)):e.apply(t,a)}}),n},jt.fn.spectrum.load=!0,jt.fn.spectrum.loadOpts={},jt.fn.spectrum.draggable=Kt,jt.fn.spectrum.defaults=a,jt.fn.spectrum.inputTypeColorSupport=function $t(){if("undefined"==typeof $t._cachedResult){var t=jt("")[0];$t._cachedResult="color"===t.type&&""!==t.value}return $t._cachedResult},jt.spectrum={},jt.spectrum.localization={},jt.spectrum.palettes={},jt.fn.spectrum.processNativeColorInputs=function(){var t=jt("input[type=color]");t.length&&!$t()&&t.spectrum({preferredFormat:"hex6"})},function(){function n(t){var e={r:0,g:0,b:0},r=1,n=!1,a=!1;return"string"==typeof t&&(t=T(t)),"object"==typeof t&&(t.hasOwnProperty("r")&&t.hasOwnProperty("g")&&t.hasOwnProperty("b")?(e=i(t.r,t.g,t.b),n=!0,a="%"===String(t.r).substr(-1)?"prgb":"rgb"):t.hasOwnProperty("h")&&t.hasOwnProperty("s")&&t.hasOwnProperty("v")?(t.s=R(t.s),t.v=R(t.v),e=l(t.h,t.s,t.v),n=!0,a="hsv"):t.hasOwnProperty("h")&&t.hasOwnProperty("s")&&t.hasOwnProperty("l")&&(t.s=R(t.s),t.l=R(t.l),e=o(t.h,t.s,t.l),n=!0,a="hsl"),t.hasOwnProperty("a")&&(r=t.a)),r=x(r),{ok:n,format:t.format||a,r:D(255,I(e.r,0)),g:D(255,I(e.g,0)),b:D(255,I(e.b,0)),a:r}}function i(t,e,r){return{r:255*k(t,255),g:255*k(e,255),b:255*k(r,255)}}function a(t,e,r){t=k(t,255),e=k(e,255),r=k(r,255);var n,a,i=I(t,e,r),o=D(t,e,r),s=(i+o)/2;if(i==o)n=a=0;else{var l=i-o;switch(a=.5>1)+720)%360;--e;)n.h=(n.h+a)%360,i.push(B(n));return i}function w(t,e){e=e||6;for(var r=B(t).toHsv(),n=r.h,a=r.s,i=r.v,o=[],s=1/e;e--;)o.push(B({h:n,s:a,v:i})),i=(i+s)%1;return o}function _(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}function x(t){return t=parseFloat(t),(isNaN(t)||t<0||1 Date: Tue, 1 Feb 2022 15:28:50 +0100 Subject: [PATCH 024/194] PERF: attempts to resort to compute markdown in less cases (#15762) --- .../javascripts/discourse/app/components/quote-button.js | 9 +++++++-- app/assets/javascripts/discourse/app/lib/utilities.js | 6 +++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/quote-button.js b/app/assets/javascripts/discourse/app/components/quote-button.js index b4002f8604..a8a4de73de 100644 --- a/app/assets/javascripts/discourse/app/components/quote-button.js +++ b/app/assets/javascripts/discourse/app/components/quote-button.js @@ -5,6 +5,7 @@ import { popupAjaxError } from "discourse/lib/ajax-error"; import { postUrl, selectedElement, + selectedRange, selectedText, setCaretPosition, translateModKey, @@ -164,10 +165,14 @@ export default Component.extend(KeyEnterEscape, { const cooked = $selectedElement.find(".cooked")[0] || $selectedElement.closest(".cooked")[0]; - const postBody = toMarkdown(cooked.innerHTML); + // computing markdown takes a lot of time on long posts + // this code attempts to compute it only when we can't fast track let opts = { - full: _selectedText === postBody, + full: + selectedRange().startOffset > 0 + ? false + : _selectedText === toMarkdown(cooked.innerHTML), }; for ( diff --git a/app/assets/javascripts/discourse/app/lib/utilities.js b/app/assets/javascripts/discourse/app/lib/utilities.js index dff0909873..ddb80fafb2 100644 --- a/app/assets/javascripts/discourse/app/lib/utilities.js +++ b/app/assets/javascripts/discourse/app/lib/utilities.js @@ -207,9 +207,13 @@ export function selectedText() { } export function selectedElement() { + return selectedRange()?.commonAncestorContainer; +} + +export function selectedRange() { const selection = window.getSelection(); if (selection.rangeCount > 0) { - return selection.getRangeAt(0).commonAncestorContainer; + return selection.getRangeAt(0); } } From 022480b461b0c4c2afe1dab70964f31da09439d8 Mon Sep 17 00:00:00 2001 From: Discourse Translator Bot Date: Tue, 1 Feb 2022 10:15:18 -0500 Subject: [PATCH 025/194] Update translations (#15763) --- config/locales/client.ar.yml | 1 - config/locales/client.da.yml | 1 - config/locales/client.el.yml | 1 - config/locales/client.es.yml | 3 +- config/locales/client.et.yml | 1 - config/locales/client.fi.yml | 1 - config/locales/client.fr.yml | 1 - config/locales/client.gl.yml | 1 - config/locales/client.hu.yml | 1 + config/locales/client.it.yml | 2 +- config/locales/client.ja.yml | 1 - config/locales/client.ko.yml | 1 - config/locales/client.lt.yml | 1 - config/locales/client.nb_NO.yml | 1 - config/locales/client.nl.yml | 1 - config/locales/client.pl_PL.yml | 46 ++++++++++- config/locales/client.pt_BR.yml | 1 - config/locales/client.ru.yml | 2 +- config/locales/client.sv.yml | 1 - config/locales/client.tr_TR.yml | 26 +++--- config/locales/client.uk.yml | 1 - config/locales/client.vi.yml | 1 - config/locales/client.zh_CN.yml | 3 +- config/locales/server.ar.yml | 2 - config/locales/server.be.yml | 1 - config/locales/server.bg.yml | 1 - config/locales/server.ca.yml | 2 - config/locales/server.da.yml | 2 - config/locales/server.de.yml | 4 +- config/locales/server.es.yml | 29 ++++++- config/locales/server.fi.yml | 2 - config/locales/server.fr.yml | 2 - config/locales/server.gl.yml | 2 - config/locales/server.he.yml | 4 +- config/locales/server.hu.yml | 1 - config/locales/server.hy.yml | 1 - config/locales/server.it.yml | 4 +- config/locales/server.ja.yml | 2 - config/locales/server.ko.yml | 2 - config/locales/server.lt.yml | 2 - config/locales/server.nb_NO.yml | 1 - config/locales/server.nl.yml | 2 - config/locales/server.pl_PL.yml | 82 ++++++++++++++++++- config/locales/server.pt.yml | 2 - config/locales/server.pt_BR.yml | 2 - config/locales/server.ru.yml | 5 +- config/locales/server.sl.yml | 2 - config/locales/server.sv.yml | 2 - config/locales/server.sw.yml | 1 - config/locales/server.tr_TR.yml | 7 +- config/locales/server.uk.yml | 2 - config/locales/server.ur.yml | 2 - config/locales/server.zh_CN.yml | 2 - config/locales/server.zh_TW.yml | 1 - .../config/locales/client.nb_NO.yml | 4 +- .../config/locales/server.nb_NO.yml | 6 +- plugins/poll/config/locales/server.es.yml | 3 + plugins/poll/config/locales/server.pl_PL.yml | 11 +++ .../styleguide/config/locales/client.es.yml | 2 + .../config/locales/client.pl_PL.yml | 2 + public/403.nb_NO.html | 2 +- 61 files changed, 208 insertions(+), 97 deletions(-) diff --git a/config/locales/client.ar.yml b/config/locales/client.ar.yml index 0c9966d58d..1b18005b49 100644 --- a/config/locales/client.ar.yml +++ b/config/locales/client.ar.yml @@ -3597,7 +3597,6 @@ ar: default_list_filter: "تصفية القائمة الافتراضية:" allow_badges_label: "السماح بمنح الشارات في هذه الفئة" edit_permissions: "تعديل الأذونات" - reviewable_by_group: "بالإضافة إلى فريق العمل، يمكن أيضًا مراجعة المحتوى في هذه الفئة بواسطة:" review_group_name: "اسم المجموعة" require_topic_approval: "طلب موافقة المشرف على جميع الموضوعات الجديدة" require_reply_approval: "طلب موافقة المشرف على جميع الردود الجديدة" diff --git a/config/locales/client.da.yml b/config/locales/client.da.yml index c36d656876..bb4b8c35a1 100644 --- a/config/locales/client.da.yml +++ b/config/locales/client.da.yml @@ -2951,7 +2951,6 @@ da: default_list_filter: "Standard Listefilter:" allow_badges_label: "Tillad at emblemer bliver tildelt i denne kategori" edit_permissions: "Redigér tilladelser" - reviewable_by_group: "Ud over personalet kan indholdet i denne kategori også gennemgås af:" review_group_name: "gruppe navn" require_topic_approval: "Kræv moderator godkendelse af alle nye emner" require_reply_approval: "Kræv moderator godkendelse af alle nye svar" diff --git a/config/locales/client.el.yml b/config/locales/client.el.yml index 87ee105f0d..7dc8579350 100644 --- a/config/locales/client.el.yml +++ b/config/locales/client.el.yml @@ -2590,7 +2590,6 @@ el: default_list_filter: "Προεπιλεγμένο φίλτρο λίστας:" allow_badges_label: "Να επιτρέπεται η απονομή παράσημων σε αυτή την κατηγορία" edit_permissions: "Επεξεργασία Δικαιωμάτων" - reviewable_by_group: "Εκτός από το προσωπικό, το περιεχόμενο αυτής της κατηγορίας μπορεί επίσης να αναθεωρηθεί από:" review_group_name: "όνομα ομάδας" require_topic_approval: "Απαιτήστε έγκριση συντονιστή για όλα τα νέα θέματα" require_reply_approval: "Απαιτήστε έγκριση συντονιστή για όλες τις νέες απαντήσεις" diff --git a/config/locales/client.es.yml b/config/locales/client.es.yml index aa74ab52cc..cdbf2b7774 100644 --- a/config/locales/client.es.yml +++ b/config/locales/client.es.yml @@ -173,6 +173,7 @@ es: themes: default_description: "Por defecto" broken_theme_alert: "Tu sitio puede que no funcione porque el tema / componente %{theme} tiene errores. Desactívalo en %{path}." + broken_decorator_alert: "Puede que las publicaciones no se muestren correctamente porque uno de los decoradores de contenido de publicaciones de tu sitio está causando errores. Revisa la consola de desarrollo del navegador para más información." s3: regions: ap_northeast_1: "Asia-Pacífico (Tokio)" @@ -3071,7 +3072,7 @@ es: default_list_filter: "Filtro de lista por defecto:" allow_badges_label: "Permitir que se concedan insignias en esta categoría" edit_permissions: "Editar permisos" - reviewable_by_group: "Además del personal, el contenido de esta categoría también puede ser revisado por:" + reviewable_by_group: "Además del personal, los siguientes grupos también pueden revisar el contenido de esta categoría:" review_group_name: "nombre del grupo" require_topic_approval: "Requiere aprobación del moderador para todos los temas nuevos" require_reply_approval: "Requiere aprobación del moderador para todas las respuestas nuevas" diff --git a/config/locales/client.et.yml b/config/locales/client.et.yml index f6715004b1..504aa48878 100644 --- a/config/locales/client.et.yml +++ b/config/locales/client.et.yml @@ -2161,7 +2161,6 @@ et: default_list_filter: "Vaikimisi teemade filter:" allow_badges_label: "Luba selles foorumis autasustamist märgistega" edit_permissions: "Muuda kasutusõigusi" - reviewable_by_group: "Lisaks meeskonnaliikmetle saavad selle kategooria sisu üle vaadata ka:" review_group_name: "grupi nimi" require_topic_approval: "Nõua moderaatori heakskiitu kõikidele uutele teemadele" require_reply_approval: "Nõua moderaatori heakskiitu kõikidele uutele vastustele" diff --git a/config/locales/client.fi.yml b/config/locales/client.fi.yml index 2023530ff0..2754c9d528 100644 --- a/config/locales/client.fi.yml +++ b/config/locales/client.fi.yml @@ -2956,7 +2956,6 @@ fi: default_list_filter: "Oletusluettelosuodatin:" allow_badges_label: "Salli kunniamerkkien myöntäminen tällä alueella" edit_permissions: "Muokkaa oikeuksia" - reviewable_by_group: "Henkilökunnan lisäksi tämän alueen sisältöä voi käsitellä myös:" review_group_name: "ryhmän nimi" require_topic_approval: "Edellytä valvojan hyväksyntää kaikille uusille ketjuille" require_reply_approval: "Edellytä valvojan hyväksyntää kaikille uusille vastauksille" diff --git a/config/locales/client.fr.yml b/config/locales/client.fr.yml index 7fb29a47ab..7e27bb35c9 100644 --- a/config/locales/client.fr.yml +++ b/config/locales/client.fr.yml @@ -2953,7 +2953,6 @@ fr: default_list_filter: "Filtre de liste par défaut :" allow_badges_label: "Autoriser les badges à être accordés dans cette catégorie" edit_permissions: "Modifier les permissions" - reviewable_by_group: "En plus des responsables, le contenu de cette catégorie peut également être examiné par :" review_group_name: "nom du groupe" require_topic_approval: "Nécessiter l'approbation pour chaque nouveau sujet" require_reply_approval: "Nécessiter l'approbation pour chaque nouvelle réponse" diff --git a/config/locales/client.gl.yml b/config/locales/client.gl.yml index 36640a9f85..99ff2f9390 100644 --- a/config/locales/client.gl.yml +++ b/config/locales/client.gl.yml @@ -2859,7 +2859,6 @@ gl: default_list_filter: "Filtro de listaxe predeterminado:" allow_badges_label: "Permitir adxudicar insignias nesta categoría" edit_permissions: "Editar permisos" - reviewable_by_group: "Ademais do equipo, o contido desta categoría tamén pode ser revisado por:" review_group_name: "nome do grupo" require_topic_approval: "Require a aprobación de todos os temas novos polo moderador" require_reply_approval: "Require a aprobación de todas as respostas novas polo moderador" diff --git a/config/locales/client.hu.yml b/config/locales/client.hu.yml index b3740c40c3..82e68cdf11 100644 --- a/config/locales/client.hu.yml +++ b/config/locales/client.hu.yml @@ -2834,6 +2834,7 @@ hu: default_view: "Alapértelmezett témakörök" allow_badges_label: "Kitűzök elnyerésének engedélyezése ebben a kategóriában" edit_permissions: "Jogok szerkesztése" + reviewable_by_group: "Az ebbe a kategóriába tartozó tartalmakat a stábon kívül a következők is jóváhagyhatják:" review_group_name: "csoport neve" this_year: "ez az év" position: "Kategóriák oldalon elfoglalt pozíció:" diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 071cad8bfe..3d7a8cedb3 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -3026,7 +3026,7 @@ it: default_list_filter: "Filtro predefinito della lista:" allow_badges_label: "Permetti l'assegnazione di distintivi in questa categoria" edit_permissions: "Modifica Permessi" - reviewable_by_group: "Oltre allo staff, i contenuti di questa categoria possono essere esaminati da:" + reviewable_by_group: "Oltre che dal personale, i contenuti di questa categoria possono essere revisionati anche da:" review_group_name: "nome gruppo" require_topic_approval: "Richiedi l'approvazione di un moderatore per tutti i nuovi argomenti" require_reply_approval: "Richiedi l'approvazione di un moderatore per tutte le nuove risposte" diff --git a/config/locales/client.ja.yml b/config/locales/client.ja.yml index e326491dad..015a753c73 100644 --- a/config/locales/client.ja.yml +++ b/config/locales/client.ja.yml @@ -2886,7 +2886,6 @@ ja: default_list_filter: "デフォルトのリストのフィルタ:" allow_badges_label: "このカテゴリでバッジの付与を許可する" edit_permissions: "権限を編集" - reviewable_by_group: "このカテゴリのコンテンツはスタッフのほか、次のユーザーもレビューできる:" review_group_name: "グループ名" require_topic_approval: "すべての新しいトピックにモデレーターの承認を必要とする" require_reply_approval: "すべての新しい返信にモデレーターの承認を必要とする" diff --git a/config/locales/client.ko.yml b/config/locales/client.ko.yml index cc281b0f28..f0aa11e425 100644 --- a/config/locales/client.ko.yml +++ b/config/locales/client.ko.yml @@ -2918,7 +2918,6 @@ ko: default_list_filter: "목록 기본 필터:" allow_badges_label: "배지가 이 카테고리에서 주어질 수 있도록 허용" edit_permissions: "권한 수정" - reviewable_by_group: "이 카테고리의 콘텐츠는 관리자 외에도 다음과 같은 방법으로 검토할 수 있습니다." review_group_name: "그룹명" require_topic_approval: "모든 새 글에 대한 관리자 승인 필요" require_reply_approval: "모든 새 댓글의 관리자 승인 필요" diff --git a/config/locales/client.lt.yml b/config/locales/client.lt.yml index b1781dad16..90ba3bde66 100644 --- a/config/locales/client.lt.yml +++ b/config/locales/client.lt.yml @@ -2898,7 +2898,6 @@ lt: default_list_filter: "Numatytasis sąrašo filtras:" allow_badges_label: "Leisti trofėjų apdovanojimus šioje kategorijoje" edit_permissions: "Redaguoti leidimus" - reviewable_by_group: "Be darbuotojų, šios kategorijos turinį taip pat gali peržiūrėti:" review_group_name: "grupės pavadinimas" require_topic_approval: "Reikalauti, kad moderatorius patvirtintų visas naujas temas" require_reply_approval: "Reikalauti, kad moderatorius patvirtintų visus naujus atsakymus" diff --git a/config/locales/client.nb_NO.yml b/config/locales/client.nb_NO.yml index b746a61132..8d2099c08d 100644 --- a/config/locales/client.nb_NO.yml +++ b/config/locales/client.nb_NO.yml @@ -2910,7 +2910,6 @@ nb_NO: default_list_filter: "Standard listefilter:" allow_badges_label: "Tillat merker å bli tildelt i denne kategorien" edit_permissions: "Rediger tillatelser" - reviewable_by_group: "I tillegg til de ansatte, kan innholdet i denne kategorien også gjennomgås ved å:" review_group_name: "gruppenavn" require_topic_approval: "Krev godkjennelse fra moderator for alle nye emner" require_reply_approval: "Krev godkjennelse fra moderator for alle nye svar" diff --git a/config/locales/client.nl.yml b/config/locales/client.nl.yml index 9dc5da0738..42ecdae32a 100644 --- a/config/locales/client.nl.yml +++ b/config/locales/client.nl.yml @@ -2970,7 +2970,6 @@ nl: default_list_filter: "Standaard lijstfilter:" allow_badges_label: "Badges laten toekennen in deze categorie" edit_permissions: "Toestemmingen bewerken" - reviewable_by_group: "Naast stafleden kan inhoud in deze categorie ook worden beoordeeld door:" review_group_name: "groepsnaam" require_topic_approval: "Goedkeuring van moderator voor alle nieuwe topics vereisen" require_reply_approval: "Goedkeuring van moderator voor alle nieuwe antwoorden vereisen" diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index b3e6699ab6..9afeb4bab5 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -219,6 +219,7 @@ pl_PL: themes: default_description: "Domyślny" broken_theme_alert: "Twoja strona może nie działać, bo motyw / komponent %{theme} zawiera błędy. Wyłącz go w %{path}." + broken_decorator_alert: "Posty mogą nie wyświetlać się poprawnie, ponieważ jeden z dekoratorów treści postów w Twojej witrynie zgłosił błąd. Sprawdź narzędzia programistyczne przeglądarki, aby uzyskać więcej informacji." s3: regions: ap_northeast_1: "Azja i Pacyfik (Tokio)" @@ -1250,6 +1251,8 @@ pl_PL: warnings: "Oficjalne ostrzeżenia" read_more_in_group: "Chcesz przeczytać więcej? Przeglądaj inne wiadomości w %{groupLink}." read_more: "Chcesz przeczytać więcej? Przeglądaj inne wiadomości w wiadomościach osobistych." + read_more_group_pm_MF: "Masz do zobaczenia { UNREAD, plural, =0 {} one { # nieprzeczytaną wiadomość } few { # nieprzeczytane wiadomości } many { # nieprzeczytanych wiadomości } other { # nieprzeczytanych wiadomości } } { NEW, plural, =0 {} one { {BOTH, select, true{i } false {} other{}} # nową wiadomość } few {} many {} other { {BOTH, select, true{i } false {are } other{}} # nowych wiadomości} }lub przeglądaj inne wiadomości w {groupLink}" + read_more_personal_pm_MF: "Masz do zobaczenia { UNREAD, plural, =0 {} one { # nieprzeczytaną wiadomość } few { # nieprzeczytane wiadomości } many { # nieprzeczytanych wiadomości } other { # nieprzeczytanych } } { NEW, plural, =0 {} one { {BOTH, select, true{i } false {} other{}} # nową wiadomość} few {} many {} other { {BOTH, select, true{and } false {are } other{}} # nowych wiadomości} } lub przeglądaj inne wiadomości osobiste" preferences_nav: account: "Konto" security: "Bezpieczeństwo" @@ -1503,9 +1506,11 @@ pl_PL: every_month: "każdego miesiąca" every_six_months: "co 6 miesięcy" email_level: + title: "Wyślij do mnie e-maila, gdy jestem cytowany, odpowiadam, pojawia się moja @nazwa_użytkownika lub gdy pojawia się nowa aktywność w moich obserwowanych kategoriach, tagach lub tematach" always: "zawsze" only_when_away: "tylko kiedy jest daleko" never: "nigdy" + email_messages_level: "Wyślij do mnie e-mail, gdy otrzymam wiadomość osobistą" include_tl0_in_digests: "Dołącz treści od nowych użytkowników w e-mailach podsumowujących." email_in_reply_to: "Zawieraj w e-mailach fragment oryginalnych postów z odpowiedzi" other_settings: "Inne" @@ -2061,6 +2066,16 @@ pl_PL: few: "Wspominając %{group}, powiadomisz %{count} osoby – czy jesteś pewien?" many: "Wspominając %{group}, powiadomisz %{count} osób – czy jesteś pewien?" other: "Wspominając %{group}, powiadomisz %{count} osób –czy jesteś pewien?" + cannot_see_mention: + category: "Wspomniano o @%{username}, lecz nie zostannie on powiadomiony, ponieważ nie ma dostępu do tej kategorii. Będziesz musiał dodać go do grupy, która ma dostęp do tej kategorii." + private: "Wspomniano o @%{username}, lecz nie zostannie on powiadomiony, ponieważ nie może zobaczyć tej wiadomości osobistej. Będziesz musiał zaprosić go do tej wiadomości osobistej." + muted_topic: "Wspomniałeś o @%{username}, lecz nie zostanie on powiadomiony, ponieważ wyciszył ten temat." + not_allowed: "Wspomniałeś o @%{username}, lecz nie zostanie on powiadomiony, ponieważ nie został zaproszony do tego tematu." + here_mention: + one: "Wspominając @%{here}, masz zamiar powiadomić %{count} użytkownika – czy jesteś pewien?" + few: "Wspominając @%{here}, masz zamiar powiadomić %{count} użytkowników – czy jesteś pewien?" + many: "Wspominając @%{here}, masz zamiar powiadomić %{count} użytkowników – czy jesteś pewien?" + other: "Wspominając @%{here}, masz zamiar powiadomić %{count} użytkowników – czy jesteś pewien?" duplicate_link: "Wygląda na to, że Twój link do %{domain} został już wcześniej przesłany w tym wątku przez @%{username} w odpowiedzi przesłanej %{ago} - jesteś pewien, że chcesz go wysłać ponownie?" reference_topic_title: "Odpowiedz: %{title}" error: @@ -2253,6 +2268,11 @@ pl_PL: reaction_2: "%{username}, %{username2} %{description}" votes_released: "%{description} - zakończone" dismiss_confirmation: + body: + one: "Jesteś pewny? Masz %{count} ważne powiadomienie." + few: "Jesteś pewny? Masz %{count} ważne powiadomienia." + many: "Jesteś pewny? Masz %{count} ważnych powiadomień." + other: "Jesteś pewny? Masz %{count} ważnych powiadomień." dismiss: "Odrzuć" cancel: "Anuluj" group_message_summary: @@ -2342,6 +2362,8 @@ pl_PL: in_topics_posts: "we wszystkich tematach i postach" enter_hint: "lub naciśnij Enter" in_posts_by: "w postach %{username}" + browser_tip: "%{modifier} + f" + browser_tip_description: "ponownie, aby użyć natywnego wyszukiwania w przeglądarce" recent: "Ostatnie wyszukiwania" clear_recent: "Wyczyść ostatnie wyszukiwania" type: @@ -2781,6 +2803,11 @@ pl_PL: help: "udostępnij odnośnik do tego tematu" instructions: "Udostępnij link do tego tematu:" copied: "Link do tematu skopiowany." + restricted_groups: + one: "Widoczne tylko dla członków grupy: %{groupNames}" + few: "Widoczne tylko dla członków grup: %{groupNames}" + many: "Widoczne tylko dla członków grup: %{groupNames}" + other: "Widoczne tylko dla członków grup: %{groupNames}" notify_users: title: "Powiadom" instructions: "Powiadom następujących użytkowników o tym temacie:" @@ -3311,7 +3338,7 @@ pl_PL: default_list_filter: "Domyślny filtr listy:" allow_badges_label: "Włącz przyznawanie odznak na podstawie aktywności w tej kategorii" edit_permissions: "Edytuj uprawnienia" - reviewable_by_group: "Oprócz personelu, treści w tej kategorii mogą być również przeglądane przez:" + reviewable_by_group: "Oprócz personelu, treści w tej kategorii mogą również przeglądać:" review_group_name: "nazwa grupy" require_topic_approval: "Wymagaj zatwierdzenia moderatora dla wszystkich nowych tematów" require_reply_approval: "Wymagaj zatwierdzenia moderatora dla wszystkich nowych odpowiedzi" @@ -3698,6 +3725,7 @@ pl_PL: title: "Menu wyszukiwania" prev_next: "%{shortcut} Przesuń zaznaczenie w górę i w dół" insert_url: "%{shortcut} Wstaw zaznaczenie do otwartego edytora" + full_page_search: "%{shortcut} Uruchamia wyszukiwanie na całej stronie" badges: earned_n_times: one: "Otrzymano tę odznakę %{count} raz" @@ -3761,12 +3789,18 @@ pl_PL: changed: "zmienione tagi:" tags: "Tagi" choose_for_topic: "tagi opcjonalne" + choose_for_topic_required: + one: "wybierz co najmniej %{count} tag..." + few: "wybierz co najmniej %{count} tagi..." + many: "wybierz co najmniej %{count} tagów..." + other: "wybierz co najmniej %{count} tagów..." info: "Informacje" default_info: "Ten tag nie jest ograniczony do żadnych kategorii i nie ma synonimów." staff_info: "Aby dodać ograniczenia, umieść ten znacznik w grupie znaczników." category_restricted: "Ten tag jest ograniczony do kategorii, do których nie masz uprawnień dostępu." synonyms: "Synonimy" synonyms_description: "W przypadku użycia następujących tagów zostaną one zastąpione przez %{base_tag_name}." + save: "Zapisz nazwę i opis tagu" tag_groups_info: one: 'Ten tag należy do grupy "%{tag_groups}”.' few: "Ten tag należy do następujących grup: %{tag_groups}." @@ -4134,6 +4168,7 @@ pl_PL: no_description: (brak opisu) all_api_keys: Wszystkie klucze API user_mode: Poziom użytkownika + scope_mode: Zakres impersonate_all_users: Podszywanie się pod dowolnego użytkownika single_user: "Pojedynczy użytkownik" user_placeholder: Wprowadź nazwę użytkownika @@ -4150,6 +4185,7 @@ pl_PL: Możesz określić, które parametry będą dozwolone. Użyj przecinków, aby oddzielić wiele wartości. title: Zakresy read_only: Tylko do odczytu + global: Globalny global_description: Klucz API nie ma ograniczeń i wszystkie punkty końcowe są dostępne. resource: Zasób action: Akcja @@ -4167,6 +4203,8 @@ pl_PL: wordpress: Niezbędne do działania wtyczki wp-discourse na WordPress. posts: edit: Edytuj dowolny post lub konkretny. + uploads: + create: Prześlij nowy plik lub zainicjuj pojedyncze lub wieloczęściowe bezpośrednie wysyłanie do zewnętrznego magazynu. users: bookmarks: Lista zakładek użytkownika. Zwraca przypomnienia o zakładkach podczas korzystania z formatu ICS. sync_sso: Zsynchronizuj użytkownika za pomocą DiscourseConnect. @@ -4180,9 +4218,13 @@ pl_PL: email: receive_emails: Połącz ten zakres z odbiorcą poczty w celu przetwarzania przychodzących wiadomości e-mail. badges: + create: Utwórz nową odznakę. + show: Uzyskaj informacje o odznace. update: Zaktualizuj odznakę. delete: Usuń odznakę. list_user_badges: Lista odznak użytkownika. + assign_badge_to_user: Przypisz odznakę użytkownikowi. + revoke_badge_from_user: Odbierz odznakę użytkownikowi. web_hooks: title: "Webhooki" none: "Brak webhooków" @@ -4555,6 +4597,7 @@ pl_PL: Zdecydowanie zalecamy dodawanie przedrostków do nazw zmiennych, aby uniknąć konfliktów z wtyczkami i/lub silnikiem forum. head_tag: + text: "Nagłówek" title: "HTML, który zostanie wstawiony przed tagiem head" body_tag: text: "Body" @@ -5419,6 +5462,7 @@ pl_PL: grant_existing_holders: Przyznaj dodatkowe odznaki obecnym posiadaczom odznak emoji: title: "Emoji" + help: "Dodaj nowe emotikony, które będą dostępne dla wszystkich. Przeciągnij i upuść wiele plików jednocześnie bez wprowadzania nazwy, aby utworzyć emotikony za pomocą ich nazw plików. Wybrana grupa zostanie użyta dla wszystkich plików, które są dodawane w tym samym czasie. Możesz także kliknąć przycisk „Dodaj nową emotikonę”, aby otworzyć selektor plików." add: "Dodaj nowe Emoji" choose_files: "Wybierz pliki" uploading: "Przesyłanie…" diff --git a/config/locales/client.pt_BR.yml b/config/locales/client.pt_BR.yml index bf41186220..c16f88cd46 100644 --- a/config/locales/client.pt_BR.yml +++ b/config/locales/client.pt_BR.yml @@ -3074,7 +3074,6 @@ pt_BR: default_list_filter: "Filtro de lista padrão:" allow_badges_label: "Permitir a concessão de emblemas nesta categoria" edit_permissions: "Editar permissões" - reviewable_by_group: "Além da equipe, o conteúdo desta categoria também pode ser revisado por:" review_group_name: "nome do grupo" require_topic_approval: "Requer aprovação dos moderadores(as) de todos os novos tópicos" require_reply_approval: "Requer aprovação dos moderadores(as) de todas as novas respostas" diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index d5d5b5724c..0e66af9990 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -3340,7 +3340,7 @@ ru: default_list_filter: "Фильтр по умолчанию:" allow_badges_label: "Разрешить вручение наград в этом разделе" edit_permissions: "Изменить права доступа" - reviewable_by_group: "Кто ещё, помимо персонала, может модерировать содержимое этого раздела:" + reviewable_by_group: "Помимо сотрудников, содержимое этого раздела также могут модерировать:" review_group_name: "Название группы" require_topic_approval: "Требовать одобрения модератором всех новых тем" require_reply_approval: "Требовать одобрения модератором всех новых ответов" diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 3399fe1cce..08cb2549b4 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -3074,7 +3074,6 @@ sv: default_list_filter: "Standardlistfilter:" allow_badges_label: "Tillåt utmärkelser i den här kategorin" edit_permissions: "Redigera behörigheter" - reviewable_by_group: "Förutom av personal kan innehåll i denna kategori också granskas av:" review_group_name: "gruppnamn" require_topic_approval: "Kräv att en moderator godkänner alla nya ämnen" require_reply_approval: "Kräv att en moderator godkänner alla nya svar" diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index 7ab6c7a14c..df59d07695 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -778,7 +778,7 @@ tr_TR: title: one: "Gruplar" other: "Gruplar" - activity: "Aktivite" + activity: "Etkinlik" members: title: "Üyeler" filter_placeholder_admin: "kullanıcı adı veya e-posta" @@ -971,7 +971,7 @@ tr_TR: saturday: "Cumartesi" sunday: "Pazar" to: "kime" - activity_stream: "Hareketler" + activity_stream: "Etkinlik" read: "Okunmuş" read_help: "Son okunan konular" preferences: "Tercihler" @@ -1058,12 +1058,12 @@ tr_TR: suspended_permanently: "Bu kullanıcı beklemeye alındı." suspended_reason: "Sebep: " github_profile: "Github" - email_activity_summary: "Aktivite özeti" + email_activity_summary: "Etkinlik Özeti" mailing_list_mode: label: "Gönderi listesi modu" enabled: "Gönderi listesi modunu etkinleştir" instructions: | - Bu ayar aktivite özetini geçersiz kılar.
+ Bu ayar etkinlik özetini geçersiz kılar.
Sessize alınmış konular ve kategoriler bu e-postalarda yer almaz. individual: "Her yeni gönderi için bir e-posta gönder" individual_no_echo: "Kendi gönderilerim haricindeki her gönderi için e-posta gönder" @@ -2255,7 +2255,7 @@ tr_TR: hamburger_menu: "menü" new_item: "yeni" go_back: "geri dön" - not_logged_in_user: "güncel aktivitelerin ve tercihlerin özetinin bulunduğu kullanıcı sayfası" + not_logged_in_user: "güncel etkinliğin ve tercihlerin özetinin bulunduğu kullanıcı sayfası" current_user: "kendi kullanıcı sayfana git" view_all: "tümünü görüntüle %{tab}" topics: @@ -2318,7 +2318,7 @@ tr_TR: top: "Popüler bir konu yok." educate: new: '

Yeni konularınız burada görünecektir. Varsayılan olarak, konular yeni kabul edilir ve son 2 gün içinde oluşturulmuşlarsa göstergesi gösterilir.

Bunu değiştirmek için tercihinizi ziyaret edin.

' - unread: '

Okunmamış konularınız burada görünür.

Konular varsayılan olarak okunmamış sayılır ve aşağıdaki durumlarda okunmamış ileti sayısı 1 gösterilir:

  • Konuyu siz oluşturmuşsanız
  • Konuyu yanıtlamışsanız
  • Konuyu 4 dakikadan fazla okumuşsanız

Konuyu her konunun altında bulunan bildirim kontrol alanından Gözleniyor veya Takip Ediliyor olarak seçmişseniz.

Tercihler sayfanızdan bunu değiştirebilirsiniz.

' + unread: '

Okunmamış konularınız burada görünür.

Konular varsayılan olarak okunmamış sayılır ve aşağıdaki durumlarda okunmamış ileti sayısı 1 gösterilir:

  • Konuyu siz oluşturmuşsanız
  • Konuyu yanıtlamışsanız
  • Konuyu 4 dakikadan fazla okumuşsanız

Konuyu her konunun altında bulunan bildirim denetim alanından İzleniyor veya Takip Ediliyor olarak seçmişseniz.

Tercihler sayfanızdan bu ayarları değiştirebilirsiniz.

' bottom: latest: "Daha fazla güncel konu yok." posted: "Daha fazla gönderilmiş konu yok." @@ -3053,7 +3053,7 @@ tr_TR: default_list_filter: "Varsayılan Liste Filtresi:" allow_badges_label: "Bu kategoride rozetle ödüllendirilmesine izin ver" edit_permissions: "İzinleri Düzenle" - reviewable_by_group: "Personele ek olarak, bu kategorideki içerik şu kişiler tarafından da incelenebilir:" + reviewable_by_group: "Personele ek olarak, bu kategorideki içerik şu kişiler tarafından da gözden geçirilebilir:" review_group_name: "grup adı" require_topic_approval: "Tüm yeni konular moderatör onayını gerektirir" require_reply_approval: "Tüm yeni yanıtlar moderatör onayı gerektirir" @@ -3099,7 +3099,7 @@ tr_TR: op_likes: "Orijinal Gönderi Beğenileri" views: "Görüntüleme" posts: "Gönderiler" - activity: "Aktivite" + activity: "Etkinlik" posters: "Posterler" category: "Kategori" created: "Oluşturulan" @@ -3222,7 +3222,7 @@ tr_TR: views_long: one: "bu konu %{count} defa görüntülendi" other: "bu konu %{number} defa görüntülendi" - activity: "Aktivite" + activity: "Etkinlik" likes: "Beğeni" likes_lowercase: one: "beğeni" @@ -3611,8 +3611,8 @@ tr_TR: pick_files_button: unsupported_file_picked: "Desteklenmeyen bir dosya seçtiniz. Desteklenen dosya türleri şunlardır– %{types}." user_activity: - no_activity_title: "Henüz aktivite yok" - no_activity_others: "Aktivite yok." + no_activity_title: "Henüz etkinlik yok" + no_activity_others: "Etkinlik yok." no_replies_title: "Henüz hiçbir konuyu yanıtlamadınız." no_replies_others: "Yanıt yok." no_drafts_title: "Hiç taslak başlatmadınız" @@ -3680,7 +3680,7 @@ tr_TR: community_health: Topluluk sağlığı moderators_activity: Moderatörlerin etkinliği whats_new_in_discourse: Discourse'daki yenilikler neler? - activity_metrics: Aktivite Ölçütleri + activity_metrics: Etkinlik Ölçütleri all_reports: "Tüm raporlar" general_tab: "Genel" moderation_tab: "Moderasyon" @@ -4718,7 +4718,7 @@ tr_TR: flags_received_none: "Bu kullanıcı herhangi bir bayrak almadı." reputation: İtibar permissions: İzinler - activity: Aktivite + activity: Etkinlik like_count: Verilen / Alınan Beğeniler last_100_days: "son 100 günde" private_topics_count: Özel Konular diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index f335f14ef9..fa9e56932a 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -3323,7 +3323,6 @@ uk: default_list_filter: "Стандартний фільтр списку:" allow_badges_label: "Дозволити нагороджувати значками у цій категорії" edit_permissions: "Редагувати дозволи" - reviewable_by_group: "Окрім персоналу, зміст цієї категорії також може бути переглянутий:" review_group_name: "назва групи" require_topic_approval: "З них потребують схвалення модератором всіх нових тем" require_reply_approval: "З них потребують схвалення модератором всіх нових відповідей" diff --git a/config/locales/client.vi.yml b/config/locales/client.vi.yml index 03ff524032..7d71447083 100644 --- a/config/locales/client.vi.yml +++ b/config/locales/client.vi.yml @@ -2724,7 +2724,6 @@ vi: default_list_filter: "Bộ lọc danh sách mặc định:" allow_badges_label: "Cho phép thưởng huy hiệu trong chuyên mục này" edit_permissions: "Sửa quyền" - reviewable_by_group: "Ngoài nhân viên, nội dung trong danh mục này cũng có thể được kiểm duyệt bởi:" review_group_name: "Nhóm tên" require_topic_approval: "Yêu cầu người kiểm duyệt phê duyệt tất cả các chủ đề mới" require_reply_approval: "Yêu cầu người kiểm duyệt phê duyệt tất cả các câu trả lời mới" diff --git a/config/locales/client.zh_CN.yml b/config/locales/client.zh_CN.yml index a20906d8b0..e8a5c2f7fb 100644 --- a/config/locales/client.zh_CN.yml +++ b/config/locales/client.zh_CN.yml @@ -2938,7 +2938,6 @@ zh_CN: default_list_filter: "默认列表筛选器:" allow_badges_label: "允许在此类别中授予徽章" edit_permissions: "编辑权限" - reviewable_by_group: "除管理人员外,此类别中的内容还可以由以下群组审核:" review_group_name: "群组名称" require_topic_approval: "所有新话题都需要版主审批" require_reply_approval: "所有新回复都需要版主审批" @@ -4098,7 +4097,7 @@ zh_CN: 强烈建议为属性名称添加前缀以避免与插件和/或核心冲突。 head_tag: - text: "头像" + text: "标签" title: "将在 tag 前插入的 HTML" body_tag: text: "正文" diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index 39d47656c9..d520f875eb 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -408,8 +408,6 @@ ar: few: "عذرًا، لا يمكن للمستخدمين الجُدد وضع أكثر من %{count} روابط في المنشور." many: "عذرًا، لا يمكن للمستخدمين الجُدد وضع أكثر من %{count} رابطًا في المنشور." other: "عذرًا، لا يمكن للمستخدمين الجُدد وضع أكثر من %{count} رابط في المنشور." - contains_blocked_word: "يتضمَّن منشورك كلمة غير مسموح بها: %{word}" - contains_blocked_words: "يتضمَّن منشورك عدة كلمات غير مسموح بها: %{words}" spamming_host: "عذرًا، لا يمكنك نشر رابط إلى هذا المضيف." user_is_suspended: "غير مسموح للمستخدمين المعلَّقين بالنشر." topic_not_found: "حدث خطأ. ربما يكون هذا الموضوع قد تم إغلاقه أو حذفه بينما كنت تعرضه؟" diff --git a/config/locales/server.be.yml b/config/locales/server.be.yml index 9116bb9b76..289fc0a8a9 100644 --- a/config/locales/server.be.yml +++ b/config/locales/server.be.yml @@ -190,7 +190,6 @@ be: no_attachments_allowed: "На жаль, новыя карыстальнікі не могуць паставіць ўкладанні ў паведамленні." no_links_allowed: "На жаль, новыя карыстальнікі не могуць змяшчаць спасылкі ў паведамленнях." links_require_trust: "На жаль, вы не можаце ўключаць спасылкі на вашыя пасты." - contains_blocked_word: "Ваша паведамленне ўтрымлівае слова якое не дазволена: %{word}" spamming_host: "На жаль, вы не можаце размясціць спасылку на гэты хост." user_is_suspended: "Заблякаваныя карыстальнікі не могуць пакідаць паведамленні." topic_not_found: "Нешта пайшло не так. Магчыма, гэтая тэма была зачыненая або выдаленая ў той час як вы глядзіце на гэта?" diff --git a/config/locales/server.bg.yml b/config/locales/server.bg.yml index f7e9bedf54..e0a512846e 100644 --- a/config/locales/server.bg.yml +++ b/config/locales/server.bg.yml @@ -157,7 +157,6 @@ bg: too_many_links: one: "Съжаляваме, новите потребители могат да поставят само по един линк в публикация." other: "Съжаляваме, новите потребители могат да поставят само %{count} линкове в публикация." - contains_blocked_word: "Публикацията ви съдържа непозволена дума: %{word}" spamming_host: "Съжаляваме, не можете да публикувате линк на този хост." user_is_suspended: "Отстранените потребители нямат право да публикуват." topic_not_found: "Нещо не е наред. Може би тази тема е била затворена или изтрита, докато я гледате." diff --git a/config/locales/server.ca.yml b/config/locales/server.ca.yml index 796371066b..876f6bd93d 100644 --- a/config/locales/server.ca.yml +++ b/config/locales/server.ca.yml @@ -262,8 +262,6 @@ ca: too_many_links: one: "Els usuaris nous només poden incloure un enllaç en una publicació." other: "Els usuaris nous només poden incloure %{count} enllaços en una publicació." - contains_blocked_word: "La vostra publicació té una paraula que no és permesa: %{word}" - contains_blocked_words: "La vostra publicació conté diverses paraules no admeses: %{words}" spamming_host: "No podeu publicar un enllaç a aquest amfitrió." user_is_suspended: "Els usuaris suspesos no tenen permís per a publicar." topic_not_found: "Alguna cosa ha fallat. Potser el tema ha estat tancat o suprimit mentre el consultàveu." diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index 16e6ce3f1a..d2192faf72 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -323,8 +323,6 @@ da: too_many_links: one: "Beklager, nye brugere kan kun indsætte et link i et indlæg." other: "Beklager, nye brugere kan kun indsætte %{count} links i et indlæg." - contains_blocked_word: "Dit indlæg indeholder et ord, der ikke er tilladt: %{word}" - contains_blocked_words: "Dit indlæg indeholder flere ord, der ikke er tilladt: %{words}" spamming_host: "Beklager, du kan ikke indsætte et link til det pågældende domæne." user_is_suspended: "Suspenderede brugere tilllades ikke at oprette indlæg." topic_not_found: "Der er gået noget galt. Måske er emnet blevet lukket eller slettet mens du kiggede på det?" diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index 3650e3a3a2..e6125ce32f 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -338,8 +338,8 @@ de: too_many_links: one: "Entschuldige, neue Benutzer können Beiträgen höchstens einen Link hinzufügen." other: "Entschuldige, neue Benutzer können Beiträgen höchstens %{count} Links hinzufügen." - contains_blocked_word: "Dein Beitrag enthält ein nicht erlaubtes Wort: %{word}" - contains_blocked_words: "Dein Beitrag enthält mehrere Wörter, die nicht erlaubt sind: %{words}" + contains_blocked_word: "Tut mir leid, du kannst das Wort '%{word}' nicht posten; es ist nicht erlaubt." + contains_blocked_words: "Sorry, das kannst du nicht posten. Nicht erlaubt: %{words}." spamming_host: "Entschuldige, leider kannst du keinen Link zu diesem Host posten." user_is_suspended: "Gesperrte Benutzer dürfen keine Beiträge schreiben." topic_not_found: "Etwas ist schiefgelaufen. Wurde das Thema eventuell geschlossen oder gelöscht, während du es angeschaut hast?" diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index a8d99a843c..3192498189 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -338,8 +338,6 @@ es: too_many_links: one: "Lo sentimos, los usuarios nuevos solo pueden poner un enlace en una publicación." other: "Lo sentimos, los usuarios nuevos solo pueden poner %{count} enlaces en una publicación." - contains_blocked_word: "Tu publicación contiene una palabra que no está permitida: %{word}" - contains_blocked_words: "Tu publicación contiene varias palabras que no están permitidas: %{words}" spamming_host: "Lo sentimos, no puedes publicar un enlace a esa web." user_is_suspended: "A los usuarios suspendidos no se les permite publicar." topic_not_found: "Algo salió mal. ¿Tal vez este tema se cerró o eliminó mientras estabas lo estabas mirando?" @@ -486,6 +484,7 @@ es: Puedes editar tu anterior respuesta para añadir una cita. Para ello, selecciona el texto que quieras citar y pulsa el botón citar respuesta que aparecerá. Es más fácil leer temas que tengan menos respuestas (aunque más profundas), que tener que leer muchas respuestas individuales. + dominating_topic: Has publicado más del %{percent} % de las respuestas, ¿hay alguien más de quien te gustaría saber? get_a_room: Has respondido a @%{reply_username} %{count} veces, ¿sabías que también puedes enviarle un mensaje personal directamente? too_many_replies: | ### Has llegado al límite de respuestas en este tema @@ -1337,6 +1336,7 @@ es: labels: user: Usuario qtt_like: Me gusta recibidos + description: "Los 10 usuarios que más me gusta han recibido." top_users_by_likes_received_from_inferior_trust_level: title: "Usuarios que más «me gusta» han recibido de usuarios con niveles de confianza bajos" labels: @@ -1349,7 +1349,9 @@ es: labels: user: Usuario qtt_like: Me gusta recibidos + description: "Los 10 usuarios que han recibido más me gusta de numerosas personas distintas." dashboard: + group_email_credentials_warning: 'Hay un problema con las credenciales del correo electrónico del grupo %{group_full_name}. No se enviarán mensajes desde la bandeja de entrada del grupo hasta que se solucione el problema. %{error}' rails_env_warning: "Tu servidor está funcionando en modo de %{env}." host_names_warning: "Tu archivo config/database.yml está utilizando el hostname localhost predeterminado. Actualízalo para usar el hostname de tu sitio." sidekiq_warning: 'Sidekiq no está funcionando. Muchas tareas, tal como el envío de correos electrónicos, se están ejecutando de forma desincronizada por sidekiq. Asegúrate de que por lo menos un proceso de sidekiq está funcionando. Puedes obtener más información sobre Sidekiq aquí.' @@ -2541,6 +2543,9 @@ es: system_messages: reviewables_reminder: subject_template: "Hay elementos pendientes en la cola de revisión" + text_body_template: + one: "Hay %{mentions} elemento recibido hace más de %{count} hora. [Por favor, revísalo](%{base_url}/review)." + other: "Hay %{mentions} elementos recibidos hace más de %{count} horas. [Por favor, revísalos](%{base_url}/review)." private_topic_title: "Tema #%{id}" contents_hidden: "Visita la publicación para ver su contenido." post_hidden: @@ -2623,6 +2628,26 @@ es: flags_agreed_and_post_deleted_for_responders: title: "Respuesta a un mensaje denunciado eliminada por el personal" subject_template: "Respuesta a un mensaje denunciado eliminada por el personal" + text_body_template: | + Hola, + + Esto es un mensaje automático enviado desde %{site_name} para hacerte saber que una [publicación](%{base_url}%{url}) a la que has respondido ha sido eliminada. + + %{flag_reason} + + La publicación fue denunciada por la comunidad y un miembro del equipo decidió eliminarla. + + ```markdown + %{flagged_post_raw_content} + ``` + + Esta era tu respuesta: + + ```markdown + %{flagged_post_response_raw_content} + ``` + + Para más detalles sobre el motivo del borrado, consulta las [directrices de la comunidad](%{base_url}/guidelines). usage_tips: text_body_template: | Si quieres unos consejos para empezar, [echa un vistazo a esta entrada de blog](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index 4367012ce0..7d89f2240f 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -331,8 +331,6 @@ fi: too_many_links: one: "Uudet käyttäjät voivat lisätä vain yhden linkin viestiin." other: "Uudet käyttäjät voivat lisätä vain %{count} linkkiä viestiin." - contains_blocked_word: "Viestissäsi on kielletty sana: %{word}" - contains_blocked_words: "Viestissäsi on kiellettyjä sanoja: %{words}" spamming_host: "Et voi lisätä linkkiä tähän isäntään." user_is_suspended: "Hyllytetyt käyttäjät eivät saa luoda viestejä." topic_not_found: "Jokin on mennyt pieleen. Ehkä tämä ketju on suljettu tai poistettu sillä välin, kun katselit sitä?" diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index fda32a58f5..f21760d5df 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -331,8 +331,6 @@ fr: too_many_links: one: "Nous sommes désolés, les nouveaux utilisateurs ne peuvent insérer qu'un seul lien par message." other: "Nous sommes désolés, les nouveaux utilisateurs ne peuvent insérer que %{count} liens par message." - contains_blocked_word: "Votre message contient un mot qui n'est pas permis : %{word}" - contains_blocked_words: "Votre message contient plusieurs mots qui ne sont pas permis : %{words}" spamming_host: "Désolé, vous ne pouvez pas insérer de lien vers ce domaine." user_is_suspended: "Les utilisateurs suspendus ne sont pas autorisés à publier des messages." topic_not_found: "Une erreur est survenue. Peut-être que ce sujet a été fermé ou supprimé pendant que vous le regardiez ?" diff --git a/config/locales/server.gl.yml b/config/locales/server.gl.yml index 004112c92a..4c8695c910 100644 --- a/config/locales/server.gl.yml +++ b/config/locales/server.gl.yml @@ -317,8 +317,6 @@ gl: too_many_links: one: "Sentímolo, mais os novos usuarios só poden poñer unha ligazón nunha publicación." other: "Sentímolo, mais os novos usuarios só poden poñer %{count} ligazóns nunha publicación." - contains_blocked_word: "A súa publicación contén unha palabra que non está permitida: %{word}" - contains_blocked_words: "A súa publicación contén varias palabras que non están permitidas: %{words}" spamming_host: "Sentímolo, non pode publicar unha ligazón a ese servidor." user_is_suspended: "Aos usuarios suspendidos non se lles permite publicar." topic_not_found: "Algo foi mal. Talvez este tema se pechou ou se eliminou mentres o estaba a consultar?" diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 93424fec7a..9afd15487d 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -376,8 +376,8 @@ he: two: "משתמשים חדשים יכולים להוסיף רק %{count} קישורים בפוסט, עמך הסליחה." many: "משתמשים חדשים יכולים להוסיף רק %{count} קישורים בפוסט, עמך הסליחה." other: "משתמשים חדשים יכולים להוסיף רק %{count} קישורים בפוסט, עמך הסליחה." - contains_blocked_word: "הפוסט שלך מכיל מילים אסורות: %{word}" - contains_blocked_words: "הפוסט שלך מכיל מספר מילים שאסור להשתמש בהן: %{words}" + contains_blocked_word: "אסור לפרסם את המילה ‚%{word}’, עמך הסליחה." + contains_blocked_words: "אי אפשר לפרסם את זה, עמך הסליחה. מילים אסורות: %{words}." spamming_host: "אין לך אפשרות לפרסם קישור לאתר זה, עמך הסליחה." user_is_suspended: "משתמשים מושעים אינם מורשים לפרסם." topic_not_found: "משהו השתבש אולי נושא זה נסגר או נמחק בזמן שקראת אותו?" diff --git a/config/locales/server.hu.yml b/config/locales/server.hu.yml index 7e706e5591..5827c4fc8a 100644 --- a/config/locales/server.hu.yml +++ b/config/locales/server.hu.yml @@ -221,7 +221,6 @@ hu: too_many_links: one: "Sajnáljuk, de az új felhasználók csak egy hivatkozást tehetnek egy bejegyzésbe." other: "Sajnáljuk, de az új felhasználók csak %{count} hivatkozást tehetnek egy bejegyzésbe." - contains_blocked_word: "A bejegyzésed egy olyan szót tartalmaz, amely nem megengedett: %{word}" user_is_suspended: "A felfüggesztett felhasználók nem hozhatnak létre új bejegyzést." topic_not_found: "Valami hiba történt. Esetleg lezárták vagy törölték ezt a témát, míg megnézte?" create_pm_on_existing_topic: "Sajnáljuk, nem hozhatsz létre PM-et egy meglévő témakörben." diff --git a/config/locales/server.hy.yml b/config/locales/server.hy.yml index 3910ca4ee5..d1823ba543 100644 --- a/config/locales/server.hy.yml +++ b/config/locales/server.hy.yml @@ -241,7 +241,6 @@ hy: too_many_links: one: "Ներողություն, նոր օգտատերերը գրառման մեջ կարող են դնել միայն մեկ հղում:" other: "Ներողություն, նոր օգտատերերը գրառման մեջ կարող են դնել միայն %{count} հղում:" - contains_blocked_word: "Ձեր գրառումը պարունակում է անթույլատրելի բառ՝%{word}" spamming_host: "Ներողություն, Դուք չեք կարող հրապարակել այդ հոսթի հղում:" user_is_suspended: "Սառեցված օգտատերերին թույլատրված չէ գրառում կատարել:" topic_not_found: "Ինչ-որ բան այնպես չէ ընթացել: Միգուցե այս թեման փակվել կամ ջնջվե՞լ է, մինչ Դուք դիտում էիք այն:" diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index e44a38ccb4..97a5fd99e1 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -337,8 +337,8 @@ it: too_many_links: one: "Spiacenti, i nuovi utenti possono inserire al massimo un link in un messaggio." other: "Spiacenti, i nuovi utenti possono inserire al massimo %{count} link in un messaggio." - contains_blocked_word: "Il tuo messaggio contiene una parola non consentita: %{word}" - contains_blocked_words: "Il tuo messaggio contiene parole non consentite: %{words}" + contains_blocked_word: "Purtroppo non è consentito pubblicare la parola '%{word}'." + contains_blocked_words: "Purtroppo non puoi pubblicare questo messaggio. Parole non consentite: %{words}." spamming_host: "Spiacenti, non puoi inserire un collegamento verso quell'host." user_is_suspended: "Agli utenti sospesi non è permesso creare messaggi." topic_not_found: "Quancosa non ha funzionato. Forse questo argomento è stato chiuso o cancellato mentre lo leggevi." diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index f22fa023d4..0f88dc754a 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -312,8 +312,6 @@ ja: links_require_trust: "投稿にリンクを含めることはできません。" too_many_links: other: "新規ユーザーは投稿につき %{count} 件のリンクしか追加できません。" - contains_blocked_word: "投稿に許可されていない言葉が含まれています: %{word}" - contains_blocked_words: "投稿に許可されていない語が複数含まれています: %{words}" spamming_host: "このホストへのリンクを投稿できません。" user_is_suspended: "凍結中のユーザーは投稿できません。" topic_not_found: "問題が発生しました。トピックがクローズしたか、閲覧中に削除された可能性があります。" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index a422024c32..22ff6c6cbd 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -313,8 +313,6 @@ ko: links_require_trust: "죄송합니다. 게시물에 링크를 포함 할 수 없습니다." too_many_links: other: "죄송합니다. 신규회원은 글 하나에 링크를 %{count}개까지 넣을 수 있습니다." - contains_blocked_word: "게시물에 허용되지 않는 단어가 포함되어 있습니다 : %{word}" - contains_blocked_words: "게시물에 허용되지 않는 단어가 여러 개 있습니다 : %{words}" spamming_host: "죄송합니다. 회원님은 링크를 첨부할 수 없습니다." user_is_suspended: "가입이 보류된 회원은 글을 쓸 수 없습니다." topic_not_found: "뭔가 잘못됐네요. 아마 읽려는 도중에 토픽이 닫혔거나 지워진 건 아닐까요?" diff --git a/config/locales/server.lt.yml b/config/locales/server.lt.yml index 104d24ea1d..c8362c2db5 100644 --- a/config/locales/server.lt.yml +++ b/config/locales/server.lt.yml @@ -272,8 +272,6 @@ lt: no_attachments_allowed: "Atsiprašome, bet nauji vartotojai negali įkelti priedų pranešimuose." no_links_allowed: "Atsiprašome, bet nauji vartotojai negali įkelti nuorodų į pranešimus." links_require_trust: "Atsiprašome, negalite įtraukti nuorodų į savo įrašus." - contains_blocked_word: "Jūsų įraše yra neleistinas žodis: %{word}" - contains_blocked_words: "Jūsų įraše yra keli neleidžiami žodžiai: %{words}" user_is_suspended: "Sustabdyti vartotojai negali rašyti pranešimų." topic_not_found: "Kažkas nepavyko. Galbūt ši tema buvo uždaryta arba ištrinta, kol į ją žiūrėjote?" not_accepting_pms: "Atsiprašome, %{username} šiuo metu nepriima pranešimų." diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index 9456fa1187..e92d9a3c0a 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -221,7 +221,6 @@ nb_NO: too_many_links: one: "Beklager, nye brukere kan bare legge til én lenke i et innlegg." other: "Beklager, nye brukere kan bare legge til %{count} lenker i et innlegg." - contains_blocked_word: "Innlegget ditt inneholder et ord som ikke er tillatt: %{word}" spamming_host: "Beklager, du kan ikke lenke til det domenet." user_is_suspended: "Utestengte brukere kan ikke skrive innlegg." topic_not_found: "Noe gikk galt. Kanskje emnet ble lukket eller slettet mens du leste det?" diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index 5611c5e49f..44ce441360 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -305,8 +305,6 @@ nl: too_many_links: one: "Sorry, nieuwe gebruikers kunnen maar één koppeling in een bericht plaatsen." other: "Sorry, nieuwe gebruikers kunnen maar %{count} koppelingen in een bericht plaatsen." - contains_blocked_word: "Uw bericht bevat een woord dat niet is toegestaan: %{word}" - contains_blocked_words: "Uw bericht bevat meerdere woorden die niet zijn toegestaan: %{words}" spamming_host: "Sorry, u kunt geen koppeling naar die host plaatsen." user_is_suspended: "Geschorste gebruikers mogen geen berichten plaatsen." topic_not_found: "Er is iets fout gegaan. Misschien is het topic gesloten of verwijderd terwijl u het bekeek?" diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index c0682d224b..04c5184d53 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -220,6 +220,7 @@ pl_PL: local_login_cannot_be_disabled_if_second_factor_enforced: "Nie można wyłączyć lokalnego logowania, jeśli wymuszone jest 2FA. Wyłącz wymuszone 2FA przed wyłączeniem lokalnych logowań." cannot_enable_s3_uploads_when_s3_enabled_globally: "Nie można włączyć przesyłania S3, ponieważ przesyłanie S3 jest już włączone globalnie, a włączenie tego poziomu witryny może powodować krytyczne problemy z przesyłaniem" cors_origins_should_not_have_trailing_slash: "Nie należy dodawać końcowego ukośnika (/) do źródeł CORS." + slow_down_crawler_user_agent_must_be_at_least_3_characters: "User-Agent musi mieć co najmniej 3 znaki, aby uniknąć niewłaściwego ograniczania prawdziwych użytkowników." slow_down_crawler_user_agent_cannot_be_popular_browsers: "Do ustawienia nie można dodać żadnej z następujących wartości: %{values}." conflicting_google_user_id: 'Identyfikator konta Google dla tego konta został zmieniony; interwencja personelu jest wymagana ze względów bezpieczeństwa. Skontaktuj się z personelem i wskaż go
https://meta.discourse.org/t/76575' onebox: @@ -243,6 +244,8 @@ pl_PL:

Jeśli pamiętasz hasło, możesz się zalogować.

W przeciwnym razie zresetuj hasło.

+ not_found_template_link: | +

To zaproszenie do %{site_name} nie może już zostać zrealizowane. Poproś osobę, która Cię zaprosiła, aby wysłała Ci nowe zaproszenie.

user_exists: "Nie ma potrzeby zapraszania %{email}, obecnie posiada konto!" invite_exists: "Zaprosiłeś już %{email}." invalid_email: "%{email} nie jest prawidłowym adresem e-mail." @@ -257,6 +260,7 @@ pl_PL: discourse_connect_enabled: "Zaproszenia są wyłączone, ponieważ DiscourseConnect jest włączony." invalid_access: "Nie masz uprawnień do przeglądania żądanego zasobu." requires_groups: "Zaproszenie zapisane. Aby dać dostęp do określonego tematu, dodaj jedną z następujących grup: %{groups}." + domain_not_allowed: "Twój adres e-mail nie może zostać użyty do zrealizowania tego zaproszenia." bulk_invite: file_should_be_csv: "Wgrywany plik powinien być formatu csv." max_rows: "Wysłano %{max_bulk_invites} pierwszych zaproszeń. Sprobuj podzielić plik na mniejsze części." @@ -372,8 +376,8 @@ pl_PL: few: "Przepraszamy, nowi użytkownicy mogą dodawać tylko %{count} linki do wpisu." many: "Przepraszamy, nowi użytkownicy mogą dodawać tylko %{count} linków do wpisu." other: "Przepraszamy, nowi użytkownicy mogą dodawać tylko %{count} linków do wpisu." - contains_blocked_word: "Twój wpis zawiera niedozwolone słowo: %{word}" - contains_blocked_words: "Twój wpis zawiera niedozwolone słowa: %{words}" + contains_blocked_word: "Niestety, nie możesz opublikować słowa '%{word}'; jest ono niedozwolone." + contains_blocked_words: "Przepraszamy, nie możesz tego opublikować. Niedozwolone słowa: %{words}." spamming_host: "Przepraszamy, nie możesz umieścić linka do tej strony." user_is_suspended: "Zawieszeni użytkownicy nie mogą wysyłać wiadomości." topic_not_found: "Coś poszło nie tak. Być może temat został zamknięty lub usunięty w międzyczasie?" @@ -711,6 +715,7 @@ pl_PL: post: image_placeholder: broken: "Ten obraz jest uszkodzony" + hidden_bidi_character: "Znaki dwukierunkowe mogą zmienić kolejność renderowania tekstu. Może to służyć do ukrywania złośliwego kodu." has_likes: one: "%{count} polubienie" few: "%{count} polubienia" @@ -1432,19 +1437,26 @@ pl_PL: mutes_count: Licznik wyciszonych description: "Użytkownicy, którzy zostali wyciszeni i / lub zignorowani przez wielu innych użytkowników." top_users_by_likes_received: + title: "Najlepsi użytkownicy według otrzymanych polubień" labels: user: Użytkownik qtt_like: Polubienia otrzymane + description: "Top 10 użytkowników, którzy otrzymali więcej polubień." top_users_by_likes_received_from_inferior_trust_level: + title: "Najlepsi użytkownicy według polubień otrzymanych od użytkownika o niższym poziomie zaufania" labels: user: Użytkownik trust_level: Poziom zaufania qtt_like: Polubienia otrzymane + description: "Top 10 użytkowników na wyższym poziomie zaufania jest lubianych przez osoby o niższym poziomie zaufania." top_users_by_likes_received_from_a_variety_of_people: + title: "Najlepsi użytkownicy według polubień otrzymanych od różnych osób" labels: user: Użytkownik qtt_like: Polubienia otrzymane + description: "Top 10 użytkowników, którzy mają polubienia od szerokiego grona osób." dashboard: + group_email_credentials_warning: 'Wystąpił problem z poświadczeniami e-mail dla grupy %{group_full_name}. Żadne e-maile nie będą wysyłane ze skrzynki odbiorczej grupy, dopóki ten problem nie zostanie rozwiązany. %{error}' rails_env_warning: "Twój serwer działa w trybie %{env}" host_names_warning: "Twój plik config/database.yml używa domyślnej nazwy serwera localhost. Zmień go by używał nazwy serwera Twojej strony." sidekiq_warning: 'Sidekiq nie działa. Wiele zadań, takich jak wysyłanie emaili, jest wykonywane asynchronicznie przez sidekiqa. Zagwarantuj, że przynajmniej jeden proces sidekiqa działa. Dowiedz się więcej o Sidekiqu.' @@ -1525,6 +1537,7 @@ pl_PL: tl2_post_edit_time_limit: "Autor tl2 + może edytować swój wpis przez (n) minut po opublikowaniu. Ustaw na zawsze na 0." edit_history_visible_to_public: "Pozwól wszystkim przeglądać poprzednie wersje edytowanych wpisów. Gdy wyłączone, jedynie obsługa/staff może." delete_removed_posts_after: "Wpisy usunięte przez autora będą automatycznie zlikwidowane po (n) godzinach. Jeżeli liczba godzin będzie wynosić 0, to zostaną usunięte natychmiast. " + notify_users_after_responses_deleted_on_flagged_post: "Gdy post zostanie oznaczony, a następnie usunięty, wszyscy użytkownicy, którzy na niego odpowiedzieli, a ich odpowiedzi zostały usunięte, zostaną powiadomieni." max_image_width: "Maksymalna szerokość miniaturki grafiki we wpisie. " max_image_height: "Maksymalna wysokość miniaturki grafiki we wpisie. " responsive_post_image_sizes: "Zmień rozmiar podglądu lightbox, aby umożliwić wyświetlanie ekranów o wysokiej rozdzielczości DPI o następujących proporcjach pikseli. Usuń wszystkie wartości, aby wyłączyć responsywne obrazy." @@ -1570,6 +1583,7 @@ pl_PL: summary_percent_filter: "Gdy użytkownik kliknie na 'Podsumowaniu tematu', pokaż % najlepszych wpisów" summary_max_results: "Maksymalna liczba wpisów zwróconych przez „Podsumuj ten temat”" summary_timeline_button: "Pokaż przycisk „Podsumuj” na osi czasu" + enable_personal_messages: "Zezwalaj użytkownikom na poziomie zaufania 1 (konfigurowalnym za pomocą min. zaufania do wysyłania wiadomości) na tworzenie i odpowiadanie na wiadomości. Należy pamiętać, że personel zawsze może wysyłać wiadomości bez względu na wszystko." enable_system_message_replies: "Pozwala użytkownikom odpowiadać na wiadomości systemowe, nawet jeśli wiadomości osobiste są wyłączone" enable_long_polling: "Message bus used for notification can use long polling" enable_chunked_encoding: "Włącz odpowiedzi fragmentaryczne serwera. Ta funkcja działa w większości konfiguracji, jednak niektóre serwery proxy mogą buforować odpowiedzi, powodując opóźnienia." @@ -1624,6 +1638,7 @@ pl_PL: allowed_iframes: "Lista prefiksów domeny src iframe, które dyskurs może bezpiecznie dopuścić w wpisach" allowed_crawler_user_agents: "Agenci użytkowników dla robotów indeksujących, które powinny mieć dostęp do strony. OSTRZEŻENIE! USTAWIENIE TEGO SPOWODUJE BLOKADE ROBOTÓW, KTÓRE NIE SĄ NA LIŚCIE!" blocked_crawler_user_agents: "Unikalne słowo bez rozróżniania wielkości liter w ciągu znaków, które identyfikują crawlery internetowe, które nie powinny mieć dostępu do witryny. Nie ma zastosowania, jeśli dozwolona lista jest zdefiniowana." + slow_down_crawler_user_agents: "User-Agent'y robotów indeksujących, którym należy ograniczyć prędkość, zgodnie z ustawieniami \"spowolnij szybkość indeksowania\". Każda wartość musi mieć co najmniej 3 znaki." slow_down_crawler_rate: "Jeśli określono parametr slow_down_crawler_user_agents, ta stawka będzie obowiązywać dla wszystkich robotów (liczba sekund opóźnienia między żądaniami)" content_security_policy: "Włącz politykę bezpieczeństwa treści" content_security_policy_report_only: "Włącz tylko treść-bezpieczeństwo-zasady-tylko raport" @@ -1660,7 +1675,9 @@ pl_PL: allow_index_in_robots_txt: "W pliku robots.txt określ, że ta witryna może być indeksowana przez wyszukiwarki internetowe. W wyjątkowych przypadkach możesz trwale zastąpić plik robots.txt." blocked_email_domains: "Lista domen poczty e-mail rozdzielonych pionową kreską, z których użytkownicy nie mogą rejestrować kont. Przykład: mailinator.com|trashmail.net" allowed_email_domains: "Lista rozdzielonych pionową kreską domen e-mail, z których użytkownicy MUSZĄ się rejestrować. UWAGA: Użytkownicy z domenami e-mail innymi niż wypisane tutaj nie będą mogli się zarejestrować!" + normalize_emails: "Sprawdź, czy znormalizowany e-mail jest unikalny. Znormalizowany e-mail usuwa wszystkie kropki z nazwy użytkownika i wszystko między symbolami + i @." auto_approve_email_domains: "Użytkownicy z adresami e-mail z tej listy domen zostaną automatycznie zatwierdzeni." + hide_email_address_taken: "Nie informuj użytkowników, że istnieje konto z podanym adresem e-mail podczas rejestracji lub podczas procesu przypominania hasła. Wymagaj podania pełnego adresu email przy prośbach o 'przypomnienie hasła'." log_out_strict: "Po wylogowaniu wyloguj WSZYSTKIE sesje użytkownika na wszystkich urządzeniach." version_checks: "Wyślij ping do Discourse Hub w celu uzyskania aktualizacji wersji i pokaż komunikaty o nowej wersji w panelu admina" new_version_emails: "Wyślij email na adres contact_email, kiedy nowa wersja Discourse będzie dostępna." @@ -1705,6 +1722,7 @@ pl_PL: google_oauth2_client_secret: "Client Secret twojej aplikacji w Google" google_oauth2_prompt: "Opcjonalna lista wartości łańcuchowych rozdzielanych spacjami, która określa, czy serwer autoryzacji monituje użytkownika o ponowne uwierzytelnienie i zgodę. Możliwe wartości można znaleźć na https://developers.google.com/identity/protocols/OpenIDConnect#prompt ." google_oauth2_hd: "Opcjonalna domena Google Apps Hosted, do której logowanie będzie ograniczone. Więcej informacji można znaleźć na https://developers.google.com/identity/protocols/OpenIDConnect#hd-param" + google_oauth2_hd_groups: "(eksperymentalne) Pobierz grupy dyskusyjne Google użytkowników w domenie hostowanej po uwierzytelnieniu. Pobrane grupy dyskusyjne Google mogą być używane do automatycznego przyznawania członkostwa w grupach Discourse (zobacz ustawienia grupy)." enable_twitter_logins: "Włącz uwierzytelnianie na Twitterze, wymaga twitter_consumer_key i twitter_consumer_secret. Zobacz Konfigurowanie logowania na Twitterze (i bogatych osadzeń) dla dyskursu ." twitter_consumer_key: "Klucz klienta do uwierzytelnienia na Twitterze, zarejestrowany na https://developer.twitter.com/apps" twitter_consumer_secret: "Sekret klienta dotyczący uwierzytelniania na Twitterze, zarejestrowany na stronie https://developer.twitter.com/apps" @@ -1848,6 +1866,9 @@ pl_PL: max_mentions_per_post: "Maksymalna liczba powiadomień poprzez @nazwę w jednym wpisie (dla wszystkich)." max_users_notified_per_group_mention: "Maksymalna liczba użytkowników, którzy mogą otrzymać powiadomienie jeśli ktoś wspomniał(a) o grupie (jeśli próg został osiągnięty, nie będzie żadnych powiadomień)" enable_mentions: "Zezwól użytkownikom na wzmianki innych użytkowników." + here_mention: "Nazwa użyta do wzmianki @here. Nie może być istniejącą nazwą użytkownika." + max_here_mentioned: "Maksymalna liczba osób oznaczonych przez @here." + min_trust_level_for_here_mention: "Minimalny poziom zaufania do oznaczania @here." create_thumbnails: "Stwórz miniatury i obrazy lightbox, które są za duże, aby pasować do wpisu." email_time_window_mins: "Odczekaj (n) minut przed wysłaniem e-maila z powiadomieniem, aby dać użytkownikom szansę na edytowanie i ukończenie wpisów." personal_email_time_window_seconds: "Poczekaj (n) sekund przed wysłaniem powiadomienia na e-mail o prywatnej wiadomości, by użytkownicy mogli edytować i dokończyć swoje wiadomości." @@ -1898,6 +1919,7 @@ pl_PL: topic_view_duration_hours: "Licz wyświetlanie nowego tematu na IP/Użytkownika co N godzin" user_profile_view_duration_hours: "Licz nowe wyświetlenia profilu użytkownika na IP/Użytkownika co N godzin" levenshtein_distance_spammer_emails: "Przy dopasowywaniu emaili spamowych, różnica liczby znaków, która w dalszym ciągu pozwoli na przybliżone dopasowanie." + max_new_accounts_per_registration_ip: "Jeśli istnieje już (x) kont o poziomie zaufania 0 z tego adresu IP (i żadne z nich nie jest członkiem personelu ani na poziomie TL2 lub wyższym), przestań akceptować nowe rejestracje z tego adresu IP. Ustaw na 0, aby wyłączyć limit." min_ban_entries_for_roll_up: "Podczas naciskania na przycisk Przewiń do góry, utwórz nowy wpis blokady podsieci jeśli jest co najmniej (N) wpisów." max_age_unmatched_emails: "Usuń niedopasowany ekranowany wpis email po (N) dniach." max_age_unmatched_ips: "Usuń niedopasowany ekranowany wpis IP po (N) dniach." @@ -2034,6 +2056,7 @@ pl_PL: global_notice: "Wyświetlaj PILNE, AWARYJNE lub zawsze widoczny banner informacyjny, który będzie widoczny dla wszystkich odwiedzających. Ustaw to pole jako puste, aby go ukryć. (HTML dozwolony)" disable_system_edit_notifications: "Wyłącz edytowanie powiadomień przez system użytkownika gdy 'download_remote_images_to_local' jest aktywne." disable_category_edit_notifications: "Wyłącz powiadomienia o edycji kategorii w tematach." + disable_tags_edit_notifications: "Wyłącz powiadomienia o edycji tagów w tematach." notification_consolidation_threshold: "Liczba polubień lub powiadomień o członkostwie otrzymanych przed połączeniem powiadomień w jedno. Ustaw 0 aby wyłączyć." likes_notification_consolidation_window_mins: "Czas w minutach, po którym powiadomienia o polubieniach są łączone w jedno powiadomienie. Próg można skonfigurować za pomocą `SiteSetting.notification_consolidation_threshold`." automatically_unpin_topics: "Automatycznie odpinaj tematy, gdy użytkownik dotknie dna." @@ -2179,10 +2202,12 @@ pl_PL: share_quote_visibility: "Określ, kiedy wyświetlać przyciski udostępniania cytatów: nigdy, tylko anonimowym użytkownikom lub wszystkim użytkownikom. " create_revision_on_bulk_topic_moves: "Utwórz rewizję dla pierwszych postów, gdy tematy zostaną przeniesione do nowej kategorii zbiorczo." allow_changing_staged_user_tracking: "Zezwalaj na zmianę preferencji powiadomień o kategoriach i tagach użytkownika etapowego przez administratora." + use_email_for_username_and_name_suggestions: "Użyj pierwszej części adresów e-mail jako sugestii dla nazwy użytkownika i pełnej nazwy. Pamiętaj, że ułatwia to odgadnięcie pełnych adresów e-mail użytkowników (ponieważ duża część osób korzysta z wspólnych usług, takich jak `gmail.com`)." errors: invalid_css_color: "Nieprawidłowy kolor. Wpisz nazwę koloru lub wartość szesnastkową." invalid_email: "Nieprawidłowy adres e-mail." invalid_username: "Użytkownik o takiej nazwie nie istnieje." + valid_username: "Istnieje użytkownik o tej nazwie." invalid_group: "Nie ma grupy o takiej nazwie." invalid_integer_min_max: "Wartość musi być między %{min} i %{max}." invalid_integer_min: "Wartość musi wynosić %{min} albo więcej." @@ -2225,6 +2250,7 @@ pl_PL: leading_trailing_slash: "Wyrażenie regularne nie może zaczynać się ani kończyć ukośnikiem." unicode_usernames_avatars: "Wewnętrzne awatary systemowe nie obsługują nazw użytkowników zawierających unicode." list_value_count: "Lista musi zawierać dokładnie %{count} wartości." + google_oauth2_hd_groups: "Musisz najpierw ustawić 'google oauth2 hd' przed włączeniem tego ustawienia." placeholder: discourse_connect_provider_secrets: key: "www.example.com" @@ -2599,6 +2625,21 @@ pl_PL: test_mailer: title: "Test Powiadomień" subject_template: "[%{email_prefix}] Test dostarczania poczty" + text_body_template: | + To jest testowa wiadomość e-mail od + + [**%{base_url}**][0] + + Mamy nadzieję, że otrzymałeś ten test dostarczalności wiadomości e-mail! + + Oto [przydatna lista kontrolna do weryfikacji konfiguracji dostarczania poczty e-mail][1]. + + Powodzenia, + + Twoi przyjaciele z [Discourse](https://www.discourse.org) + + [0]: %{base_url} + [1]: https://meta.discourse.org/t/email-delivery-configuration-checklist/209839 new_version_mailer: title: "Nowa wersja powiadomień" subject_template: "[%{email_prefix}] Nowa wersja Discourse jest dostępna" @@ -2636,6 +2677,11 @@ pl_PL: inappropriate: "Twój wpis został oznaczony jako **nieodpowiedni**: społeczność uznała, że zbyt agresywny lub niezgodny z [jej wytycznymi](%{base_path}/guidelines)." spam: "Twój wpis został oznaczony jako **spam**: społeczność czuje, że jest to reklama, czyli coś nadmiernie promującego, a nie użytecznego czy odnoszącego się do tematu." notify_moderators: "Twój wpis został oznaczony jako **do uwagi moderatora**: społeczność czuje, że wpis wymaga ręcznej interwencji członka personelu." + responder: + off_topic: "Post został oznaczony jako **nie na temat**: społeczność uważa, że nie pasuje on do tematu, który obecnie określa tytuł i pierwszy post." + inappropriate: "Post został oznaczony jako **nieodpowiedni**: społeczność uważa, że jest obraźliwy, wulgarny lub narusza [nasze wytyczne dla społeczności](%{base_path}/guidelines)." + spam: "Post został oznaczony jako **spam**: społeczność uważa, że jest to reklama, lub coś, co ma charakter nadmiernie promocyjny, a nie jest przydatne lub związane z tematem zgodnie z oczekiwaniami." + notify_moderators: "Post został oznaczony **w celu zwrócenia uwagi moderatora**: społeczność uważa, że coś w tym poście wymaga ręcznej interwencji członka personelu." flags_dispositions: agreed: "Dziękujemy za zwrócenie uwagi. Zgadzamy się, że jest to problem i przyjrzymy się temu. " agreed_and_deleted: "Dziękujemy za zwrócenie uwagi. Zgadzamy się, że jest to problem i wpis został usunięty. " @@ -2648,6 +2694,13 @@ pl_PL: many: "Ten temat jest tymczasowo zamknięty na co najmniej %{count} godzin z powodu dużej liczby flag społeczności." other: "Ten temat jest tymczasowo zamknięty na co najmniej %{count} godzin z powodu dużej liczby flag społeczności." system_messages: + reviewables_reminder: + subject_template: "W kolejce do sprawdzenia znajdują się elementy, które wymagają uwagi" + text_body_template: + one: "%{mentions} Wiadomości zostały wysłane ponad %{count} godzinę temu. [Sprawdź je](%{base_url}/review)." + few: "%{mentions} Wiadomości zostały wysłane ponad %{count} godziny temu. [Sprawdź je](%{base_url}/review)." + many: "%{mentions} Wiadomości zostały wysłane ponad %{count} godzin temu. [Sprawdź je](%{base_url}/review)." + other: "%{mentions} Wiadomości zostały wysłane ponad %{count} godzin temu. [Sprawdź je](%{base_url}/review)." private_topic_title: "Temat#%{id}" contents_hidden: "Proszę przejść do wpisu, aby wyświetlić jego zawartość." post_hidden: @@ -2727,6 +2780,29 @@ pl_PL: ``` Zapoznaj się z naszymi [wytycznymi społeczności](%{base_url}/guidelines) po więcej szczegółów. + flags_agreed_and_post_deleted_for_responders: + title: "Odpowiedź usunięta z oflagowanego postu przez personel" + subject_template: "Odpowiedź usunięta z oflagowanego postu przez personel" + text_body_template: | + Witaj, + + To jest automatyczna wiadomość od %{site_name} informująca, że [post](%{base_url}%{url}), na który odpowiedziałeś, został usunięty. + + %{flag_reason} + + Ten post został oznaczony przez społeczność, a członek personelu zdecydował się go usunąć. + + ``` markdown + %{flagged_post_raw_content} + ``` + + Na który odpowiedziałeś + + ``` markdown + %{flagged_post_response_raw_content} + ``` + + Aby uzyskać więcej informacji na temat powodu usunięcia, zapoznaj się z naszymi [wytycznymi dla społeczności](%{base_url}/guidelines). usage_tips: text_body_template: | Aby uzyskać kilka szybkich wskazówek, jak zacząć jako nowy użytkownik, [przeczytaj ten post na blogu](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). @@ -3384,6 +3460,7 @@ pl_PL: %{respond_instructions} user_group_mentioned_pm: + title: "Wspomniana grupa użytkowników PW" subject_template: "[%{email_prefix}] [PW] %{topic_title}" text_body_template: | %{header_instructions} @@ -3394,6 +3471,7 @@ pl_PL: %{respond_instructions} user_group_mentioned_pm_group: + title: "Wspomniana grupa użytkowników PW" subject_template: "[%{email_prefix}] [PW] %{topic_title}" text_body_template: | %{header_instructions} diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index 120a8a59db..c971077789 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -319,8 +319,6 @@ pt: too_many_links: one: "Pedimos desculpa, novos utilizadores podem colocar apenas %{count} hiperligação numa mensagem." other: "Pedimos desculpa, novos utilizadores podem colocar apenas %{count} hiperligações numa mensagem." - contains_blocked_word: "Sua postagem contém uma palavra que não é permitida: %{word}" - contains_blocked_words: "Sua postagem contém algumas palavras que não são permitidas: %{words}" spamming_host: "Pedimos desculpa, não pode colocar uma hiperligação para esse servidor." user_is_suspended: "Utilizadores suspensos não têm permissão para publicar." topic_not_found: "Algo de errado ocorreu. Talvez este tópico tenha sido fechado ou eliminado enquanto olhava para ele?" diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 7b0b954f05..3e9c5c0157 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -338,8 +338,6 @@ pt_BR: too_many_links: one: "Desculpe, usuários(as) novos(as) podem inserir apenas %{count} link em uma postagem." other: "Desculpe, usuários(as) novos(as) podem inserir apenas %{count} links em uma postagem." - contains_blocked_word: "Sua postagem contém uma palavra que não é permitida: %{word}" - contains_blocked_words: "Sua postagem contém várias palavras que não são permitidas: %{words}" spamming_host: "Desculpe, você não pode postar um link para esse host." user_is_suspended: "Usuários(as) suspensos(as) não têm permissão para postar." topic_not_found: "Ocorreu um erro. Talvez este tópico tenha sido fechado ou removido enquanto você estava visualizando." diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index 8919612545..3c5dd41502 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -376,8 +376,8 @@ ru: few: "Извините, новые пользователи могут размещать только %{count} ссылки в сообщении." many: "Извините, новые пользователи могут размещать только %{count} ссылок в сообщении." other: "Извините, новые пользователи могут размещать только %{count} ссылок в сообщении." - contains_blocked_word: "Ваше сообщение содержит запрещённое слово: %{word}" - contains_blocked_words: "Ваше сообщение содержит несколько запрещённых слов: %{words}" + contains_blocked_word: "Извините, но вы не можете использовать слово '%{word}'; оно недопустимо." + contains_blocked_words: "Извините, но вы не можете опубликовать это. Не допускаются следующие слова: %{words}." spamming_host: "Извините, но вы не можете разместить ссылку на этот ресурс." user_is_suspended: "Замороженные пользователи не могут создавать сообщения." topic_not_found: "Что-то пошло не так. Возможно, эта тема была закрыта или удалена, пока вы её читали?" @@ -2203,6 +2203,7 @@ ru: share_quote_visibility: "Определите, когда показывать кнопки обмена цитатами: никогда, только анонимным пользователям или всем пользователям. " create_revision_on_bulk_topic_moves: "Добавлять первые сообщения в историю редактирования при массовом перемещении тем в другой раздел." allow_changing_staged_user_tracking: "Разрешить пользователю с правами администратора изменять настройки уведомлений для сымитированных пользователей в разделах и тегах." + use_email_for_username_and_name_suggestions: "Предлагать первую часть адресов электронной почты в качестве имени и псевдонима пользователя. Обратите внимание, что это упрощает угадывание полных адресов электронной почты пользователей (поскольку большая часть людей использует такие известные службы как `gmail.com`)." errors: invalid_css_color: "Недопустимый цвет. Введите название цвета или шестнадцатеричное значение." invalid_email: "Неправильный адрес электронной почты." diff --git a/config/locales/server.sl.yml b/config/locales/server.sl.yml index bc875d5cee..f5ae75d697 100644 --- a/config/locales/server.sl.yml +++ b/config/locales/server.sl.yml @@ -172,8 +172,6 @@ sl: two: "Novi uporabniki lahko v prispevek dodajo samo %{count} povezavi." few: "Novi uporabniki lahko v prispevek dodajo samo %{count} povezave." other: "Novi uporabniki lahko v prispevek dodajo samo %{count} povezav." - contains_blocked_word: "Vaš prispevek vsebuje prepovedano besedo: %{word}" - contains_blocked_words: "Vaš prispevek vsebuje prepovedane besede: %{words}" user_is_suspended: "Suspendirani uporabniki ne morejo objavljati." pm_reached_recipients_limit: "Ne morete imeti več kot %{recipients_limit} prejemnikov v sporočilu." removed_direct_reply_full_quotes: "Samodejno odstranjen citat celotnega prejšnega prispevka." diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index 26831ac624..84da7ab632 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -338,8 +338,6 @@ sv: too_many_links: one: "Tyvärr kan nya användare bara ha en länk i ett inlägg." other: "Tyvärr kan nya användare bara ha %{count} länkar i ett inlägg." - contains_blocked_word: "Ditt inlägg innehåller ett ord som inte är tillåtet: %{word}" - contains_blocked_words: "Ditt inlägg innehåller flera ord som inte är tillåtna: %{words}" spamming_host: "Tyvärr kan du inte publicera en länk till den värden." user_is_suspended: "Avstängda användare har inte tillåtelse att göra inlägg" topic_not_found: "Något har gått fel. Kanske har ämnet stängts eller raderats medan du tittade på det?" diff --git a/config/locales/server.sw.yml b/config/locales/server.sw.yml index ff7ba61592..06d85e95ed 100644 --- a/config/locales/server.sw.yml +++ b/config/locales/server.sw.yml @@ -167,7 +167,6 @@ sw: no_attachments_allowed: "Samahani watumiaji wapya hawawezi kuambatanisha picha, sauti, video au dokument kwenye machapisho." no_links_allowed: "Samahani watumiaji wapya hawawezi kuweka viungo kwenye machapisho." links_require_trust: "Samahani, hauwezi kuweka viungo kwenye machapisho yako." - contains_blocked_word: "Chapisho lako lina neno lisiloruhusiwa: %{word}" spamming_host: "Samahani hauwezi kuchapisha kiungo kwenye computer hiyo." user_is_suspended: "Watumiaji waliosimamishwa hawaruhusiwi kuchapisha." topic_not_found: "Kuna tatizo limetokea. Labda hii mada ilifungwa au kufutwa ukiwa unaangalia?" diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index 49846523f0..fa9eceed57 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -335,8 +335,8 @@ tr_TR: too_many_links: one: "Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} bağlantı ekleyebilirler." other: "Üzgünüz, yeni kullanıcılar bir gönderiye sadece %{count} bağlantı ekleyebilirler." - contains_blocked_word: "Gönderiniz izin verilmeyen bir sözcük içeriyor: %{word}" - contains_blocked_words: "Gönderiniz izin verilmeyen birden çok sözcük içeriyor: %{words}" + contains_blocked_word: "Üzgünüz, '%{word}' kelimesini kullanamazsınız; yasaklı." + contains_blocked_words: "Üzgünüm, bunu yayınlayamazsınız. Yasak kelimeler: %{words}." spamming_host: "Üzgünüz bu sunucuya bağlantı veremezsiniz." user_is_suspended: "Uzaklaştırılmış kullanıcılar gönderi yapamazlar." topic_not_found: "Bir şeyler ters gitti. Muhtemelen siz konuya bakarken bu konu kapatıldı ya da silindi." @@ -1025,7 +1025,7 @@ tr_TR: score: Skor description: "Yetkililerin raporlarına verdiği yanıtın oranına göre sıralanan kullanıcıların listesi (Kabul edilmemişten kabul edilmişe doğru)." moderators_activity: - title: "Moderatör Aktivitesi" + title: "Moderatör Etkinliği" labels: moderator: Moderatör flag_count: Raporlar yeniden görüntülendi @@ -2070,6 +2070,7 @@ tr_TR: share_quote_buttons: "Alıntı paylaşım widget'ında hangi öğelerin görüneceğini ve hangi sırayla görüneceklerini belirleyin." share_quote_visibility: "Alıntı paylaşma düğmelerinin ne zaman gösterileceğini belirleyin: asla, yalnızca anonim kullanıcılara veya tüm kullanıcılara. " create_revision_on_bulk_topic_moves: "Konular toplu olarak yeni bir kategoriye taşındığında ilk gönderiler için revizyon oluştur." + use_email_for_username_and_name_suggestions: "Kullanıcı adları ve ad önerileri için e-posta adreslerinin ilk kısmını kullanın. Ama unutmayın bu yaklaşım, insanların e-posta adreslerinin tamamını tahmin etmelerini kolaylaştırır (çünkü insanların büyük bir kısmı \"gmail.com\" gibi ortak hizmetleri paylaşır)." errors: invalid_css_color: "Geçersiz renk. Bir renk adı veya hex değer girin." invalid_email: "Geçersiz e-posta adresi." diff --git a/config/locales/server.uk.yml b/config/locales/server.uk.yml index 67bb0a44cc..94e9869a3b 100644 --- a/config/locales/server.uk.yml +++ b/config/locales/server.uk.yml @@ -374,8 +374,6 @@ uk: few: "Даруйте, нові користувачі можуть вставляти тільки %{count} посилань в допис." many: "Даруйте, нові користувачі можуть вставляти тільки %{count} посилань в допис." other: "Даруйте, нові користувачі можуть вставляти тільки %{count} посилань в допис." - contains_blocked_word: "Ваш пост містить слово, яке заборонено: %{word}" - contains_blocked_words: "Ваш пост містить кілька заборонених слів: %{words}" spamming_host: "Даруйте, Ви не можете вставити посилання на цей хост." user_is_suspended: "Заблокованим користувачам заборонено писати." topic_not_found: "Щось пішло не так. Можливо цей допис було закрито або видалено, під час того, як ви його переглядали?" diff --git a/config/locales/server.ur.yml b/config/locales/server.ur.yml index 5c0859f176..edf33b30ad 100644 --- a/config/locales/server.ur.yml +++ b/config/locales/server.ur.yml @@ -256,8 +256,6 @@ ur: too_many_links: one: "معذرت، نئے صارفین ایک پوسٹ میں صرف ایک لِنک ڈال سکتے ہیں۔" other: "معذرت، نئے صارفین ایک پوسٹ میں صرف %{count} لِنکس ڈال سکتے ہیں۔" - contains_blocked_word: "آپ کی پوسٹ میں ایک ایسا لفظ شامل ہے جس کی اجازت نہیں ہے: %{word}" - contains_blocked_words: "آپ کی پوسٹ میں متعدد الفاظ شامل ہیں جن کی اجازت نہیں ہے: %{words}" spamming_host: "معذرت، آپ اس ہَوسٹ کیلئے لِنک پوسٹ نہیں کر سکتے۔" user_is_suspended: "معطل صارفین کو پوسٹ کرنے کی اجازت نہیں ہے۔" topic_not_found: "کچھ غلط ہو گیا ہے۔ شاید جس دوران آپ اِسے دیکھ رہے تھے، یہ ٹاپک بند یا حذف کر دیا گیا؟" diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index 9a3aa3368c..bb7702364b 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -316,8 +316,6 @@ zh_CN: links_require_trust: "抱歉,您的帖子中不能包含链接。" too_many_links: other: "抱歉,新用户在一个帖子中仅能发布 %{count} 个链接。" - contains_blocked_word: "您的帖子中包含一个不被允许的字词:%{word}" - contains_blocked_words: "您的帖子中包含多个不被允许的字词:%{words}" spamming_host: "抱歉,您不能发布指向该主机的链接。" user_is_suspended: "被封禁的用户不允许发帖。" topic_not_found: "出了点问题。或许此话题在您查看时已被关闭或删除。" diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml index f7280cc5f3..81a25589db 100644 --- a/config/locales/server.zh_TW.yml +++ b/config/locales/server.zh_TW.yml @@ -233,7 +233,6 @@ zh_TW: links_require_trust: "抱歉,您不能在貼文中插入連結" too_many_links: other: "抱歉,新使用者只能在貼文中放置 %{count} 個連結。" - contains_blocked_word: "您的貼文包含被禁用的文字:%{word}" spamming_host: "抱歉,你不能張貼該網站之連結。" user_is_suspended: "被停權的使用者無法張貼貼文。" topic_not_found: "出現問題。也許這個話題被關閉或刪除。" diff --git a/plugins/discourse-narrative-bot/config/locales/client.nb_NO.yml b/plugins/discourse-narrative-bot/config/locales/client.nb_NO.yml index aa33db00e2..043b4b28b7 100644 --- a/plugins/discourse-narrative-bot/config/locales/client.nb_NO.yml +++ b/plugins/discourse-narrative-bot/config/locales/client.nb_NO.yml @@ -8,5 +8,5 @@ nb_NO: js: discourse_narrative_bot: welcome_post_type: - new_user_track: "Start den nye brukerveiledningen for alle nye brukere" - welcome_message: "Send alle nye brukere en velkomstmelding med en rask startguide for bruk av forumet." + new_user_track: "Start den nye brukerveiledningen for alle nye brukere?" + welcome_message: "Send alle nye brukere en velkomstmelding med en rask startguide for bruk av forumet?" diff --git a/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml b/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml index f81b54c34e..77169ef40c 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.nb_NO.yml @@ -6,9 +6,9 @@ nb_NO: site_settings: - discourse_narrative_bot_enabled: "Aktiver Discourse Narrativ Bot (discobot)" - disable_discourse_narrative_bot_welcome_post: "Deaktiver velkomstinnlegget fra Discourse Fortellerbot" - discourse_narrative_bot_ignored_usernames: "Brukernavn som Discourse Fortellerbot skal ignorere" + discourse_narrative_bot_enabled: "Aktiver Discourse Narrative Bot (discobot)" + disable_discourse_narrative_bot_welcome_post: "Deaktiver velkomst innlegg fra Discourse Fortellerbot" + discourse_narrative_bot_ignored_usernames: "Brukernavn som Discourse Narrative bot skal ignorere" discourse_narrative_bot_disable_public_replies: "Deaktiver åpne svar fra Discourse Fortellerbot" discourse_narrative_bot_welcome_post_type: "Type velkomstinnlegg som Discourse Fortellerbot skal sende ut" discourse_narrative_bot_welcome_post_delay: "Vent (n) sekunder før Discourse Fortellerbot sender ut velkomstinnlegg." diff --git a/plugins/poll/config/locales/server.es.yml b/plugins/poll/config/locales/server.es.yml index 3956cf9107..7c20266e1e 100644 --- a/plugins/poll/config/locales/server.es.yml +++ b/plugins/poll/config/locales/server.es.yml @@ -44,6 +44,9 @@ es: max_vote_per_user: one: Votar %{count} vez en esta encuesta. other: Solo puedes votar %{count} veces en esta encuesta. + min_vote_per_user: + one: En esta encuesta hace falta %{count} voto. + other: En esta encuesta hacen falta %{count} votos. topic_must_be_open_to_toggle_status: "El tema debe estar abierto para cambiar el estado." only_staff_or_op_can_toggle_status: "Solo un miembro del equipo o la persona que realizó la publicación original pueden cambiar el estado de una encuesta." insufficient_rights_to_create: "No tienes permitido crear encuestas." diff --git a/plugins/poll/config/locales/server.pl_PL.yml b/plugins/poll/config/locales/server.pl_PL.yml index 555de3b547..317935f0cf 100644 --- a/plugins/poll/config/locales/server.pl_PL.yml +++ b/plugins/poll/config/locales/server.pl_PL.yml @@ -44,6 +44,17 @@ pl_PL: user_cant_post_in_topic: "Nie możesz głosować, bo nie możesz odpowiadać w tym temacie." topic_must_be_open_to_vote: "Tematy musi być otwarta aby głosować." poll_must_be_open_to_vote: "Ankieta musi być otwarta aby głosować." + one_vote_per_user: "W tej ankiecie można oddać tylko 1 głos." + max_vote_per_user: + one: Tylko %{count} głos jest dozwolony w tej ankiecie. + few: Tylko %{count} głosy są dozwolone w tej ankiecie. + many: Tylko %{count} głosów jest dozwolonych w tej ankiecie. + other: W tej ankiecie można oddać maksymalnie %{count} głosów. + min_vote_per_user: + one: Do tej ankiety wymagany jest co najmniej %{count} głos. + few: Do tej ankiety wymagane są co najmniej %{count} głosy. + many: Do tej ankiety wymagane jest co najmniej %{count} głosów. + other: Do tej ankiety wymagane jest co najmniej %{count} głosów. topic_must_be_open_to_toggle_status: "Ankieta musi być otwarta aby zmienić status ankiety." only_staff_or_op_can_toggle_status: "Status ankiety może być zmieniony przez autora wpisu lub członka załogi serwisu." insufficient_rights_to_create: "Nie masz zezwolenia na tworzenie ankiet." diff --git a/plugins/styleguide/config/locales/client.es.yml b/plugins/styleguide/config/locales/client.es.yml index 3362a941d9..4c62894985 100644 --- a/plugins/styleguide/config/locales/client.es.yml +++ b/plugins/styleguide/config/locales/client.es.yml @@ -85,3 +85,5 @@ es: title: "Iconos de encabezado" spinners: title: "Indicadores de carga" + empty_state: + title: "En caso de vacío" diff --git a/plugins/styleguide/config/locales/client.pl_PL.yml b/plugins/styleguide/config/locales/client.pl_PL.yml index c02380b92d..ed95894c1a 100644 --- a/plugins/styleguide/config/locales/client.pl_PL.yml +++ b/plugins/styleguide/config/locales/client.pl_PL.yml @@ -85,3 +85,5 @@ pl_PL: title: "Ikony nagłówka" spinners: title: "Ładowanie" + empty_state: + title: "Pusty stan" diff --git a/public/403.nb_NO.html b/public/403.nb_NO.html index de9bc32b8d..7a428d6972 100644 --- a/public/403.nb_NO.html +++ b/public/403.nb_NO.html @@ -20,7 +20,7 @@

403

-

Du har ikke tilgang til å se den ressursen!

+

Du har ikke tilgang til å se den siden

Dette vil bli erstattet av en egendefinert Discourse 403-side.

From 7b7e707fa21d0e3612a87889481a9452cc6c5c55 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 17:46:15 +0100 Subject: [PATCH 026/194] DEV: Follow up jQ file upload removal in #15376 (#15766) --- package.json | 1 - .../javascripts/jquery.iframe-transport.js | 221 ------------------ yarn.lock | 24 -- 3 files changed, 246 deletions(-) delete mode 100644 vendor/assets/javascripts/jquery.iframe-transport.js diff --git a/package.json b/package.json index 94dd81290e..59c67a341b 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "@uppy/utils": "^4.0.3", "@uppy/xhr-upload": "^2.0.4", "ace-builds": "1.4.13", - "blueimp-file-upload": "10.13.0", "bootbox": "3.2.0", "bootstrap": "v3.4.1", "chart.js": "3.5.1", diff --git a/vendor/assets/javascripts/jquery.iframe-transport.js b/vendor/assets/javascripts/jquery.iframe-transport.js deleted file mode 100644 index 29cdeaa907..0000000000 --- a/vendor/assets/javascripts/jquery.iframe-transport.js +++ /dev/null @@ -1,221 +0,0 @@ -/* - * jQuery Iframe Transport Plugin - * https://github.com/blueimp/jQuery-File-Upload - * - * Copyright 2011, Sebastian Tschan - * https://blueimp.net - * - * Licensed under the MIT license: - * https://opensource.org/licenses/MIT - */ - -/* global define, require */ - -(function (factory) { - 'use strict'; - if (typeof define === 'function' && define.amd) { - // Register as an anonymous AMD module: - define(['jquery'], factory); - } else if (typeof exports === 'object') { - // Node/CommonJS: - factory(require('jquery')); - } else { - // Browser globals: - factory(window.jQuery); - } -})(function ($) { - 'use strict'; - - // Helper variable to create unique names for the transport iframes: - var counter = 0, - jsonAPI = $, - jsonParse = 'parseJSON'; - - if ('JSON' in window && 'parse' in JSON) { - jsonAPI = JSON; - jsonParse = 'parse'; - } - - // The iframe transport accepts four additional options: - // options.fileInput: a jQuery collection of file input fields - // options.paramName: the parameter name for the file form data, - // overrides the name property of the file input field(s), - // can be a string or an array of strings. - // options.formData: an array of objects with name and value properties, - // equivalent to the return data of .serializeArray(), e.g.: - // [{name: 'a', value: 1}, {name: 'b', value: 2}] - // options.initialIframeSrc: the URL of the initial iframe src, - // by default set to "javascript:false;" - $.ajaxTransport('iframe', function (options) { - if (options.async) { - // javascript:false as initial iframe src - // prevents warning popups on HTTPS in IE6: - // eslint-disable-next-line no-script-url - var initialIframeSrc = options.initialIframeSrc || 'javascript:false;', - form, - iframe, - addParamChar; - return { - send: function (_, completeCallback) { - form = $('
'); - form.attr('accept-charset', options.formAcceptCharset); - addParamChar = /\?/.test(options.url) ? '&' : '?'; - // XDomainRequest only supports GET and POST: - if (options.type === 'DELETE') { - options.url = options.url + addParamChar + '_method=DELETE'; - options.type = 'POST'; - } else if (options.type === 'PUT') { - options.url = options.url + addParamChar + '_method=PUT'; - options.type = 'POST'; - } else if (options.type === 'PATCH') { - options.url = options.url + addParamChar + '_method=PATCH'; - options.type = 'POST'; - } - // IE versions below IE8 cannot set the name property of - // elements that have already been added to the DOM, - // so we set the name along with the iframe HTML markup: - counter += 1; - iframe = $( - '' - ).on('load', function () { - var fileInputClones, - paramNames = $.isArray(options.paramName) - ? options.paramName - : [options.paramName]; - iframe.off('load').on('load', function () { - var response; - // Wrap in a try/catch block to catch exceptions thrown - // when trying to access cross-domain iframe contents: - try { - response = iframe.contents(); - // Google Chrome and Firefox do not throw an - // exception when calling iframe.contents() on - // cross-domain requests, so we unify the response: - if (!response.length || !response[0].firstChild) { - throw new Error(); - } - } catch (e) { - response = undefined; - } - // The complete callback returns the - // iframe content document as response object: - completeCallback(200, 'success', { iframe: response }); - // Fix for IE endless progress bar activity bug - // (happens on form submits to iframe targets): - $('').appendTo( - form - ); - window.setTimeout(function () { - // Removing the form in a setTimeout call - // allows Chrome's developer tools to display - // the response result - form.remove(); - }, 0); - }); - form - .prop('target', iframe.prop('name')) - .prop('action', options.url) - .prop('method', options.type); - if (options.formData) { - $.each(options.formData, function (index, field) { - $('') - .prop('name', field.name) - .val(field.value) - .appendTo(form); - }); - } - if ( - options.fileInput && - options.fileInput.length && - options.type === 'POST' - ) { - fileInputClones = options.fileInput.clone(); - // Insert a clone for each file input field: - options.fileInput.after(function (index) { - return fileInputClones[index]; - }); - if (options.paramName) { - options.fileInput.each(function (index) { - $(this).prop('name', paramNames[index] || options.paramName); - }); - } - // Appending the file input fields to the hidden form - // removes them from their original location: - form - .append(options.fileInput) - .prop('enctype', 'multipart/form-data') - // enctype must be set as encoding for IE: - .prop('encoding', 'multipart/form-data'); - // Remove the HTML5 form attribute from the input(s): - options.fileInput.removeAttr('form'); - } - form.submit(); - // Insert the file input fields at their original location - // by replacing the clones with the originals: - if (fileInputClones && fileInputClones.length) { - options.fileInput.each(function (index, input) { - var clone = $(fileInputClones[index]); - // Restore the original name and form properties: - $(input) - .prop('name', clone.prop('name')) - .attr('form', clone.attr('form')); - clone.replaceWith(input); - }); - } - }); - form.append(iframe).appendTo(document.body); - }, - abort: function () { - if (iframe) { - // javascript:false as iframe src aborts the request - // and prevents warning popups on HTTPS in IE6. - iframe.off('load').prop('src', initialIframeSrc); - } - if (form) { - form.remove(); - } - } - }; - } - }); - - // The iframe transport returns the iframe content document as response. - // The following adds converters from iframe to text, json, html, xml - // and script. - // Please note that the Content-Type for JSON responses has to be text/plain - // or text/html, if the browser doesn't include application/json in the - // Accept header, else IE will show a download dialog. - // The Content-Type for XML responses on the other hand has to be always - // application/xml or text/xml, so IE properly parses the XML response. - // See also - // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation - $.ajaxSetup({ - converters: { - 'iframe text': function (iframe) { - return iframe && $(iframe[0].body).text(); - }, - 'iframe json': function (iframe) { - return iframe && jsonAPI[jsonParse]($(iframe[0].body).text()); - }, - 'iframe html': function (iframe) { - return iframe && $(iframe[0].body).html(); - }, - 'iframe xml': function (iframe) { - var xmlDoc = iframe && iframe[0]; - return xmlDoc && $.isXMLDoc(xmlDoc) - ? xmlDoc - : $.parseXML( - (xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || - $(xmlDoc.body).html() - ); - }, - 'iframe script': function (iframe) { - return iframe && $.globalEval($(iframe[0].body).text()); - } - } - }); -}); diff --git a/yarn.lock b/yarn.lock index 0c1e8bc222..b065bb7908 100644 --- a/yarn.lock +++ b/yarn.lock @@ -581,30 +581,6 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -blueimp-canvas-to-blob@3: - version "3.28.0" - resolved "https://registry.yarnpkg.com/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.28.0.tgz#c8ab4dc6bb08774a7f273798cdf94b0776adf6c8" - integrity sha512-5q+YHzgGsuHQ01iouGgJaPJXod2AzTxJXmVv90PpGrRxU7G7IqgPqWXz+PBmt3520jKKi6irWbNV87DicEa7wg== - -blueimp-file-upload@10.13.0: - version "10.13.0" - resolved "https://registry.yarnpkg.com/blueimp-file-upload/-/blueimp-file-upload-10.13.0.tgz#3994d1606caa44197e4aa29d7f7e1cdd6f521568" - integrity sha512-N0yIt/5oR0ZioBaj6u8YuCRSp+1doaJOnNJHIYHBHZdrcWfjfc9Xq03nzodkSdbQIRfWwNin5rexUwY203V35g== - optionalDependencies: - blueimp-canvas-to-blob "3" - blueimp-load-image "3" - blueimp-tmpl "3" - -blueimp-load-image@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/blueimp-load-image/-/blueimp-load-image-3.0.0.tgz#d71c39440a7d2f1a83e3e86a625e329116a51705" - integrity sha512-Q9rFbd4ZUNvzSFmRXx9MoG0RwWwJeMjjEUbG7WIOJgUg22Jgkow0wL5b35B6qwiBscxACW9OHdrP5s2vQ3x8DQ== - -blueimp-tmpl@3: - version "3.19.0" - resolved "https://registry.yarnpkg.com/blueimp-tmpl/-/blueimp-tmpl-3.19.0.tgz#1160f79c4ce55bd82d25cfa3df7db116f8d1df62" - integrity sha512-v8/Vge6U3uwlAjO9TxeHoYl77C1GJDZBN45pUp+39WyHU/VRzYbnGDhRNYvcT6Lh8jihVsXNZttnDpnYVA4m9w== - bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" From 7ee708913ad35692a84fc03c552a6f423dbd8c52 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 18:16:59 +0100 Subject: [PATCH 027/194] DEV: Remove install-imagemagick script (#15768) Seems to be accidentally added in #14338? --- install-imagemagick | 86 --------------------------------------------- 1 file changed, 86 deletions(-) delete mode 100755 install-imagemagick diff --git a/install-imagemagick b/install-imagemagick deleted file mode 100755 index 7122613547..0000000000 --- a/install-imagemagick +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash -set -e - -# version check: https://github.com/ImageMagick/ImageMagick/releases -IMAGE_MAGICK_VERSION="7.0.11-13" -IMAGE_MAGICK_HASH="fc454be622724c6224fa6c8230bb9c50191a05fbf05b9c9c25aa3e5497090b83" - -# version check: https://github.com/strukturag/libheif/releases -LIBHEIF_VERSION="1.12.0" -LIBHEIF_HASH="086145b0d990182a033b0011caadb1b642da84f39ab83aa66d005610650b3c65" - -# version check: https://aomedia.googlesource.com/aom -LIB_AOM_VERSION="3.1.0" - -# We use debian, but GitHub CI is stuck on Ubuntu Bionic, so this must be compatible with both -LIBJPEGTURBO=$(cat /etc/issue | grep -qi Debian && echo 'libjpeg62-turbo libjpeg62-turbo-dev' || echo 'libjpeg-turbo8 libjpeg-turbo8-dev') - -PREFIX=/usr/local -WDIR=/tmp/imagemagick - -# Install build deps -apt -y -q remove imagemagick -apt -y -q install git make gcc pkg-config autoconf curl g++ \ - yasm cmake \ - libde265-0 libde265-dev ${LIBJPEGTURBO} x265 libx265-dev libtool \ - libpng16-16 libpng-dev ${LIBJPEGTURBO} libwebp6 libwebp-dev libgomp1 libwebpmux3 libwebpdemux2 ghostscript libxml2-dev libxml2-utils \ - libbz2-dev gsfonts libtiff-dev libfreetype6-dev libjpeg-dev - -mkdir -p $WDIR -cd $WDIR - -# Building libaom -git clone https://aomedia.googlesource.com/aom -cd aom && git checkout v${LIB_AOM_VERSION} && cd .. -mkdir build_aom -cd build_aom -cmake ../aom/ -DENABLE_TESTS=0 -DBUILD_SHARED_LIBS=1 && make && make install -ldconfig /usr/local/lib -cd .. -rm -rf aom -rm -rf build_aom - -# Build and install libheif -cd $WDIR -wget -O $WDIR/libheif.tar.gz "https://github.com/strukturag/libheif/archive/v$LIBHEIF_VERSION.tar.gz" -sha256sum $WDIR/libheif.tar.gz -echo "$LIBHEIF_HASH $WDIR/libheif.tar.gz" | sha256sum -c -tar -xzvf $WDIR/libheif.tar.gz -cd libheif-$LIBHEIF_VERSION -./autogen.sh -./configure -make && make install - -# Build and install ImageMagick -wget -O $WDIR/ImageMagick.tar.gz "https://github.com/ImageMagick/ImageMagick/archive/$IMAGE_MAGICK_VERSION.tar.gz" -sha256sum $WDIR/ImageMagick.tar.gz -echo "$IMAGE_MAGICK_HASH $WDIR/ImageMagick.tar.gz" | sha256sum -c -IMDIR=$WDIR/$(tar tzf $WDIR/ImageMagick.tar.gz --wildcards "ImageMagick-*/configure" |cut -d/ -f1) -tar zxf $WDIR/ImageMagick.tar.gz -C $WDIR -cd $IMDIR -PKG_CONF_LIBDIR=$PREFIX/lib LDFLAGS=-L$PREFIX/lib CFLAGS=-I$PREFIX/include ./configure \ - --prefix=$PREFIX \ - --enable-static \ - --enable-bounds-checking \ - --enable-hdri \ - --enable-hugepages \ - --with-threads \ - --with-modules \ - --with-quantum-depth=16 \ - --without-magick-plus-plus \ - --with-bzlib \ - --with-zlib \ - --without-autotrace \ - --with-freetype \ - --with-jpeg \ - --without-lcms \ - --with-lzma \ - --with-png \ - --with-tiff \ - --with-heic \ - --with-webp -make all && make install - -cd $HOME -rm -rf $WDIR -ldconfig /usr/local/lib From 2e2fee9da3af7898d38e5a8797d5930d6c26fc03 Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Tue, 1 Feb 2022 15:26:58 -0300 Subject: [PATCH 028/194] FIX: Remove svg icons from webmanifest shortcuts (#15765) * FIX: Remove svg icons from webmanifest shortcuts While SVGs are valid in the webmanifest, Chromium has not implemented support for it in this specific manifest member. Revert when https://bugs.chromium.org/p/chromium/issues/detail?id=1091612 lands. * fix test --- app/controllers/metadata_controller.rb | 28 ----------------------- spec/requests/metadata_controller_spec.rb | 2 +- 2 files changed, 1 insertion(+), 29 deletions(-) diff --git a/app/controllers/metadata_controller.rb b/app/controllers/metadata_controller.rb index 47213031d9..eff9af7ac5 100644 --- a/app/controllers/metadata_controller.rb +++ b/app/controllers/metadata_controller.rb @@ -65,49 +65,21 @@ class MetadataController < ApplicationController name: I18n.t('js.topic.create_long'), short_name: I18n.t('js.topic.create'), url: "#{Discourse.base_path}/new-topic", - icons: [ - { - src: "#{icon_url_base}/plus.svg", - sizes: "131x150", - type: "image/svg" - } - ] }, { name: I18n.t('js.user.messages.inbox'), short_name: I18n.t('js.user.messages.inbox'), url: "#{Discourse.base_path}/my/messages", - icons: [ - { - src: "#{icon_url_base}/envelope.svg", - sizes: "150x150", - type: "image/svg" - } - ] }, { name: I18n.t('js.user.bookmarks'), short_name: I18n.t('js.user.bookmarks'), url: "#{Discourse.base_path}/my/activity/bookmarks", - icons: [ - { - src: "#{icon_url_base}/bookmark.svg", - sizes: "113x150", - type: "image/svg" - } - ] }, { name: I18n.t('js.filters.top.title'), short_name: I18n.t('js.filters.top.title'), url: "#{Discourse.base_path}/top", - icons: [ - { - src: "#{icon_url_base}/signal.svg", - sizes: "188x150", - type: "image/svg" - } - ] } ] } diff --git a/spec/requests/metadata_controller_spec.rb b/spec/requests/metadata_controller_spec.rb index 93f120b016..a0037c05b9 100644 --- a/spec/requests/metadata_controller_spec.rb +++ b/spec/requests/metadata_controller_spec.rb @@ -94,7 +94,7 @@ RSpec.describe MetadataController do expect(response.status).to eq(200) manifest = JSON.parse(response.body) expect(manifest["shortcuts"].size).to be > 0 - expect { URI.parse(manifest["shortcuts"][0]["icons"][0]["src"]) }.not_to raise_error + expect { URI.parse(manifest["shortcuts"][0]["url"]) }.not_to raise_error end end From 2e74f1dd28146c2d7b61673a87f62a5a92a6dc6e Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 19:29:53 +0100 Subject: [PATCH 029/194] DEV: Refactor clean-dom (#15609) * Move it out of page-tracking initializer * Don't use jQuery anymore * Remove `activeElement` IE10 bug workaround * Remove `$("html").data("hide-dropdown")` support; it dates back to the "initial" commit (https://github.com/discourse/discourse/blame/68ad545f0f275390a5c1f1e216edbb482d372a45/app/assets/javascripts/discourse/routes/discourse_route.js.coffee#L26-L27) and I don't think it was being used for years now --- .../initializers/clean-dom-on-route-change.js | 46 +++++++++++++++++++ .../app/initializers/page-tracking.js | 5 -- .../discourse/app/lib/clean-dom.js | 34 -------------- 3 files changed, 46 insertions(+), 39 deletions(-) create mode 100644 app/assets/javascripts/discourse/app/initializers/clean-dom-on-route-change.js delete mode 100644 app/assets/javascripts/discourse/app/lib/clean-dom.js diff --git a/app/assets/javascripts/discourse/app/initializers/clean-dom-on-route-change.js b/app/assets/javascripts/discourse/app/initializers/clean-dom-on-route-change.js new file mode 100644 index 0000000000..e7f0276658 --- /dev/null +++ b/app/assets/javascripts/discourse/app/initializers/clean-dom-on-route-change.js @@ -0,0 +1,46 @@ +import { scheduleOnce } from "@ember/runloop"; + +function _clean(transition) { + if (window.MiniProfiler && transition.from) { + window.MiniProfiler.pageTransition(); + } + + // Close some elements that may be open + document.querySelectorAll("header ul.icons li").forEach((element) => { + element.classList.remove("active"); + }); + + document.querySelectorAll(`[data-toggle="dropdown"]`).forEach((element) => { + element.parentElement.classList.remove("open"); + }); + + // Close the lightbox + if ($.magnificPopup?.instance) { + $.magnificPopup.instance.close(); + document.body.classList.remove("mfp-zoom-out-cur"); + } + + // Remove any link focus + const { activeElement } = document; + if (activeElement && !activeElement.classList.contains("no-blur")) { + activeElement.blur(); + } + + this.lookup("route:application").send("closeModal"); + + this.lookup("service:app-events").trigger("dom:clean"); + this.lookup("service:document-title").updateContextCount(0); +} + +export default { + name: "clean-dom-on-route-change", + after: "inject-objects", + + initialize(container) { + const router = container.lookup("router:main"); + + router.on("routeDidChange", (transition) => { + scheduleOnce("afterRender", container, _clean, transition); + }); + }, +}; diff --git a/app/assets/javascripts/discourse/app/initializers/page-tracking.js b/app/assets/javascripts/discourse/app/initializers/page-tracking.js index df11851a6e..f640275e8c 100644 --- a/app/assets/javascripts/discourse/app/initializers/page-tracking.js +++ b/app/assets/javascripts/discourse/app/initializers/page-tracking.js @@ -3,7 +3,6 @@ import { resetPageTracking, startPageTracking, } from "discourse/lib/page-tracker"; -import { cleanDOM } from "discourse/lib/clean-dom"; import { viewTrackingRequired } from "discourse/lib/ajax"; export default { @@ -13,11 +12,7 @@ export default { initialize(container) { // Tell our AJAX system to track a page transition const router = container.lookup("router:main"); - router.on("routeWillChange", viewTrackingRequired); - router.on("routeDidChange", (transition) => { - cleanDOM(container, { skipMiniProfilerPageTransition: !transition.from }); - }); let appEvents = container.lookup("service:app-events"); let documentTitle = container.lookup("service:document-title"); diff --git a/app/assets/javascripts/discourse/app/lib/clean-dom.js b/app/assets/javascripts/discourse/app/lib/clean-dom.js deleted file mode 100644 index 00403b30f4..0000000000 --- a/app/assets/javascripts/discourse/app/lib/clean-dom.js +++ /dev/null @@ -1,34 +0,0 @@ -import { scheduleOnce } from "@ember/runloop"; - -function _clean(opts = {}) { - if (window.MiniProfiler && !opts.skipMiniProfilerPageTransition) { - window.MiniProfiler.pageTransition(); - } - - // Close some elements that may be open - $("header ul.icons li").removeClass("active"); - $('[data-toggle="dropdown"]').parent().removeClass("open"); - // close the lightbox - if ($.magnificPopup && $.magnificPopup.instance) { - $.magnificPopup.instance.close(); - $("body").removeClass("mfp-zoom-out-cur"); - } - - // Remove any link focus - // NOTE: the '.not("body")' is here to prevent a bug in IE10 on Win7 - // cf. https://stackoverflow.com/questions/5657371 - $(document.activeElement).not("body").not(".no-blur").blur(); - - this.lookup("route:application").send("closeModal"); - const hideDropDownFunction = $("html").data("hide-dropdown"); - if (hideDropDownFunction) { - hideDropDownFunction(); - } - - this.lookup("service:app-events").trigger("dom:clean"); - this.lookup("service:document-title").updateContextCount(0); -} - -export function cleanDOM(container, opts) { - scheduleOnce("afterRender", container, _clean, opts); -} From 82a46beecbc4ce7156b504b9aa08fbe25088515b Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 20:04:46 +0100 Subject: [PATCH 030/194] UX: Add hover style to refresh-page dismiss button (#15711) Also fixes icon size and position --- .../common/software-update-prompt.scss | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/common/software-update-prompt.scss b/app/assets/stylesheets/common/software-update-prompt.scss index c253eaad48..812b7e2687 100644 --- a/app/assets/stylesheets/common/software-update-prompt.scss +++ b/app/assets/stylesheets/common/software-update-prompt.scss @@ -22,6 +22,12 @@ .update-prompt-message { cursor: pointer; padding: 0.75em 0; + + .d-icon { + margin-right: 0.33em; + font-size: 0.9em; + } + span { text-decoration: underline; } @@ -35,17 +41,15 @@ span { cursor: pointer; - display: inline; height: 100%; display: flex; align-items: center; padding-left: 20px; - } - } - .d-icon { - margin-right: 0.33em; - font-size: 0.9em; + &:hover { + color: var(--tertiary-hover); + } + } } &.require-software-refresh { From 36194398e54dd8569194480a9b1a13b040c69a92 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 20:07:23 +0100 Subject: [PATCH 031/194] UX: Slightly tweak admin/customize/themes CSS (#15712) --- app/assets/stylesheets/common/admin/customize.scss | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/app/assets/stylesheets/common/admin/customize.scss b/app/assets/stylesheets/common/admin/customize.scss index c134aa3452..f09583c1b3 100644 --- a/app/assets/stylesheets/common/admin/customize.scss +++ b/app/assets/stylesheets/common/admin/customize.scss @@ -176,12 +176,10 @@ .themes-list-header { width: 100%; - border-bottom: 1px solid var(--primary-low); - border-top: 1px solid var(--primary-low); - border-right: 1px solid var(--primary-low); display: flex; .tab { + border: none; padding: 1em; width: 50%; box-sizing: border-box; @@ -190,16 +188,12 @@ &.active { font-weight: 700; } - - &:last-child { - border-left: 1px solid var(--primary-low); - } } } .themes-list-container { overflow-y: auto; - box-sizing: content-box; + box-sizing: border-box; max-height: 60vh; @media screen and (max-height: 1000px) { max-height: 50vh; @@ -209,6 +203,7 @@ } border-right: 1px solid var(--primary-low); border-bottom: 1px solid var(--primary-low); + border-left: 1px solid var(--primary-low); width: 100%; .themes-list-item:last-child { @@ -218,7 +213,6 @@ color: var(--primary); border-bottom: 1px solid var(--primary-low); display: flex; - border-left: 1px solid var(--primary-low); &.inactive-indicator { border-right: 0; From 7806857841561c0ae07e54ee9980ed889be970d9 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 21:32:48 +0100 Subject: [PATCH 032/194] UX: Highlight "Users" link when on adminUser path (#15739) --- app/assets/javascripts/admin/addon/templates/admin.hbs | 2 +- app/assets/stylesheets/common/admin/admin_base.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/admin/addon/templates/admin.hbs b/app/assets/javascripts/admin/addon/templates/admin.hbs index d0a6be8bc5..8a7c76a106 100644 --- a/app/assets/javascripts/admin/addon/templates/admin.hbs +++ b/app/assets/javascripts/admin/addon/templates/admin.hbs @@ -7,7 +7,7 @@ {{#if currentUser.admin}} {{nav-item route="adminSiteSettings" label="admin.site_settings.title"}} {{/if}} - {{nav-item route="adminUsersList" label="admin.users.title"}} + {{nav-item route="adminUsers" label="admin.users.title"}} {{#if showGroups}} {{nav-item route="groups" label="admin.groups.title"}} {{/if}} diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss index f004e44354..cfe46e0842 100644 --- a/app/assets/stylesheets/common/admin/admin_base.scss +++ b/app/assets/stylesheets/common/admin/admin_base.scss @@ -10,9 +10,9 @@ $mobile-breakpoint: 700px; display: inline-flex; position: relative; width: 100%; - height: auto; overflow: hidden; height: 100%; + @include breakpoint(tablet) { width: calc(100% + 10px); margin-left: -10px; From 692b6543ff86cae30316410572fc87a66f7cfb55 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 21:33:06 +0100 Subject: [PATCH 033/194] FIX: Composer fields on small desktop sizes (#15729) --- app/assets/stylesheets/common/base/compose.scss | 15 --------------- app/assets/stylesheets/mobile/compose.scss | 5 ++++- 2 files changed, 4 insertions(+), 16 deletions(-) diff --git a/app/assets/stylesheets/common/base/compose.scss b/app/assets/stylesheets/common/base/compose.scss index 8a07695208..5a8024c739 100644 --- a/app/assets/stylesheets/common/base/compose.scss +++ b/app/assets/stylesheets/common/base/compose.scss @@ -237,11 +237,6 @@ max-width: 40%; margin: 0 0 8px 8px; - @media screen and (max-width: 955px) { - flex: 1 0 100%; - margin-left: 0; - } - .category-chooser { display: flex; flex: 1 0 auto; @@ -286,12 +281,6 @@ min-width: 0; // allows flex to shrink flex-wrap: wrap; max-width: calc(50% - 4px); - - @media screen and (max-width: 920px) { - margin-right: 0; - margin-bottom: 6px; - max-width: calc(50% - 3px); - } } } @@ -322,10 +311,6 @@ margin: 0 0 8px 8px; z-index: z("composer", "dropdown"); - @media screen and (max-width: 920px) { - max-width: calc(50% - 3px); - } - .select-kit-header { color: var(--primary-high); } diff --git a/app/assets/stylesheets/mobile/compose.scss b/app/assets/stylesheets/mobile/compose.scss index cb64cbf2cd..f9530d81b1 100644 --- a/app/assets/stylesheets/mobile/compose.scss +++ b/app/assets/stylesheets/mobile/compose.scss @@ -85,8 +85,10 @@ margin-bottom: 6px; } - .category-input { + .category-input, + .with-tags .category-input { margin-bottom: 6px; + max-width: calc(50% - 3px); } .submit-panel { @@ -189,6 +191,7 @@ .mini-tag-chooser { margin: 0 0 6px 6px; + max-width: calc(50% - 3px); } .selected-name { From ce2c5ffb290eeb8f6d4cb62074ae3d558ee538ca Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 22:36:34 +0100 Subject: [PATCH 034/194] DEV: Simplify header width css (#15746) --- app/assets/stylesheets/common/base/header.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/common/base/header.scss b/app/assets/stylesheets/common/base/header.scss index 7302275b13..07cffbaf11 100644 --- a/app/assets/stylesheets/common/base/header.scss +++ b/app/assets/stylesheets/common/base/header.scss @@ -14,8 +14,10 @@ backface-visibility: hidden; /** do magic for scrolling performance **/ > .wrap { - width: calc(100% - 20px); // accommodates for 10px vertical padding + box-sizing: border-box; + width: 100%; height: 100%; + .contents { display: flex; align-items: center; From 6f8c91254ec816b25d73b9edadebc8db2e76edd2 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 22:36:48 +0100 Subject: [PATCH 035/194] FEATURE: Partial match aliases in emoji filter (#15613) --- .../javascripts/discourse/tests/unit/lib/emoji-test.js | 7 +++++++ app/assets/javascripts/pretty-text/addon/emoji.js | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/tests/unit/lib/emoji-test.js b/app/assets/javascripts/discourse/tests/unit/lib/emoji-test.js index 77ce2d61d1..8be1a2a50a 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/emoji-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/emoji-test.js @@ -158,4 +158,11 @@ discourseModule("Unit | Utility | emoji", function () { assert.deepEqual(matches, ["bowing_man"]); }); + + test("search does partial-match on emoji aliases", function (assert) { + const matches = emojiSearch("instru"); + + assert.ok(matches.includes("woman_teacher")); + assert.ok(matches.includes("violin")); + }); }); diff --git a/app/assets/javascripts/pretty-text/addon/emoji.js b/app/assets/javascripts/pretty-text/addon/emoji.js index 9d79a6ce61..16d4b31aea 100644 --- a/app/assets/javascripts/pretty-text/addon/emoji.js +++ b/app/assets/javascripts/pretty-text/addon/emoji.js @@ -222,9 +222,11 @@ export function emojiSearch(term, options) { } } - if (searchAliases[term]) { - for (const emoji of searchAliases[term]) { - addResult(emoji); + for (const [key, value] of Object.entries(searchAliases)) { + if (key.startsWith(term)) { + for (const emoji of value) { + addResult(emoji); + } } } From eff0106efbf1cec02d46a13460fcd686591e64d8 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 1 Feb 2022 23:30:21 +0100 Subject: [PATCH 036/194] FIX: Image sizes were slightly off in some cases (#15678) This fixes rare cases of layout shift caused by images appearing slightly smaller after being loaded. For example, a 371x1031 image is uploaded. It gets lightboxed, with the generated thumbnail of size 179x500. `height: auto` changes that thumbnail's size (only after being loaded) to 179x497, causing a 3px shift. I did not observe any regressions with this change. --- app/assets/stylesheets/common/base/topic-post.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss index 4ca310e6c4..37ce8a326d 100644 --- a/app/assets/stylesheets/common/base/topic-post.scss +++ b/app/assets/stylesheets/common/base/topic-post.scss @@ -191,7 +191,6 @@ $quote-share-maxwidth: 150px; img:not(.thumbnail):not(.ytp-thumbnail-image):not(.emoji) { max-width: 100%; - height: auto; } } From 3da6f6b717905bafb62d64d800965d62e2603ac6 Mon Sep 17 00:00:00 2001 From: tshenry Date: Tue, 1 Feb 2022 19:53:02 -0800 Subject: [PATCH 037/194] FEATURE: New plugin outlets for categories-boxes template (#15771) Adds new category-box-before-each-box and category-box-after-each-box outlets to improve flexibility with customizations. --- .../discourse/app/templates/components/categories-boxes.hbs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs b/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs index 725497bbec..d1d03e36fa 100644 --- a/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs @@ -1,4 +1,5 @@ {{#each categories as |c|}} + {{plugin-outlet name="category-box-before-each-box" args=(hash category=c)}}
{{#unless c.isMuted}} @@ -73,4 +74,5 @@ {{plugin-outlet name="category-box-below-each-category" args=(hash category=c)}}
+ {{plugin-outlet name="category-box-after-each-box" args=(hash category=c)}} {{/each}} From bb015636822bebf7f4d29f50cbc2685f0894ea34 Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Wed, 2 Feb 2022 16:22:52 +1100 Subject: [PATCH 038/194] FIX: post mover validation color and message (#15688) When the record is not saved, we should display a proper message. One potential reason can be plugins for example discourse-calendar is specifying that only first post can contain event --- .../discourse/app/controllers/move-to-topic.js | 2 +- app/controllers/topics_controller.rb | 2 +- app/models/post_mover.rb | 2 +- spec/requests/topics_controller_spec.rb | 15 +++++++++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/move-to-topic.js b/app/assets/javascripts/discourse/app/controllers/move-to-topic.js index d5e8709541..c5f80bcab2 100644 --- a/app/assets/javascripts/discourse/app/controllers/move-to-topic.js +++ b/app/assets/javascripts/discourse/app/controllers/move-to-topic.js @@ -169,7 +169,7 @@ export default Controller.extend(ModalFunctionality, { DiscourseURL.routeTo(result.url); }) .catch((xhr) => { - this.flash(extractError(xhr, I18n.t("topic.move_to.error"))); + this.flash(extractError(xhr, I18n.t("topic.move_to.error")), "error"); }) .finally(() => { this.set("saving", false); diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index baeef8c388..a7b758e20f 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -839,7 +839,7 @@ class TopicsController < ApplicationController destination_topic = move_posts_to_destination(topic) render_topic_changes(destination_topic) - rescue ActiveRecord::RecordInvalid => ex + rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotSaved => ex render_json_error(ex) end diff --git a/app/models/post_mover.rb b/app/models/post_mover.rb index e24b9827d8..945d547377 100644 --- a/app/models/post_mover.rb +++ b/app/models/post_mover.rb @@ -165,7 +165,7 @@ class PostMover guardian: Guardian.new(user), skip_jobs: true ) - new_post = @post_creator.create + new_post = @post_creator.create! move_email_logs(post, new_post) diff --git a/spec/requests/topics_controller_spec.rb b/spec/requests/topics_controller_spec.rb index e1dfc7acd1..7328b2eb93 100644 --- a/spec/requests/topics_controller_spec.rb +++ b/spec/requests/topics_controller_spec.rb @@ -326,6 +326,21 @@ RSpec.describe TopicsController do expect(result['success']).to eq(false) expect(result['url']).to be_blank end + + it 'returns plugin validation error' do + # stub here is to simulate validation added by plugin which would be triggered when post is moved + PostCreator.any_instance.stubs(:skip_validations?).returns(false) + + p1.update_columns(raw: "i", cooked: "") + post "/t/#{topic.id}/move-posts.json", params: { + post_ids: [p1.id], + destination_topic_id: dest_topic.id + } + + expect(response.status).to eq(422) + result = response.parsed_body + expect(result['errors']).to eq(["Body is too short (minimum is 5 characters) and Body seems unclear, is it a complete sentence?"]) + end end end From a1adc13125c9073fe4a86a8eda03a6d1489e362e Mon Sep 17 00:00:00 2001 From: Krzysztof Kotlarek Date: Wed, 2 Feb 2022 16:23:56 +1100 Subject: [PATCH 039/194] FIX: aria label for popup-input-tip (#15724) popup-input-tip is used for composer validation. Aria label is essential to for accessibility. Also, HTML tags have to be removed --- .../discourse/app/components/popup-input-tip.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/discourse/app/components/popup-input-tip.js b/app/assets/javascripts/discourse/app/components/popup-input-tip.js index 0ee73dbdc6..096e941bed 100644 --- a/app/assets/javascripts/discourse/app/components/popup-input-tip.js +++ b/app/assets/javascripts/discourse/app/components/popup-input-tip.js @@ -5,7 +5,7 @@ import { getOwner } from "discourse-common/lib/get-owner"; export default Component.extend({ classNameBindings: [":popup-tip", "good", "bad", "lastShownAt::hide"], - attributeBindings: ["role"], + attributeBindings: ["role", "ariaLabel"], rerenderTriggers: ["validation.reason"], tipReason: null, lastShownAt: or("shownAt", "validation.lastShownAt"), @@ -19,6 +19,11 @@ export default Component.extend({ } }, + @discourseComputed("validation.reason") + ariaLabel(reason) { + return reason?.replace(/(<([^>]+)>)/gi, ""); + }, + click() { this.set("shownAt", null); const composer = getOwner(this).lookup("controller:composer"); From 3837eb45b87b01927a75dd2c5e01f48f935c9655 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 2 Feb 2022 10:56:03 -0500 Subject: [PATCH 040/194] FIX: Qunit tests were failing if your node was defaulting to IPV6 (#15773) This is now the default in newer node versions. The code that fails is a workaround for another error :'( This also upgrades `chrome-launcher` which helpers with debugging. --- package.json | 2 +- test/run-qunit.js | 4 ++-- yarn.lock | 39 ++++++++++++--------------------------- 3 files changed, 15 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 59c67a341b..ddb9c60851 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,7 @@ "@arkweid/lefthook": "^0.7.2", "@mixer/parallel-prettier": "^2.0.1", "browserify": "^17.0.0", - "chrome-launcher": "^0.12.0", + "chrome-launcher": "^0.14.2", "chrome-remote-interface": "^0.25", "lodash-cli": "https://github.com/lodash-archive/lodash-cli.git", "pretender": "^3.4.7", diff --git a/test/run-qunit.js b/test/run-qunit.js index 2ec905fc50..de5bd7f8af 100644 --- a/test/run-qunit.js +++ b/test/run-qunit.js @@ -61,7 +61,7 @@ async function runAllTests() { // Workaround for intermittent CI error caused by // https://github.com/GoogleChrome/chrome-launcher/issues/145 try { - protocol = await CDP({ port: chrome.port }); + protocol = await CDP({ port: chrome.port, host: "127.0.0.1" }); } catch (e) { if (e.message === "No inspectable targets" && connectAttempts < 50) { connectAttempts++; @@ -279,7 +279,7 @@ function logQUnit() { console.log("Slowest tests"); console.log("----------------------------------------------"); let ary = Object.keys(durations).map((key) => ({ - key: key, + key, value: durations[key], })); ary.sort((p1, p2) => p2.value - p1.value); diff --git a/yarn.lock b/yarn.lock index b065bb7908..c7471bdcc0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -917,16 +917,15 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chrome-launcher@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.12.0.tgz#08db81ef0f7b283c331df2c350e780c38bd0ce3a" - integrity sha512-rBUP4tvWToiileDi3UR0SbWKoUoDCYTRmVND2sdoBL1xANBgVz8V9h1yQluj3MEQaBJg0fRw7hW82uOPrJus7A== +chrome-launcher@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.14.2.tgz#5cb334794b9e83fad7303c96c131a4ec9e9f83a6" + integrity sha512-Nk8DUCIfPR6p9WClPPFeP2ztpAdkT8xueoiDS03csea1uoJjm4w0p5Oy1hjykyjT1EQ0MMrEshLD3C8gHXyiZw== dependencies: "@types/node" "*" - is-wsl "^2.1.0" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" lighthouse-logger "^1.0.0" - mkdirp "0.5.1" - rimraf "^2.6.1" chrome-remote-interface@^0.25: version "0.25.7" @@ -1480,6 +1479,11 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + eslint-config-discourse@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/eslint-config-discourse/-/eslint-config-discourse-1.1.9.tgz#9a5ee6b3a4b986e5243f517e7945d1709c4e22df" @@ -2543,7 +2547,7 @@ is-windows@^1.0.1, is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.1.0: +is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -2883,11 +2887,6 @@ minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -2906,13 +2905,6 @@ mkdirp-classic@^0.5.2: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - mkdirp@^0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -3647,13 +3639,6 @@ rimraf@3.0.2, rimraf@^3.0.0: dependencies: glob "^7.1.3" -rimraf@^2.6.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" From f16f9171d0d5f8027c58ed956faa60de6bc17d67 Mon Sep 17 00:00:00 2001 From: Mohamed ABDELLANI Date: Wed, 2 Feb 2022 17:05:37 +0100 Subject: [PATCH 041/194] Update DEVELOPER-ADVANCED.md (#15770) In the READ.ME, version 2.7.2 is recommended. --- docs/DEVELOPER-ADVANCED.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DEVELOPER-ADVANCED.md b/docs/DEVELOPER-ADVANCED.md index a4dac6c68b..db713d2a0a 100644 --- a/docs/DEVELOPER-ADVANCED.md +++ b/docs/DEVELOPER-ADVANCED.md @@ -28,8 +28,8 @@ To get your Ubuntu 16.04 or 18.04 LTS install up and running to develop Discours # exit the terminal and open it again to activate RVM - rvm install 2.6.2 - rvm --default use 2.6.2 # If this error out check https://rvm.io/integration/gnome-terminal + rvm install 2.7.2 + rvm --default use 2.7.2 # If this error out check https://rvm.io/integration/gnome-terminal gem install bundler rake # Download and install postgresql-10 from https://wiki.postgresql.org/wiki/Apt From 6f25f1736031184ac05fc4059edde772a7e3bf56 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 2 Feb 2022 12:09:03 -0500 Subject: [PATCH 042/194] DEV: Revisit skipped tests (#15769) * Some are no longer flaky or easily fixed * Some are out of date or test things we can't do accurately (scroll position) and are removed. * Unwinds some uppy tests and makes sure all promises and runloops are resolved. Everything has been run in legacy/ember cli multiple times to ensure no obvious suite regressions. --- .../app/mixins/composer-upload-uppy.js | 218 ++++++++++-------- .../tests/acceptance/click-track-test.js | 5 +- .../acceptance/composer-uploads-uppy-test.js | 45 ++-- .../tests/acceptance/fast-edit-test.js | 4 +- .../tests/acceptance/jump-to-test.js | 4 +- .../discourse/tests/acceptance/modal-test.js | 6 +- .../tests/acceptance/post-history-test.js | 4 +- .../tests/acceptance/search-full-test.js | 44 +--- .../tests/acceptance/sign-in-test.js | 8 +- .../tests/acceptance/sticky-avatars-test.js | 19 -- .../acceptance/topic-quote-button-test.js | 155 +++++++------ .../tests/acceptance/unknown-test.js | 4 +- .../discourse/tests/helpers/qunit-helpers.js | 12 +- .../integration/components/ace-editor-test.js | 24 +- .../integration/components/value-list-test.js | 4 - .../integration/widgets/home-logo-test.js | 1 - .../unit/lib/click-track-edit-history-test.js | 107 --------- .../unit/lib/click-track-profile-page-test.js | 98 -------- .../tests/unit/lib/load-script-test.js | 19 +- .../tests/unit/lib/pretty-text-test.js | 16 +- .../tests/unit/lib/utilities-test.js | 19 +- 21 files changed, 261 insertions(+), 555 deletions(-) delete mode 100644 app/assets/javascripts/discourse/tests/acceptance/sticky-avatars-test.js delete mode 100644 app/assets/javascripts/discourse/tests/unit/lib/click-track-edit-history-test.js delete mode 100644 app/assets/javascripts/discourse/tests/unit/lib/click-track-profile-page-test.js diff --git a/app/assets/javascripts/discourse/app/mixins/composer-upload-uppy.js b/app/assets/javascripts/discourse/app/mixins/composer-upload-uppy.js index 7ba98ad19e..5039c8626b 100644 --- a/app/assets/javascripts/discourse/app/mixins/composer-upload-uppy.js +++ b/app/assets/javascripts/discourse/app/mixins/composer-upload-uppy.js @@ -20,6 +20,7 @@ import { } from "discourse/lib/uploads"; import { cacheShortUploadUrl } from "pretty-text/upload-short-url"; import bootbox from "bootbox"; +import { run } from "@ember/runloop"; // Note: This mixin is used _in addition_ to the ComposerUpload mixin // on the composer-editor component. It overrides some, but not all, @@ -206,112 +207,135 @@ export default Mixin.create(ExtendableUploader, UppyS3Multipart, { } this._uppyInstance.on("file-added", (file) => { - if (isPrivateMessage) { - file.meta.for_private_message = true; - } + run(() => { + if (isPrivateMessage) { + file.meta.for_private_message = true; + } + }); }); this._uppyInstance.on("progress", (progress) => { - if (this.isDestroying || this.isDestroyed) { - return; - } + run(() => { + if (this.isDestroying || this.isDestroyed) { + return; + } - this.set("uploadProgress", progress); + this.set("uploadProgress", progress); + }); }); this._uppyInstance.on("file-removed", (file, reason) => { - // we handle the cancel-all event specifically, so no need - // to do anything here. this event is also fired when some files - // are handled by an upload handler - if (reason === "cancel-all") { - return; - } + run(() => { + // we handle the cancel-all event specifically, so no need + // to do anything here. this event is also fired when some files + // are handled by an upload handler + if (reason === "cancel-all") { + return; + } - file.meta.cancelled = true; - this._removeInProgressUpload(file.id); - this._resetUpload(file, { removePlaceholder: true }); - if (this.inProgressUploads.length === 0) { - this.set("userCancelled", true); - this._uppyInstance.cancelAll(); - } + file.meta.cancelled = true; + this._removeInProgressUpload(file.id); + this._resetUpload(file, { removePlaceholder: true }); + if (this.inProgressUploads.length === 0) { + this.set("userCancelled", true); + this._uppyInstance.cancelAll(); + } + }); }); this._uppyInstance.on("upload-progress", (file, progress) => { - if (this.isDestroying || this.isDestroyed) { - return; - } + run(() => { + if (this.isDestroying || this.isDestroyed) { + return; + } - const upload = this.inProgressUploads.find((upl) => upl.id === file.id); - if (upload) { - const percentage = Math.round( - (progress.bytesUploaded / progress.bytesTotal) * 100 - ); - upload.set("progress", percentage); - } + const upload = this.inProgressUploads.find((upl) => upl.id === file.id); + if (upload) { + const percentage = Math.round( + (progress.bytesUploaded / progress.bytesTotal) * 100 + ); + upload.set("progress", percentage); + } + }); }); this._uppyInstance.on("upload", (data) => { - this._addNeedProcessing(data.fileIDs.length); + run(() => { + this._addNeedProcessing(data.fileIDs.length); - const files = data.fileIDs.map((fileId) => - this._uppyInstance.getFile(fileId) - ); - - this.setProperties({ - isProcessingUpload: true, - isCancellable: false, - }); - - files.forEach((file) => { - // The inProgressUploads is meant to be used to display these uploads - // in a UI, and Ember will only update the array in the UI if pushObject - // is used to notify it. - this.inProgressUploads.pushObject( - EmberObject.create({ - fileName: file.name, - id: file.id, - progress: 0, - extension: file.extension, - }) + const files = data.fileIDs.map((fileId) => + this._uppyInstance.getFile(fileId) ); - const placeholder = this._uploadPlaceholder(file); - this.placeholders[file.id] = { - uploadPlaceholder: placeholder, - }; - this.appEvents.trigger(`${this.eventPrefix}:insert-text`, placeholder); - this.appEvents.trigger(`${this.eventPrefix}:upload-started`, file.name); + + this.setProperties({ + isProcessingUpload: true, + isCancellable: false, + }); + + files.forEach((file) => { + // The inProgressUploads is meant to be used to display these uploads + // in a UI, and Ember will only update the array in the UI if pushObject + // is used to notify it. + this.inProgressUploads.pushObject( + EmberObject.create({ + fileName: file.name, + id: file.id, + progress: 0, + extension: file.extension, + }) + ); + const placeholder = this._uploadPlaceholder(file); + this.placeholders[file.id] = { + uploadPlaceholder: placeholder, + }; + this.appEvents.trigger( + `${this.eventPrefix}:insert-text`, + placeholder + ); + this.appEvents.trigger( + `${this.eventPrefix}:upload-started`, + file.name + ); + }); }); }); this._uppyInstance.on("upload-success", (file, response) => { - this._removeInProgressUpload(file.id); - let upload = response.body; - const markdown = this.uploadMarkdownResolvers.reduce( - (md, resolver) => resolver(upload) || md, - getUploadMarkdown(upload) - ); + run(() => { + if (!this._uppyInstance) { + return; + } + this._removeInProgressUpload(file.id); + let upload = response.body; + const markdown = this.uploadMarkdownResolvers.reduce( + (md, resolver) => resolver(upload) || md, + getUploadMarkdown(upload) + ); - cacheShortUploadUrl(upload.short_url, upload); + cacheShortUploadUrl(upload.short_url, upload); - this.appEvents.trigger( - `${this.eventPrefix}:replace-text`, - this.placeholders[file.id].uploadPlaceholder.trim(), - markdown - ); + this.appEvents.trigger( + `${this.eventPrefix}:replace-text`, + this.placeholders[file.id].uploadPlaceholder.trim(), + markdown + ); - this._resetUpload(file, { removePlaceholder: false }); - this.appEvents.trigger( - `${this.eventPrefix}:upload-success`, - file.name, - upload - ); + this._resetUpload(file, { removePlaceholder: false }); + this.appEvents.trigger( + `${this.eventPrefix}:upload-success`, + file.name, + upload + ); + }); }); this._uppyInstance.on("upload-error", this._handleUploadError); this._uppyInstance.on("complete", () => { - this.appEvents.trigger(`${this.eventPrefix}:all-uploads-complete`); - this._reset(); + run(() => { + this.appEvents.trigger(`${this.eventPrefix}:all-uploads-complete`); + this._reset(); + }); }); this._uppyInstance.on("cancel-all", () => { @@ -319,11 +343,13 @@ export default Mixin.create(ExtendableUploader, UppyS3Multipart, { // only do the manual cancelling work if the user clicked cancel if (this.userCancelled) { Object.values(this.placeholders).forEach((data) => { - this.appEvents.trigger( - `${this.eventPrefix}:replace-text`, - data.uploadPlaceholder, - "" - ); + run(() => { + this.appEvents.trigger( + `${this.eventPrefix}:replace-text`, + data.uploadPlaceholder, + "" + ); + }); }); this.set("userCancelled", false); @@ -415,21 +441,25 @@ export default Mixin.create(ExtendableUploader, UppyS3Multipart, { this._onPreProcessComplete( (file) => { - let placeholderData = this.placeholders[file.id]; - this.appEvents.trigger( - `${this.eventPrefix}:replace-text`, - placeholderData.processingPlaceholder, - placeholderData.uploadPlaceholder - ); + run(() => { + let placeholderData = this.placeholders[file.id]; + this.appEvents.trigger( + `${this.eventPrefix}:replace-text`, + placeholderData.processingPlaceholder, + placeholderData.uploadPlaceholder + ); + }); }, () => { - this.setProperties({ - isProcessingUpload: false, - isCancellable: true, + run(() => { + this.setProperties({ + isProcessingUpload: false, + isCancellable: true, + }); + this.appEvents.trigger( + `${this.eventPrefix}:uploads-preprocessing-complete` + ); }); - this.appEvents.trigger( - `${this.eventPrefix}:uploads-preprocessing-complete` - ); } ); }, diff --git a/app/assets/javascripts/discourse/tests/acceptance/click-track-test.js b/app/assets/javascripts/discourse/tests/acceptance/click-track-test.js index 00e1f45ccb..3fde9f90b2 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/click-track-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/click-track-test.js @@ -4,8 +4,7 @@ import { exists, } from "discourse/tests/helpers/qunit-helpers"; import { click, currentURL, visit } from "@ember/test-helpers"; -import { skip } from "qunit"; -// import { test } from "qunit"; +import { test } from "qunit"; acceptance("Click Track", function (needs) { let tracked = false; @@ -16,7 +15,7 @@ acceptance("Click Track", function (needs) { }); }); - skip("Do not track mentions", async function (assert) { + test("Do not track mentions", async function (assert) { await visit("/t/internationalization-localization/280"); assert.ok(!exists(".user-card.show"), "card should not appear"); diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js index 5ee335fe01..efb6bb6fe6 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js @@ -9,7 +9,8 @@ import bootbox from "bootbox"; import { authorizedExtensions } from "discourse/lib/uploads"; import { click, fillIn, visit } from "@ember/test-helpers"; import I18n from "I18n"; -import { skip, test } from "qunit"; +import { test } from "qunit"; +import { Promise } from "rsvp"; function pretender(server, helper) { server.post("/uploads/lookup-urls", () => { @@ -132,28 +133,17 @@ acceptance("Uppy Composer Attachment - Upload Placeholder", function (needs) { appEvents.trigger("composer:add-files", [jsonFile]); }); - // TODO: Had to comment this out for now; it works fine in Ember CLI but lagging - // UI updates sink it for the old Ember for some reason. Will re-enable - // when we make Ember CLI the primary. - - skip("cancelling uploads clears the placeholders out", async function (assert) { + test("cancelling uploads clears the placeholders out", async function (assert) { await visit("/"); await click("#create-topic"); await fillIn(".d-editor-input", "The image:\n"); + + const image = createFile("avatar.png"); + const image2 = createFile("avatar2.png"); + const appEvents = loggedInUser().appEvents; - const done = assert.async(); - - appEvents.on("composer:uploads-cancelled", () => { - assert.strictEqual( - query(".d-editor-input").value, - "The image:\n", - "it should clear the cancelled placeholders" - ); - done(); - }); - let uploadStarted = 0; - appEvents.on("composer:upload-started", async () => { + appEvents.on("composer:upload-started", () => { uploadStarted++; if (uploadStarted === 2) { @@ -164,14 +154,21 @@ acceptance("Uppy Composer Attachment - Upload Placeholder", function (needs) { ); } }); - - appEvents.on("composer:uploads-preprocessing-complete", async () => { - await click("#cancel-file-upload"); + appEvents.on("composer:uploads-cancelled", () => { + assert.strictEqual( + query(".d-editor-input").value, + "The image:\n", + "it should clear the cancelled placeholders" + ); }); - const image = createFile("avatar.png"); - const image2 = createFile("avatar2.png"); - appEvents.trigger("composer:add-files", [image, image2]); + await new Promise(function (resolve) { + appEvents.on("composer:uploads-preprocessing-complete", function () { + resolve(); + }); + appEvents.trigger("composer:add-files", [image, image2]); + }); + await click("#cancel-file-upload"); }); test("should insert a newline before and after an image when pasting in the end of the line", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/fast-edit-test.js b/app/assets/javascripts/discourse/tests/acceptance/fast-edit-test.js index ea91320e45..0485dbd73b 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/fast-edit-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/fast-edit-test.js @@ -5,7 +5,7 @@ import { selectText, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, triggerKeyEvent, visit } from "@ember/test-helpers"; -import { skip, test } from "qunit"; +import { test } from "qunit"; import postFixtures from "discourse/tests/fixtures/post"; import { cloneJSON } from "discourse-common/lib/object"; @@ -62,7 +62,7 @@ acceptance("Fast Edit", function (needs) { assert.notOk(exists("#fast-edit-input"), "fast editor is closed"); }); - skip("Opens full composer for multi-line selection", async function (assert) { + test("Opens full composer for multi-line selection", async function (assert) { await visit("/t/internationalization-localization/280"); const textNode = query("#post_2 .cooked"); diff --git a/app/assets/javascripts/discourse/tests/acceptance/jump-to-test.js b/app/assets/javascripts/discourse/tests/acceptance/jump-to-test.js index 9b539b7deb..94d60b9ab8 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/jump-to-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/jump-to-test.js @@ -1,6 +1,6 @@ import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { click, currentURL, fillIn, visit } from "@ember/test-helpers"; -import { skip, test } from "qunit"; +import { test } from "qunit"; acceptance("Jump to", function (needs) { needs.user(); @@ -37,7 +37,7 @@ acceptance("Jump to", function (needs) { ); }); - skip("invalid date", async function (assert) { + test("invalid date", async function (assert) { await visit("/t/internationalization-localization/280"); await click("nav#topic-progress .nums"); await click("button.jump-to-post"); diff --git a/app/assets/javascripts/discourse/tests/acceptance/modal-test.js b/app/assets/javascripts/discourse/tests/acceptance/modal-test.js index 08b193e953..6a33ab945b 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/modal-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/modal-test.js @@ -6,7 +6,7 @@ import { queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, triggerKeyEvent, visit } from "@ember/test-helpers"; -import { skip, test } from "qunit"; +import { test } from "qunit"; import I18n from "I18n"; import hbs from "htmlbars-inline-precompile"; import { run } from "@ember/runloop"; @@ -30,7 +30,7 @@ acceptance("Modal", function (needs) { I18n.translations = _translations; }); - skip("modal", async function (assert) { + test("modal", async function (assert) { await visit("/"); assert.ok(!exists(".d-modal:visible"), "there is no modal at first"); @@ -51,7 +51,7 @@ acceptance("Modal", function (needs) { await click(".login-button"); assert.strictEqual(count(".d-modal:visible"), 1, "modal should reappear"); - await triggerKeyEvent("#main-outlet", "keyup", 27); + await triggerKeyEvent("#main-outlet", "keydown", 27); assert.ok(!exists(".d-modal:visible"), "ESC should close the modal"); Ember.TEMPLATES[ diff --git a/app/assets/javascripts/discourse/tests/acceptance/post-history-test.js b/app/assets/javascripts/discourse/tests/acceptance/post-history-test.js index 2a715a7f0c..6167e0ff3a 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/post-history-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/post-history-test.js @@ -4,7 +4,7 @@ import { count, query, } from "discourse/tests/helpers/qunit-helpers"; -import { skip } from "qunit"; +import { test } from "qunit"; acceptance("Post - History", function (needs) { needs.user(); @@ -51,7 +51,7 @@ acceptance("Post - History", function (needs) { }); }); - skip("Shows highlighted tag changes", async function (assert) { + test("Shows highlighted tag changes", async function (assert) { await visit("/t/internationalization-localization/280"); await click("article[data-post-id='419'] .edits button"); assert.equal(count(".discourse-tag"), 4); diff --git a/app/assets/javascripts/discourse/tests/acceptance/search-full-test.js b/app/assets/javascripts/discourse/tests/acceptance/search-full-test.js index 19169cfd2a..97bf831271 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/search-full-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/search-full-test.js @@ -5,10 +5,9 @@ import { queryAll, selectDate, visible, - waitFor, } from "discourse/tests/helpers/qunit-helpers"; -import { click, fillIn, triggerKeyEvent, visit } from "@ember/test-helpers"; -import { skip, test } from "qunit"; +import { click, fillIn, visit } from "@ember/test-helpers"; +import { test } from "qunit"; import { SEARCH_TYPE_CATS_TAGS, SEARCH_TYPE_DEFAULT, @@ -150,45 +149,6 @@ acceptance("Search - Full Page", function (needs) { ); }); - skip("update username through advanced search ui", async function (assert) { - await visit("/search"); - await fillIn(".search-query", "none"); - await fillIn(".search-advanced-options .user-selector", "admin"); - await click(".search-advanced-options .user-selector"); - await triggerKeyEvent( - ".search-advanced-options .user-selector", - "keydown", - 8 - ); - - waitFor(assert, async () => { - assert.ok( - visible(".search-advanced-options .autocomplete"), - '"autocomplete" popup is visible' - ); - assert.ok( - exists( - '.search-advanced-options .autocomplete ul li a span.username:contains("admin")' - ), - '"autocomplete" popup has an entry for "admin"' - ); - - await click( - ".search-advanced-options .autocomplete ul li a:nth-of-type(1)" - ); - - assert.ok( - exists('.search-advanced-options span:contains("admin")'), - 'has "admin" pre-populated' - ); - assert.strictEqual( - queryAll(".search-query").val(), - "none @admin", - 'has updated search term to "none user:admin"' - ); - }); - }); - test("update category through advanced search ui", async function (assert) { const categoryChooser = selectKit( ".search-advanced-options .category-chooser" diff --git a/app/assets/javascripts/discourse/tests/acceptance/sign-in-test.js b/app/assets/javascripts/discourse/tests/acceptance/sign-in-test.js index 182abe9802..91dcfebe14 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/sign-in-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/sign-in-test.js @@ -5,7 +5,7 @@ import { queryAll, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; -import { skip, test } from "qunit"; +import { test } from "qunit"; acceptance("Signing In", function () { test("sign in", async function (assert) { @@ -81,7 +81,7 @@ acceptance("Signing In", function () { ); }); - skip("second factor", async function (assert) { + test("second factor", async function (assert) { await visit("/"); await click("header .login-button"); @@ -91,7 +91,6 @@ acceptance("Signing In", function () { await fillIn("#login-account-password", "need-second-factor"); await click(".modal-footer .btn-primary"); - assert.not(exists("#modal-alert:visible"), "it hides the login error"); assert.not( exists("#credentials:visible"), "it hides the username and password prompt" @@ -114,7 +113,7 @@ acceptance("Signing In", function () { ); }); - skip("security key", async function (assert) { + test("security key", async function (assert) { await visit("/"); await click("header .login-button"); @@ -124,7 +123,6 @@ acceptance("Signing In", function () { await fillIn("#login-account-password", "need-security-key"); await click(".modal-footer .btn-primary"); - assert.not(exists("#modal-alert:visible"), "it hides the login error"); assert.not( exists("#credentials:visible"), "it hides the username and password prompt" diff --git a/app/assets/javascripts/discourse/tests/acceptance/sticky-avatars-test.js b/app/assets/javascripts/discourse/tests/acceptance/sticky-avatars-test.js deleted file mode 100644 index 042f8232f5..0000000000 --- a/app/assets/javascripts/discourse/tests/acceptance/sticky-avatars-test.js +++ /dev/null @@ -1,19 +0,0 @@ -import { acceptance, query } from "discourse/tests/helpers/qunit-helpers"; -import { skip } from "qunit"; -import { visit } from "@ember/test-helpers"; - -acceptance("Sticky Avatars", function () { - skip("Adds sticky avatars when scrolling up", async function (assert) { - const container = document.getElementById("ember-testing-container"); - container.scrollTo(0, 0); - - await visit("/t/internationalization-localization/280"); - container.scrollTo(0, 800); - container.scrollTo(0, 700); - - assert.ok( - query("#post_5").parentElement.classList.contains("sticky-avatar"), - "Sticky avatar is applied" - ); - }); -}); diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js index d539c69373..6c9c7bb9c2 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js @@ -1,12 +1,13 @@ import { acceptance, + chromeTest, exists, queryAll, selectText, } from "discourse/tests/helpers/qunit-helpers"; import I18n from "I18n"; import { click, triggerKeyEvent, visit } from "@ember/test-helpers"; -import { skip, test } from "qunit"; +import { test } from "qunit"; // This tests are flaky on Firefox. Fails with `calling set on destroyed object` acceptance("Topic - Quote button - logged in", function (needs) { @@ -16,42 +17,50 @@ acceptance("Topic - Quote button - logged in", function (needs) { share_quote_buttons: "twitter|email", }); - // All these skips were chromeTest - skip("Does not show the quote share buttons by default", async function (assert) { - await visit("/t/internationalization-localization/280"); - await selectText("#post_5 blockquote"); - assert.ok(exists(".insert-quote"), "it shows the quote button"); - assert.ok(!exists(".quote-sharing"), "it does not show quote sharing"); - }); + chromeTest( + "Does not show the quote share buttons by default", + async function (assert) { + await visit("/t/internationalization-localization/280"); + await selectText("#post_5 blockquote"); + assert.ok(exists(".insert-quote"), "it shows the quote button"); + assert.ok(!exists(".quote-sharing"), "it does not show quote sharing"); + } + ); - skip("Shows quote share buttons with the right site settings", async function (assert) { - this.siteSettings.share_quote_visibility = "all"; + chromeTest( + "Shows quote share buttons with the right site settings", + async function (assert) { + this.siteSettings.share_quote_visibility = "all"; - await visit("/t/internationalization-localization/280"); - await selectText("#post_5 blockquote"); + await visit("/t/internationalization-localization/280"); + await selectText("#post_5 blockquote"); - assert.ok(exists(".quote-sharing"), "it shows the quote sharing options"); - assert.ok( - exists(`.quote-sharing .btn[title='${I18n.t("share.twitter")}']`), - "it includes the twitter share button" - ); - assert.ok( - exists(`.quote-sharing .btn[title='${I18n.t("share.email")}']`), - "it includes the email share button" - ); - }); + assert.ok(exists(".quote-sharing"), "it shows the quote sharing options"); + assert.ok( + exists(`.quote-sharing .btn[title='${I18n.t("share.twitter")}']`), + "it includes the twitter share button" + ); + assert.ok( + exists(`.quote-sharing .btn[title='${I18n.t("share.email")}']`), + "it includes the email share button" + ); + } + ); - skip("Quoting a Onebox should not copy the formatting of the rendered Onebox", async function (assert) { - await visit("/t/topic-for-group-moderators/2480"); - await selectText("#post_3 aside.onebox p"); - await click(".insert-quote"); + chromeTest( + "Quoting a Onebox should not copy the formatting of the rendered Onebox", + async function (assert) { + await visit("/t/topic-for-group-moderators/2480"); + await selectText("#post_3 aside.onebox p"); + await click(".insert-quote"); - assert.strictEqual( - queryAll(".d-editor-input").val().trim(), - '[quote="group_moderator, post:3, topic:2480"]\nhttps://example.com/57350945\n[/quote]', - "quote only contains a link" - ); - }); + assert.strictEqual( + queryAll(".d-editor-input").val().trim(), + '[quote="group_moderator, post:3, topic:2480"]\nhttps://example.com/57350945\n[/quote]', + "quote only contains a link" + ); + } + ); }); acceptance("Topic - Quote button - anonymous", function (needs) { @@ -60,48 +69,60 @@ acceptance("Topic - Quote button - anonymous", function (needs) { share_quote_buttons: "twitter|email", }); - skip("Shows quote share buttons with the right site settings", async function (assert) { - await visit("/t/internationalization-localization/280"); - await selectText("#post_5 blockquote"); + chromeTest( + "Shows quote share buttons with the right site settings", + async function (assert) { + await visit("/t/internationalization-localization/280"); + await selectText("#post_5 blockquote"); - assert.ok(queryAll(".quote-sharing"), "it shows the quote sharing options"); - assert.ok( - exists(`.quote-sharing .btn[title='${I18n.t("share.twitter")}']`), - "it includes the twitter share button" - ); - assert.ok( - exists(`.quote-sharing .btn[title='${I18n.t("share.email")}']`), - "it includes the email share button" - ); - assert.ok(!exists(".insert-quote"), "it does not show the quote button"); - }); + assert.ok( + queryAll(".quote-sharing"), + "it shows the quote sharing options" + ); + assert.ok( + exists(`.quote-sharing .btn[title='${I18n.t("share.twitter")}']`), + "it includes the twitter share button" + ); + assert.ok( + exists(`.quote-sharing .btn[title='${I18n.t("share.email")}']`), + "it includes the email share button" + ); + assert.ok(!exists(".insert-quote"), "it does not show the quote button"); + } + ); - skip("Shows single share button when site setting only has one item", async function (assert) { - this.siteSettings.share_quote_buttons = "twitter"; + chromeTest( + "Shows single share button when site setting only has one item", + async function (assert) { + this.siteSettings.share_quote_buttons = "twitter"; - await visit("/t/internationalization-localization/280"); - await selectText("#post_5 blockquote"); + await visit("/t/internationalization-localization/280"); + await selectText("#post_5 blockquote"); - assert.ok(exists(".quote-sharing"), "it shows the quote sharing options"); - assert.ok( - exists(`.quote-sharing .btn[title='${I18n.t("share.twitter")}']`), - "it includes the twitter share button" - ); - assert.ok( - !exists(".quote-share-label"), - "it does not show the Share label" - ); - }); + assert.ok(exists(".quote-sharing"), "it shows the quote sharing options"); + assert.ok( + exists(`.quote-sharing .btn[title='${I18n.t("share.twitter")}']`), + "it includes the twitter share button" + ); + assert.ok( + !exists(".quote-share-label"), + "it does not show the Share label" + ); + } + ); - skip("Shows nothing when visibility is disabled", async function (assert) { - this.siteSettings.share_quote_visibility = "none"; + chromeTest( + "Shows nothing when visibility is disabled", + async function (assert) { + this.siteSettings.share_quote_visibility = "none"; - await visit("/t/internationalization-localization/280"); - await selectText("#post_5 blockquote"); + await visit("/t/internationalization-localization/280"); + await selectText("#post_5 blockquote"); - assert.ok(!exists(".quote-sharing"), "it does not show quote sharing"); - assert.ok(!exists(".insert-quote"), "it does not show the quote button"); - }); + assert.ok(!exists(".quote-sharing"), "it does not show quote sharing"); + assert.ok(!exists(".insert-quote"), "it does not show the quote button"); + } + ); }); acceptance("Topic - Quote button - keyboard shortcut", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js b/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js index a0d15313ad..b14e9f08df 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/unknown-test.js @@ -1,6 +1,6 @@ import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { click, currentURL, visit } from "@ember/test-helpers"; -import { skip, test } from "qunit"; +import { test } from "qunit"; acceptance("Category 404", function (needs) { needs.pretender((server, helper) => { @@ -12,7 +12,7 @@ acceptance("Category 404", function (needs) { }); }); }); - skip("Navigating to a bad category link does not break the router", async function (assert) { + test("Navigating to a bad category link does not break the router", async function (assert) { await visit("/t/internationalization-localization/280"); await click('[data-for-test="category-404"]'); diff --git a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js index 336b6e2491..340340ad9d 100644 --- a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js +++ b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js @@ -12,7 +12,7 @@ import { import { forceMobile, resetMobile } from "discourse/lib/mobile"; import { getApplication, getContext, settled } from "@ember/test-helpers"; import { getOwner } from "discourse-common/lib/get-owner"; -import { later, run } from "@ember/runloop"; +import { run } from "@ember/runloop"; import { setupApplicationTest } from "ember-qunit"; import { Promise } from "rsvp"; import Site from "discourse/models/site"; @@ -434,16 +434,6 @@ QUnit.assert.containsInstance = function (collection, klass, message) { }); }; -export function waitFor(assert, callback, timeout) { - timeout = timeout || 500; - - const done = assert.async(); - later(() => { - callback(); - done(); - }, timeout); -} - export async function selectDate(selector, date) { return new Promise((resolve) => { const elem = document.querySelector(selector); diff --git a/app/assets/javascripts/discourse/tests/integration/components/ace-editor-test.js b/app/assets/javascripts/discourse/tests/integration/components/ace-editor-test.js index 1bdea3ddca..0e2cc1eaad 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/ace-editor-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/ace-editor-test.js @@ -12,50 +12,36 @@ discourseModule("Integration | Component | ace-editor", function (hooks) { setupRenderingTest(hooks); componentTest("css editor", { - skip: true, template: hbs`{{ace-editor mode="css"}}`, test(assert) { - assert.expect(1); assert.ok(exists(".ace_editor"), "it renders the ace editor"); }, }); componentTest("html editor", { - skip: true, template: hbs`{{ace-editor mode="html" content="wat"}}`, test(assert) { - assert.expect(1); assert.ok(exists(".ace_editor"), "it renders the ace editor"); }, }); componentTest("sql editor", { - skip: true, template: hbs`{{ace-editor mode="sql" content="SELECT * FROM users"}}`, test(assert) { - assert.expect(1); assert.ok(exists(".ace_editor"), "it renders the ace editor"); }, }); componentTest("disabled editor", { - skip: true, template: hbs` {{ace-editor mode="sql" content="SELECT * FROM users" disabled=true}} `, test(assert) { - const $ace = queryAll(".ace_editor"); - assert.expect(3); - assert.ok($ace.length, "it renders the ace editor"); - assert.strictEqual( - $ace.parent().data().editor.getReadOnly(), - true, - "it sets ACE to read-only mode" - ); - assert.strictEqual( - $ace.parent().attr("data-disabled"), - "true", - "ACE wrapper has `data-disabled` attribute set to true" + assert.ok(exists(".ace_editor"), "it renders the ace editor"); + assert.equal( + queryAll(".ace-wrapper[data-disabled]").length, + 1, + "it has a data-disabled attr" ); }, }); diff --git a/app/assets/javascripts/discourse/tests/integration/components/value-list-test.js b/app/assets/javascripts/discourse/tests/integration/components/value-list-test.js index 46a8d1e207..6ad51806b6 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/value-list-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/value-list-test.js @@ -16,8 +16,6 @@ discourseModule("Integration | Component | value-list", function (hooks) { componentTest("adding a value", { template: hbs`{{value-list values=values}}`, - skip: true, - beforeEach() { this.set("values", "vinkas\nosama"); }, @@ -132,8 +130,6 @@ discourseModule("Integration | Component | value-list", function (hooks) { this.set("values", "vinkas|osama"); }, - skip: true, - async test(assert) { await selectKit().expand(); await selectKit().fillInFilter("eviltrout"); diff --git a/app/assets/javascripts/discourse/tests/integration/widgets/home-logo-test.js b/app/assets/javascripts/discourse/tests/integration/widgets/home-logo-test.js index 515dcd8561..9582b3a590 100644 --- a/app/assets/javascripts/discourse/tests/integration/widgets/home-logo-test.js +++ b/app/assets/javascripts/discourse/tests/integration/widgets/home-logo-test.js @@ -24,7 +24,6 @@ discourseModule( componentTest("basics", { template: hbs`{{mount-widget widget="home-logo" args=args}}`, - skip: true, beforeEach() { this.siteSettings.site_logo_url = bigLogo; this.siteSettings.site_logo_small_url = smallLogo; diff --git a/app/assets/javascripts/discourse/tests/unit/lib/click-track-edit-history-test.js b/app/assets/javascripts/discourse/tests/unit/lib/click-track-edit-history-test.js deleted file mode 100644 index ae13699e88..0000000000 --- a/app/assets/javascripts/discourse/tests/unit/lib/click-track-edit-history-test.js +++ /dev/null @@ -1,107 +0,0 @@ -import { fixture, logIn } from "discourse/tests/helpers/qunit-helpers"; -import { module, skip } from "qunit"; -import ClickTrack from "discourse/lib/click-track"; -import DiscourseURL from "discourse/lib/url"; -import User from "discourse/models/user"; -import pretender from "discourse/tests/helpers/create-pretender"; -import sinon from "sinon"; - -const track = ClickTrack.trackClick; - -function generateClickEventOn(selector) { - return $.Event("click", { currentTarget: fixture(selector) }); -} - -module("Unit | Utility | click-track-edit-history", function (hooks) { - hooks.beforeEach(function () { - logIn(); - - let win = { focus: function () {} }; - sinon.stub(window, "open").returns(win); - sinon.stub(win, "focus"); - - sinon.stub(DiscourseURL, "routeTo"); - sinon.stub(DiscourseURL, "redirectTo"); - - sessionStorage.clear(); - - fixture().innerHTML = `
-
- `; - }); - - skip("tracks internal URLs", async function (assert) { - assert.expect(2); - sinon.stub(DiscourseURL, "origin").returns("http://discuss.domain.com"); - - const done = assert.async(); - pretender.post("/clicks/track", (request) => { - assert.strictEqual( - request.requestBody, - "url=http%3A%2F%2Fdiscuss.domain.com&post_id=42&topic_id=1337" - ); - done(); - }); - - assert.notOk(track(generateClickEventOn("#same-site"))); - }); - - skip("tracks external URLs", async function (assert) { - assert.expect(2); - - const done = assert.async(); - pretender.post("/clicks/track", (request) => { - assert.strictEqual( - request.requestBody, - "url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337" - ); - done(); - }); - - assert.notOk(track(generateClickEventOn("a"))); - }); - - skip("tracks external URLs when opening in another window", async function (assert) { - assert.expect(3); - User.currentProp("external_links_in_new_tab", true); - - const done = assert.async(); - pretender.post("/clicks/track", (request) => { - assert.strictEqual( - request.requestBody, - "url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337" - ); - done(); - }); - - assert.notOk(track(generateClickEventOn("a"))); - assert.ok(window.open.calledWith("http://www.google.com", "_blank")); - }); -}); diff --git a/app/assets/javascripts/discourse/tests/unit/lib/click-track-profile-page-test.js b/app/assets/javascripts/discourse/tests/unit/lib/click-track-profile-page-test.js deleted file mode 100644 index 8373b51710..0000000000 --- a/app/assets/javascripts/discourse/tests/unit/lib/click-track-profile-page-test.js +++ /dev/null @@ -1,98 +0,0 @@ -import { fixture, logIn } from "discourse/tests/helpers/qunit-helpers"; -import { module, skip } from "qunit"; -import ClickTrack from "discourse/lib/click-track"; -import DiscourseURL from "discourse/lib/url"; -import pretender from "discourse/tests/helpers/create-pretender"; -import sinon from "sinon"; - -const track = ClickTrack.trackClick; - -function generateClickEventOn(selector) { - return $.Event("click", { currentTarget: fixture(selector) }); -} - -module("Unit | Utility | click-track-profile-page", function (hooks) { - hooks.beforeEach(function () { - logIn(); - - let win = { focus: function () {} }; - sinon.stub(window, "open").returns(win); - sinon.stub(win, "focus"); - - sinon.stub(DiscourseURL, "routeTo"); - sinon.stub(DiscourseURL, "redirectTo"); - - sessionStorage.clear(); - - fixture().innerHTML = `

- google.com - google.com -

- google.com - forum - log.txt - #hashtag -

-

- google.com - google.com -

- google.com - forum - log.txt - #hashtag -

`; - }); - - skip("tracks internal URLs", async function (assert) { - assert.expect(2); - sinon.stub(DiscourseURL, "origin").returns("http://discuss.domain.com"); - - const done = assert.async(); - pretender.post("/clicks/track", (request) => { - assert.strictEqual( - request.requestBody, - "url=http%3A%2F%2Fdiscuss.domain.com" - ); - done(); - }); - - assert.notOk(track(generateClickEventOn("#same-site"))); - }); - - skip("tracks external URLs", async function (assert) { - assert.expect(2); - - const done = assert.async(); - pretender.post("/clicks/track", (request) => { - assert.strictEqual( - request.requestBody, - "url=http%3A%2F%2Fwww.google.com&post_id=42&topic_id=1337" - ); - done(); - }); - - assert.notOk(track(generateClickEventOn("a"))); - }); - - skip("tracks external URLs in other posts", async function (assert) { - assert.expect(2); - - const done = assert.async(); - pretender.post("/clicks/track", (request) => { - assert.strictEqual( - request.requestBody, - "url=http%3A%2F%2Fwww.google.com&post_id=24&topic_id=7331" - ); - done(); - }); - - assert.notOk(track(generateClickEventOn(".second a"))); - }); -}); diff --git a/app/assets/javascripts/discourse/tests/unit/lib/load-script-test.js b/app/assets/javascripts/discourse/tests/unit/lib/load-script-test.js index f977a03ad9..fe48fbc858 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/load-script-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/load-script-test.js @@ -1,23 +1,8 @@ -import { cacheBuster, loadScript } from "discourse/lib/load-script"; -import { module, skip, test } from "qunit"; +import { cacheBuster } from "discourse/lib/load-script"; +import { module, test } from "qunit"; import { PUBLIC_JS_VERSIONS as jsVersions } from "discourse/lib/public-js-versions"; module("Unit | Utility | load-script", function () { - skip("load with a script tag, and callbacks are only executed after script is loaded", async function (assert) { - assert.ok( - typeof window.ace === "undefined", - "ensures ace is not previously loaded" - ); - - const src = "/javascripts/ace/ace.js"; - - await loadScript(src); - assert.ok( - typeof window.ace !== "undefined", - "callbacks should only be executed after the script has fully loaded" - ); - }); - test("works when a value is not present", function (assert) { assert.strictEqual( cacheBuster("/javascripts/my-script.js"), diff --git a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js index 2f80646e34..8e4bda3cd5 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js @@ -3,7 +3,7 @@ import { applyCachedInlineOnebox, deleteCachedInlineOnebox, } from "pretty-text/inline-oneboxer"; -import QUnit, { module, skip, test } from "qunit"; +import QUnit, { module, test } from "qunit"; import Post from "discourse/models/post"; import { buildQuote } from "discourse/lib/quote"; import { deepMerge } from "discourse-common/lib/object"; @@ -54,20 +54,6 @@ QUnit.assert.cookedPara = function (input, expected, message) { }; module("Unit | Utility | pretty-text", function () { - skip("Pending Engine fixes and spec fixes", function (assert) { - assert.cooked( - "Derpy: http://derp.com?_test_=1", - '

Derpy: http://derp.com?_test_=1

', - "works with underscores in urls" - ); - - assert.cooked( - "**a*_b**", - "

a*_b

", - "allows for characters within bold" - ); - }); - test("buildOptions", function (assert) { assert.ok( buildOptions({ siteSettings: { enable_emoji: true } }).discourse.features diff --git a/app/assets/javascripts/discourse/tests/unit/lib/utilities-test.js b/app/assets/javascripts/discourse/tests/unit/lib/utilities-test.js index edbc2ddab2..ddca5c5578 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/utilities-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/utilities-test.js @@ -15,7 +15,7 @@ import { slugify, toAsciiPrintable, } from "discourse/lib/utilities"; -import { skip, test } from "qunit"; +import { test } from "qunit"; import Handlebars from "handlebars"; import { discourseModule } from "discourse/tests/helpers/qunit-helpers"; @@ -282,21 +282,4 @@ discourseModule("Unit | Utilities", function () { } }); }); - - skip("inCodeBlock - runs fast", function (assert) { - const phrase = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."; - const text = `${phrase}\n\n\`\`\`\n${phrase}\n\`\`\`\n\n${phrase}\n\n\`${phrase}\n${phrase}\n\n${phrase}\n\n[code]\n${phrase}\n[/code]\n\n${phrase}\n\n ${phrase}\n\n\`${phrase}\`\n\n${phrase}`; - - let time = Number.MAX_VALUE; - for (let i = 0; i < 10; ++i) { - const start = performance.now(); - inCodeBlock(text, text.length); - const end = performance.now(); - time = Math.min(time, end - start); - } - - // This runs in 'keyUp' event handler so it should run as fast as - // possible. It should take less than 1ms for the test text. - assert.ok(time < 10); - }); }); From c23ccd87f8c3946da4dc9cff4d39021a24750087 Mon Sep 17 00:00:00 2001 From: Jordan Vidrine <30537603+jordanvidrine@users.noreply.github.com> Date: Wed, 2 Feb 2022 15:50:14 -0600 Subject: [PATCH 043/194] DEV: Add plugin outlet to `topic-list-item.hbs` (#15776) --- .../discourse/app/templates/components/topic-list-item.hbs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/assets/javascripts/discourse/app/templates/components/topic-list-item.hbs b/app/assets/javascripts/discourse/app/templates/components/topic-list-item.hbs index 556c0177f9..216d3b1b12 100644 --- a/app/assets/javascripts/discourse/app/templates/components/topic-list-item.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/topic-list-item.hbs @@ -1 +1,6 @@ {{topicListItemContents}} + +{{plugin-outlet + name="after-topic-list-item" + args=(hash topic=topic) +}} From febe997beec6e7d344911412a6f560a07276dc97 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Wed, 2 Feb 2022 23:41:42 +0100 Subject: [PATCH 044/194] FIX: Regression in timezone name localizations (#15761) This also switches to using the NPM package for better build stability. And adds a clearer label in the alert that is displayed to show your current timezone (when changing timezones). --- .../addon/components/timezone-input.js | 30 +++++++++++-------- package.json | 2 +- .../discourse-local-dates-create-form.js | 8 +++-- .../discourse-local-dates-create-form.hbs | 3 +- .../common/discourse-local-dates.scss | 1 + .../config/locales/client.en.yml | 1 + yarn.lock | 9 +++--- 7 files changed, 32 insertions(+), 22 deletions(-) diff --git a/app/assets/javascripts/select-kit/addon/components/timezone-input.js b/app/assets/javascripts/select-kit/addon/components/timezone-input.js index 4590c703a7..28a0c25e6d 100644 --- a/app/assets/javascripts/select-kit/addon/components/timezone-input.js +++ b/app/assets/javascripts/select-kit/addon/components/timezone-input.js @@ -1,25 +1,29 @@ import ComboBoxComponent from "select-kit/components/combo-box"; -import { computed } from "@ember/object"; export default ComboBoxComponent.extend({ pluginApiIdentifiers: ["timezone-input"], classNames: ["timezone-input"], - nameProperty: null, - valueProperty: null, selectKitOptions: { filterable: true, allowAny: false, }, - content: computed(function () { - if ( - moment.locale() !== "en" && - typeof moment.tz.localizedNames === "function" - ) { - return moment.tz.localizedNames().mapBy("value"); - } else { - return moment.tz.names(); - } - }), + get nameProperty() { + return this.isLocalized ? "name" : null; + }, + + get valueProperty() { + return this.isLocalized ? "value" : null; + }, + + get content() { + return this.isLocalized ? moment.tz.localizedNames() : moment.tz.names(); + }, + + get isLocalized() { + return ( + moment.locale() !== "en" && typeof moment.tz.localizedNames === "function" + ); + }, }); diff --git a/package.json b/package.json index ddb9c60851..6a7bfc5ede 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "license": "GPL-2.0-only", "dependencies": { "@discourse/itsatrap": "^2.0.10", + "@discourse/moment-timezone-names-translations": "^1.0.0", "@fortawesome/fontawesome-free": "5.11.2", "@highlightjs/cdn-assets": "^10.7.0", "@json-editor/json-editor": "^2.6.1", @@ -30,7 +31,6 @@ "markdown-it": "10.0.0", "moment": "2.29.1", "moment-timezone": "0.5.31", - "moment-timezone-names-translations": "https://github.com/discourse/moment-timezone-names-translations", "pikaday": "1.8.0", "workbox-cacheable-response": "^4.3.1", "workbox-core": "^4.3.1", diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js index 46dee48eee..c2a2f5f6a4 100644 --- a/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js +++ b/plugins/discourse-local-dates/assets/javascripts/discourse/components/discourse-local-dates-create-form.js @@ -205,7 +205,7 @@ export default Component.extend({ @computed("currentUserTimezone") formatedCurrentUserTimezone(timezone) { - return timezone.replace("_", " ").replace("Etc/", "").split("/"); + return timezone.replace("_", " ").replace("Etc/", "").replace("/", ", "); }, @computed("formats") @@ -398,8 +398,10 @@ export default Component.extend({ return new Promise((resolve) => { loadScript("/javascripts/pikaday.js").then(() => { const options = { - field: this.$(`.fake-input`)[0], - container: this.$(`#picker-container-${this.elementId}`)[0], + field: this.element.querySelector(".fake-input"), + container: this.element.querySelector( + `#picker-container-${this.elementId}` + ), bound: false, format: "YYYY-MM-DD", reposition: false, diff --git a/plugins/discourse-local-dates/assets/javascripts/discourse/templates/components/discourse-local-dates-create-form.hbs b/plugins/discourse-local-dates/assets/javascripts/discourse/templates/components/discourse-local-dates-create-form.hbs index 196fb791c9..847a3b31cd 100644 --- a/plugins/discourse-local-dates/assets/javascripts/discourse/templates/components/discourse-local-dates-create-form.hbs +++ b/plugins/discourse-local-dates/assets/javascripts/discourse/templates/components/discourse-local-dates-create-form.hbs @@ -7,7 +7,8 @@ {{#if isValid}} {{#if timezoneIsDifferentFromUserTimezone}}
- {{formatedCurrentUserTimezone}} {{currentPreview}} + {{i18n "discourse_local_dates.create.form.current_timezone"}} + {{formatedCurrentUserTimezone}}{{currentPreview}}
{{/if}} {{else}} diff --git a/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss b/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss index 9f2543d22c..ee45d9826e 100644 --- a/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss +++ b/plugins/discourse-local-dates/assets/stylesheets/common/discourse-local-dates.scss @@ -262,6 +262,7 @@ b { margin-right: 0.5em; + margin-left: 0.5em; } b + p { diff --git a/plugins/discourse-local-dates/config/locales/client.en.yml b/plugins/discourse-local-dates/config/locales/client.en.yml index a968b96f87..a18bddd976 100644 --- a/plugins/discourse-local-dates/config/locales/client.en.yml +++ b/plugins/discourse-local-dates/config/locales/client.en.yml @@ -25,6 +25,7 @@ en: format_title: Date format timezone: Timezone until: Until... + current_timezone: "Current timezone:" recurring: every_day: "Every day" every_week: "Every week" diff --git a/yarn.lock b/yarn.lock index c7471bdcc0..8b99ee19ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -111,6 +111,11 @@ resolved "https://registry.yarnpkg.com/@discourse/itsatrap/-/itsatrap-2.0.10.tgz#c7e750eeb32b54e769e952c4ecc472213eb1385a" integrity sha512-Jn1gdiyHMGUsmUfLFf4Q7VnTAv0l7NePbegU6pKhKHEmbzV3FosGxq30fTOYgVyTS1bxqGjlA6LvQttJpv3ROw== +"@discourse/moment-timezone-names-translations@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@discourse/moment-timezone-names-translations/-/moment-timezone-names-translations-1.0.0.tgz#b22344456513d37c81baf384a41487b539b91534" + integrity sha512-4xr1QWQ0nzmFa2ZXQgWZA+dtE/BU2ePA+qkJWPFzNpq4ZnQi8MmMMAS2285t3rc2ySMBQqYaAArmcSUiufUgRA== + "@ember-data/rfc395-data@^0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" @@ -2933,10 +2938,6 @@ module-deps@^6.2.3: through2 "^2.0.0" xtend "^4.0.0" -"moment-timezone-names-translations@https://github.com/discourse/moment-timezone-names-translations": - version "0.0.0" - resolved "https://github.com/discourse/moment-timezone-names-translations#5f576fc6355d8e636783bfb7b0214a5d74a5399d" - moment-timezone@0.5.31: version "0.5.31" resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.31.tgz#9c40d8c5026f0c7ab46eda3d63e49c155148de05" From 82cb67e67b83c444f068fd6b3006d8396803454f Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Thu, 3 Feb 2022 10:36:32 +1000 Subject: [PATCH 045/194] FIX: Canonical Message-ID was incorrect for some cases (#15701) When creating a direct message to a group with group SMTP set up, and adding another person to that message in the OP, we send an email to the second person in the OP via the group_smtp job. This in turn creates an IncomingEmail record to guard against IMAP double sync. The issue with this was that this IncomingEmail (which is essentialy a placeholder/dummy one) was having its Message-ID used as the canonical References Message-ID for subsequent emails sent out to user_private_message recipients (such as members of the group), causing threading issues in the mail client. The canonical format should be used instead for these cases. This commit fixes the issue by only using the IncomingEmail for the OP's Message-ID if the OP was created via our handle_mail email receiver pipeline. It does not make sense to use it in other cases. --- lib/email/message_id_service.rb | 9 ++++++++- spec/components/email/sender_spec.rb | 18 ++++++++++++++---- spec/lib/message_id_service_spec.rb | 15 ++++++++++++++- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/lib/email/message_id_service.rb b/lib/email/message_id_service.rb index 4143d00d8d..72d67912dd 100644 --- a/lib/email/message_id_service.rb +++ b/lib/email/message_id_service.rb @@ -39,8 +39,15 @@ module Email def generate_for_topic(topic, use_incoming_email_if_present: false, canonical: false) first_post = topic.ordered_posts.first + incoming_email = first_post.incoming_email - if use_incoming_email_if_present && first_post.incoming_email&.message_id.present? + # If the incoming email was created by handle_mail, then it was an + # inbound email sent to Discourse and handled by Email::Receiver, + # this is the only case where we want to use the original Message-ID + # because we want to maintain threading in the original mail client. + if use_incoming_email_if_present && + incoming_email&.message_id.present? && + incoming_email&.created_via == IncomingEmail.created_via_types[:handle_mail] return "<#{first_post.incoming_email.message_id}>" end diff --git a/spec/components/email/sender_spec.rb b/spec/components/email/sender_spec.rb index 940326a1a4..cfad24c929 100644 --- a/spec/components/email/sender_spec.rb +++ b/spec/components/email/sender_spec.rb @@ -123,8 +123,10 @@ describe Email::Sender do let(:reply_key) { "abcd" * 8 } let(:message) do - message = Mail::Message.new to: 'eviltrout@test.domain', - body: '**hello**' + message = Mail::Message.new( + to: 'eviltrout@test.domain', + body: '**hello**' + ) message.stubs(:deliver_now) message end @@ -288,7 +290,13 @@ describe Email::Sender do end it "sets the 'References' header with the incoming email Message-ID if it exists on the first post" do - incoming = Fabricate(:incoming_email, topic: topic, post: post_1, message_id: "blah1234@someemailprovider.com") + incoming = Fabricate( + :incoming_email, + topic: topic, + post: post_1, + message_id: "blah1234@someemailprovider.com", + created_via: IncomingEmail.created_via_types[:handle_mail] + ) message.header['X-Discourse-Post-Id'] = post_1.id email_sender.send @@ -331,7 +339,9 @@ describe Email::Sender do end it "uses the incoming_email message_id when available, but always uses a random message-id" do - topic_incoming_email = IncomingEmail.create(topic: topic, post: post_1, message_id: "foo@bar") + topic_incoming_email = IncomingEmail.create( + topic: topic, post: post_1, message_id: "foo@bar", created_via: IncomingEmail.created_via_types[:handle_mail] + ) post_2_incoming_email = IncomingEmail.create(topic: topic, post: post_2, message_id: "bar@foo") post_4_incoming_email = IncomingEmail.create(topic: topic, post: post_4, message_id: "wat@wat") diff --git a/spec/lib/message_id_service_spec.rb b/spec/lib/message_id_service_spec.rb index 3b8a581faa..7d40d6531f 100644 --- a/spec/lib/message_id_service_spec.rb +++ b/spec/lib/message_id_service_spec.rb @@ -24,11 +24,24 @@ describe Email::MessageIdService do describe "#generate_for_topic" do it "generates for the topic using the message_id on the first post's incoming_email" do - Fabricate(:incoming_email, message_id: "test213428@somemailservice.com", post: post) + Fabricate(:incoming_email, message_id: "test213428@somemailservice.com", post: post, created_via: IncomingEmail.created_via_types[:handle_mail]) post.reload expect(subject.generate_for_topic(topic, use_incoming_email_if_present: true)).to eq("") end + it "does not use the first post's incoming email if it was created via group_smtp, only handle_mail" do + incoming = Fabricate( + :incoming_email, + message_id: "test213428@somemailservice.com", + post: post, + created_via: IncomingEmail.created_via_types[:group_smtp] + ) + post.reload + expect(subject.generate_for_topic(topic, use_incoming_email_if_present: true)).to match(subject.message_id_topic_id_regexp) + incoming.update(created_via: IncomingEmail.created_via_types[:handle_mail]) + expect(subject.generate_for_topic(topic, use_incoming_email_if_present: true)).to eq("") + end + it "generates for the topic without an incoming_email record" do expect(subject.generate_for_topic(topic)).to match(subject.message_id_topic_id_regexp) expect(subject.generate_for_topic(topic, use_incoming_email_if_present: true)).to match(subject.message_id_topic_id_regexp) From 23a8341b28be2df92795fde51fbc3b19eab0fc68 Mon Sep 17 00:00:00 2001 From: Natalie Tay Date: Thu, 3 Feb 2022 11:26:53 +0800 Subject: [PATCH 046/194] FEATURE: Validate domain settings for blocked_onebox_domain only (#15754) We want to prevent the user from adding ? or * minimally when setting domains in sitesettings --- .../components/site-settings/host-list.js | 21 +++++++++++++ .../components/site-settings/host-list.hbs | 11 ++++++- .../acceptance/admin-site-settings-test.js | 31 ++++++++++++++++++- .../discourse/tests/fixtures/site-settings.js | 14 ++++++++- .../components/select-kit/host-list-test.js | 31 +++++++++++++++++++ config/locales/server.en.yml | 3 +- config/site_settings.yml | 2 +- lib/site_settings/type_supervisor.rb | 2 ++ lib/validators/host_list_setting_validator.rb | 15 +++++++++ .../host_list_setting_validator_spec.rb | 31 +++++++++++++++++++ 10 files changed, 156 insertions(+), 5 deletions(-) create mode 100644 app/assets/javascripts/admin/addon/components/site-settings/host-list.js create mode 100644 app/assets/javascripts/discourse/tests/integration/components/select-kit/host-list-test.js create mode 100644 lib/validators/host_list_setting_validator.rb create mode 100644 spec/components/validators/host_list_setting_validator_spec.rb diff --git a/app/assets/javascripts/admin/addon/components/site-settings/host-list.js b/app/assets/javascripts/admin/addon/components/site-settings/host-list.js new file mode 100644 index 0000000000..8cc320da8f --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/site-settings/host-list.js @@ -0,0 +1,21 @@ +import Component from "@ember/component"; +import { action, computed } from "@ember/object"; + +export default Component.extend({ + tokenSeparator: "|", + choices: null, + + @computed("value") + get settingValue() { + return this.value.toString().split(this.tokenSeparator).filter(Boolean); + }, + + @action + onChange(value) { + if (value.some((v) => v.includes("?") || v.includes("*"))) { + return; + } + + this.set("value", value.join(this.tokenSeparator)); + }, +}); diff --git a/app/assets/javascripts/admin/addon/templates/components/site-settings/host-list.hbs b/app/assets/javascripts/admin/addon/templates/components/site-settings/host-list.hbs index d1486292dd..3460bf78df 100644 --- a/app/assets/javascripts/admin/addon/templates/components/site-settings/host-list.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/site-settings/host-list.hbs @@ -1,3 +1,12 @@ -{{value-list values=value addKey="admin.site_settings.add_host"}} +{{list-setting + value=settingValue + settingName=setting.setting + choices=settingValue + onChange=(action "onChange") + options=(hash + allowAny=allowAny + ) +}} + {{setting-validation-message message=validationMessage}}
{{html-safe setting.description}}
diff --git a/app/assets/javascripts/discourse/tests/acceptance/admin-site-settings-test.js b/app/assets/javascripts/discourse/tests/acceptance/admin-site-settings-test.js index d5ace60556..8a1c4458cc 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/admin-site-settings-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/admin-site-settings-test.js @@ -13,6 +13,9 @@ import { } from "@ember/test-helpers"; import siteSettingFixture from "discourse/tests/fixtures/site-settings"; import { test } from "qunit"; +import pretender from "discourse/tests/helpers/create-pretender"; + +const ENTER_KEYCODE = 13; acceptance("Admin - Site Settings", function (needs) { let updatedTitle; @@ -105,7 +108,7 @@ acceptance("Admin - Site Settings", function (needs) { ); await fillIn(".input-setting-string", "Test"); - await triggerKeyEvent(".input-setting-string", "keydown", 13); // enter + await triggerKeyEvent(".input-setting-string", "keydown", ENTER_KEYCODE); assert.ok( exists(".row.setting.overridden"), "saving via Enter key marks setting as overriden" @@ -163,4 +166,30 @@ acceptance("Admin - Site Settings", function (needs) { "/admin/site_settings/category/all_results?filter=contact" ); }); + + test("filters * and ? for domain lists", async (assert) => { + pretender.put("/admin/site_settings/blocked_onebox_domains", () => [200]); + + await visit("/admin/site_settings"); + await fillIn("#setting-filter", "domains"); + + await click(".select-kit-header.multi-select-header"); + + await fillIn(".select-kit-filter input", "cat.?.domain"); + await triggerKeyEvent(".select-kit-filter input", "keydown", ENTER_KEYCODE); + + await fillIn(".select-kit-filter input", "*.domain"); + await triggerKeyEvent(".select-kit-filter input", "keydown", ENTER_KEYCODE); + + await fillIn(".select-kit-filter input", "proper.com"); + await triggerKeyEvent(".select-kit-filter input", "keydown", ENTER_KEYCODE); + + await click("button.ok"); + + assert.strictEqual( + pretender.handledRequests[pretender.handledRequests.length - 1] + .requestBody, + "blocked_onebox_domains=proper.com" + ); + }); }); diff --git a/app/assets/javascripts/discourse/tests/fixtures/site-settings.js b/app/assets/javascripts/discourse/tests/fixtures/site-settings.js index f5fca9c661..8b3bbbee64 100644 --- a/app/assets/javascripts/discourse/tests/fixtures/site-settings.js +++ b/app/assets/javascripts/discourse/tests/fixtures/site-settings.js @@ -64,7 +64,19 @@ export default { secret: false, type: "upload", plugin: "discourse-logo" - } + }, + { + category: "onebox", + default: "", + description: + "A list of domains that will never be oneboxed e.g. wikipedia.org\n(Wildcard symbols * ? not supported)", + placeholder: null, + preview: null, + secret: false, + setting: "blocked_onebox_domains", + type: "host_list", + value: "", + }, ], diags: { last_message_processed: null diff --git a/app/assets/javascripts/discourse/tests/integration/components/select-kit/host-list-test.js b/app/assets/javascripts/discourse/tests/integration/components/select-kit/host-list-test.js new file mode 100644 index 0000000000..dbb318176c --- /dev/null +++ b/app/assets/javascripts/discourse/tests/integration/components/select-kit/host-list-test.js @@ -0,0 +1,31 @@ +import componentTest, { + setupRenderingTest, +} from "discourse/tests/helpers/component-test"; +import { discourseModule, query } from "discourse/tests/helpers/qunit-helpers"; +import hbs from "htmlbars-inline-precompile"; + +discourseModule( + "Integration | Component | site-setting | host-list", + function (hooks) { + setupRenderingTest(hooks); + + componentTest("displays setting value", { + template: hbs`{{site-setting setting=setting}}`, + + beforeEach() { + this.set("setting", { + setting: "blocked_onebox_domains", + value: "a.com|b.com", + type: "host_list", + }); + }, + + async test(assert) { + assert.strictEqual( + query(".formated-selection").innerText, + "a.com, b.com" + ); + }, + }); + } +); diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 6b2a4ef217..7dde1ebb06 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1530,7 +1530,7 @@ en: show_pinned_excerpt_mobile: "Show excerpt on pinned topics in mobile view." show_pinned_excerpt_desktop: "Show excerpt on pinned topics in desktop view." post_onebox_maxlength: "Maximum length of a oneboxed Discourse post in characters." - blocked_onebox_domains: "A list of domains that will never be oneboxed." + blocked_onebox_domains: "A list of domains that will never be oneboxed e.g. wikipedia.org\n(Wildcard symbols * ? not supported)" allowed_inline_onebox_domains: "A list of domains that will be oneboxed in miniature form if linked without a title" enable_inline_onebox_on_all_domains: "Ignore inline_onebox_domain_allowlist site setting and allow inline onebox on all domains." force_custom_user_agent_hosts: "Hosts for which to use the custom onebox user agent on all requests. (Especially useful for hosts that limit access by user agent)." @@ -2365,6 +2365,7 @@ en: invalid_json: "Invalid JSON." invalid_reply_by_email_address: "Value must contain '%{reply_key}' and be different from the notification email." invalid_alternative_reply_by_email_addresses: "All values must contain '%{reply_key}' and be different from the notification email." + invalid_domain_hostname: "Must not include * or ? characters." pop3_polling_host_is_empty: "You must set a 'pop3 polling host' before enabling POP3 polling." pop3_polling_username_is_empty: "You must set a 'pop3 polling username' before enabling POP3 polling." pop3_polling_password_is_empty: "You must set a 'pop3 polling password' before enabling POP3 polling." diff --git a/config/site_settings.yml b/config/site_settings.yml index 897a2c6d0f..168d375577 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -1700,7 +1700,7 @@ onebox: zh_TW: 200 blocked_onebox_domains: default: "" - type: list + type: host_list list_type: compact max_oneboxes_per_post: default: 50 diff --git a/lib/site_settings/type_supervisor.rb b/lib/site_settings/type_supervisor.rb index 428aadfe4c..5c37f26c89 100644 --- a/lib/site_settings/type_supervisor.rb +++ b/lib/site_settings/type_supervisor.rb @@ -269,6 +269,8 @@ class SiteSettings::TypeSupervisor RegexSettingValidator when self.class.types[:string], self.class.types[:list], self.class.types[:enum] StringSettingValidator + when self.class.types[:host_list] + HostListSettingValidator else nil end end diff --git a/lib/validators/host_list_setting_validator.rb b/lib/validators/host_list_setting_validator.rb new file mode 100644 index 0000000000..93d51aa2b0 --- /dev/null +++ b/lib/validators/host_list_setting_validator.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class HostListSettingValidator + def initialize(opts = {}) + @opts = opts + end + + def valid_value?(val) + val.exclude?("*") && val.exclude?("?") + end + + def error_message + I18n.t('site_settings.errors.invalid_domain_hostname') + end +end diff --git a/spec/components/validators/host_list_setting_validator_spec.rb b/spec/components/validators/host_list_setting_validator_spec.rb new file mode 100644 index 0000000000..afeaa8c5c4 --- /dev/null +++ b/spec/components/validators/host_list_setting_validator_spec.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe HostListSettingValidator do + subject(:validator) { described_class.new() } + + describe '#valid_value?' do + describe "returns false for values containing *" do + it { expect(validator.valid_value?("*")).to eq false } + it { expect(validator.valid_value?("**")).to eq false } + it { expect(validator.valid_value?(".*")).to eq false } + it { expect(validator.valid_value?("a")).to eq true } + end + + describe "returns false for values containing ?" do + it { expect(validator.valid_value?("?")).to eq false } + it { expect(validator.valid_value?("??")).to eq false } + it { expect(validator.valid_value?(".?")).to eq false } + it { expect(validator.valid_value?("a")).to eq true } + end + end + + describe "#error_message" do + it "returns invalid domain hostname error" do + expect(validator.error_message).to eq(I18n.t( + 'site_settings.errors.invalid_domain_hostname' + )) + end + end +end From 3b1b7137a293d17880acd9813584d5048a75dcc6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 16:16:03 +1100 Subject: [PATCH 047/194] Build(deps): Bump bootsnap from 1.9.4 to 1.10.3 (#15779) Bumps [bootsnap](https://github.com/Shopify/bootsnap) from 1.9.4 to 1.10.3. - [Release notes](https://github.com/Shopify/bootsnap/releases) - [Changelog](https://github.com/Shopify/bootsnap/blob/main/CHANGELOG.md) - [Commits](https://github.com/Shopify/bootsnap/compare/v1.9.4...v1.10.3) --- updated-dependencies: - dependency-name: bootsnap dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1ef1259fbc..5f5cfd6320 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -80,8 +80,8 @@ GEM rack (>= 0.9.0) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) - bootsnap (1.9.4) - msgpack (~> 1.0) + bootsnap (1.10.3) + msgpack (~> 1.2) builder (3.2.4) bullet (7.0.1) activesupport (>= 3.0.0) @@ -243,7 +243,7 @@ GEM mocha (1.13.0) mock_redis (0.29.0) ruby2_keywords - msgpack (1.4.2) + msgpack (1.4.4) multi_json (1.15.0) multi_xml (0.6.0) multipart-post (2.1.1) From 7d5d2bf13ef7aced7653b16bd721931ea5f4ece1 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Thu, 3 Feb 2022 06:16:49 +0100 Subject: [PATCH 048/194] A11Y: Use `autocomplete=off` more widely (#15780) --- .../addon/templates/components/admin-editable-field.hbs | 2 +- .../admin/addon/templates/components/simple-list.hbs | 5 +++-- .../admin/addon/templates/components/themes-list.hbs | 3 ++- .../discourse/app/components/search-text-field.js | 2 +- .../discourse/app/templates/components/d-editor.hbs | 2 +- .../discourse/app/templates/components/emoji-picker.hbs | 3 ++- .../javascripts/discourse/app/templates/group-index.hbs | 2 +- .../javascripts/discourse/app/templates/invites/show.hbs | 2 +- .../discourse/app/templates/mobile/group-index.hbs | 2 +- .../discourse/app/templates/modal/create-account.hbs | 2 +- .../javascripts/discourse/app/templates/user/bookmarks.hbs | 4 +++- 11 files changed, 17 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/admin/addon/templates/components/admin-editable-field.hbs b/app/assets/javascripts/admin/addon/templates/components/admin-editable-field.hbs index 7377a782b9..3dce5e6299 100644 --- a/app/assets/javascripts/admin/addon/templates/components/admin-editable-field.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/admin-editable-field.hbs @@ -1,7 +1,7 @@
{{i18n name}}
{{#if editing}} - {{text-field value=buffer autofocus="autofocus" autocomplete="discourse"}} + {{text-field value=buffer autofocus="autofocus" autocomplete="off"}} {{else}} {{value}} diff --git a/app/assets/javascripts/admin/addon/templates/components/simple-list.hbs b/app/assets/javascripts/admin/addon/templates/components/simple-list.hbs index 3e78f77b05..ab94ad2e39 100644 --- a/app/assets/javascripts/admin/addon/templates/components/simple-list.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/simple-list.hbs @@ -26,9 +26,10 @@ value=newValue placeholderKey="admin.site_settings.simple_list.add_item" class="add-value-input" - autocomplete="discourse" + autocomplete="off" autocorrect="off" - autocapitalize="off"}} + autocapitalize="off" + }} {{d-button action=(action "addValue") diff --git a/app/assets/javascripts/admin/addon/templates/components/themes-list.hbs b/app/assets/javascripts/admin/addon/templates/components/themes-list.hbs index ab342b1b93..5639dc42c1 100644 --- a/app/assets/javascripts/admin/addon/templates/components/themes-list.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/themes-list.hbs @@ -20,7 +20,8 @@ {{input class="filter-input" placeholder=(i18n "admin.customize.theme.filter_placeholder") - autocomplete="discourse" + autocomplete="off" + type="search" value=(mut filterTerm) }} {{d-icon "search"}} diff --git a/app/assets/javascripts/discourse/app/components/search-text-field.js b/app/assets/javascripts/discourse/app/components/search-text-field.js index cad882f85c..520a90c552 100644 --- a/app/assets/javascripts/discourse/app/components/search-text-field.js +++ b/app/assets/javascripts/discourse/app/components/search-text-field.js @@ -4,7 +4,7 @@ import TextField from "discourse/components/text-field"; import { applySearchAutocomplete } from "discourse/lib/search"; export default TextField.extend({ - autocomplete: "discourse-search", + autocomplete: "off", @discourseComputed("searchService.searchContextEnabled") placeholder(searchContextEnabled) { diff --git a/app/assets/javascripts/discourse/app/templates/components/d-editor.hbs b/app/assets/javascripts/discourse/app/templates/components/d-editor.hbs index b424143c3d..c1be4f6978 100644 --- a/app/assets/javascripts/discourse/app/templates/components/d-editor.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/d-editor.hbs @@ -43,7 +43,7 @@ {{conditional-loading-spinner condition=loading}} {{d-textarea - autocomplete="discourse" + autocomplete="off" tabindex=tabindex value=value class="d-editor-input" diff --git a/app/assets/javascripts/discourse/app/templates/components/emoji-picker.hbs b/app/assets/javascripts/discourse/app/templates/components/emoji-picker.hbs index 5584b496d4..6de3a63fd3 100644 --- a/app/assets/javascripts/discourse/app/templates/components/emoji-picker.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/emoji-picker.hbs @@ -24,7 +24,8 @@ class="filter" name="filter" placeholder=(i18n "emoji_picker.filter_placeholder") - autocomplete="discourse" + autocomplete="off" + type="search" autocorrect="off" autocapitalize="off" input=(action "onFilter") diff --git a/app/assets/javascripts/discourse/app/templates/group-index.hbs b/app/assets/javascripts/discourse/app/templates/group-index.hbs index 86aaea824b..71c929e137 100644 --- a/app/assets/javascripts/discourse/app/templates/group-index.hbs +++ b/app/assets/javascripts/discourse/app/templates/group-index.hbs @@ -4,7 +4,7 @@ {{text-field value=filterInput placeholderKey=filterPlaceholder - autocomplete="discourse" + autocomplete="off" class="group-username-filter no-blur" }} {{/if}} diff --git a/app/assets/javascripts/discourse/app/templates/invites/show.hbs b/app/assets/javascripts/discourse/app/templates/invites/show.hbs index cacd25edc7..cda2c35542 100644 --- a/app/assets/javascripts/discourse/app/templates/invites/show.hbs +++ b/app/assets/javascripts/discourse/app/templates/invites/show.hbs @@ -70,7 +70,7 @@ {{/if}}
- {{input value=accountUsername class=(value-entered accountUsername) id="new-account-username" name="username" maxlength=maxUsernameLength autocomplete="discourse"}} + {{input value=accountUsername class=(value-entered accountUsername) id="new-account-username" name="username" maxlength=maxUsernameLength autocomplete="off"}}
{{/styleguide-example}} +{{#styleguide-example title="full-width inline-form with search type input"}} +
+ {{input placeholder="Search type input" type="search"}} +
+{{/styleguide-example}} + {{#styleguide-example title="category-notifications-button and regular button"}}
{{category-notifications-button category=dummy.categories.[0] value=1 onChange=(action "dummy")}} From 128ba0fb62da1b2a628e4777fafc30243ea46858 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 13:55:17 +0100 Subject: [PATCH 060/194] Build(deps): Bump zeitwerk from 2.5.3 to 2.5.4 (#15792) Bumps [zeitwerk](https://github.com/fxn/zeitwerk) from 2.5.3 to 2.5.4. - [Release notes](https://github.com/fxn/zeitwerk/releases) - [Changelog](https://github.com/fxn/zeitwerk/blob/main/CHANGELOG.md) - [Commits](https://github.com/fxn/zeitwerk/compare/v2.5.3...v2.5.4) --- updated-dependencies: - dependency-name: zeitwerk dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9ffab565a2..a6c2040da3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -477,7 +477,7 @@ GEM jwt (~> 2.0) xorcist (1.1.2) yaml-lint (0.0.10) - zeitwerk (2.5.3) + zeitwerk (2.5.4) PLATFORMS aarch64-linux From a25ddc26b147bde599d6ea72e409103c3d3f2cb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 13:55:48 +0100 Subject: [PATCH 061/194] Build(deps): Bump nokogiri from 1.12.5 to 1.13.1 (#15573) Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.12.5 to 1.13.1. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/v1.13.1/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.12.5...v1.13.1) --- updated-dependencies: - dependency-name: nokogiri dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index a6c2040da3..27f6928e89 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -231,7 +231,7 @@ GEM rack (>= 1.1.3) method_source (1.0.0) mini_mime (1.1.2) - mini_portile2 (2.6.1) + mini_portile2 (2.7.1) mini_racer (0.6.2) libv8-node (~> 16.10.0.0) mini_scheduler (0.13.0) @@ -249,14 +249,16 @@ GEM multipart-post (2.1.1) mustache (1.1.1) nio4r (2.5.8) - nokogiri (1.12.5) - mini_portile2 (~> 2.6.1) + nokogiri (1.13.1) + mini_portile2 (~> 2.7.0) racc (~> 1.4) - nokogiri (1.12.5-arm64-darwin) + nokogiri (1.13.1-aarch64-linux) racc (~> 1.4) - nokogiri (1.12.5-x86_64-darwin) + nokogiri (1.13.1-arm64-darwin) racc (~> 1.4) - nokogiri (1.12.5-x86_64-linux) + nokogiri (1.13.1-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.13.1-x86_64-linux) racc (~> 1.4) oauth (0.5.8) oauth2 (1.4.7) From 7e67c5c8a8f8d8114e9e63c662ef2c55a59f7426 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 13:56:58 +0100 Subject: [PATCH 062/194] Build(deps): Bump rubocop-rspec from 2.7.0 to 2.8.0 (#15793) Bumps [rubocop-rspec](https://github.com/rubocop/rubocop-rspec) from 2.7.0 to 2.8.0. - [Release notes](https://github.com/rubocop/rubocop-rspec/releases) - [Changelog](https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop-rspec/compare/v2.7.0...v2.8.0) --- updated-dependencies: - dependency-name: rubocop-rspec dependency-type: indirect update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 27f6928e89..90bdab4ed9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -409,7 +409,7 @@ GEM rubocop-discourse (2.5.0) rubocop (>= 1.1.0) rubocop-rspec (>= 2.0.0) - rubocop-rspec (2.7.0) + rubocop-rspec (2.8.0) rubocop (~> 1.19) ruby-prof (1.4.3) ruby-progressbar (1.11.0) From 7933278ef46e7c96dc07fb70b9baa2bb33399d9c Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 3 Feb 2022 12:57:57 +0000 Subject: [PATCH 063/194] DEV: Improve Ember module shims under Ember CLI (#15795) In our legacy environment, Ember RFC176 shims are included in `discourse-loader.js` which is part of the `vendor.js` bundle. This meant that the module shims were available as soon as the vendor.js asset was loaded. Under Ember CLI, we were defining these shims in `discourse-boot.js`. This is loaded by the browser much later, and meant that the shims were not available to themes/plugins that call `require()` before Discourse has booted. This was causing errors under some circumstances. This commit refactors the Ember CLI implementation so that the shims are included in the vendor.js bundle. This is done via an addon which leans on the ember-rfc176-data NPM package. This will ensure we have all the definitions, without the need for manual copy/paste. --- .../javascripts/discourse/ember-cli-build.js | 5 + .../discourse/lib/rfc176-shims/.npmrc | 1 + .../discourse/lib/rfc176-shims/index.js | 57 +++++++ .../discourse/lib/rfc176-shims/package.json | 6 + app/assets/javascripts/discourse/package.json | 4 +- .../public/assets/scripts/discourse-boot.js | 160 ------------------ .../public/assets/scripts/module-shims.js | 9 + 7 files changed, 81 insertions(+), 161 deletions(-) create mode 100644 app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc create mode 100644 app/assets/javascripts/discourse/lib/rfc176-shims/index.js create mode 100644 app/assets/javascripts/discourse/lib/rfc176-shims/package.json create mode 100644 app/assets/javascripts/discourse/public/assets/scripts/module-shims.js diff --git a/app/assets/javascripts/discourse/ember-cli-build.js b/app/assets/javascripts/discourse/ember-cli-build.js index 64c4055808..e6a01988ad 100644 --- a/app/assets/javascripts/discourse/ember-cli-build.js +++ b/app/assets/javascripts/discourse/ember-cli-build.js @@ -110,6 +110,11 @@ module.exports = function (defaults) { }); app.import(discourseRoot + "/app/assets/javascripts/polyfills.js"); + app.import( + discourseRoot + + "/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js" + ); + const mergedTree = mergeTrees([ discourseScss(`${discourseRoot}/app/assets/stylesheets`, "testem.scss"), createI18nTree(discourseRoot, vendorJs), diff --git a/app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc b/app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc new file mode 100644 index 0000000000..c42da845b4 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/app/assets/javascripts/discourse/lib/rfc176-shims/index.js b/app/assets/javascripts/discourse/lib/rfc176-shims/index.js new file mode 100644 index 0000000000..df26adac62 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/rfc176-shims/index.js @@ -0,0 +1,57 @@ +"use strict"; + +// In core, babel-plugin-ember-modules-api-polyfill takes care of re-writing the new module +// syntax to the legacy Ember globals. For themes and plugins, we need to manually set up +// the modules. +// +// Eventually, Ember RFC176 will be implemented, and we can drop these shims. + +const RFC176Data = require("ember-rfc176-data"); + +module.exports = { + name: require("./package").name, + + isDevelopingAddon() { + return true; + }, + + contentFor: function (type) { + if (type !== "vendor-suffix") { + return; + } + + const modules = {}; + + for (const entry of RFC176Data) { + // Entries look like: + // { + // global: 'Ember.expandProperties', + // module: '@ember/object/computed', + // export: 'expandProperties', + // deprecated: false + // }, + + if (entry.deprecated) { + continue; + } + + let m = modules[entry.module]; + if (!m) { + m = modules[entry.module] = []; + } + + m.push(entry); + } + + let output = ""; + for (const moduleName of Object.keys(modules)) { + const exports = modules[moduleName]; + const rawExports = exports + .map((e) => `${e.export}:${e.global}`) + .join(","); + output += `define("${moduleName}", () => {return {${rawExports}}});\n`; + } + + return output; + }, +}; diff --git a/app/assets/javascripts/discourse/lib/rfc176-shims/package.json b/app/assets/javascripts/discourse/lib/rfc176-shims/package.json new file mode 100644 index 0000000000..60bf829f39 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/rfc176-shims/package.json @@ -0,0 +1,6 @@ +{ + "name": "rfc176-shims", + "keywords": [ + "ember-addon" + ] +} diff --git a/app/assets/javascripts/discourse/package.json b/app/assets/javascripts/discourse/package.json index e743a6586f..013f5cedba 100644 --- a/app/assets/javascripts/discourse/package.json +++ b/app/assets/javascripts/discourse/package.json @@ -49,6 +49,7 @@ "ember-load-initializers": "^2.1.1", "ember-maybe-import-regenerator": "^0.1.6", "ember-qunit": "^5.1.2", + "ember-rfc176-data": "^0.3.17", "ember-source": "~3.15.0", "ember-test-selectors": "^6.0.0", "eslint": "^7.27.0", @@ -79,7 +80,8 @@ }, "ember-addon": { "paths": [ - "lib/bootstrap-json" + "lib/bootstrap-json", + "lib/rfc176-shims" ] }, "devDependencies": { diff --git a/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js b/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js index a1fe1ebd48..1bc1786c8d 100644 --- a/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js +++ b/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js @@ -2,157 +2,6 @@ if (window.unsupportedBrowser) { throw "Unsupported browser detected"; } - // TODO: These are needed to load plugins because @ember has its own loader. - // We should find a nicer way to do this. - const EMBER_MODULES = { - "@ember/application": { - default: Ember.Application, - setOwner: Ember.setOwner, - getOwner: Ember.getOwner, - }, - "@ember/array": { - default: Ember.Array, - A: Ember.A, - isArray: Ember.isArray, - }, - "@ember/array/proxy": { - default: Ember.ArrayProxy, - }, - "@ember/component": { - default: Ember.Component, - }, - "@ember/component/helper": { - default: Ember.Helper, - }, - "@ember/component/text-field": { - default: Ember.TextField, - }, - "@ember/component/text-area": { - default: Ember.TextArea, - }, - "@ember/controller": { - default: Ember.Controller, - inject: Ember.inject.controller, - }, - "@ember/debug": { - warn: Ember.warn, - }, - "@ember/error": { - default: Ember.error, - }, - "@ember/object": { - action: Ember._action, - default: Ember.Object, - get: Ember.get, - getProperties: Ember.getProperties, - set: Ember.set, - setProperties: Ember.setProperties, - computed: Ember.computed, - defineProperty: Ember.defineProperty, - }, - "@ember/object/computed": { - alias: Ember.computed.alias, - and: Ember.computed.and, - bool: Ember.computed.bool, - collect: Ember.computed.collect, - deprecatingAlias: Ember.computed.deprecatingAlias, - empty: Ember.computed.empty, - equal: Ember.computed.equal, - filter: Ember.computed.filter, - filterBy: Ember.computed.filterBy, - gt: Ember.computed.gt, - gte: Ember.computed.gte, - intersect: Ember.computed.intersect, - lt: Ember.computed.lt, - lte: Ember.computed.lte, - map: Ember.computed.map, - mapBy: Ember.computed.mapBy, - match: Ember.computed.match, - max: Ember.computed.max, - min: Ember.computed.min, - none: Ember.computed.none, - not: Ember.computed.not, - notEmpty: Ember.computed.notEmpty, - oneWay: Ember.computed.oneWay, - or: Ember.computed.or, - readOnly: Ember.computed.readOnly, - reads: Ember.computed.reads, - setDiff: Ember.computed.setDiff, - sort: Ember.computed.sort, - sum: Ember.computed.sum, - union: Ember.computed.union, - uniq: Ember.computed.uniq, - uniqBy: Ember.computed.uniqBy, - }, - "@ember/object/internals": { - guidFor: Ember.guidFor, - }, - "@ember/object/mixin": { default: Ember.Mixin }, - "@ember/object/proxy": { default: Ember.ObjectProxy }, - "@ember/object/promise-proxy-mixin": { default: Ember.PromiseProxyMixin }, - "@ember/object/evented": { - default: Ember.Evented, - on: Ember.on, - }, - "@ember/routing/route": { default: Ember.Route }, - "@ember/routing/router": { default: Ember.Router }, - "@ember/runloop": { - bind: Ember.run.bind, - cancel: Ember.run.cancel, - debounce: Ember.testing ? Ember.run : Ember.run.debounce, - later: Ember.run.later, - next: Ember.run.next, - once: Ember.run.once, - run: Ember.run, - schedule: Ember.run.schedule, - scheduleOnce: Ember.run.scheduleOnce, - throttle: Ember.run.throttle, - }, - "@ember/service": { - default: Ember.Service, - inject: Ember.inject.service, - }, - "@ember/string": { - w: Ember.String.w, - dasherize: Ember.String.dasherize, - decamelize: Ember.String.decamelize, - camelize: Ember.String.camelize, - classify: Ember.String.classify, - underscore: Ember.String.underscore, - capitalize: Ember.String.capitalize, - }, - "@ember/template": { - htmlSafe: Ember.String.htmlSafe, - }, - "@ember/utils": { - isBlank: Ember.isBlank, - isEmpty: Ember.isEmpty, - isNone: Ember.isNone, - isPresent: Ember.isPresent, - }, - jquery: { default: $ }, - rsvp: { - asap: Ember.RSVP.asap, - all: Ember.RSVP.all, - allSettled: Ember.RSVP.allSettled, - race: Ember.RSVP.race, - hash: Ember.RSVP.hash, - hashSettled: Ember.RSVP.hashSettled, - rethrow: Ember.RSVP.rethrow, - defer: Ember.RSVP.defer, - denodeify: Ember.RSVP.denodeify, - resolve: Ember.RSVP.resolve, - reject: Ember.RSVP.reject, - map: Ember.RSVP.map, - filter: Ember.RSVP.filter, - default: Ember.RSVP, - Promise: Ember.RSVP.Promise, - EventTarget: Ember.RSVP.EventTarget, - }, - }; - Object.keys(EMBER_MODULES).forEach((mod) => { - define(mod, () => EMBER_MODULES[mod]); - }); // TODO: Remove this and have resolver find the templates const prefix = "discourse/templates/"; @@ -166,15 +15,6 @@ } }); - define("I18n", ["exports"], function (exports) { - return I18n; - }); - - define("htmlbars-inline-precompile", ["exports"], function (exports) { - exports.default = function tag(strings) { - return Ember.Handlebars.compile(strings[0]); - }; - }); window.__widget_helpers = require("discourse-widget-hbs/helpers").default; // TODO: Eliminate this global diff --git a/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js b/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js new file mode 100644 index 0000000000..cab696c012 --- /dev/null +++ b/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js @@ -0,0 +1,9 @@ +define("I18n", ["exports"], function (exports) { + return I18n; +}); + +define("htmlbars-inline-precompile", ["exports"], function (exports) { + exports.default = function tag(strings) { + return Ember.Handlebars.compile(strings[0]); + }; +}); From 59a41fe45fcf995afe10bc902d6dcb8765d1471d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 13:58:27 +0100 Subject: [PATCH 064/194] Build(deps): Bump pg from 1.2.3 to 1.3.1 (#15794) Bumps [pg](https://github.com/ged/ruby-pg) from 1.2.3 to 1.3.1. - [Release notes](https://github.com/ged/ruby-pg/releases) - [Changelog](https://github.com/ged/ruby-pg/blob/master/History.rdoc) - [Commits](https://github.com/ged/ruby-pg/compare/v1.2.3...v1.3.1) --- updated-dependencies: - dependency-name: pg dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 90bdab4ed9..c3ea24e673 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -300,7 +300,7 @@ GEM parallel parser (3.1.0.0) ast (~> 2.4.1) - pg (1.2.3) + pg (1.3.1) progress (3.6.0) pry (0.13.1) coderay (~> 1.1) From acc0a195df9c5cec0bd1e0bd1d196dbc685882e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 15:04:50 +0100 Subject: [PATCH 065/194] Build(deps): Bump rspec-mocks from 3.10.2 to 3.10.3 (#15799) Bumps [rspec-mocks](https://github.com/rspec/rspec-mocks) from 3.10.2 to 3.10.3. - [Release notes](https://github.com/rspec/rspec-mocks/releases) - [Changelog](https://github.com/rspec/rspec-mocks/blob/main/Changelog.md) - [Commits](https://github.com/rspec/rspec-mocks/compare/v3.10.2...v3.10.3) --- updated-dependencies: - dependency-name: rspec-mocks dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index c3ea24e673..e7f3c6c335 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -376,7 +376,7 @@ GEM rspec-html-matchers (0.9.4) nokogiri (~> 1) rspec (>= 3.0.0.a, < 4) - rspec-mocks (3.10.2) + rspec-mocks (3.10.3) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.10.0) rspec-rails (5.0.2) From f5824dd586a0e65e10599be7dfdc18b7490411f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 15:04:57 +0100 Subject: [PATCH 066/194] Build(deps-dev): Bump fabrication from 2.24.0 to 2.26.0 (#15798) Bumps [fabrication](https://github.com/paulelliott/fabrication) from 2.24.0 to 2.26.0. - [Release notes](https://github.com/paulelliott/fabrication/releases) - [Changelog](https://github.com/paulelliott/fabrication/blob/master/Changelog.markdown) - [Commits](https://github.com/paulelliott/fabrication/commits) --- updated-dependencies: - dependency-name: fabrication dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index e7f3c6c335..40d89561b3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -132,7 +132,7 @@ GEM excon (0.89.0) execjs (2.8.1) exifr (1.3.9) - fabrication (2.24.0) + fabrication (2.26.0) faker (2.19.0) i18n (>= 1.6, < 2) fakeweb (1.3.0) From dfcb8a72fde7fbab4e819f5e7c93ff7f78465048 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 3 Feb 2022 14:24:15 +0000 Subject: [PATCH 067/194] DEV: Ensure Sidekiq warnings are logged to STDERR (#15800) The default configuration will log to STOUT, which pollutes the output of scripts/rake-tasks --- config/initializers/100-sidekiq.rb | 2 +- lib/demon/sidekiq.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/initializers/100-sidekiq.rb b/config/initializers/100-sidekiq.rb index a14a080307..b309e45123 100644 --- a/config/initializers/100-sidekiq.rb +++ b/config/initializers/100-sidekiq.rb @@ -81,7 +81,7 @@ if Sidekiq.server? end end -Sidekiq.logger.level = Logger::WARN +Sidekiq.logger = Sidekiq::Logger.new(STDERR, level: Logger::WARN) class SidekiqLogsterReporter < Sidekiq::ExceptionHandler::Logger def call(ex, context = {}) diff --git a/lib/demon/sidekiq.rb b/lib/demon/sidekiq.rb index a66fed3aef..b8d418f928 100644 --- a/lib/demon/sidekiq.rb +++ b/lib/demon/sidekiq.rb @@ -31,7 +31,7 @@ class Demon::Sidekiq < ::Demon::Base # trouble, if STDOUT is closed in our process all sort of weird # will ensue, resetting the logger ensures it will reinit correctly # parent process is in charge of the file anyway. - Sidekiq.logger = nil + Sidekiq.logger = Sidekiq::Logger.new(STDERR, level: Logger::WARN) cli = Sidekiq::CLI.instance # Unicorn uses USR1 to indicate that log files have been rotated From c9e7ddc13758e5e4cc5e9474c6bcb4a82fde01e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 15:26:23 +0100 Subject: [PATCH 068/194] Build(deps): Bump puma from 5.5.2 to 5.6.1 (#15796) Bumps [puma](https://github.com/puma/puma) from 5.5.2 to 5.6.1. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v5.5.2...v5.6.1) --- updated-dependencies: - dependency-name: puma dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 40d89561b3..6f313b5cd8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -311,7 +311,7 @@ GEM pry-rails (0.3.9) pry (>= 0.10.4) public_suffix (4.0.6) - puma (5.5.2) + puma (5.6.1) nio4r (~> 2.0) r2 (0.2.7) racc (1.6.0) From b96b49e744a2fdc1b53b18417d07d8820c3dbc33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 15:50:14 +0100 Subject: [PATCH 069/194] Build(deps): Bump i18n from 1.8.11 to 1.9.1 (#15797) Bumps [i18n](https://github.com/ruby-i18n/i18n) from 1.8.11 to 1.9.1. - [Release notes](https://github.com/ruby-i18n/i18n/releases) - [Changelog](https://github.com/ruby-i18n/i18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/ruby-i18n/i18n/compare/v1.8.11...v1.9.1) --- updated-dependencies: - dependency-name: i18n dependency-type: indirect update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 6f313b5cd8..b09b712dda 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -175,7 +175,7 @@ GEM hkdf (0.3.0) htmlentities (4.3.4) http_accept_language (2.1.1) - i18n (1.8.11) + i18n (1.9.1) concurrent-ruby (~> 1.0) image_optim (0.31.1) exifr (~> 1.2, >= 1.2.2) From 1a53617b4fdb3d5c6ce89da80865e2aa12fa3bf8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 15:50:30 +0100 Subject: [PATCH 070/194] Build(deps): Bump excon from 0.89.0 to 0.90.0 (#15574) Bumps [excon](https://github.com/excon/excon) from 0.89.0 to 0.90.0. - [Release notes](https://github.com/excon/excon/releases) - [Changelog](https://github.com/excon/excon/blob/master/changelog.txt) - [Commits](https://github.com/excon/excon/compare/v0.89.0...v0.90.0) --- updated-dependencies: - dependency-name: excon dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index b09b712dda..50ac3ee711 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -129,7 +129,7 @@ GEM sprockets (>= 3.3, < 4.1) ember-source (2.18.2) erubi (1.10.0) - excon (0.89.0) + excon (0.90.0) execjs (2.8.1) exifr (1.3.9) fabrication (2.26.0) From 1febf3cd9400e3b02cf0ff35663a62d7d86c4c99 Mon Sep 17 00:00:00 2001 From: janzenisaac <50783505+janzenisaac@users.noreply.github.com> Date: Thu, 3 Feb 2022 09:16:17 -0600 Subject: [PATCH 071/194] DEV: Update Font Awesome to 5.15.4 --- package.json | 2 +- .../assets/svg-icons/fontawesome/brands.svg | 143 +++++++++++---- .../assets/svg-icons/fontawesome/regular.svg | 4 +- vendor/assets/svg-icons/fontawesome/solid.svg | 173 +++++++++++++++--- yarn.lock | 8 +- 5 files changed, 261 insertions(+), 69 deletions(-) diff --git a/package.json b/package.json index 6a7bfc5ede..d4a6629fa6 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,8 @@ "license": "GPL-2.0-only", "dependencies": { "@discourse/itsatrap": "^2.0.10", + "@fortawesome/fontawesome-free": "5.15.4", "@discourse/moment-timezone-names-translations": "^1.0.0", - "@fortawesome/fontawesome-free": "5.11.2", "@highlightjs/cdn-assets": "^10.7.0", "@json-editor/json-editor": "^2.6.1", "@popperjs/core": "v2.10.2", diff --git a/vendor/assets/svg-icons/fontawesome/brands.svg b/vendor/assets/svg-icons/fontawesome/brands.svg index e0206c0d71..a32e971626 100644 --- a/vendor/assets/svg-icons/fontawesome/brands.svg +++ b/vendor/assets/svg-icons/fontawesome/brands.svg @@ -1,6 +1,6 @@ @@ -19,9 +19,6 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - - @@ -46,8 +43,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - + + @@ -97,8 +94,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - + + @@ -139,8 +136,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - + + @@ -200,7 +197,10 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + + + + @@ -292,9 +292,15 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + @@ -322,8 +328,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - + + @@ -359,7 +365,10 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + + + + @@ -413,10 +422,13 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + - - + + + + + @@ -437,16 +449,16 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + - + - + - + @@ -467,7 +479,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -538,11 +550,14 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + - - + + @@ -565,6 +580,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -583,6 +601,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -601,12 +622,24 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + + + + + + + @@ -748,6 +781,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -757,6 +793,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -785,11 +824,14 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + + + + @@ -835,6 +877,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -850,8 +895,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - + + @@ -862,6 +907,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -899,7 +947,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -944,13 +992,16 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + + + + - + @@ -979,6 +1030,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -1117,23 +1171,23 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + - - - - - + + @@ -1156,9 +1210,18 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + + + + @@ -1210,6 +1273,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -1243,6 +1309,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -1276,8 +1345,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - + + diff --git a/vendor/assets/svg-icons/fontawesome/regular.svg b/vendor/assets/svg-icons/fontawesome/regular.svg index 817aad1e56..31ebef71bc 100644 --- a/vendor/assets/svg-icons/fontawesome/regular.svg +++ b/vendor/assets/svg-icons/fontawesome/regular.svg @@ -1,6 +1,6 @@ @@ -269,7 +269,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + diff --git a/vendor/assets/svg-icons/fontawesome/solid.svg b/vendor/assets/svg-icons/fontawesome/solid.svg index f62cc56f97..edaf082663 100644 --- a/vendor/assets/svg-icons/fontawesome/solid.svg +++ b/vendor/assets/svg-icons/fontawesome/solid.svg @@ -1,6 +1,6 @@ @@ -16,8 +16,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - + + @@ -140,7 +140,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -163,6 +163,15 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + + + + @@ -191,7 +200,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -304,6 +313,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -415,6 +427,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -572,7 +587,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -667,6 +682,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -772,6 +790,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -781,8 +802,8 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - + + @@ -895,6 +916,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -922,6 +946,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -1064,7 +1091,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -1237,9 +1264,15 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + @@ -1273,8 +1306,11 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + - + @@ -1282,9 +1318,18 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + + + + @@ -1303,12 +1348,21 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - - + + + + + + + + + + + + @@ -1369,6 +1423,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -1393,6 +1450,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -1447,14 +1507,14 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - - + + - + @@ -1492,6 +1552,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -1579,6 +1642,12 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + @@ -1658,7 +1727,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -1849,6 +1918,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -1906,6 +1978,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -1913,7 +1988,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -1975,6 +2050,12 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + @@ -2057,10 +2138,10 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + - + @@ -2099,10 +2180,10 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + - + @@ -2141,7 +2222,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -2161,6 +2242,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -2180,7 +2264,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -2206,6 +2290,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -2266,6 +2353,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -2389,12 +2479,21 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + + + + @@ -2575,6 +2674,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -2599,6 +2701,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -2735,7 +2840,7 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL - + @@ -2764,6 +2869,9 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + @@ -2782,6 +2890,12 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + @@ -2797,6 +2911,15 @@ License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL + + + + + + + + + diff --git a/yarn.lock b/yarn.lock index 8b99ee19ea..a4992cc4c2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -121,10 +121,10 @@ resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== -"@fortawesome/fontawesome-free@5.11.2": - version "5.11.2" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.11.2.tgz#8644bc25b19475779a7b7c1fc104bc0a794f4465" - integrity sha512-XiUPoS79r1G7PcpnNtq85TJ7inJWe0v+b5oZJZKb0pGHNIV6+UiNeQWiFGmuQ0aj7GEhnD/v9iqxIsjuRKtEnQ== +"@fortawesome/fontawesome-free@5.15.4": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" + integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== "@glimmer/env@0.1.7": version "0.1.7" From ea37b30ab2c1e7f565a353b5d45f0f760f7f7d2e Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 3 Feb 2022 16:13:33 +0000 Subject: [PATCH 072/194] Revert "DEV: Improve Ember module shims under Ember CLI (#15795)" (#15803) This reverts commit 7933278ef46e7c96dc07fb70b9baa2bb33399d9c. This isn't working in production, reverting pending investigations. --- .../javascripts/discourse/ember-cli-build.js | 5 - .../discourse/lib/rfc176-shims/.npmrc | 1 - .../discourse/lib/rfc176-shims/index.js | 57 ------- .../discourse/lib/rfc176-shims/package.json | 6 - app/assets/javascripts/discourse/package.json | 4 +- .../public/assets/scripts/discourse-boot.js | 160 ++++++++++++++++++ .../public/assets/scripts/module-shims.js | 9 - 7 files changed, 161 insertions(+), 81 deletions(-) delete mode 100644 app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc delete mode 100644 app/assets/javascripts/discourse/lib/rfc176-shims/index.js delete mode 100644 app/assets/javascripts/discourse/lib/rfc176-shims/package.json delete mode 100644 app/assets/javascripts/discourse/public/assets/scripts/module-shims.js diff --git a/app/assets/javascripts/discourse/ember-cli-build.js b/app/assets/javascripts/discourse/ember-cli-build.js index e6a01988ad..64c4055808 100644 --- a/app/assets/javascripts/discourse/ember-cli-build.js +++ b/app/assets/javascripts/discourse/ember-cli-build.js @@ -110,11 +110,6 @@ module.exports = function (defaults) { }); app.import(discourseRoot + "/app/assets/javascripts/polyfills.js"); - app.import( - discourseRoot + - "/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js" - ); - const mergedTree = mergeTrees([ discourseScss(`${discourseRoot}/app/assets/stylesheets`, "testem.scss"), createI18nTree(discourseRoot, vendorJs), diff --git a/app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc b/app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc deleted file mode 100644 index c42da845b4..0000000000 --- a/app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict = true diff --git a/app/assets/javascripts/discourse/lib/rfc176-shims/index.js b/app/assets/javascripts/discourse/lib/rfc176-shims/index.js deleted file mode 100644 index df26adac62..0000000000 --- a/app/assets/javascripts/discourse/lib/rfc176-shims/index.js +++ /dev/null @@ -1,57 +0,0 @@ -"use strict"; - -// In core, babel-plugin-ember-modules-api-polyfill takes care of re-writing the new module -// syntax to the legacy Ember globals. For themes and plugins, we need to manually set up -// the modules. -// -// Eventually, Ember RFC176 will be implemented, and we can drop these shims. - -const RFC176Data = require("ember-rfc176-data"); - -module.exports = { - name: require("./package").name, - - isDevelopingAddon() { - return true; - }, - - contentFor: function (type) { - if (type !== "vendor-suffix") { - return; - } - - const modules = {}; - - for (const entry of RFC176Data) { - // Entries look like: - // { - // global: 'Ember.expandProperties', - // module: '@ember/object/computed', - // export: 'expandProperties', - // deprecated: false - // }, - - if (entry.deprecated) { - continue; - } - - let m = modules[entry.module]; - if (!m) { - m = modules[entry.module] = []; - } - - m.push(entry); - } - - let output = ""; - for (const moduleName of Object.keys(modules)) { - const exports = modules[moduleName]; - const rawExports = exports - .map((e) => `${e.export}:${e.global}`) - .join(","); - output += `define("${moduleName}", () => {return {${rawExports}}});\n`; - } - - return output; - }, -}; diff --git a/app/assets/javascripts/discourse/lib/rfc176-shims/package.json b/app/assets/javascripts/discourse/lib/rfc176-shims/package.json deleted file mode 100644 index 60bf829f39..0000000000 --- a/app/assets/javascripts/discourse/lib/rfc176-shims/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "rfc176-shims", - "keywords": [ - "ember-addon" - ] -} diff --git a/app/assets/javascripts/discourse/package.json b/app/assets/javascripts/discourse/package.json index 013f5cedba..e743a6586f 100644 --- a/app/assets/javascripts/discourse/package.json +++ b/app/assets/javascripts/discourse/package.json @@ -49,7 +49,6 @@ "ember-load-initializers": "^2.1.1", "ember-maybe-import-regenerator": "^0.1.6", "ember-qunit": "^5.1.2", - "ember-rfc176-data": "^0.3.17", "ember-source": "~3.15.0", "ember-test-selectors": "^6.0.0", "eslint": "^7.27.0", @@ -80,8 +79,7 @@ }, "ember-addon": { "paths": [ - "lib/bootstrap-json", - "lib/rfc176-shims" + "lib/bootstrap-json" ] }, "devDependencies": { diff --git a/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js b/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js index 1bc1786c8d..a1fe1ebd48 100644 --- a/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js +++ b/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js @@ -2,6 +2,157 @@ if (window.unsupportedBrowser) { throw "Unsupported browser detected"; } + // TODO: These are needed to load plugins because @ember has its own loader. + // We should find a nicer way to do this. + const EMBER_MODULES = { + "@ember/application": { + default: Ember.Application, + setOwner: Ember.setOwner, + getOwner: Ember.getOwner, + }, + "@ember/array": { + default: Ember.Array, + A: Ember.A, + isArray: Ember.isArray, + }, + "@ember/array/proxy": { + default: Ember.ArrayProxy, + }, + "@ember/component": { + default: Ember.Component, + }, + "@ember/component/helper": { + default: Ember.Helper, + }, + "@ember/component/text-field": { + default: Ember.TextField, + }, + "@ember/component/text-area": { + default: Ember.TextArea, + }, + "@ember/controller": { + default: Ember.Controller, + inject: Ember.inject.controller, + }, + "@ember/debug": { + warn: Ember.warn, + }, + "@ember/error": { + default: Ember.error, + }, + "@ember/object": { + action: Ember._action, + default: Ember.Object, + get: Ember.get, + getProperties: Ember.getProperties, + set: Ember.set, + setProperties: Ember.setProperties, + computed: Ember.computed, + defineProperty: Ember.defineProperty, + }, + "@ember/object/computed": { + alias: Ember.computed.alias, + and: Ember.computed.and, + bool: Ember.computed.bool, + collect: Ember.computed.collect, + deprecatingAlias: Ember.computed.deprecatingAlias, + empty: Ember.computed.empty, + equal: Ember.computed.equal, + filter: Ember.computed.filter, + filterBy: Ember.computed.filterBy, + gt: Ember.computed.gt, + gte: Ember.computed.gte, + intersect: Ember.computed.intersect, + lt: Ember.computed.lt, + lte: Ember.computed.lte, + map: Ember.computed.map, + mapBy: Ember.computed.mapBy, + match: Ember.computed.match, + max: Ember.computed.max, + min: Ember.computed.min, + none: Ember.computed.none, + not: Ember.computed.not, + notEmpty: Ember.computed.notEmpty, + oneWay: Ember.computed.oneWay, + or: Ember.computed.or, + readOnly: Ember.computed.readOnly, + reads: Ember.computed.reads, + setDiff: Ember.computed.setDiff, + sort: Ember.computed.sort, + sum: Ember.computed.sum, + union: Ember.computed.union, + uniq: Ember.computed.uniq, + uniqBy: Ember.computed.uniqBy, + }, + "@ember/object/internals": { + guidFor: Ember.guidFor, + }, + "@ember/object/mixin": { default: Ember.Mixin }, + "@ember/object/proxy": { default: Ember.ObjectProxy }, + "@ember/object/promise-proxy-mixin": { default: Ember.PromiseProxyMixin }, + "@ember/object/evented": { + default: Ember.Evented, + on: Ember.on, + }, + "@ember/routing/route": { default: Ember.Route }, + "@ember/routing/router": { default: Ember.Router }, + "@ember/runloop": { + bind: Ember.run.bind, + cancel: Ember.run.cancel, + debounce: Ember.testing ? Ember.run : Ember.run.debounce, + later: Ember.run.later, + next: Ember.run.next, + once: Ember.run.once, + run: Ember.run, + schedule: Ember.run.schedule, + scheduleOnce: Ember.run.scheduleOnce, + throttle: Ember.run.throttle, + }, + "@ember/service": { + default: Ember.Service, + inject: Ember.inject.service, + }, + "@ember/string": { + w: Ember.String.w, + dasherize: Ember.String.dasherize, + decamelize: Ember.String.decamelize, + camelize: Ember.String.camelize, + classify: Ember.String.classify, + underscore: Ember.String.underscore, + capitalize: Ember.String.capitalize, + }, + "@ember/template": { + htmlSafe: Ember.String.htmlSafe, + }, + "@ember/utils": { + isBlank: Ember.isBlank, + isEmpty: Ember.isEmpty, + isNone: Ember.isNone, + isPresent: Ember.isPresent, + }, + jquery: { default: $ }, + rsvp: { + asap: Ember.RSVP.asap, + all: Ember.RSVP.all, + allSettled: Ember.RSVP.allSettled, + race: Ember.RSVP.race, + hash: Ember.RSVP.hash, + hashSettled: Ember.RSVP.hashSettled, + rethrow: Ember.RSVP.rethrow, + defer: Ember.RSVP.defer, + denodeify: Ember.RSVP.denodeify, + resolve: Ember.RSVP.resolve, + reject: Ember.RSVP.reject, + map: Ember.RSVP.map, + filter: Ember.RSVP.filter, + default: Ember.RSVP, + Promise: Ember.RSVP.Promise, + EventTarget: Ember.RSVP.EventTarget, + }, + }; + Object.keys(EMBER_MODULES).forEach((mod) => { + define(mod, () => EMBER_MODULES[mod]); + }); // TODO: Remove this and have resolver find the templates const prefix = "discourse/templates/"; @@ -15,6 +166,15 @@ } }); + define("I18n", ["exports"], function (exports) { + return I18n; + }); + + define("htmlbars-inline-precompile", ["exports"], function (exports) { + exports.default = function tag(strings) { + return Ember.Handlebars.compile(strings[0]); + }; + }); window.__widget_helpers = require("discourse-widget-hbs/helpers").default; // TODO: Eliminate this global diff --git a/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js b/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js deleted file mode 100644 index cab696c012..0000000000 --- a/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js +++ /dev/null @@ -1,9 +0,0 @@ -define("I18n", ["exports"], function (exports) { - return I18n; -}); - -define("htmlbars-inline-precompile", ["exports"], function (exports) { - exports.default = function tag(strings) { - return Ember.Handlebars.compile(strings[0]); - }; -}); From 5b5cbbfe5cfdfd43bb7671458a8175b70d7aed8f Mon Sep 17 00:00:00 2001 From: Rafael dos Santos Silva Date: Thu, 3 Feb 2022 13:39:21 -0300 Subject: [PATCH 073/194] FEATURE: Onebox for news.ycombinator.com (#15781) --- lib/onebox/engine.rb | 1 + lib/onebox/engine/hackernews_onebox.rb | 48 ++++++++++++++++ lib/onebox/templates/hackernews.mustache | 18 ++++++ .../onebox/hackernews_comment.response | 1 + .../fixtures/onebox/hackernews_story.response | 1 + spec/lib/onebox/engine/hackernews_spec.rb | 57 +++++++++++++++++++ 6 files changed, 126 insertions(+) create mode 100644 lib/onebox/engine/hackernews_onebox.rb create mode 100644 lib/onebox/templates/hackernews.mustache create mode 100644 spec/fixtures/onebox/hackernews_comment.response create mode 100644 spec/fixtures/onebox/hackernews_story.response create mode 100644 spec/lib/onebox/engine/hackernews_spec.rb diff --git a/lib/onebox/engine.rb b/lib/onebox/engine.rb index 99064c64b3..5d64fa41f6 100644 --- a/lib/onebox/engine.rb +++ b/lib/onebox/engine.rb @@ -210,3 +210,4 @@ require_relative "engine/kaltura_onebox" require_relative "engine/reddit_media_onebox" require_relative "engine/google_drive_onebox" require_relative "engine/facebook_media_onebox" +require_relative "engine/hackernews_onebox" diff --git a/lib/onebox/engine/hackernews_onebox.rb b/lib/onebox/engine/hackernews_onebox.rb new file mode 100644 index 0000000000..79d8e037a5 --- /dev/null +++ b/lib/onebox/engine/hackernews_onebox.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module Onebox + module Engine + class HackernewsOnebox + include Engine + include LayoutSupport + include JSON + + REGEX = /^https?:\/\/news\.ycombinator\.com\/item\?id=(?\d+)/ + + matches_regexp(REGEX) + + # This is their official API: https://blog.ycombinator.com/hacker-news-api/ + def url + "https://hacker-news.firebaseio.com/v0/item/#{match[:item_id]}.json" + end + + private + + def match + @match ||= @url.match(REGEX) + end + + def data + return nil unless %w{story comment}.include?(raw['type']) + + html_entities = HTMLEntities.new + data = { + link: @url, + title: Onebox::Helpers.truncate(raw['title'], 80), + favicon: 'https://news.ycombinator.com/y18.gif', + timestamp: Time.at(raw['time']).strftime("%-l:%M %p - %-d %b %Y"), + author: raw['by'] + } + + data['description'] = html_entities.decode(Onebox::Helpers.truncate(raw['text'], 400)) if raw['text'] + + if raw['type'] == 'story' + data['data_1'] = raw['score'] + data['data_2'] = raw['descendants'] + end + + data + end + end + end +end diff --git a/lib/onebox/templates/hackernews.mustache b/lib/onebox/templates/hackernews.mustache new file mode 100644 index 0000000000..e4431a2601 --- /dev/null +++ b/lib/onebox/templates/hackernews.mustache @@ -0,0 +1,18 @@ +

{{title}}

+ +{{#description}} +

{{description}}

+{{/description}} + + +

+ {{#data_1}} + {{data_1}} points — + {{/data_1}} + {{#data_2}} + {{data_2}} comments — + {{/data_2}} + {{author}} — + {{timestamp}} +

+ diff --git a/spec/fixtures/onebox/hackernews_comment.response b/spec/fixtures/onebox/hackernews_comment.response new file mode 100644 index 0000000000..93c753faef --- /dev/null +++ b/spec/fixtures/onebox/hackernews_comment.response @@ -0,0 +1 @@ +{"by":"codinghorror","id":5173615,"parent":5173013,"text":"Completely, forums are about basic human expression in paragraph form. This is an essential right and we want to give it back to the world in 100% no strings attached open source form.

Not that there aren't other forum choices, of course there are, but VERY few are 100% open source and even fewer are ones I want to use.","time":1360102194,"type":"comment"} \ No newline at end of file diff --git a/spec/fixtures/onebox/hackernews_story.response b/spec/fixtures/onebox/hackernews_story.response new file mode 100644 index 0000000000..2896cdeece --- /dev/null +++ b/spec/fixtures/onebox/hackernews_story.response @@ -0,0 +1 @@ +{"by":"sosuke","descendants":270,"id":5172905,"kids":[5173142,5173462,5173017,5173011,5173162,5173096,5173389,5173293,5173674,5173185,5173184,5173102,5176942,5173013,5173470,5173134,5174761,5173633,5173075,5173367,5173441,5172994,5172963,5173100,5173129,5173922,5173532,5175377,5173063,5173118,5174902,5173062,5173188,5173217,5174393,5173283,5173595,5175282,5174673,5173220,5173987,5174254,5174114,5173433,5172970,5174863,5173152,5173268,5174226,5173925,5174224,5173045,5174240,5173307,5174395,5175680,5174795,5174098,5175464,5175574,5173095,5179521,5173072,5173511,5175643,5176315,5173012,5173054,5173512,5175604,5173042,5173608,5172961,5177654,5178409,5174238,5173099,5174201,5173081,5175087,5174260,5173820,5174730],"score":727,"time":1360094559,"title":"Civilized Discourse Construction Kit","type":"story","url":"http://www.codinghorror.com/blog/2013/02/civilized-discourse-construction-kit.html"} \ No newline at end of file diff --git a/spec/lib/onebox/engine/hackernews_spec.rb b/spec/lib/onebox/engine/hackernews_spec.rb new file mode 100644 index 0000000000..539019b9d0 --- /dev/null +++ b/spec/lib/onebox/engine/hackernews_spec.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe Onebox::Engine::HackernewsOnebox do + context "When oneboxing a comment" do + let(:link) { "https://news.ycombinator.com/item?id=30181167" } + let(:api_link) { "https://hacker-news.firebaseio.com/v0/item/30181167.json" } + let(:html) { described_class.new(link).to_html } + + before do + stub_request(:get, api_link).to_return(status: 200, body: onebox_response("hackernews_comment")) + end + + it "has the comments first words" do + expect(html).to include("Completely, forums are about basic human expression in paragraph form.") + end + + it "has author username" do + expect(html).to include("codinghorror") + end + + it "has the permalink to the comic" do + expect(html).to include(link) + end + + it "has the item date" do + expect(html).to include("2013") + end + end + + context "When oneboxing a story" do + let(:link) { "https://news.ycombinator.com/item?id=5172905" } + let(:api_link) { "https://hacker-news.firebaseio.com/v0/item/5172905.json" } + let(:html) { described_class.new(link).to_html } + + before do + stub_request(:get, api_link).to_return(status: 200, body: onebox_response("hackernews_story")) + end + + it "has story title" do + expect(html).to include("Civilized Discourse Construction Kit") + end + + it "has author username" do + expect(html).to include("sosuke") + end + + it "has the permalink to the comic" do + expect(html).to include(link) + end + + it "has the item date" do + expect(html).to include("2013") + end + end +end From c985f821746a031a537329bec49c384c52d3fb26 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 3 Feb 2022 16:54:48 +0000 Subject: [PATCH 074/194] Revert "PERF: Update ember-auto-import (#15695)" (#15805) This reverts commit 76022132f77e669ce1d00c1a1dbe811c951464d5. This update introduced 'chunking' of vendored dependencies, which we don't support in the rails app. --- app/assets/javascripts/admin/package.json | 5 +- .../javascripts/discourse-common/package.json | 13 +- .../javascripts/discourse-hbr/package.json | 5 +- .../discourse-widget-hbs/package.json | 5 +- app/assets/javascripts/discourse/package.json | 9 +- .../javascripts/pretty-text/package.json | 5 +- .../javascripts/select-kit/package.json | 3 +- .../javascripts/truth-helpers/package.json | 5 +- app/assets/javascripts/yarn.lock | 1785 +---------------- 9 files changed, 117 insertions(+), 1718 deletions(-) diff --git a/app/assets/javascripts/admin/package.json b/app/assets/javascripts/admin/package.json index bd0e0da1a7..8608b42a45 100644 --- a/app/assets/javascripts/admin/package.json +++ b/app/assets/javascripts/admin/package.json @@ -15,11 +15,10 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", "ember-cli-htmlbars": "^4.2.0", - "xss": "^1.0.8", - "webpack": "^5.67.0" + "xss": "^1.0.8" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse-common/package.json b/app/assets/javascripts/discourse-common/package.json index 68f1a4c629..9f39f2e1ad 100644 --- a/app/assets/javascripts/discourse-common/package.json +++ b/app/assets/javascripts/discourse-common/package.json @@ -15,18 +15,17 @@ "start": "ember serve" }, "dependencies": { + "ember-cli-babel": "^7.13.0", + "ember-cli-htmlbars": "^4.2.0", + "ember-auto-import": "^1.5.3", + "handlebars": "^4.7.0", + "truth-helpers": "^1.0.0", "@uppy/aws-s3": "^2.0.4", "@uppy/aws-s3-multipart": "^2.1.0", "@uppy/core": "^2.1.0", "@uppy/drop-target": "^1.1.0", "@uppy/utils": "^4.0.3", - "@uppy/xhr-upload": "^2.0.4", - "ember-auto-import": "^2.2.4", - "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "handlebars": "^4.7.0", - "truth-helpers": "^1.0.0", - "webpack": "^5.67.0" + "@uppy/xhr-upload": "^2.0.4" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse-hbr/package.json b/app/assets/javascripts/discourse-hbr/package.json index c93fc5c69f..0b290a071f 100644 --- a/app/assets/javascripts/discourse-hbr/package.json +++ b/app/assets/javascripts/discourse-hbr/package.json @@ -15,10 +15,9 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "webpack": "^5.67.0" + "ember-cli-htmlbars": "^4.2.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse-widget-hbs/package.json b/app/assets/javascripts/discourse-widget-hbs/package.json index 9efdb12804..06a8626fd8 100644 --- a/app/assets/javascripts/discourse-widget-hbs/package.json +++ b/app/assets/javascripts/discourse-widget-hbs/package.json @@ -15,10 +15,9 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "webpack": "^5.67.0" + "ember-cli-htmlbars": "^4.2.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse/package.json b/app/assets/javascripts/discourse/package.json index e743a6586f..056a33e088 100644 --- a/app/assets/javascripts/discourse/package.json +++ b/app/assets/javascripts/discourse/package.json @@ -34,7 +34,7 @@ "discourse-common": "^1.0.0", "discourse-hbr": "^1.0.0", "discourse-widget-hbs": "^1.0.0", - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.12.0", "ember-buffered-proxy": "^2.0.0-beta.0", "ember-cli": "~3.25.3", "ember-cli-app-version": "^4.0.0", @@ -44,7 +44,7 @@ "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-sri": "^2.1.1", "ember-cli-terser": "^4.0.1", - "ember-exam": "^7.0.1", + "ember-exam": "6.1.0", "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.1", "ember-maybe-import-regenerator": "^0.1.6", @@ -66,8 +66,7 @@ "sass": "^1.32.8", "select-kit": "^1.0.0", "sinon": "^9.2.0", - "virtual-dom": "^2.1.1", - "webpack": "^5.67.0" + "virtual-dom": "^2.1.1" }, "engines": { "node": "12.* || 14.* || >= 16", @@ -83,6 +82,6 @@ ] }, "devDependencies": { - "ember-exam": "^7.0.1" + "ember-exam": "6.1.0" } } diff --git a/app/assets/javascripts/pretty-text/package.json b/app/assets/javascripts/pretty-text/package.json index 59c35d79fa..9619aa7198 100644 --- a/app/assets/javascripts/pretty-text/package.json +++ b/app/assets/javascripts/pretty-text/package.json @@ -15,11 +15,10 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", "ember-cli-htmlbars": "^4.2.0", - "xss": "^1.0.8", - "webpack": "^5.67.0" + "xss": "^1.0.8" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/select-kit/package.json b/app/assets/javascripts/select-kit/package.json index d7b1f548de..eb95c12d0b 100644 --- a/app/assets/javascripts/select-kit/package.json +++ b/app/assets/javascripts/select-kit/package.json @@ -17,8 +17,7 @@ "dependencies": { "ember-cli-babel": "^7.13.0", "ember-cli-htmlbars": "^4.2.0", - "ember-auto-import": "^2.2.4", - "webpack": "^5.67.0" + "ember-auto-import": "^1.5.3" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/truth-helpers/package.json b/app/assets/javascripts/truth-helpers/package.json index 20ea6f12a0..132705b564 100644 --- a/app/assets/javascripts/truth-helpers/package.json +++ b/app/assets/javascripts/truth-helpers/package.json @@ -15,10 +15,9 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "webpack": "^5.67.0" + "ember-cli-htmlbars": "^4.2.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/yarn.lock b/app/assets/javascripts/yarn.lock index 7c1f0500cb..80a80588c2 100644 --- a/app/assets/javascripts/yarn.lock +++ b/app/assets/javascripts/yarn.lock @@ -16,23 +16,11 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== -"@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" - integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== - "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.14.3", "@babel/core@^7.3.4": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" @@ -54,27 +42,6 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/core@^7.16.7": - version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" - integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.16.7" - "@babel/parser" "^7.16.12" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.10" - "@babel/types" "^7.16.8" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - "@babel/generator@^7.14.2", "@babel/generator@^7.14.3": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" @@ -84,15 +51,6 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" - integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== - dependencies: - "@babel/types" "^7.16.8" - jsesc "^2.5.1" - source-map "^0.5.0" - "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -100,13 +58,6 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" @@ -115,14 +66,6 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" @@ -133,16 +76,6 @@ browserslist "^4.14.5" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - "@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.13.11", "@babel/helper-create-class-features-plugin@^7.5.5": version "7.13.11" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" @@ -154,19 +87,6 @@ "@babel/helper-replace-supers" "^7.13.0" "@babel/helper-split-export-declaration" "^7.12.13" -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" - integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-create-regexp-features-plugin@^7.12.13": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" @@ -175,14 +95,6 @@ "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" - integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^4.7.1" - "@babel/helper-define-polyfill-provider@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" @@ -197,27 +109,6 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-explode-assignable-expression@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" @@ -225,13 +116,6 @@ dependencies: "@babel/types" "^7.13.0" -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" @@ -241,15 +125,6 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.14.2" -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -257,13 +132,6 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-hoist-variables@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" @@ -272,13 +140,6 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" @@ -286,13 +147,6 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-member-expression-to-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" - integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" @@ -300,13 +154,6 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" @@ -321,20 +168,6 @@ "@babel/traverse" "^7.14.2" "@babel/types" "^7.14.2" -"@babel/helper-module-transforms@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" - integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -342,23 +175,11 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== -"@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - "@babel/helper-remap-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" @@ -368,15 +189,6 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" - "@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" @@ -387,17 +199,6 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.12" -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" @@ -405,13 +206,6 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -419,13 +213,6 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - "@babel/helper-split-export-declaration@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" @@ -433,33 +220,16 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - "@babel/helper-wrap-function@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" @@ -470,16 +240,6 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - "@babel/helpers@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" @@ -489,15 +249,6 @@ "@babel/traverse" "^7.14.0" "@babel/types" "^7.14.0" -"@babel/helpers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" - integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" @@ -507,32 +258,11 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== -"@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7": - version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" - integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" @@ -542,15 +272,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-proposal-optional-chaining" "^7.13.12" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions@^7.13.15": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" @@ -560,15 +281,6 @@ "@babel/helper-remap-async-to-generator" "^7.13.0" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-async-generator-functions@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" - integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" @@ -577,23 +289,6 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-class-properties@^7.16.5", "@babel/plugin-proposal-class-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" - integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" - integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-proposal-decorators@^7.13.5": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz#e91ccfef2dc24dd5bd5dcc9fc9e2557c684ecfb8" @@ -603,15 +298,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-decorators" "^7.12.13" -"@babel/plugin-proposal-decorators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz#922907d2e3e327f5b07d2246bcfc0bd438f360d2" - integrity sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-decorators" "^7.16.7" - "@babel/plugin-proposal-dynamic-import@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" @@ -620,14 +306,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" @@ -636,14 +314,6 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-proposal-json-strings@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" @@ -652,14 +322,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-proposal-logical-assignment-operators@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" @@ -668,14 +330,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" @@ -684,14 +338,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" - integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" @@ -700,14 +346,6 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" @@ -719,17 +357,6 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.13.0" -"@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" - integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" @@ -738,14 +365,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" @@ -755,15 +374,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" - integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-proposal-private-methods@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" @@ -772,24 +382,6 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-private-methods@^7.16.11", "@babel/plugin-proposal-private-methods@^7.16.5": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" - integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.10" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-private-property-in-object@^7.16.5", "@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" @@ -798,14 +390,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-proposal-unicode-property-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" - integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -820,13 +404,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-decorators@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" @@ -834,13 +411,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-decorators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" - integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -904,13 +474,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-top-level-await@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -918,13 +481,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript@^7.12.13", "@babel/plugin-syntax-typescript@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" @@ -939,13 +495,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-arrow-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" - integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" @@ -955,15 +504,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-remap-async-to-generator" "^7.13.0" -"@babel/plugin-transform-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" - integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" @@ -971,13 +511,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-block-scoping@^7.12.13", "@babel/plugin-transform-block-scoping@^7.6.2": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" @@ -985,13 +518,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" - integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-classes@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" @@ -1005,20 +531,6 @@ "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" - integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - globals "^11.1.0" - "@babel/plugin-transform-computed-properties@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" @@ -1026,13 +538,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-computed-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" - integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-destructuring@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" @@ -1040,13 +545,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" - integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" @@ -1055,14 +553,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-dotall-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-duplicate-keys@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" @@ -1070,13 +560,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-duplicate-keys@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" @@ -1085,14 +568,6 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-for-of@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" @@ -1100,13 +575,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-for-of@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" - integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-function-name@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" @@ -1115,15 +583,6 @@ "@babel/helper-function-name" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== - dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-literals@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" @@ -1131,13 +590,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" - integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-member-expression-literals@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" @@ -1145,13 +597,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" @@ -1161,15 +606,6 @@ "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-amd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-commonjs@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" @@ -1180,16 +616,6 @@ "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" - integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-systemjs@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" @@ -1201,17 +627,6 @@ "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" - integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== - dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-umd@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" @@ -1220,14 +635,6 @@ "@babel/helper-module-transforms" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-modules-umd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" @@ -1235,13 +642,6 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.12.13" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/plugin-transform-new-target@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" @@ -1249,13 +649,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-new-target@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-object-assign@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz#d9b9200a69e03403a813e44a933ad9f4bddfd050" @@ -1271,14 +664,6 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/plugin-transform-parameters@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" @@ -1286,13 +671,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-parameters@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" - integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-property-literals@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" @@ -1300,13 +678,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-regenerator@^7.13.15": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" @@ -1314,13 +685,6 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" - integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== - dependencies: - regenerator-transform "^0.14.2" - "@babel/plugin-transform-reserved-words@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" @@ -1328,13 +692,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-reserved-words@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.13.9": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz#2eddf585dd066b84102517e10a577f24f76a9cd7" @@ -1354,13 +711,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-spread@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" @@ -1369,14 +719,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" -"@babel/plugin-transform-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" - integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-transform-sticky-regex@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" @@ -1384,13 +726,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-template-literals@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" @@ -1398,13 +733,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-template-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" - integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-typeof-symbol@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" @@ -1412,13 +740,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-typeof-symbol@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-typescript@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" @@ -1452,13 +773,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-unicode-regex@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" @@ -1467,14 +781,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/polyfill@^7.11.5": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" @@ -1558,86 +864,6 @@ core-js-compat "^3.9.0" semver "^6.3.0" -"@babel/preset-env@^7.16.5", "@babel/preset-env@^7.16.7": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== - dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" - semver "^6.3.0" - "@babel/preset-modules@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" @@ -1649,17 +875,6 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - "@babel/runtime@7.12.18": version "7.12.18" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" @@ -1683,15 +898,6 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" @@ -1706,22 +912,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" - integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.16.10" - "@babel/types" "^7.16.8" - debug "^4.1.0" - globals "^11.1.0" - "@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" @@ -1730,14 +920,6 @@ "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" -"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" - integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1836,6 +1018,45 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" +"@embroider/core@0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.36.0.tgz#fbbd60d29c3fcbe02b4e3e63e6043a43de2b9ce3" + integrity sha512-J6esENP+aNt+/r070cF1RCJyCi/Rn1I6uFp37vxyLWwvGDuT0E7wGcaPU29VBkBFqxi4Z1n4F796BaGHv+kX6w== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.12.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.12.1" + "@babel/runtime" "^7.12.5" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/macros" "0.36.0" + assert-never "^1.1.0" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-node-api "^1.7.0" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.1" + broccoli-source "^3.0.0" + debug "^3.1.0" + escape-string-regexp "^4.0.0" + fast-sourcemap-concat "^1.4.0" + filesize "^4.1.2" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.4.2" + js-string-escape "^1.0.1" + jsdom "^16.4.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + pkg-up "^3.1.0" + resolve "^1.8.1" + resolve-package-path "^1.2.2" + semver "^7.3.2" + strip-bom "^3.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^1.1.3" + wrap-legacy-hbs-plugin-if-needed "^1.0.1" + "@embroider/macros@0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" @@ -1851,59 +1072,21 @@ resolve "^1.8.1" semver "^7.3.2" -"@embroider/macros@^0.47.0": - version "0.47.2" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.47.2.tgz#23cbe92cac3c24747f054e1eea2a22538bf7ebd0" - integrity sha512-ViNWluJCeM5OPlM3rs8kdOz3RV5rpfXX5D2rDnc/q86xRS0xf4NFEjYRV7W6fBcD0b3v5jSHDTwrjq9Kee4rHg== +"@embroider/macros@0.36.0", "@embroider/macros@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.36.0.tgz#5330f1e6f12112f0f68e34b3e4855dc7dd3c69a5" + integrity sha512-w37G4uXG+Wi3K3EHSFBSr/n6kGFXYG8nzZ9ptzDOC7LP3Oh5/MskBnVZW3+JkHXUPEqKsDGlxPxCVpPl1kQyjQ== dependencies: - "@embroider/shared-internals" "0.47.2" - assert-never "^1.2.1" - ember-cli-babel "^7.26.6" - find-up "^5.0.0" - lodash "^4.17.21" - resolve "^1.20.0" + "@babel/core" "^7.12.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/core" "0.36.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" semver "^7.3.2" -"@embroider/macros@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-1.0.0.tgz#2dfab550ba4e03cbf6e3524759949749ced98cc2" - integrity sha512-RutDJ27j1eFQulyv83yJm27oSypsMd/UZyy62Q0NU00TIsIgQPCXaDiGIONWcJuAAVbtBRP3X4LMvaBAeq5g+A== - dependencies: - "@embroider/shared-internals" "1.0.0" - assert-never "^1.2.1" - babel-import-util "^1.1.0" - ember-cli-babel "^7.26.6" - find-up "^5.0.0" - lodash "^4.17.21" - resolve "^1.20.0" - semver "^7.3.2" - -"@embroider/shared-internals@0.47.2": - version "0.47.2" - resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.47.2.tgz#24e9fa0dd9c529d5c996ee1325729ea08d1fa19f" - integrity sha512-SxdZYjAE0fiM5zGDz+12euWIsQZ1tsfR1k+NKmiWMyLhA5T3pNgbR2/Djvx/cVIxOtEavGGSllYbzRKBtV4xMg== - dependencies: - babel-import-util "^0.2.0" - ember-rfc176-data "^0.3.17" - fs-extra "^9.1.0" - lodash "^4.17.21" - resolve-package-path "^4.0.1" - semver "^7.3.5" - typescript-memoize "^1.0.1" - -"@embroider/shared-internals@1.0.0", "@embroider/shared-internals@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-1.0.0.tgz#b081708ac79e4582f17ba0f3e3796e6612a8976c" - integrity sha512-Vx3dmejJxI5MG/qC7or3EUZY0AZBSBNOAR50PYotX3LxUSb4lAm5wISPnFbwEY4bbo2VhL/6XtWjMv8ZMcaP+g== - dependencies: - babel-import-util "^1.1.0" - ember-rfc176-data "^0.3.17" - fs-extra "^9.1.0" - lodash "^4.17.21" - resolve-package-path "^4.0.1" - semver "^7.3.5" - typescript-memoize "^1.0.1" - "@eslint/eslintrc@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" @@ -2171,27 +1354,6 @@ dependencies: "@types/node" "*" -"@types/eslint-scope@^3.7.0": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" - integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.50": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - "@types/express-serve-static-core@^4.17.18": version "4.17.19" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" @@ -2233,11 +1395,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - "@types/json-schema@^7.0.5": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" @@ -2253,11 +1410,6 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== -"@types/minimatch@^3.0.4": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - "@types/node@*": version "14.14.37" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" @@ -2362,14 +1514,6 @@ "@uppy/utils" "^4.0.3" nanoid "^3.1.25" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -2379,31 +1523,16 @@ "@webassemblyjs/helper-wasm-bytecode" "1.9.0" "@webassemblyjs/wast-parser" "1.9.0" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - "@webassemblyjs/floating-point-hex-parser@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - "@webassemblyjs/helper-api-error@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - "@webassemblyjs/helper-buffer@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" @@ -2428,35 +1557,11 @@ dependencies: "@webassemblyjs/ast" "1.9.0" -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - "@webassemblyjs/helper-wasm-bytecode@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/helper-wasm-section@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" @@ -2467,13 +1572,6 @@ "@webassemblyjs/helper-wasm-bytecode" "1.9.0" "@webassemblyjs/wasm-gen" "1.9.0" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - "@webassemblyjs/ieee754@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" @@ -2481,13 +1579,6 @@ dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - "@webassemblyjs/leb128@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" @@ -2495,30 +1586,11 @@ dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - "@webassemblyjs/utf8@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - "@webassemblyjs/wasm-edit@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" @@ -2533,17 +1605,6 @@ "@webassemblyjs/wasm-parser" "1.9.0" "@webassemblyjs/wast-printer" "1.9.0" -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - "@webassemblyjs/wasm-gen@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" @@ -2555,16 +1616,6 @@ "@webassemblyjs/leb128" "1.9.0" "@webassemblyjs/utf8" "1.9.0" -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wasm-opt@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" @@ -2575,18 +1626,6 @@ "@webassemblyjs/wasm-gen" "1.9.0" "@webassemblyjs/wasm-parser" "1.9.0" -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - "@webassemblyjs/wasm-parser@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" @@ -2611,14 +1650,6 @@ "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - "@webassemblyjs/wast-printer@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" @@ -2664,11 +1695,6 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" @@ -2694,11 +1720,6 @@ acorn@^8.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.1.tgz#fb0026885b9ac9f48bac1e185e4af472971149ff" integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g== -acorn@^8.4.1: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - acorn@^8.5.0: version "8.6.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" @@ -2721,26 +1742,12 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2750,16 +1757,6 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" - integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ajv@^8.0.1: version "8.5.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" @@ -2992,7 +1989,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-never@^1.1.0, assert-never@^1.2.1: +assert-never@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== @@ -3284,16 +2281,6 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-import-util@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-0.2.0.tgz#b468bb679919601a3570f9e317536c54f2862e23" - integrity sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag== - -babel-import-util@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-1.1.0.tgz#4156b16ef090c4f0d3cdb869ff799202f24aeb93" - integrity sha512-sfzgAiJsUT1es9yrHAuJZuJfBkkOE7Og6rovAIwK/gNJX6MjDfWTprbPngdJZTd5ye4F3FvpvpQmvKXObRzVYA== - babel-loader@^8.0.6: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -3384,17 +2371,6 @@ babel-plugin-htmlbars-inline-precompile@^5.0.0: parse-static-imports "^1.1.0" string.prototype.matchall "^4.0.4" -babel-plugin-htmlbars-inline-precompile@^5.2.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-5.3.1.tgz#5ba272e2e4b6221522401f5f1d98a73b1de38787" - integrity sha512-QWjjFgSKtSRIcsBhJmEwS2laIdrA6na8HAlc/pEAhjHgQsah/gMiBFRZvbQTy//hWxR4BMwV7/Mya7q5H8uHeA== - dependencies: - babel-plugin-ember-modules-api-polyfill "^3.5.0" - line-column "^1.0.2" - magic-string "^0.25.7" - parse-static-imports "^1.1.0" - string.prototype.matchall "^4.0.5" - babel-plugin-module-resolver@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" @@ -3426,15 +2402,6 @@ babel-plugin-polyfill-corejs2@^0.2.0: "@babel/helper-define-polyfill-provider" "^0.2.0" semver "^6.1.1" -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" - semver "^6.1.1" - babel-plugin-polyfill-corejs3@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" @@ -3443,14 +2410,6 @@ babel-plugin-polyfill-corejs3@^0.2.0: "@babel/helper-define-polyfill-provider" "^0.2.0" core-js-compat "^3.9.1" -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" - integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.20.0" - babel-plugin-polyfill-regenerator@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" @@ -3458,13 +2417,6 @@ babel-plugin-polyfill-regenerator@^0.2.0: dependencies: "@babel/helper-define-polyfill-provider" "^0.2.0" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -4268,19 +3220,6 @@ broccoli-funnel@^3.0.3: path-posix "^1.0.0" walk-sync "^2.0.2" -broccoli-funnel@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.8.tgz#f5b62e2763c3918026a15a3c833edc889971279b" - integrity sha512-ng4eIhPYiXqMw6SyGoxPHR3YAwEd2lr9FgBI1CyTbspl4txZovOsmzFkMkGAlu88xyvYXJqHiM2crfLa65T1BQ== - dependencies: - array-equal "^1.0.0" - broccoli-plugin "^4.0.7" - debug "^4.1.1" - fs-tree-diff "^2.0.1" - heimdalljs "^0.2.0" - minimatch "^3.0.0" - walk-sync "^2.0.2" - broccoli-kitchen-sink-helpers@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" @@ -4501,19 +3440,6 @@ broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli rimraf "^3.0.2" symlink-or-copy "^1.3.1" -broccoli-plugin@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" - integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== - dependencies: - broccoli-node-api "^1.7.0" - broccoli-output-wrapper "^3.2.5" - fs-merger "^3.2.1" - promise-map-series "^0.3.0" - quick-temp "^0.1.8" - rimraf "^3.0.2" - symlink-or-copy "^1.3.1" - broccoli-slow-trees@^3.0.1, broccoli-slow-trees@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.1.0.tgz#8e48903f59e061bf1213963733b9e61dec2ee5d7" @@ -4727,17 +3653,6 @@ browserslist@^4.14.5, browserslist@^4.16.3: escalade "^3.1.1" node-releases "^1.1.71" -browserslist@^4.17.5, browserslist@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== - dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -4880,11 +3795,6 @@ caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001208: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz#066a506046ba4be34cde5f74a08db7a396718fb7" integrity sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA== -caniuse-lite@^1.0.30001286: - version "1.0.30001301" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz#ebc9086026534cab0dab99425d9c3b4425e5f450" - integrity sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA== - capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -4946,14 +3856,6 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -5405,14 +4307,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.20.0, core-js-compat@^3.20.2: - version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" - integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== - dependencies: - browserslist "^4.19.1" - semver "7.0.0" - core-js-compat@^3.9.0, core-js-compat@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.10.1.tgz#62183a3a77ceeffcc420d907a3e6fc67d9b27f1c" @@ -5518,27 +4412,6 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-loader@^5.2.0: - version "5.2.7" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" - integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== - dependencies: - icss-utils "^5.1.0" - loader-utils "^2.0.0" - postcss "^8.2.15" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^3.0.0" - semver "^7.3.5" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - cssfilter@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" @@ -5622,13 +4495,6 @@ debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: dependencies: ms "^2.1.1" -debug@^4.3.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -5896,11 +4762,6 @@ electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.712: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.712.tgz#ae467ffe5f95961c6d41ceefe858fc36eb53b38f" integrity sha512-3kRVibBeCM4vsgoHHGKHmPocLqtFAGTrebXxxtgKs87hNUzXrX2NuS3jnBys7IozCnw7viQlozxKkmty2KNfrw== -electron-to-chromium@^1.4.17: - version "1.4.51" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.51.tgz#a432f5a5d983ace79278a33057300cf949627e63" - integrity sha512-JNEmcYl3mk1tGQmy0EvL5eik/CKSBuzAyGP0QFdG6LIgxQe3II0BL1m2zKc2MZMf3uGqHWE1TFddJML0RpjSHQ== - elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -5914,7 +4775,7 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -ember-auto-import@^1.10.1: +ember-auto-import@^1.10.1, ember-auto-import@^1.5.3: version "1.11.2" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.2.tgz#b6e9a0dddd88a10692830ffa4f5dfd8c137c8919" integrity sha512-Sm0x9qgAQEx+XSYeh5zeKj89Uo0c7XzULZxuziFPxbhtKy/G4pywhBuQ7EgDznTj8IZVxOdfe4ufcUxnJtbSgg== @@ -5949,41 +4810,40 @@ ember-auto-import@^1.10.1: walk-sync "^0.3.3" webpack "^4.43.0" -ember-auto-import@^2.2.3, ember-auto-import@^2.2.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.4.0.tgz#91c4797f08315728086e35af954cb60bd23c14bc" - integrity sha512-BwF6iTaoSmT2vJ9NEHEGRBCh2+qp+Nlaz/Q7roqNSxl5oL5iMRwenPnHhOoBPTYZvPhcV/KgXR5e+pBQ107plQ== +ember-auto-import@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.12.0.tgz#52246b04891090e2608244e65c4c6af7710df12b" + integrity sha512-fzMGnyHGfUNFHchpLbJ98Vs/c5H2wZBMR9r/XwW+WOWPisZDGLUPPyhJQsSREPoUQ+o8GvyLaD/rkrKqW8bmgw== dependencies: - "@babel/core" "^7.16.7" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-decorators" "^7.16.7" - "@babel/preset-env" "^7.16.7" - "@embroider/macros" "^1.0.0" - "@embroider/shared-internals" "^1.0.0" + "@babel/core" "^7.1.6" + "@babel/preset-env" "^7.10.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.1.6" + "@embroider/core" "^0.33.0" + babel-core "^6.26.3" babel-loader "^8.0.6" - babel-plugin-ember-modules-api-polyfill "^3.5.0" - babel-plugin-htmlbars-inline-precompile "^5.2.1" babel-plugin-syntax-dynamic-import "^6.18.0" + babylon "^6.18.0" broccoli-debug "^0.6.4" - broccoli-funnel "^3.0.8" - broccoli-merge-trees "^4.2.0" + broccoli-node-api "^1.7.0" broccoli-plugin "^4.0.0" broccoli-source "^3.0.0" - css-loader "^5.2.0" - debug "^4.3.1" + debug "^3.1.0" + ember-cli-babel "^7.0.0" + enhanced-resolve "^4.0.0" fs-extra "^6.0.1" fs-tree-diff "^2.0.0" handlebars "^4.3.1" js-string-escape "^1.0.1" lodash "^4.17.19" - mini-css-extract-plugin "^2.5.2" - parse5 "^6.0.1" - resolve "^1.20.0" + mkdirp "^0.5.1" resolve-package-path "^3.1.0" + rimraf "^2.6.2" semver "^7.3.4" - style-loader "^2.0.0" + symlink-or-copy "^1.2.0" typescript-memoize "^1.0.0-alpha.3" - walk-sync "^3.0.0" + walk-sync "^0.3.3" + webpack "^4.43.0" ember-buffered-proxy@^2.0.0-beta.0: version "2.0.0-beta.0" @@ -6059,42 +4919,6 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember- rimraf "^3.0.1" semver "^5.5.0" -ember-cli-babel@^7.26.6: - version "7.26.11" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.11.tgz#50da0fe4dcd99aada499843940fec75076249a9f" - integrity sha512-JJYeYjiz/JTn34q7F5DSOjkkZqy8qwFOOxXfE6pe9yEJqWGu4qErKxlz8I22JoVEQ/aBUO+OcKTpmctvykM9YA== - dependencies: - "@babel/core" "^7.12.0" - "@babel/helper-compilation-targets" "^7.12.0" - "@babel/plugin-proposal-class-properties" "^7.16.5" - "@babel/plugin-proposal-decorators" "^7.13.5" - "@babel/plugin-proposal-private-methods" "^7.16.5" - "@babel/plugin-proposal-private-property-in-object" "^7.16.5" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-runtime" "^7.13.9" - "@babel/plugin-transform-typescript" "^7.13.0" - "@babel/polyfill" "^7.11.5" - "@babel/preset-env" "^7.16.5" - "@babel/runtime" "7.12.18" - amd-name-resolver "^1.3.1" - babel-plugin-debug-macros "^0.3.4" - babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.5.0" - babel-plugin-module-resolver "^3.2.0" - broccoli-babel-transpiler "^7.8.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.2" - broccoli-source "^2.1.2" - calculate-cache-key-for-tree "^2.0.0" - clone "^2.1.2" - ember-cli-babel-plugin-helpers "^1.1.1" - ember-cli-version-checker "^4.1.0" - ensure-posix-path "^1.0.2" - fixturify-project "^1.10.0" - resolve-package-path "^3.1.0" - rimraf "^3.0.1" - semver "^5.5.0" - ember-cli-dependency-checker@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.2.0.tgz#9202ad9e14d6fda33cffc22a11c343c2a8885330" @@ -6460,20 +5284,20 @@ ember-disable-prototype-extensions@^1.1.3: resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= -ember-exam@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ember-exam/-/ember-exam-7.0.1.tgz#3735a0e3599e37f8cf5c758f4c7069da3c369a2d" - integrity sha512-m3EskoFrJ1KThlzdS0pjXImXQWgPWqqOJjAnCpz/XmUHUA+EVmvsu/A0F0jRpqXeQpTSFXRl8/TPVduN6+t17A== +ember-exam@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ember-exam/-/ember-exam-6.1.0.tgz#1ea2c0ece27ac8ad6a80d959b1c207611b7dfdd7" + integrity sha512-H9tg7eUgqkjAsr1/15UzxGyZobGLgsyTi56Ng0ySnkYGCRfvVpwtVc3xgcNOFnUaa9RExUFpxC0adjW3K87Uxw== dependencies: - "@embroider/macros" "^0.47.0" - chalk "^4.1.1" + "@embroider/macros" "^0.36.0" + chalk "^4.1.0" cli-table3 "^0.6.0" debug "^4.2.0" - ember-auto-import "^2.2.3" + ember-auto-import "^1.10.1" ember-cli-babel "^7.21.0" ember-cli-version-checker "^5.1.2" execa "^4.0.3" - fs-extra "^10.0.0" + fs-extra "^9.0.1" js-yaml "^3.14.0" npmlog "^4.1.2" rimraf "^3.0.2" @@ -6735,14 +5559,6 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - enquirer@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -6815,37 +5631,6 @@ es-abstract@^1.18.0-next.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.0" -es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -6916,14 +5701,6 @@ eslint-plugin-node@^10.0.0: resolve "^1.10.1" semver "^6.1.0" -eslint-scope@5.1.1, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -6932,6 +5709,14 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-utils@^1.3.1, eslint-utils@^1.4.2: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" @@ -7127,7 +5912,7 @@ events-to-array@^1.0.1: resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= -events@^3.0.0, events@^3.2.0: +events@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -7737,15 +6522,6 @@ fs-extra@^0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -7813,17 +6589,6 @@ fs-merger@^3.0.1, fs-merger@^3.1.0: rimraf "^2.6.3" walk-sync "^2.0.2" -fs-merger@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" - integrity sha512-AN6sX12liy0JE7C2evclwoo0aCG3PFulLjrTLsJpWh/2mM+DinhpSGqYLbHBBbIW1PLRNcFhJG8Axtz8mQW3ug== - dependencies: - broccoli-node-api "^1.7.0" - broccoli-node-info "^2.1.0" - fs-extra "^8.0.1" - fs-tree-diff "^2.0.1" - walk-sync "^2.2.0" - fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" @@ -7951,14 +6716,6 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -8046,11 +6803,6 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -8218,11 +6970,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== -graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - graceful-fs@~1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" @@ -8321,13 +7068,6 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -8587,11 +7327,6 @@ iconv-lite@0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -8806,11 +7541,6 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== -is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" @@ -8818,13 +7548,6 @@ is-core-module@^2.2.0: dependencies: has "^1.0.3" -is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" - is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -8997,24 +7720,11 @@ is-regex@^1.1.2: call-bind "^1.0.2" has-symbols "^1.0.1" -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== - is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -9030,13 +7740,6 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== -is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -9056,13 +7759,6 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-weakref@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -9148,15 +7844,6 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -jest-worker@^27.4.1: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" - integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jquery@^3.4.1: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" @@ -9486,11 +8173,6 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" @@ -9500,15 +8182,6 @@ loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - loader.js@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.7.0.tgz#a1a52902001c83631efde9688b8ab3799325ef1f" @@ -9727,7 +8400,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.6.1, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.6.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -10022,11 +8695,6 @@ mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - mime-match@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8" @@ -10041,13 +8709,6 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.26, mime-types@~2.1.19, dependencies: mime-db "1.47.0" -mime-types@^2.1.27: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -10075,13 +8736,6 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" -mini-css-extract-plugin@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz#b3b9b98320c2c054d92c16f6a94ddfdbbba13755" - integrity sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA== - dependencies: - schema-utils "^4.0.0" - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -10239,11 +8893,6 @@ nanoid@^3.1.25: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== -nanoid@^3.1.30: - version "3.2.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" - integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -10271,7 +8920,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -10368,11 +9017,6 @@ node-releases@^1.1.71: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - node-watch@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.1.tgz#0caaa6a6833b0d533487f953c52a6c787769ba7c" @@ -10487,11 +9131,6 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.11.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" @@ -10770,7 +9409,7 @@ parse-static-imports@^1.1.0: resolved "https://registry.yarnpkg.com/parse-static-imports/-/parse-static-imports-1.1.0.tgz#ae2f18f18da1a993080ae406a5219455c0bbad5d" integrity sha512-HlxrZcISCblEV0lzXmAHheH/8qEkKgmqkdxyHTPbSqsTUV8GzqmN1L+SSti+VbNPfbBO3bYLPHDiUs2avbAdbA== -parse5@6.0.1, parse5@^6.0.1: +parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -10840,11 +9479,6 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - path-posix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" @@ -10902,11 +9536,6 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" @@ -10976,56 +9605,6 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.9" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" - integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.2.15: - version "8.4.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" - integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - preact@^10.5.13: version "10.5.14" resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.14.tgz#0b14a2eefba3c10a57116b90d1a65f5f00cd2701" @@ -11629,13 +10208,6 @@ resolve-package-path@^3.1.0: path-root "^0.1.1" resolve "^1.17.0" -resolve-package-path@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-4.0.3.tgz#31dab6897236ea6613c72b83658d88898a9040aa" - integrity sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA== - dependencies: - path-root "^0.1.1" - resolve-path@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" @@ -11657,15 +10229,6 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.1 is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.20.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -11848,25 +10411,6 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -11882,7 +10426,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -11915,13 +10459,6 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - serve-static@1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" @@ -12194,11 +10731,6 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -12225,14 +10757,6 @@ source-map-support@~0.5.12, source-map-support@~0.5.19: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -12451,20 +10975,6 @@ string.prototype.matchall@^4.0.4: regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" -string.prototype.matchall@^4.0.5: - version "4.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" - integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" - side-channel "^1.0.4" - string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" @@ -12558,14 +11068,6 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" - integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - styled_string@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" @@ -12597,18 +11099,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -12677,11 +11167,6 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - temp@0.9.4: version "0.9.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" @@ -12705,17 +11190,6 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser-webpack-plugin@^5.1.3: - version "5.3.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz#21641326486ecf91d8054161c816e464435bae9f" - integrity sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ== - dependencies: - jest-worker "^27.4.1" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.2" - terser@^4.1.2, terser@^4.3.9: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" @@ -12734,15 +11208,6 @@ terser@^5.3.0: source-map "~0.7.2" source-map-support "~0.5.19" -terser@^5.7.2: - version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - testem@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.0.tgz#48ab6b98e96085eeddac1fb46337872b13e9e06c" @@ -13088,11 +11553,6 @@ typescript-memoize@^1.0.0-alpha.3: resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.1.tgz#0a8199aa28f6fe18517f6e9308ef7bfbe9a98d59" integrity sha512-oJNge1qUrOK37d5Y6Ly2txKeuelYVsFtNF6U9kXIN7juudcQaHJQg2MxLOy0CqtkW65rVDYuTCOjnSIVPd8z3w== -typescript-memoize@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.1.0.tgz#4a8f512d06fc995167c703a3592219901db8bc79" - integrity sha512-LQPKVXK8QrBBkL/zclE6YgSWn0I8ew5m0Lf+XL00IwMhlotqRLlzHV+BRrljVQIc+NohUAuQP7mg4HQwrx5Xbg== - uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -13103,7 +11563,7 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== -unbox-primitive@^1.0.0, unbox-primitive@^1.0.1: +unbox-primitive@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== @@ -13428,16 +11888,6 @@ walk-sync@^2.0.0, walk-sync@^2.0.2, walk-sync@^2.2.0: matcher-collection "^2.0.0" minimatch "^3.0.4" -walk-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-3.0.0.tgz#67f882925021e20569a1edd560b8da31da8d171c" - integrity sha512-41TvKmDGVpm2iuH7o+DAOt06yyu/cSHpX3uzAwetzASvlNtVddgIjXIb2DfB/Wa20B1Jo86+1Dv1CraSU7hWdw== - dependencies: - "@types/minimatch" "^3.0.4" - ensure-posix-path "^1.1.0" - matcher-collection "^2.0.1" - minimatch "^3.0.4" - walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -13473,14 +11923,6 @@ watchpack@^1.7.4: chokidar "^3.4.1" watchpack-chokidar2 "^2.0.1" -watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - watchr@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/watchr/-/watchr-1.0.0.tgz#ce023fd59edae9430523031915c1812ff2302c27" @@ -13521,11 +11963,6 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - webpack@^4.43.0: version "4.46.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" @@ -13555,36 +11992,6 @@ webpack@^4.43.0: watchpack "^1.7.4" webpack-sources "^1.4.1" -webpack@^5.67.0: - version "5.67.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.67.0.tgz#cb43ca2aad5f7cc81c4cd36b626e6b819805dbfd" - integrity sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw== - dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.50" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.3" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" - webpack-sources "^3.2.3" - websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" From 569fa8a13552e4a463bddff4aed6211c920207fc Mon Sep 17 00:00:00 2001 From: David Taylor Date: Thu, 3 Feb 2022 17:36:32 +0000 Subject: [PATCH 075/194] DEV: Improve Ember module shims under Ember CLI (#15795) (#15806) In our legacy environment, Ember RFC176 shims are included in `discourse-loader.js` which is part of the `vendor.js` bundle. This meant that the module shims were available as soon as the vendor.js asset was loaded. Under Ember CLI, we were defining these shims in `discourse-boot.js`. This is loaded by the browser much later, and meant that the shims were not available to themes/plugins that call `require()` before Discourse has booted. This was causing errors under some circumstances. This commit refactors the Ember CLI implementation so that the shims are included in the vendor.js bundle. This is done via an addon which leans on the ember-rfc176-data NPM package. This will ensure we have all the definitions, without the need for manual copy/paste. --- .../javascripts/discourse/ember-cli-build.js | 5 + .../discourse/lib/rfc176-shims/.npmrc | 1 + .../discourse/lib/rfc176-shims/index.js | 57 +++++++ .../discourse/lib/rfc176-shims/package.json | 6 + app/assets/javascripts/discourse/package.json | 4 +- .../public/assets/scripts/discourse-boot.js | 160 ------------------ .../public/assets/scripts/module-shims.js | 9 + 7 files changed, 81 insertions(+), 161 deletions(-) create mode 100644 app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc create mode 100644 app/assets/javascripts/discourse/lib/rfc176-shims/index.js create mode 100644 app/assets/javascripts/discourse/lib/rfc176-shims/package.json create mode 100644 app/assets/javascripts/discourse/public/assets/scripts/module-shims.js diff --git a/app/assets/javascripts/discourse/ember-cli-build.js b/app/assets/javascripts/discourse/ember-cli-build.js index 64c4055808..e6a01988ad 100644 --- a/app/assets/javascripts/discourse/ember-cli-build.js +++ b/app/assets/javascripts/discourse/ember-cli-build.js @@ -110,6 +110,11 @@ module.exports = function (defaults) { }); app.import(discourseRoot + "/app/assets/javascripts/polyfills.js"); + app.import( + discourseRoot + + "/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js" + ); + const mergedTree = mergeTrees([ discourseScss(`${discourseRoot}/app/assets/stylesheets`, "testem.scss"), createI18nTree(discourseRoot, vendorJs), diff --git a/app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc b/app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc new file mode 100644 index 0000000000..c42da845b4 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/rfc176-shims/.npmrc @@ -0,0 +1 @@ +engine-strict = true diff --git a/app/assets/javascripts/discourse/lib/rfc176-shims/index.js b/app/assets/javascripts/discourse/lib/rfc176-shims/index.js new file mode 100644 index 0000000000..df26adac62 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/rfc176-shims/index.js @@ -0,0 +1,57 @@ +"use strict"; + +// In core, babel-plugin-ember-modules-api-polyfill takes care of re-writing the new module +// syntax to the legacy Ember globals. For themes and plugins, we need to manually set up +// the modules. +// +// Eventually, Ember RFC176 will be implemented, and we can drop these shims. + +const RFC176Data = require("ember-rfc176-data"); + +module.exports = { + name: require("./package").name, + + isDevelopingAddon() { + return true; + }, + + contentFor: function (type) { + if (type !== "vendor-suffix") { + return; + } + + const modules = {}; + + for (const entry of RFC176Data) { + // Entries look like: + // { + // global: 'Ember.expandProperties', + // module: '@ember/object/computed', + // export: 'expandProperties', + // deprecated: false + // }, + + if (entry.deprecated) { + continue; + } + + let m = modules[entry.module]; + if (!m) { + m = modules[entry.module] = []; + } + + m.push(entry); + } + + let output = ""; + for (const moduleName of Object.keys(modules)) { + const exports = modules[moduleName]; + const rawExports = exports + .map((e) => `${e.export}:${e.global}`) + .join(","); + output += `define("${moduleName}", () => {return {${rawExports}}});\n`; + } + + return output; + }, +}; diff --git a/app/assets/javascripts/discourse/lib/rfc176-shims/package.json b/app/assets/javascripts/discourse/lib/rfc176-shims/package.json new file mode 100644 index 0000000000..60bf829f39 --- /dev/null +++ b/app/assets/javascripts/discourse/lib/rfc176-shims/package.json @@ -0,0 +1,6 @@ +{ + "name": "rfc176-shims", + "keywords": [ + "ember-addon" + ] +} diff --git a/app/assets/javascripts/discourse/package.json b/app/assets/javascripts/discourse/package.json index 056a33e088..7b234f6291 100644 --- a/app/assets/javascripts/discourse/package.json +++ b/app/assets/javascripts/discourse/package.json @@ -49,6 +49,7 @@ "ember-load-initializers": "^2.1.1", "ember-maybe-import-regenerator": "^0.1.6", "ember-qunit": "^5.1.2", + "ember-rfc176-data": "^0.3.17", "ember-source": "~3.15.0", "ember-test-selectors": "^6.0.0", "eslint": "^7.27.0", @@ -78,7 +79,8 @@ }, "ember-addon": { "paths": [ - "lib/bootstrap-json" + "lib/bootstrap-json", + "lib/rfc176-shims" ] }, "devDependencies": { diff --git a/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js b/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js index a1fe1ebd48..1bc1786c8d 100644 --- a/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js +++ b/app/assets/javascripts/discourse/public/assets/scripts/discourse-boot.js @@ -2,157 +2,6 @@ if (window.unsupportedBrowser) { throw "Unsupported browser detected"; } - // TODO: These are needed to load plugins because @ember has its own loader. - // We should find a nicer way to do this. - const EMBER_MODULES = { - "@ember/application": { - default: Ember.Application, - setOwner: Ember.setOwner, - getOwner: Ember.getOwner, - }, - "@ember/array": { - default: Ember.Array, - A: Ember.A, - isArray: Ember.isArray, - }, - "@ember/array/proxy": { - default: Ember.ArrayProxy, - }, - "@ember/component": { - default: Ember.Component, - }, - "@ember/component/helper": { - default: Ember.Helper, - }, - "@ember/component/text-field": { - default: Ember.TextField, - }, - "@ember/component/text-area": { - default: Ember.TextArea, - }, - "@ember/controller": { - default: Ember.Controller, - inject: Ember.inject.controller, - }, - "@ember/debug": { - warn: Ember.warn, - }, - "@ember/error": { - default: Ember.error, - }, - "@ember/object": { - action: Ember._action, - default: Ember.Object, - get: Ember.get, - getProperties: Ember.getProperties, - set: Ember.set, - setProperties: Ember.setProperties, - computed: Ember.computed, - defineProperty: Ember.defineProperty, - }, - "@ember/object/computed": { - alias: Ember.computed.alias, - and: Ember.computed.and, - bool: Ember.computed.bool, - collect: Ember.computed.collect, - deprecatingAlias: Ember.computed.deprecatingAlias, - empty: Ember.computed.empty, - equal: Ember.computed.equal, - filter: Ember.computed.filter, - filterBy: Ember.computed.filterBy, - gt: Ember.computed.gt, - gte: Ember.computed.gte, - intersect: Ember.computed.intersect, - lt: Ember.computed.lt, - lte: Ember.computed.lte, - map: Ember.computed.map, - mapBy: Ember.computed.mapBy, - match: Ember.computed.match, - max: Ember.computed.max, - min: Ember.computed.min, - none: Ember.computed.none, - not: Ember.computed.not, - notEmpty: Ember.computed.notEmpty, - oneWay: Ember.computed.oneWay, - or: Ember.computed.or, - readOnly: Ember.computed.readOnly, - reads: Ember.computed.reads, - setDiff: Ember.computed.setDiff, - sort: Ember.computed.sort, - sum: Ember.computed.sum, - union: Ember.computed.union, - uniq: Ember.computed.uniq, - uniqBy: Ember.computed.uniqBy, - }, - "@ember/object/internals": { - guidFor: Ember.guidFor, - }, - "@ember/object/mixin": { default: Ember.Mixin }, - "@ember/object/proxy": { default: Ember.ObjectProxy }, - "@ember/object/promise-proxy-mixin": { default: Ember.PromiseProxyMixin }, - "@ember/object/evented": { - default: Ember.Evented, - on: Ember.on, - }, - "@ember/routing/route": { default: Ember.Route }, - "@ember/routing/router": { default: Ember.Router }, - "@ember/runloop": { - bind: Ember.run.bind, - cancel: Ember.run.cancel, - debounce: Ember.testing ? Ember.run : Ember.run.debounce, - later: Ember.run.later, - next: Ember.run.next, - once: Ember.run.once, - run: Ember.run, - schedule: Ember.run.schedule, - scheduleOnce: Ember.run.scheduleOnce, - throttle: Ember.run.throttle, - }, - "@ember/service": { - default: Ember.Service, - inject: Ember.inject.service, - }, - "@ember/string": { - w: Ember.String.w, - dasherize: Ember.String.dasherize, - decamelize: Ember.String.decamelize, - camelize: Ember.String.camelize, - classify: Ember.String.classify, - underscore: Ember.String.underscore, - capitalize: Ember.String.capitalize, - }, - "@ember/template": { - htmlSafe: Ember.String.htmlSafe, - }, - "@ember/utils": { - isBlank: Ember.isBlank, - isEmpty: Ember.isEmpty, - isNone: Ember.isNone, - isPresent: Ember.isPresent, - }, - jquery: { default: $ }, - rsvp: { - asap: Ember.RSVP.asap, - all: Ember.RSVP.all, - allSettled: Ember.RSVP.allSettled, - race: Ember.RSVP.race, - hash: Ember.RSVP.hash, - hashSettled: Ember.RSVP.hashSettled, - rethrow: Ember.RSVP.rethrow, - defer: Ember.RSVP.defer, - denodeify: Ember.RSVP.denodeify, - resolve: Ember.RSVP.resolve, - reject: Ember.RSVP.reject, - map: Ember.RSVP.map, - filter: Ember.RSVP.filter, - default: Ember.RSVP, - Promise: Ember.RSVP.Promise, - EventTarget: Ember.RSVP.EventTarget, - }, - }; - Object.keys(EMBER_MODULES).forEach((mod) => { - define(mod, () => EMBER_MODULES[mod]); - }); // TODO: Remove this and have resolver find the templates const prefix = "discourse/templates/"; @@ -166,15 +15,6 @@ } }); - define("I18n", ["exports"], function (exports) { - return I18n; - }); - - define("htmlbars-inline-precompile", ["exports"], function (exports) { - exports.default = function tag(strings) { - return Ember.Handlebars.compile(strings[0]); - }; - }); window.__widget_helpers = require("discourse-widget-hbs/helpers").default; // TODO: Eliminate this global diff --git a/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js b/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js new file mode 100644 index 0000000000..cab696c012 --- /dev/null +++ b/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js @@ -0,0 +1,9 @@ +define("I18n", ["exports"], function (exports) { + return I18n; +}); + +define("htmlbars-inline-precompile", ["exports"], function (exports) { + exports.default = function tag(strings) { + return Ember.Handlebars.compile(strings[0]); + }; +}); From 452905abee9792c6755256d0e0f883546993fe4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 19:25:58 +0100 Subject: [PATCH 076/194] Build(deps-dev): Bump fabrication from 2.26.0 to 2.27.0 (#15801) Bumps [fabrication](https://gitlab.com/fabrication-gem/fabrication) from 2.26.0 to 2.27.0. - [Release notes](https://gitlab.com/fabrication-gem/fabrication/tags) - [Changelog](https://gitlab.com/fabrication-gem/fabrication/blob/master/Changelog.markdown) - [Commits](https://gitlab.com/fabrication-gem/fabrication/compare/2.26.0...2.27.0) --- updated-dependencies: - dependency-name: fabrication dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 50ac3ee711..1803be6059 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -132,7 +132,7 @@ GEM excon (0.90.0) execjs (2.8.1) exifr (1.3.9) - fabrication (2.26.0) + fabrication (2.27.0) faker (2.19.0) i18n (>= 1.6, < 2) fakeweb (1.3.0) From 69cbdb9f97ecded3f01addeb3cb56a8318f9536a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 19:26:15 +0100 Subject: [PATCH 077/194] Build(deps-dev): Bump rspec-rails from 5.0.2 to 5.1.0 (#15789) Bumps [rspec-rails](https://github.com/rspec/rspec-rails) from 5.0.2 to 5.1.0. - [Release notes](https://github.com/rspec/rspec-rails/releases) - [Changelog](https://github.com/rspec/rspec-rails/blob/main/Changelog.md) - [Commits](https://github.com/rspec/rspec-rails/compare/v5.0.2...v5.1.0) --- updated-dependencies: - dependency-name: rspec-rails dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1803be6059..0be7aa51b1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -379,7 +379,7 @@ GEM rspec-mocks (3.10.3) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.10.0) - rspec-rails (5.0.2) + rspec-rails (5.1.0) actionpack (>= 5.2) activesupport (>= 5.2) railties (>= 5.2) From cffc2836cbf2fff4653a65654c243f647966d29b Mon Sep 17 00:00:00 2001 From: janzenisaac <50783505+janzenisaac@users.noreply.github.com> Date: Thu, 3 Feb 2022 13:07:40 -0600 Subject: [PATCH 078/194] DEV: Don't allow users to immediately reinvite (#15722) - Limit bulk re-invite to 1 time per day - Move bulk invite by csv behind a site setting (hidden by default) - Bump invite expiry from 30 -> 90 days ## Updates to rate_limiter When limiting reinvites I found that **staff** are never limited in any way. So I updated the **rate_limiter** model to allow for a few things: - add an optional param of `staff_limit`, which (when included and passed values, and the user passes `.staff?`) will override the default `max` & `secs` values and apply them to the user. - in the case you **do** pass values to `staff_limit` but the user **does not** pass `staff?` the standard `max` & `secs` values will be applied to the user. This should give us enough flexibility to 1. continue to apply a strict rate limit to a standard user 2. but also apply a secondary (less strict) limit to staff --- .../app/templates/user-invited-show.hbs | 8 +++-- app/controllers/invites_controller.rb | 6 ++++ config/locales/server.en.yml | 1 + config/site_settings.yml | 6 +++- lib/rate_limiter.rb | 16 ++++++--- spec/components/rate_limiter_spec.rb | 35 ++++++++++++++++++- spec/requests/invites_controller_spec.rb | 19 +++++++--- 7 files changed, 76 insertions(+), 15 deletions(-) diff --git a/app/assets/javascripts/discourse/app/templates/user-invited-show.hbs b/app/assets/javascripts/discourse/app/templates/user-invited-show.hbs index 73eb1be666..f9afbbe552 100644 --- a/app/assets/javascripts/discourse/app/templates/user-invited-show.hbs +++ b/app/assets/javascripts/discourse/app/templates/user-invited-show.hbs @@ -10,9 +10,11 @@ {{#d-section class="user-invite-buttons"}} {{d-button class="btn-default" icon="plus" action=(action "createInvite") label="user.invited.create"}} {{#if canBulkInvite}} - {{#unless site.mobileView}} - {{d-button class="btn-default" icon="upload" action=(action "createInviteCsv") label="user.invited.bulk_invite.text"}} - {{/unless}} + {{#if siteSettings.allow_bulk_invite}} + {{#unless site.mobileView}} + {{d-button class="btn-default" icon="upload" action=(action "createInviteCsv") label="user.invited.bulk_invite.text"}} + {{/unless}} + {{/if}} {{/if}} {{#if showBulkActionButtons}} {{#if inviteExpired}} diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index 2c75d65911..e02a2c59fe 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -361,6 +361,12 @@ class InvitesController < ApplicationController def resend_all_invites guardian.ensure_can_resend_all_invites!(current_user) + begin + RateLimiter.new(current_user, "bulk-reinvite-per-day", 1, 1.day, apply_limit_to_staff: true).performed! + rescue RateLimiter::LimitExceeded + return render_json_error(I18n.t("rate_limiter.slow_down")) + end + Invite.pending(current_user) .where('invites.email IS NOT NULL') .find_each { |invite| invite.resend_invite } diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 7dde1ebb06..490c983dc1 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1465,6 +1465,7 @@ en: watched_word_regexp_error: "The regular expression for '%{action}' watched words is invalid. Please check your Watched Word settings, or disable the 'watched words regular expressions' site setting." site_settings: + allow_bulk_invite: "Allow bulk invites by uploading a CSV file" disabled: "disabled" display_local_time_in_user_card: "Display the local time based on a user's timezone when their user card is opened." censored_words: "Words that will be automatically replaced with ■■■■" diff --git a/config/site_settings.yml b/config/site_settings.yml index 168d375577..a84fd9d588 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -584,7 +584,7 @@ users: client: true default: true invite_expiry_days: - default: 30 + default: 90 client: true max: 36500 invites_per_page: @@ -2347,6 +2347,10 @@ uncategorized: default: false hidden: true + allow_bulk_invite: + default: true + client: true + max_bulk_invites: default: 50000 hidden: true diff --git a/lib/rate_limiter.rb b/lib/rate_limiter.rb index f7572d4b05..06f70dc4ad 100644 --- a/lib/rate_limiter.rb +++ b/lib/rate_limiter.rb @@ -37,7 +37,7 @@ class RateLimiter "#{RateLimiter.key_prefix}:#{@user && @user.id}:#{type}" end - def initialize(user, type, max, secs, global: false, aggressive: false, error_code: nil) + def initialize(user, type, max, secs, global: false, aggressive: false, error_code: nil, apply_limit_to_staff: false, staff_limit: { max: nil, secs: nil }) @user = user @type = type @key = build_key(type) @@ -46,6 +46,14 @@ class RateLimiter @global = global @aggressive = aggressive @error_code = error_code + @apply_limit_to_staff = apply_limit_to_staff + @staff_limit = staff_limit + + # override the default values if staff user, and staff specific max is passed + if @user&.staff? && !@apply_limit_to_staff && @staff_limit[:max].present? + @max = @staff_limit[:max] + @secs = @staff_limit[:secs] + end end def clear! @@ -115,8 +123,7 @@ class RateLimiter def performed!(raise_error: true) return true if rate_unlimited? now = Time.now.to_i - - if ((max || 0) <= 0) || rate_limiter_allowed?(now) + if ((@max || 0) <= 0) || rate_limiter_allowed?(now) raise RateLimiter::LimitExceeded.new(seconds_to_wait(now), @type, @error_code) if raise_error false else @@ -153,7 +160,6 @@ class RateLimiter private def rate_limiter_allowed?(now) - lua, lua_sha = nil if @aggressive lua = PERFORM_LUA_AGGRESSIVE @@ -193,7 +199,7 @@ class RateLimiter end def rate_unlimited? - !!(RateLimiter.disabled? || (@user && @user.staff?)) + !!(RateLimiter.disabled? || (@user&.staff? && !@apply_limit_to_staff && @staff_limit[:max].nil?)) end def eval_lua(lua, sha, keys, args) diff --git a/spec/components/rate_limiter_spec.rb b/spec/components/rate_limiter_spec.rb index 4802feac93..ce4eea9d6d 100644 --- a/spec/components/rate_limiter_spec.rb +++ b/spec/components/rate_limiter_spec.rb @@ -6,7 +6,11 @@ require 'rate_limiter' describe RateLimiter do fab!(:user) { Fabricate(:user) } + fab!(:admin) { Fabricate(:admin) } let(:rate_limiter) { RateLimiter.new(user, "peppermint-butler", 2, 60) } + let(:apply_staff_rate_limiter) { RateLimiter.new(admin, "peppermint-servant", 5, 40, apply_limit_to_staff: true) } + let(:staff_rate_limiter) { RateLimiter.new(user, "peppermind-servant", 5, 40, staff_limit: { max: 10, secs: 80 }) } + let(:admin_staff_rate_limiter) { RateLimiter.new(admin, "peppermind-servant", 5, 40, staff_limit: { max: 10, secs: 80 }) } context 'disabled' do before do @@ -32,6 +36,8 @@ describe RateLimiter do before do RateLimiter.enable rate_limiter.clear! + staff_rate_limiter.clear! + admin_staff_rate_limiter.clear! end context 'aggressive rate limiter' do @@ -46,7 +52,6 @@ describe RateLimiter do limiter.performed! limiter.performed! - freeze_time 29.seconds.from_now expect do @@ -189,6 +194,34 @@ describe RateLimiter do user.moderator = true expect { rate_limiter.performed! }.not_to raise_error end + + it "applies max / secs to staff when apply_limit_to_staff flag is true" do + 5.times { apply_staff_rate_limiter.performed! } + freeze_time 10.seconds.from_now + expect { apply_staff_rate_limiter.performed! }.to raise_error do |error| + expect(error).to be_a(RateLimiter::LimitExceeded) + expect(error).to having_attributes(available_in: 30) + end + end + + it "applies staff_limit max when present for staff" do + expect(admin_staff_rate_limiter.can_perform?).to eq(true) + expect(admin_staff_rate_limiter.remaining).to eq(10) + end + + it "applies staff_limit secs when present for staff" do + 10.times { admin_staff_rate_limiter.performed! } + freeze_time 10.seconds.from_now + expect { admin_staff_rate_limiter.performed! }.to raise_error do |error| + expect(error).to be_a(RateLimiter::LimitExceeded) + expect(error).to having_attributes(available_in: 70) + end + end + + it "applies standard max to non-staff users when staff_limit values are present" do + expect(staff_rate_limiter.can_perform?).to eq(true) + expect(staff_rate_limiter.remaining).to eq(5) + end end context "rollback!" do diff --git a/spec/requests/invites_controller_spec.rb b/spec/requests/invites_controller_spec.rb index 7110cf1733..52f0ba9177 100644 --- a/spec/requests/invites_controller_spec.rb +++ b/spec/requests/invites_controller_spec.rb @@ -907,15 +907,15 @@ describe InvitesController do freeze_time - user = Fabricate(:admin) - new_invite = Fabricate(:invite, invited_by: user) - expired_invite = Fabricate(:invite, invited_by: user) + admin = Fabricate(:admin) + new_invite = Fabricate(:invite, invited_by: admin) + expired_invite = Fabricate(:invite, invited_by: admin) expired_invite.update!(expires_at: 2.days.ago) - redeemed_invite = Fabricate(:invite, invited_by: user) + redeemed_invite = Fabricate(:invite, invited_by: admin) Fabricate(:invited_user, invite: redeemed_invite, user: Fabricate(:user)) redeemed_invite.update!(expires_at: 5.days.ago) - sign_in(user) + sign_in(admin) post '/invites/reinvite-all' expect(response.status).to eq(200) @@ -953,6 +953,15 @@ describe InvitesController do expect(Jobs::BulkInvite.jobs.size).to eq(1) end + it 'limits admins when bulk inviting' do + sign_in(admin) + post '/invites/upload_csv.json', params: { file: file, name: 'discourse.csv' } + expect(response.status).to eq(200) + post '/invites/upload_csv.json', params: { file: file, name: 'discourse.csv' } + expect(response.status).to eq(422) + expect(Jobs::BulkInvite.jobs.size).to eq(1) + end + it 'allows admin to bulk invite when DiscourseConnect enabled' do SiteSetting.discourse_connect_url = "https://example.com" SiteSetting.enable_discourse_connect = true From 5f322605c6fa43d5e22c09ea04060344edd99593 Mon Sep 17 00:00:00 2001 From: Jordan Vidrine <30537603+jordanvidrine@users.noreply.github.com> Date: Thu, 3 Feb 2022 13:16:27 -0600 Subject: [PATCH 079/194] DEV: Add category-color variable (#15807) --- app/assets/javascripts/discourse/app/helpers/border-color.js | 2 +- .../discourse/app/helpers/category-color-variable.js | 3 +++ .../app/templates/components/categories-boxes-with-topics.hbs | 2 +- .../discourse/app/templates/components/categories-boxes.hbs | 2 +- .../discourse/app/templates/components/parent-category-row.hbs | 2 +- 5 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 app/assets/javascripts/discourse/app/helpers/category-color-variable.js diff --git a/app/assets/javascripts/discourse/app/helpers/border-color.js b/app/assets/javascripts/discourse/app/helpers/border-color.js index bbe9845650..7272a76586 100644 --- a/app/assets/javascripts/discourse/app/helpers/border-color.js +++ b/app/assets/javascripts/discourse/app/helpers/border-color.js @@ -1,3 +1,3 @@ import { htmlHelper } from "discourse-common/lib/helpers"; -export default htmlHelper((color) => `border-color: #${color}`); +export default htmlHelper((color) => `border-color: #${color}; `); diff --git a/app/assets/javascripts/discourse/app/helpers/category-color-variable.js b/app/assets/javascripts/discourse/app/helpers/category-color-variable.js new file mode 100644 index 0000000000..4ad1cdcea7 --- /dev/null +++ b/app/assets/javascripts/discourse/app/helpers/category-color-variable.js @@ -0,0 +1,3 @@ +import { htmlHelper } from "discourse-common/lib/helpers"; + +export default htmlHelper((color) => `--category-color: #${color};`); diff --git a/app/assets/javascripts/discourse/app/templates/components/categories-boxes-with-topics.hbs b/app/assets/javascripts/discourse/app/templates/components/categories-boxes-with-topics.hbs index f11790e5c2..0a041d8cc0 100644 --- a/app/assets/javascripts/discourse/app/templates/components/categories-boxes-with-topics.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/categories-boxes-with-topics.hbs @@ -1,5 +1,5 @@ {{#each categories as |c|}} -

+
diff --git a/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs b/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs index d1d03e36fa..255d483880 100644 --- a/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/categories-boxes.hbs @@ -1,6 +1,6 @@ {{#each categories as |c|}} {{plugin-outlet name="category-box-before-each-box" args=(hash category=c)}} -
+
{{#unless c.isMuted}}
+ {{plugin-outlet name="user-profile-above-collapsed-info" args=(hash model=model collapsedInfo=collapsedInfo)}} {{#unless collapsedInfo}}
From 6e4af0e36f8bec32d77bdb3c0051088efa8069e0 Mon Sep 17 00:00:00 2001 From: janzenisaac <50783505+janzenisaac@users.noreply.github.com> Date: Thu, 3 Feb 2022 15:17:36 -0600 Subject: [PATCH 081/194] DEV: update show social login logic (#15809) Only display text if one or more social login options are enabled --- .../discourse/app/controllers/invites-show.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/invites-show.js b/app/assets/javascripts/discourse/app/controllers/invites-show.js index fbeb0ee8ab..4a6307d75c 100644 --- a/app/assets/javascripts/discourse/app/controllers/invites-show.js +++ b/app/assets/javascripts/discourse/app/controllers/invites-show.js @@ -100,9 +100,19 @@ export default Controller.extend( ); }, - @discourseComputed("externalAuthsOnly", "discourseConnectEnabled") - showSocialLoginAvailable(externalAuthsOnly, discourseConnectEnabled) { - return !externalAuthsOnly && !discourseConnectEnabled; + @discourseComputed( + "externalAuthsEnabled", + "externalAuthsOnly", + "discourseConnectEnabled" + ) + showSocialLoginAvailable( + externalAuthsEnabled, + externalAuthsOnly, + discourseConnectEnabled + ) { + return ( + externalAuthsEnabled && !externalAuthsOnly && !discourseConnectEnabled + ); }, @discourseComputed( From 1485dab12eb00a0e863322463fdb67994a2649a2 Mon Sep 17 00:00:00 2001 From: Keegan George Date: Thu, 3 Feb 2022 13:47:02 -0800 Subject: [PATCH 082/194] FEATURE: Ability to re-order value lists (#15775) Adds up and down buttons next to the inputs of value lists when there is more than 1 item present. This helps to re-order the items in the value lists if necessary. --- .../admin/addon/components/simple-list.js | 24 ++++++++++++++++++- .../admin/addon/components/value-list.js | 21 ++++++++++++++++ .../templates/components/simple-list.hbs | 15 ++++++++++++ .../addon/templates/components/value-list.hbs | 13 ++++++++++ .../stylesheets/common/admin/admin_base.scss | 13 ++++++++++ 5 files changed, 85 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/admin/addon/components/simple-list.js b/app/assets/javascripts/admin/addon/components/simple-list.js index 96136c98e2..46b8691e39 100644 --- a/app/assets/javascripts/admin/addon/components/simple-list.js +++ b/app/assets/javascripts/admin/addon/components/simple-list.js @@ -1,7 +1,7 @@ import Component from "@ember/component"; import { action } from "@ember/object"; import { empty } from "@ember/object/computed"; -import { on } from "discourse-common/utils/decorators"; +import discourseComputed, { on } from "discourse-common/utils/decorators"; export default Component.extend({ classNameBindings: [":simple-list", ":value-list"], @@ -47,10 +47,32 @@ export default Component.extend({ this._onChange(); }, + @action + shift(operation, index) { + let futureIndex = index + operation; + + if (futureIndex > this.collection.length - 1) { + futureIndex = 0; + } else if (futureIndex < 0) { + futureIndex = this.collection.length - 1; + } + + const shiftedValue = this.collection[index]; + this.collection.removeAt(index); + this.collection.insertAt(futureIndex, shiftedValue); + + this._onChange(); + }, + _onChange() { this.attrs.onChange && this.attrs.onChange(this.collection); }, + @discourseComputed("collection") + showUpDownButtons(collection) { + return collection.length - 1 ? true : false; + }, + _splitValues(values, delimiter) { return values && values.length ? values.split(delimiter || "\n").filter(Boolean) diff --git a/app/assets/javascripts/admin/addon/components/value-list.js b/app/assets/javascripts/admin/addon/components/value-list.js index 2daacfd8a4..57197548cb 100644 --- a/app/assets/javascripts/admin/addon/components/value-list.js +++ b/app/assets/javascripts/admin/addon/components/value-list.js @@ -59,6 +59,22 @@ export default Component.extend({ selectChoice(choice) { this._addValue(choice); }, + + shift(operation, index) { + let futureIndex = index + operation; + + if (futureIndex > this.collection.length - 1) { + futureIndex = 0; + } else if (futureIndex < 0) { + futureIndex = this.collection.length - 1; + } + + const shiftedValue = this.collection[index]; + this.collection.removeAt(index); + this.collection.insertAt(futureIndex, shiftedValue); + + this._saveValues(); + }, }, _addValue(value) { @@ -99,6 +115,11 @@ export default Component.extend({ this.set("values", this.collection.join(this.inputDelimiter || "\n")); }, + @discourseComputed("collection") + showUpDownButtons(collection) { + return collection.length - 1 ? true : false; + }, + _splitValues(values, delimiter) { if (values && values.length) { return values.split(delimiter).filter((x) => x); diff --git a/app/assets/javascripts/admin/addon/templates/components/simple-list.hbs b/app/assets/javascripts/admin/addon/templates/components/simple-list.hbs index ab94ad2e39..fab64bc92d 100644 --- a/app/assets/javascripts/admin/addon/templates/components/simple-list.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/simple-list.hbs @@ -15,8 +15,23 @@ class="value-input" focus-out=(action "changeValue" index) }} + + {{#if showUpDownButtons}} + {{d-button + action=(action "shift" -1 index) + icon="arrow-up" + class="shift-up-value-btn btn-small" + }} + {{d-button + action=(action "shift" 1 index) + icon="arrow-down" + class="shift-down-value-btn btn-small" + }} + {{/if}}
+ {{/each}} +
{{/if}} diff --git a/app/assets/javascripts/admin/addon/templates/components/value-list.hbs b/app/assets/javascripts/admin/addon/templates/components/value-list.hbs index 94b1d12325..518922c965 100644 --- a/app/assets/javascripts/admin/addon/templates/components/value-list.hbs +++ b/app/assets/javascripts/admin/addon/templates/components/value-list.hbs @@ -15,6 +15,19 @@ class="value-input" focus-out=(action "changeValue" index) }} + + {{#if showUpDownButtons}} + {{d-button + action=(action "shift" -1 index) + icon="arrow-up" + class="shift-up-value-btn btn-small" + }} + {{d-button + action=(action "shift" 1 index) + icon="arrow-down" + class="shift-down-value-btn btn-small" + }} + {{/if}}
{{/each}}
diff --git a/app/assets/stylesheets/common/admin/admin_base.scss b/app/assets/stylesheets/common/admin/admin_base.scss index cfe46e0842..12489ab12e 100644 --- a/app/assets/stylesheets/common/admin/admin_base.scss +++ b/app/assets/stylesheets/common/admin/admin_base.scss @@ -856,6 +856,19 @@ table#user-badges { @include value-btn; margin-right: 0.25em; } + + .shift-up-value-btn, + .shift-down-value-btn { + display: none; + margin-inline: 0.25em; + } + + &:hover { + .shift-up-value-btn, + .shift-down-value-btn { + display: block; + } + } } .values { margin-bottom: 0.5em; From 9fc33d310b2bab7e17dbe07c49355b90a9238dd7 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Fri, 4 Feb 2022 08:45:55 +1000 Subject: [PATCH 083/194] FIX: Table pasting issues with uppy (#15787) When changing to uppy for file uploads we forgot to add these conditions to the paste event from 9c96511ec47bf0eb450a0b7e15738d284ee3761f Basically, if you are pasting more than just a file (e.g. text, html, rtf), then we should not handle the file and upload it, and instead just paste in the text. This causes issues with spreadsheet tools, that will copy the text representation and also an image representation of cells to the user's clipboard. This also moves the paste event for composer-upload-uppy to the element found by the `editorClass` property, so it shares the paste event with d-editor (via TextareaTextManipulation), which makes testing this possible as the ember paste bindings are not picked up unless both paste events are on the same element. --- .../app/components/composer-editor.js | 1 + .../app/mixins/composer-upload-uppy.js | 9 +++-- .../acceptance/composer-uploads-uppy-test.js | 38 ++++++++++++++++++- .../discourse/tests/helpers/qunit-helpers.js | 9 +++++ .../integration/components/d-editor-test.js | 9 +---- 5 files changed, 53 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/composer-editor.js b/app/assets/javascripts/discourse/app/components/composer-editor.js index 1912fded1c..9c47b57677 100644 --- a/app/assets/javascripts/discourse/app/components/composer-editor.js +++ b/app/assets/javascripts/discourse/app/components/composer-editor.js @@ -100,6 +100,7 @@ export function cleanUpComposerUploadMarkdownResolver() { export default Component.extend(ComposerUploadUppy, { classNameBindings: ["showToolbar:toolbar-visible", ":wmd-controls"], + editorClass: ".d-editor", fileUploadElementId: "file-uploader", mobileFileUploaderId: "mobile-file-upload", eventPrefix: "composer", diff --git a/app/assets/javascripts/discourse/app/mixins/composer-upload-uppy.js b/app/assets/javascripts/discourse/app/mixins/composer-upload-uppy.js index 5039c8626b..0442cf9697 100644 --- a/app/assets/javascripts/discourse/app/mixins/composer-upload-uppy.js +++ b/app/assets/javascripts/discourse/app/mixins/composer-upload-uppy.js @@ -65,7 +65,7 @@ export default Mixin.create(ExtendableUploader, UppyS3Multipart, { this.fileInputEventListener ); - this.element.removeEventListener("paste", this.pasteEventListener); + this.editorEl?.removeEventListener("paste", this.pasteEventListener); this.appEvents.off(`${this.eventPrefix}:add-files`, this._addFiles); this.appEvents.off( @@ -93,6 +93,7 @@ export default Mixin.create(ExtendableUploader, UppyS3Multipart, { this.set("inProgressUploads", []); this.placeholders = {}; this._preProcessorStatus = {}; + this.editorEl = this.element.querySelector(this.editorClass); this.fileInputEl = document.getElementById(this.fileUploadElementId); const isPrivateMessage = this.get("composerModel.privateMessage"); @@ -107,7 +108,7 @@ export default Mixin.create(ExtendableUploader, UppyS3Multipart, { this.fileInputEl, this._addFiles ); - this.element.addEventListener("paste", this.pasteEventListener); + this.editorEl.addEventListener("paste", this.pasteEventListener); this._uppyInstance = new Uppy({ id: this.uppyId, @@ -550,12 +551,12 @@ export default Mixin.create(ExtendableUploader, UppyS3Multipart, { return; } - const { canUpload } = clipboardHelpers(event, { + const { canUpload, canPasteHtml, types } = clipboardHelpers(event, { siteSettings: this.siteSettings, canUpload: true, }); - if (!canUpload) { + if (!canUpload || canPasteHtml || types.includes("text/plain")) { return; } diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js index efb6bb6fe6..f185994963 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js @@ -2,12 +2,13 @@ import { acceptance, createFile, loggedInUser, + paste, query, } from "discourse/tests/helpers/qunit-helpers"; import { withPluginApi } from "discourse/lib/plugin-api"; import bootbox from "bootbox"; import { authorizedExtensions } from "discourse/lib/uploads"; -import { click, fillIn, visit } from "@ember/test-helpers"; +import { click, fillIn, settled, visit } from "@ember/test-helpers"; import I18n from "I18n"; import { test } from "qunit"; import { Promise } from "rsvp"; @@ -53,6 +54,7 @@ acceptance("Uppy Composer Attachment - Upload Placeholder", function (needs) { needs.pretender(pretender); needs.settings({ simultaneous_uploads: 2, + enable_rich_text_paste: true, }); test("should insert the Uploading placeholder then the complete image placeholder", async function (assert) { @@ -310,6 +312,40 @@ acceptance("Uppy Composer Attachment - Upload Placeholder", function (needs) { const image = createFile("avatar.png"); appEvents.trigger("composer:add-files", image); }); + + test("should be able to paste a table with files and not upload the files", async function (assert) { + await visit("/"); + await click("#create-topic"); + const appEvents = loggedInUser().appEvents; + const done = assert.async(); + + let uppyEventFired = false; + + appEvents.on("composer:upload-started", () => { + uppyEventFired = true; + }); + + let element = query(".d-editor"); + let inputElement = query(".d-editor-input"); + inputElement.focus(); + await paste(element, "\ta\tb\n1\t2\t3", { + types: ["text/plain", "Files"], + files: [createFile("avatar.png")], + }); + await settled(); + + assert.strictEqual( + inputElement.value, + "||a|b|\n|---|---|---|\n|1|2|3|\n", + "only the plain text table is pasted" + ); + assert.strictEqual( + uppyEventFired, + false, + "uppy does not start uploading the file" + ); + done(); + }); }); acceptance("Uppy Composer Attachment - Upload Error", function (needs) { diff --git a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js index 749d72ea7a..3a4bd5f5d0 100644 --- a/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js +++ b/app/assets/javascripts/discourse/tests/helpers/qunit-helpers.js @@ -1,4 +1,5 @@ import QUnit, { module, skip, test } from "qunit"; +import { deepMerge } from "discourse-common/lib/object"; import MessageBus from "message-bus-client"; import { clearCache as clearOutletCache, @@ -553,3 +554,11 @@ export function createFile(name, type = "image/png", blobData = null) { }); return file; } + +export async function paste(element, text, otherClipboardData = {}) { + let e = new Event("paste", { cancelable: true }); + e.clipboardData = deepMerge({ getData: () => text }, otherClipboardData); + element.dispatchEvent(e); + await settled(); + return e; +} diff --git a/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js b/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js index d80d186ff9..df9c4b6388 100644 --- a/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js +++ b/app/assets/javascripts/discourse/tests/integration/components/d-editor-test.js @@ -5,6 +5,7 @@ import componentTest, { import { discourseModule, exists, + paste, query, queryAll, } from "discourse/tests/helpers/qunit-helpers"; @@ -822,14 +823,6 @@ third line` } ); - async function paste(element, text) { - let e = new Event("paste", { cancelable: true }); - e.clipboardData = { getData: () => text }; - element.dispatchEvent(e); - await settled(); - return e; - } - componentTest("paste table", { template: hbs`{{d-editor value=value composerEvents=true}}`, beforeEach() { From f3467ee67324878325791a8351664b8532e1eec1 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Fri, 4 Feb 2022 09:00:40 +1000 Subject: [PATCH 084/194] FEATURE: Add requestCustomMarkdownCookFunction API (#15753) This commit adds a requestCustomMarkdownCookFunction function to the `helper` that is provided to custom markdown rules via their `setup` function. The way this works is that once the default markdown engine that we use for cooking posts has been set up, we loop through all of the callbacks registered by `requestCustomMarkdownCookFunction` and call `_buildCustomMarkdownCookFunction`. This creates a new markdown engine using many of the same settings as the default one, but will allow for the following options to be changed by the markdown rule requesting the custom function: * featuresOverride - The markdown-it features to allow for the engine * markdownItRules - The markdown-it rules to allow for the engine After this engine is set up a render function which renders + sanitizes the output is returned for use by the markdown rule. The use case for this API is mainly for block BBCode markdown rules which want to render their content with a limited subset of the markdown features/rules. Our initial use case for this is chat message quoting. This commit also does some minor refactoring of discourse-markdown-it to accommodate this new engine building. --- .../addon/engines/discourse-markdown-it.js | 285 ++++++++++++------ 1 file changed, 198 insertions(+), 87 deletions(-) diff --git a/app/assets/javascripts/pretty-text/addon/engines/discourse-markdown-it.js b/app/assets/javascripts/pretty-text/addon/engines/discourse-markdown-it.js index 5d9ca251bd..558f66cdf0 100644 --- a/app/assets/javascripts/pretty-text/addon/engines/discourse-markdown-it.js +++ b/app/assets/javascripts/pretty-text/addon/engines/discourse-markdown-it.js @@ -1,4 +1,5 @@ import AllowLister from "pretty-text/allow-lister"; +import { cloneJSON } from "discourse-common/lib/object"; import deprecated from "discourse-common/lib/deprecated"; import guid from "pretty-text/guid"; import { sanitize } from "pretty-text/sanitizer"; @@ -18,11 +19,18 @@ function deprecate(feature, name) { }; } +// We have some custom extensions and extension points for markdown-it, including +// the helper (passed in via setup) that has registerOptions, registerPlugin etc. +// as well as our postProcessText rule to replace text with a regex. +// +// Take a look at https://meta.discourse.org/t/developers-guide-to-markdown-extensions/66023 +// for more detailed information. function createHelper( featureName, opts, optionCallbacks, pluginCallbacks, + customMarkdownCookFnCallbacks, getOptions, allowListed ) { @@ -58,6 +66,10 @@ function createHelper( pluginCallbacks.push([featureName, callback]); }; + helper.buildCookFunction = (callback) => { + customMarkdownCookFnCallbacks.push([featureName, callback]); + }; + return helper; } @@ -101,10 +113,12 @@ function setupBlockBBCode(md) { md.block.bbcode = { ruler: new Ruler() }; } +// inline bbcode ruler for parsing of spoiler tags, discourse-chart etc function setupInlineBBCode(md) { md.inline.bbcode = { ruler: new Ruler() }; } +// rule for text replacement via regex, used for @mentions, category hashtags, etc. function setupTextPostProcessRuler(md) { const TextPostProcessRuler = requirejs( "pretty-text/engines/discourse-markdown/text-post-process" @@ -112,11 +126,14 @@ function setupTextPostProcessRuler(md) { md.core.textPostProcess = { ruler: new TextPostProcessRuler() }; } +// hoists html_raw tokens out of the render flow and replaces them +// with a GUID. this GUID is then replaced with the final raw HTML +// content in unhoistForCooked function renderHoisted(tokens, idx, options) { const content = tokens[idx].content; if (content && content.length > 0) { let id = guid(); - options.discourse.hoisted[id] = tokens[idx].content; + options.discourse.hoisted[id] = content; return id; } else { return ""; @@ -129,25 +146,12 @@ function setupUrlDecoding(md) { md.utils.lib.mdurl.decode.defaultChars = ";/?:@&=+$,# "; } +// html_raw tokens, funnily enough, render raw HTML via renderHoisted and +// unhoistForCooked function setupHoister(md) { md.renderer.rules.html_raw = renderHoisted; } -export function extractDataAttribute(str) { - let sep = str.indexOf("="); - if (sep === -1) { - return null; - } - - const key = `data-${str.substr(0, sep)}`.toLowerCase(); - if (!/^[A-Za-z]+[\w\-\:\.]*$/.test(key)) { - return null; - } - - const value = str.substr(sep + 1); - return [key, value]; -} - // videoHTML and audioHTML follow the same HTML syntax // as oneboxer.rb when dealing with these formats function videoHTML(token) { @@ -287,6 +291,152 @@ function setupAttachments(md) { md.renderer.rules.link_open = renderAttachment; } +function buildCustomMarkdownCookFunction(engineOpts, defaultEngineOpts) { + // everything except the engine for opts can just point to the other + // opts references, they do not change and we don't need to worry about + // mutating them. note that this may need to be updated when additional + // opts are added to the pipeline + const newOpts = {}; + newOpts.allowListed = defaultEngineOpts.allowListed; + newOpts.pluginCallbacks = defaultEngineOpts.pluginCallbacks; + newOpts.sanitizer = defaultEngineOpts.sanitizer; + newOpts.discourse = {}; + const featureConfig = cloneJSON(defaultEngineOpts.discourse.features); + + // everything from the discourse part of defaultEngineOpts can be cloned except + // the features, because these can be a limited subset and we don't want to + // change the original object reference + for (const [key, value] of Object.entries(defaultEngineOpts.discourse)) { + if (key !== "features") { + newOpts.discourse[key] = value; + } + } + + if (engineOpts.featuresOverride !== undefined) { + overrideMarkdownFeatures(featureConfig, engineOpts.featuresOverride); + } + newOpts.discourse.features = featureConfig; + + const markdownitOpts = { + discourse: newOpts.discourse, + html: defaultEngineOpts.engine.options.html, + breaks: defaultEngineOpts.engine.options.breaks, + xhtmlOut: defaultEngineOpts.engine.options.xhtmlOut, + linkify: defaultEngineOpts.engine.options.linkify, + typographer: defaultEngineOpts.engine.options.typographer, + }; + newOpts.engine = createMarkdownItEngineWithOpts( + markdownitOpts, + engineOpts.markdownItRules + ); + + // we have to do this to make sure plugin callbacks, allow list, and helper + // functions are all set up correctly for the new engine + setupMarkdownEngine(newOpts, featureConfig); + + // we don't need the whole engine as a consumer, just a cook function + // will do + return function customRenderFn(contentToRender) { + return newOpts.discourse + .sanitizer(newOpts.engine.render(contentToRender)) + .trim(); + }; +} + +function createMarkdownItEngineWithOpts(markdownitOpts, ruleOverrides) { + if (ruleOverrides !== undefined) { + // Preset for "zero", https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.js + return window.markdownit("zero", markdownitOpts).enable(ruleOverrides); + } + return window.markdownit(markdownitOpts); +} + +function overrideMarkdownFeatures(features, featureOverrides) { + if (featureOverrides !== undefined) { + Object.keys(features).forEach((feature) => { + features[feature] = featureOverrides.includes(feature); + }); + } +} + +function setupMarkdownEngine(opts, featureConfig) { + const quotation_marks = + opts.discourse.limitedSiteSettings.markdownTypographerQuotationMarks; + if (quotation_marks) { + opts.engine.options.quotes = quotation_marks.split("|"); + } + + opts.engine.linkify.tlds( + (opts.discourse.limitedSiteSettings.markdownLinkifyTlds || "").split("|") + ); + + setupUrlDecoding(opts.engine); + setupHoister(opts.engine); + setupImageAndPlayableMediaRenderer(opts.engine); + setupAttachments(opts.engine); + setupBlockBBCode(opts.engine); + setupInlineBBCode(opts.engine); + setupTextPostProcessRuler(opts.engine); + + opts.pluginCallbacks.forEach(([feature, callback]) => { + if (featureConfig[feature]) { + opts.engine.use(callback); + } + }); + + // top level markdown it notifier + opts.markdownIt = true; + opts.setup = true; + + if (!opts.discourse.sanitizer || !opts.sanitizer) { + const allowLister = new AllowLister(opts.discourse); + + opts.allowListed.forEach(([feature, info]) => { + allowLister.allowListFeature(feature, info); + }); + + opts.sanitizer = opts.discourse.sanitizer = !!opts.discourse.sanitize + ? (a) => sanitize(a, allowLister) + : (a) => a; + } +} + +function unhoistForCooked(hoisted, cooked) { + const keys = Object.keys(hoisted); + if (keys.length) { + let found = true; + + const unhoist = function (key) { + cooked = cooked.replace(new RegExp(key, "g"), function () { + found = true; + return hoisted[key]; + }); + }; + + while (found) { + found = false; + keys.forEach(unhoist); + } + } + + return cooked; +} + +export function extractDataAttribute(str) { + let sep = str.indexOf("="); + if (sep === -1) { + return null; + } + + const key = `data-${str.substr(0, sep)}`.toLowerCase(); + if (!/^[A-Za-z]+[\w\-\:\.]*$/.test(key)) { + return null; + } + + const value = str.substr(sep + 1); + return [key, value]; +} + let Helpers; export function setup(opts, siteSettings, state) { @@ -302,6 +452,7 @@ export function setup(opts, siteSettings, state) { let optionCallbacks = []; let pluginCallbacks = []; + let customMarkdownCookFnCallbacks = []; // ideally I would like to change the top level API a bit, but in the mean time this will do let getOptions = { @@ -312,6 +463,9 @@ export function setup(opts, siteSettings, state) { let features = []; let allowListed = []; + // all of the modules under discourse-markdown or markdown-it + // directories are considered additional markdown "features" which + // may define their own rules Object.keys(require._eak_seen).forEach((entry) => { if (check.test(entry)) { const module = requirejs(entry); @@ -325,13 +479,14 @@ export function setup(opts, siteSettings, state) { features .sort((a, b) => a.priority - b.priority) - .forEach((f) => { - f.setup( + .forEach((markdownFeature) => { + markdownFeature.setup( createHelper( - f.id, + markdownFeature.id, opts, optionCallbacks, pluginCallbacks, + customMarkdownCookFnCallbacks, getOptions, allowListed ) @@ -353,10 +508,8 @@ export function setup(opts, siteSettings, state) { } }); - if (opts.featuresOverride) { - Object.keys(opts.features).forEach((feature) => { - opts.features[feature] = opts.featuresOverride.includes(feature); - }); + if (opts.featuresOverride !== undefined) { + overrideMarkdownFeatures(opts.features, opts.featuresOverride); } let copy = {}; @@ -375,92 +528,50 @@ export function setup(opts, siteSettings, state) { opts.discourse.limitedSiteSettings = { secureMedia: siteSettings.secure_media, enableDiffhtmlPreview: siteSettings.enable_diffhtml_preview, + traditionalMarkdownLinebreaks: siteSettings.traditional_markdown_linebreaks, + enableMarkdownLinkify: siteSettings.enable_markdown_linkify, + enableMarkdownTypographer: siteSettings.enable_markdown_typographer, + markdownTypographerQuotationMarks: + siteSettings.markdown_typographer_quotation_marks, + markdownLinkifyTlds: siteSettings.markdown_linkify_tlds, }; const markdownitOpts = { discourse: opts.discourse, html: true, - breaks: !siteSettings.traditional_markdown_linebreaks, + breaks: !opts.discourse.limitedSiteSettings.traditionalMarkdownLinebreaks, xhtmlOut: false, - linkify: siteSettings.enable_markdown_linkify, - typographer: siteSettings.enable_markdown_typographer, + linkify: opts.discourse.limitedSiteSettings.enableMarkdownLinkify, + typographer: opts.discourse.limitedSiteSettings.enableMarkdownTypographer, }; - if (opts.discourse.markdownItRules !== undefined) { - opts.engine = window - .markdownit("zero", markdownitOpts) // Preset for "zero", https://github.com/markdown-it/markdown-it/blob/master/lib/presets/zero.js - .enable(opts.discourse.markdownItRules); - } else { - opts.engine = window.markdownit(markdownitOpts); - } - - const quotation_marks = siteSettings.markdown_typographer_quotation_marks; - if (quotation_marks) { - opts.engine.options.quotes = quotation_marks.split("|"); - } - - opts.engine.linkify.tlds( - (siteSettings.markdown_linkify_tlds || "").split("|") + opts.engine = createMarkdownItEngineWithOpts( + markdownitOpts, + opts.discourse.markdownItRules ); - setupUrlDecoding(opts.engine); - setupHoister(opts.engine); - setupImageAndPlayableMediaRenderer(opts.engine); - setupAttachments(opts.engine); - setupBlockBBCode(opts.engine); - setupInlineBBCode(opts.engine); - setupTextPostProcessRuler(opts.engine); + opts.pluginCallbacks = pluginCallbacks; + opts.allowListed = allowListed; - pluginCallbacks.forEach(([feature, callback]) => { - if (opts.discourse.features[feature]) { - opts.engine.use(callback); - } + setupMarkdownEngine(opts, opts.discourse.features); + + customMarkdownCookFnCallbacks.forEach(([, callback]) => { + callback(opts, (engineOpts, afterBuild) => + afterBuild(buildCustomMarkdownCookFunction(engineOpts, opts)) + ); }); - - // top level markdown it notifier - opts.markdownIt = true; - opts.setup = true; - - if (!opts.discourse.sanitizer || !opts.sanitizer) { - const allowLister = new AllowLister(opts.discourse); - - allowListed.forEach(([feature, info]) => { - allowLister.allowListFeature(feature, info); - }); - - opts.sanitizer = opts.discourse.sanitizer = !!opts.discourse.sanitize - ? (a) => sanitize(a, allowLister) - : (a) => a; - } } export function cook(raw, opts) { // we still have to hoist html_raw nodes so they bypass the allowlister // this is the case for oneboxes let hoisted = {}; - opts.discourse.hoisted = hoisted; const rendered = opts.engine.render(raw); let cooked = opts.discourse.sanitizer(rendered).trim(); - - const keys = Object.keys(hoisted); - if (keys.length) { - let found = true; - - const unhoist = function (key) { - cooked = cooked.replace(new RegExp(key, "g"), function () { - found = true; - return hoisted[key]; - }); - }; - - while (found) { - found = false; - keys.forEach(unhoist); - } - } - + cooked = unhoistForCooked(hoisted, cooked); delete opts.discourse.hoisted; + return cooked; } From f4c6a6185517a7d8a17c3faefb7e2e8cc67c44a8 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 11:00:51 +0000 Subject: [PATCH 085/194] PERF: Update ember-auto-import (#15814) This makes a small improvement to 'cold cache' ember-cli build times, and a large improvement to 'warm cache' build times The ember-auto-import update means that vendor is now split into multiple files for efficiency. These are named `chunk.*`, and should be included immediately after the `vendor.js` file. This commit also updates the rails app to render script tags for these chunks --- app/assets/javascripts/admin/package.json | 5 +- .../javascripts/discourse-common/package.json | 13 +- .../javascripts/discourse-hbr/package.json | 5 +- .../discourse-widget-hbs/package.json | 5 +- app/assets/javascripts/discourse/package.json | 9 +- .../javascripts/pretty-text/package.json | 5 +- .../javascripts/select-kit/package.json | 3 +- .../javascripts/truth-helpers/package.json | 5 +- app/assets/javascripts/yarn.lock | 1785 ++++++++++++++++- app/helpers/application_helper.rb | 16 + app/views/layouts/application.html.erb | 2 +- app/views/qunit/index.html.erb | 2 +- app/views/users/activate_account.html.erb | 2 +- 13 files changed, 1737 insertions(+), 120 deletions(-) diff --git a/app/assets/javascripts/admin/package.json b/app/assets/javascripts/admin/package.json index 8608b42a45..bd0e0da1a7 100644 --- a/app/assets/javascripts/admin/package.json +++ b/app/assets/javascripts/admin/package.json @@ -15,10 +15,11 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^1.5.3", + "ember-auto-import": "^2.2.4", "ember-cli-babel": "^7.13.0", "ember-cli-htmlbars": "^4.2.0", - "xss": "^1.0.8" + "xss": "^1.0.8", + "webpack": "^5.67.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse-common/package.json b/app/assets/javascripts/discourse-common/package.json index 9f39f2e1ad..68f1a4c629 100644 --- a/app/assets/javascripts/discourse-common/package.json +++ b/app/assets/javascripts/discourse-common/package.json @@ -15,17 +15,18 @@ "start": "ember serve" }, "dependencies": { - "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "ember-auto-import": "^1.5.3", - "handlebars": "^4.7.0", - "truth-helpers": "^1.0.0", "@uppy/aws-s3": "^2.0.4", "@uppy/aws-s3-multipart": "^2.1.0", "@uppy/core": "^2.1.0", "@uppy/drop-target": "^1.1.0", "@uppy/utils": "^4.0.3", - "@uppy/xhr-upload": "^2.0.4" + "@uppy/xhr-upload": "^2.0.4", + "ember-auto-import": "^2.2.4", + "ember-cli-babel": "^7.13.0", + "ember-cli-htmlbars": "^4.2.0", + "handlebars": "^4.7.0", + "truth-helpers": "^1.0.0", + "webpack": "^5.67.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse-hbr/package.json b/app/assets/javascripts/discourse-hbr/package.json index 0b290a071f..c93fc5c69f 100644 --- a/app/assets/javascripts/discourse-hbr/package.json +++ b/app/assets/javascripts/discourse-hbr/package.json @@ -15,9 +15,10 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^1.5.3", + "ember-auto-import": "^2.2.4", "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0" + "ember-cli-htmlbars": "^4.2.0", + "webpack": "^5.67.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse-widget-hbs/package.json b/app/assets/javascripts/discourse-widget-hbs/package.json index 06a8626fd8..9efdb12804 100644 --- a/app/assets/javascripts/discourse-widget-hbs/package.json +++ b/app/assets/javascripts/discourse-widget-hbs/package.json @@ -15,9 +15,10 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^1.5.3", + "ember-auto-import": "^2.2.4", "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0" + "ember-cli-htmlbars": "^4.2.0", + "webpack": "^5.67.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse/package.json b/app/assets/javascripts/discourse/package.json index 7b234f6291..013f5cedba 100644 --- a/app/assets/javascripts/discourse/package.json +++ b/app/assets/javascripts/discourse/package.json @@ -34,7 +34,7 @@ "discourse-common": "^1.0.0", "discourse-hbr": "^1.0.0", "discourse-widget-hbs": "^1.0.0", - "ember-auto-import": "^1.12.0", + "ember-auto-import": "^2.2.4", "ember-buffered-proxy": "^2.0.0-beta.0", "ember-cli": "~3.25.3", "ember-cli-app-version": "^4.0.0", @@ -44,7 +44,7 @@ "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-sri": "^2.1.1", "ember-cli-terser": "^4.0.1", - "ember-exam": "6.1.0", + "ember-exam": "^7.0.1", "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.1", "ember-maybe-import-regenerator": "^0.1.6", @@ -67,7 +67,8 @@ "sass": "^1.32.8", "select-kit": "^1.0.0", "sinon": "^9.2.0", - "virtual-dom": "^2.1.1" + "virtual-dom": "^2.1.1", + "webpack": "^5.67.0" }, "engines": { "node": "12.* || 14.* || >= 16", @@ -84,6 +85,6 @@ ] }, "devDependencies": { - "ember-exam": "6.1.0" + "ember-exam": "^7.0.1" } } diff --git a/app/assets/javascripts/pretty-text/package.json b/app/assets/javascripts/pretty-text/package.json index 9619aa7198..59c35d79fa 100644 --- a/app/assets/javascripts/pretty-text/package.json +++ b/app/assets/javascripts/pretty-text/package.json @@ -15,10 +15,11 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^1.5.3", + "ember-auto-import": "^2.2.4", "ember-cli-babel": "^7.13.0", "ember-cli-htmlbars": "^4.2.0", - "xss": "^1.0.8" + "xss": "^1.0.8", + "webpack": "^5.67.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/select-kit/package.json b/app/assets/javascripts/select-kit/package.json index eb95c12d0b..d7b1f548de 100644 --- a/app/assets/javascripts/select-kit/package.json +++ b/app/assets/javascripts/select-kit/package.json @@ -17,7 +17,8 @@ "dependencies": { "ember-cli-babel": "^7.13.0", "ember-cli-htmlbars": "^4.2.0", - "ember-auto-import": "^1.5.3" + "ember-auto-import": "^2.2.4", + "webpack": "^5.67.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/truth-helpers/package.json b/app/assets/javascripts/truth-helpers/package.json index 132705b564..20ea6f12a0 100644 --- a/app/assets/javascripts/truth-helpers/package.json +++ b/app/assets/javascripts/truth-helpers/package.json @@ -15,9 +15,10 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^1.5.3", + "ember-auto-import": "^2.2.4", "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0" + "ember-cli-htmlbars": "^4.2.0", + "webpack": "^5.67.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/yarn.lock b/app/assets/javascripts/yarn.lock index 80a80588c2..7c1f0500cb 100644 --- a/app/assets/javascripts/yarn.lock +++ b/app/assets/javascripts/yarn.lock @@ -16,11 +16,23 @@ dependencies: "@babel/highlight" "^7.12.13" +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== +"@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.14.3", "@babel/core@^7.3.4": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" @@ -42,6 +54,27 @@ semver "^6.3.0" source-map "^0.5.0" +"@babel/core@^7.16.7": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" + integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.12" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.10" + "@babel/types" "^7.16.8" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + "@babel/generator@^7.14.2", "@babel/generator@^7.14.3": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" @@ -51,6 +84,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== + dependencies: + "@babel/types" "^7.16.8" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -58,6 +100,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" @@ -66,6 +115,14 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" @@ -76,6 +133,16 @@ browserslist "^4.14.5" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.13.11", "@babel/helper-create-class-features-plugin@^7.5.5": version "7.13.11" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" @@ -87,6 +154,19 @@ "@babel/helper-replace-supers" "^7.13.0" "@babel/helper-split-export-declaration" "^7.12.13" +"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" + integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-create-regexp-features-plugin@^7.12.13": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" @@ -95,6 +175,14 @@ "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" + integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^4.7.1" + "@babel/helper-define-polyfill-provider@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" @@ -109,6 +197,27 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-explode-assignable-expression@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" @@ -116,6 +225,13 @@ dependencies: "@babel/types" "^7.13.0" +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" @@ -125,6 +241,15 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.14.2" +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -132,6 +257,13 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-hoist-variables@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" @@ -140,6 +272,13 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" @@ -147,6 +286,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" @@ -154,6 +300,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" @@ -168,6 +321,20 @@ "@babel/traverse" "^7.14.2" "@babel/types" "^7.14.2" +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -175,11 +342,23 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== +"@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + "@babel/helper-remap-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" @@ -189,6 +368,15 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" + "@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" @@ -199,6 +387,17 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.12" +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" @@ -206,6 +405,13 @@ dependencies: "@babel/types" "^7.13.12" +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -213,6 +419,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-split-export-declaration@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" @@ -220,16 +433,33 @@ dependencies: "@babel/types" "^7.12.13" +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + "@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + "@babel/helper-wrap-function@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" @@ -240,6 +470,16 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== + dependencies: + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" + "@babel/helpers@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" @@ -249,6 +489,15 @@ "@babel/traverse" "^7.14.0" "@babel/types" "^7.14.0" +"@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" @@ -258,11 +507,32 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.16.7": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== +"@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" + integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" @@ -272,6 +542,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-proposal-optional-chaining" "^7.13.12" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions@^7.13.15": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" @@ -281,6 +560,15 @@ "@babel/helper-remap-async-to-generator" "^7.13.0" "@babel/plugin-syntax-async-generators" "^7.8.4" +"@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" @@ -289,6 +577,23 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-class-properties@^7.16.5", "@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-class-static-block@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" + integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-proposal-decorators@^7.13.5": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz#e91ccfef2dc24dd5bd5dcc9fc9e2557c684ecfb8" @@ -298,6 +603,15 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-decorators" "^7.12.13" +"@babel/plugin-proposal-decorators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz#922907d2e3e327f5b07d2246bcfc0bd438f360d2" + integrity sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-decorators" "^7.16.7" + "@babel/plugin-proposal-dynamic-import@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" @@ -306,6 +620,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" @@ -314,6 +636,14 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" @@ -322,6 +652,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-json-strings" "^7.8.3" +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-proposal-logical-assignment-operators@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" @@ -330,6 +668,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" @@ -338,6 +684,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-proposal-numeric-separator@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" @@ -346,6 +700,14 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" @@ -357,6 +719,17 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.13.0" +"@babel/plugin-proposal-object-rest-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== + dependencies: + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" @@ -365,6 +738,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-proposal-optional-chaining@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" @@ -374,6 +755,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-proposal-private-methods@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" @@ -382,6 +772,24 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-proposal-private-methods@^7.16.11", "@babel/plugin-proposal-private-methods@^7.16.5": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.10" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-private-property-in-object@^7.16.5", "@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" @@ -390,6 +798,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-proposal-unicode-property-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -404,6 +820,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-decorators@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" @@ -411,6 +834,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-decorators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" + integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -474,6 +904,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-top-level-await@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -481,6 +918,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript@^7.12.13", "@babel/plugin-syntax-typescript@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" @@ -495,6 +939,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" @@ -504,6 +955,15 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-remap-async-to-generator" "^7.13.0" +"@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" @@ -511,6 +971,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-block-scoping@^7.12.13", "@babel/plugin-transform-block-scoping@^7.6.2": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" @@ -518,6 +985,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-classes@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" @@ -531,6 +1005,20 @@ "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" @@ -538,6 +1026,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-destructuring@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" @@ -545,6 +1040,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-destructuring@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" @@ -553,6 +1055,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-dotall-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-duplicate-keys@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" @@ -560,6 +1070,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" @@ -568,6 +1085,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-for-of@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" @@ -575,6 +1100,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-function-name@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" @@ -583,6 +1115,15 @@ "@babel/helper-function-name" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== + dependencies: + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-literals@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" @@ -590,6 +1131,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-member-expression-literals@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" @@ -597,6 +1145,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" @@ -606,6 +1161,15 @@ "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-commonjs@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" @@ -616,6 +1180,16 @@ "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-commonjs@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-systemjs@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" @@ -627,6 +1201,17 @@ "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-systemjs@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== + dependencies: + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-umd@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" @@ -635,6 +1220,14 @@ "@babel/helper-module-transforms" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" @@ -642,6 +1235,13 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.12.13" +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" + integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/plugin-transform-new-target@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" @@ -649,6 +1249,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-object-assign@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz#d9b9200a69e03403a813e44a933ad9f4bddfd050" @@ -664,6 +1271,14 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-replace-supers" "^7.12.13" +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/plugin-transform-parameters@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" @@ -671,6 +1286,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-property-literals@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" @@ -678,6 +1300,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-regenerator@^7.13.15": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" @@ -685,6 +1314,13 @@ dependencies: regenerator-transform "^0.14.2" +"@babel/plugin-transform-regenerator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== + dependencies: + regenerator-transform "^0.14.2" + "@babel/plugin-transform-reserved-words@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" @@ -692,6 +1328,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.13.9": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz#2eddf585dd066b84102517e10a577f24f76a9cd7" @@ -711,6 +1354,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-spread@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" @@ -719,6 +1369,14 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" +"@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-transform-sticky-regex@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" @@ -726,6 +1384,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-template-literals@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" @@ -733,6 +1398,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" +"@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-typeof-symbol@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" @@ -740,6 +1412,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-typescript@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" @@ -773,6 +1452,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-unicode-regex@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" @@ -781,6 +1467,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/polyfill@^7.11.5": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" @@ -864,6 +1558,86 @@ core-js-compat "^3.9.0" semver "^6.3.0" +"@babel/preset-env@^7.16.5", "@babel/preset-env@^7.16.7": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" + integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== + dependencies: + "@babel/compat-data" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.16.8" + "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.8" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.20.2" + semver "^6.3.0" + "@babel/preset-modules@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" @@ -875,6 +1649,17 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + "@babel/runtime@7.12.18": version "7.12.18" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" @@ -898,6 +1683,15 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" @@ -912,6 +1706,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" + integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.10" + "@babel/types" "^7.16.8" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" @@ -920,6 +1730,14 @@ "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" +"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1018,45 +1836,6 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" -"@embroider/core@0.36.0": - version "0.36.0" - resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.36.0.tgz#fbbd60d29c3fcbe02b4e3e63e6043a43de2b9ce3" - integrity sha512-J6esENP+aNt+/r070cF1RCJyCi/Rn1I6uFp37vxyLWwvGDuT0E7wGcaPU29VBkBFqxi4Z1n4F796BaGHv+kX6w== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.12.3" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.12.1" - "@babel/runtime" "^7.12.5" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - "@embroider/macros" "0.36.0" - assert-never "^1.1.0" - babel-plugin-syntax-dynamic-import "^6.18.0" - broccoli-node-api "^1.7.0" - broccoli-persistent-filter "^3.1.2" - broccoli-plugin "^4.0.1" - broccoli-source "^3.0.0" - debug "^3.1.0" - escape-string-regexp "^4.0.0" - fast-sourcemap-concat "^1.4.0" - filesize "^4.1.2" - fs-extra "^7.0.1" - fs-tree-diff "^2.0.0" - handlebars "^4.4.2" - js-string-escape "^1.0.1" - jsdom "^16.4.0" - json-stable-stringify "^1.0.1" - lodash "^4.17.10" - pkg-up "^3.1.0" - resolve "^1.8.1" - resolve-package-path "^1.2.2" - semver "^7.3.2" - strip-bom "^3.0.0" - typescript-memoize "^1.0.0-alpha.3" - walk-sync "^1.1.3" - wrap-legacy-hbs-plugin-if-needed "^1.0.1" - "@embroider/macros@0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" @@ -1072,21 +1851,59 @@ resolve "^1.8.1" semver "^7.3.2" -"@embroider/macros@0.36.0", "@embroider/macros@^0.36.0": - version "0.36.0" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.36.0.tgz#5330f1e6f12112f0f68e34b3e4855dc7dd3c69a5" - integrity sha512-w37G4uXG+Wi3K3EHSFBSr/n6kGFXYG8nzZ9ptzDOC7LP3Oh5/MskBnVZW3+JkHXUPEqKsDGlxPxCVpPl1kQyjQ== +"@embroider/macros@^0.47.0": + version "0.47.2" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.47.2.tgz#23cbe92cac3c24747f054e1eea2a22538bf7ebd0" + integrity sha512-ViNWluJCeM5OPlM3rs8kdOz3RV5rpfXX5D2rDnc/q86xRS0xf4NFEjYRV7W6fBcD0b3v5jSHDTwrjq9Kee4rHg== dependencies: - "@babel/core" "^7.12.3" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - "@embroider/core" "0.36.0" - assert-never "^1.1.0" - ember-cli-babel "^7.23.0" - lodash "^4.17.10" - resolve "^1.8.1" + "@embroider/shared-internals" "0.47.2" + assert-never "^1.2.1" + ember-cli-babel "^7.26.6" + find-up "^5.0.0" + lodash "^4.17.21" + resolve "^1.20.0" semver "^7.3.2" +"@embroider/macros@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-1.0.0.tgz#2dfab550ba4e03cbf6e3524759949749ced98cc2" + integrity sha512-RutDJ27j1eFQulyv83yJm27oSypsMd/UZyy62Q0NU00TIsIgQPCXaDiGIONWcJuAAVbtBRP3X4LMvaBAeq5g+A== + dependencies: + "@embroider/shared-internals" "1.0.0" + assert-never "^1.2.1" + babel-import-util "^1.1.0" + ember-cli-babel "^7.26.6" + find-up "^5.0.0" + lodash "^4.17.21" + resolve "^1.20.0" + semver "^7.3.2" + +"@embroider/shared-internals@0.47.2": + version "0.47.2" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.47.2.tgz#24e9fa0dd9c529d5c996ee1325729ea08d1fa19f" + integrity sha512-SxdZYjAE0fiM5zGDz+12euWIsQZ1tsfR1k+NKmiWMyLhA5T3pNgbR2/Djvx/cVIxOtEavGGSllYbzRKBtV4xMg== + dependencies: + babel-import-util "^0.2.0" + ember-rfc176-data "^0.3.17" + fs-extra "^9.1.0" + lodash "^4.17.21" + resolve-package-path "^4.0.1" + semver "^7.3.5" + typescript-memoize "^1.0.1" + +"@embroider/shared-internals@1.0.0", "@embroider/shared-internals@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-1.0.0.tgz#b081708ac79e4582f17ba0f3e3796e6612a8976c" + integrity sha512-Vx3dmejJxI5MG/qC7or3EUZY0AZBSBNOAR50PYotX3LxUSb4lAm5wISPnFbwEY4bbo2VhL/6XtWjMv8ZMcaP+g== + dependencies: + babel-import-util "^1.1.0" + ember-rfc176-data "^0.3.17" + fs-extra "^9.1.0" + lodash "^4.17.21" + resolve-package-path "^4.0.1" + semver "^7.3.5" + typescript-memoize "^1.0.1" + "@eslint/eslintrc@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" @@ -1354,6 +2171,27 @@ dependencies: "@types/node" "*" +"@types/eslint-scope@^3.7.0": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" + integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^0.0.50": + version "0.0.50" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== + "@types/express-serve-static-core@^4.17.18": version "4.17.19" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" @@ -1395,6 +2233,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + "@types/json-schema@^7.0.5": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" @@ -1410,6 +2253,11 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== +"@types/minimatch@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + "@types/node@*": version "14.14.37" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" @@ -1514,6 +2362,14 @@ "@uppy/utils" "^4.0.3" nanoid "^3.1.25" +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -1523,16 +2379,31 @@ "@webassemblyjs/helper-wasm-bytecode" "1.9.0" "@webassemblyjs/wast-parser" "1.9.0" +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + "@webassemblyjs/floating-point-hex-parser@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + "@webassemblyjs/helper-api-error@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + "@webassemblyjs/helper-buffer@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" @@ -1557,11 +2428,35 @@ dependencies: "@webassemblyjs/ast" "1.9.0" +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== + "@webassemblyjs/helper-wasm-bytecode@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/helper-wasm-section@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" @@ -1572,6 +2467,13 @@ "@webassemblyjs/helper-wasm-bytecode" "1.9.0" "@webassemblyjs/wasm-gen" "1.9.0" +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== + dependencies: + "@xtuc/ieee754" "^1.2.0" + "@webassemblyjs/ieee754@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" @@ -1579,6 +2481,13 @@ dependencies: "@xtuc/ieee754" "^1.2.0" +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== + dependencies: + "@xtuc/long" "4.2.2" + "@webassemblyjs/leb128@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" @@ -1586,11 +2495,30 @@ dependencies: "@xtuc/long" "4.2.2" +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + "@webassemblyjs/utf8@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + "@webassemblyjs/wasm-edit@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" @@ -1605,6 +2533,17 @@ "@webassemblyjs/wasm-parser" "1.9.0" "@webassemblyjs/wast-printer" "1.9.0" +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + "@webassemblyjs/wasm-gen@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" @@ -1616,6 +2555,16 @@ "@webassemblyjs/leb128" "1.9.0" "@webassemblyjs/utf8" "1.9.0" +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wasm-opt@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" @@ -1626,6 +2575,18 @@ "@webassemblyjs/wasm-gen" "1.9.0" "@webassemblyjs/wasm-parser" "1.9.0" +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + "@webassemblyjs/wasm-parser@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" @@ -1650,6 +2611,14 @@ "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@xtuc/long" "4.2.2" + "@webassemblyjs/wast-printer@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" @@ -1695,6 +2664,11 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" @@ -1720,6 +2694,11 @@ acorn@^8.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.1.tgz#fb0026885b9ac9f48bac1e185e4af472971149ff" integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g== +acorn@^8.4.1: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + acorn@^8.5.0: version "8.6.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" @@ -1742,12 +2721,26 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1757,6 +2750,16 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^8.0.0, ajv@^8.8.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" + integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + ajv@^8.0.1: version "8.5.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" @@ -1989,7 +2992,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-never@^1.1.0: +assert-never@^1.1.0, assert-never@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== @@ -2281,6 +3284,16 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-import-util@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-0.2.0.tgz#b468bb679919601a3570f9e317536c54f2862e23" + integrity sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag== + +babel-import-util@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-1.1.0.tgz#4156b16ef090c4f0d3cdb869ff799202f24aeb93" + integrity sha512-sfzgAiJsUT1es9yrHAuJZuJfBkkOE7Og6rovAIwK/gNJX6MjDfWTprbPngdJZTd5ye4F3FvpvpQmvKXObRzVYA== + babel-loader@^8.0.6: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -2371,6 +3384,17 @@ babel-plugin-htmlbars-inline-precompile@^5.0.0: parse-static-imports "^1.1.0" string.prototype.matchall "^4.0.4" +babel-plugin-htmlbars-inline-precompile@^5.2.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-5.3.1.tgz#5ba272e2e4b6221522401f5f1d98a73b1de38787" + integrity sha512-QWjjFgSKtSRIcsBhJmEwS2laIdrA6na8HAlc/pEAhjHgQsah/gMiBFRZvbQTy//hWxR4BMwV7/Mya7q5H8uHeA== + dependencies: + babel-plugin-ember-modules-api-polyfill "^3.5.0" + line-column "^1.0.2" + magic-string "^0.25.7" + parse-static-imports "^1.1.0" + string.prototype.matchall "^4.0.5" + babel-plugin-module-resolver@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" @@ -2402,6 +3426,15 @@ babel-plugin-polyfill-corejs2@^0.2.0: "@babel/helper-define-polyfill-provider" "^0.2.0" semver "^6.1.1" +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== + dependencies: + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.3.1" + semver "^6.1.1" + babel-plugin-polyfill-corejs3@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" @@ -2410,6 +3443,14 @@ babel-plugin-polyfill-corejs3@^0.2.0: "@babel/helper-define-polyfill-provider" "^0.2.0" core-js-compat "^3.9.1" +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" + integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.20.0" + babel-plugin-polyfill-regenerator@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" @@ -2417,6 +3458,13 @@ babel-plugin-polyfill-regenerator@^0.2.0: dependencies: "@babel/helper-define-polyfill-provider" "^0.2.0" +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.3.1" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -3220,6 +4268,19 @@ broccoli-funnel@^3.0.3: path-posix "^1.0.0" walk-sync "^2.0.2" +broccoli-funnel@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.8.tgz#f5b62e2763c3918026a15a3c833edc889971279b" + integrity sha512-ng4eIhPYiXqMw6SyGoxPHR3YAwEd2lr9FgBI1CyTbspl4txZovOsmzFkMkGAlu88xyvYXJqHiM2crfLa65T1BQ== + dependencies: + array-equal "^1.0.0" + broccoli-plugin "^4.0.7" + debug "^4.1.1" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + walk-sync "^2.0.2" + broccoli-kitchen-sink-helpers@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" @@ -3440,6 +4501,19 @@ broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli rimraf "^3.0.2" symlink-or-copy "^1.3.1" +broccoli-plugin@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" + integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-output-wrapper "^3.2.5" + fs-merger "^3.2.1" + promise-map-series "^0.3.0" + quick-temp "^0.1.8" + rimraf "^3.0.2" + symlink-or-copy "^1.3.1" + broccoli-slow-trees@^3.0.1, broccoli-slow-trees@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.1.0.tgz#8e48903f59e061bf1213963733b9e61dec2ee5d7" @@ -3653,6 +4727,17 @@ browserslist@^4.14.5, browserslist@^4.16.3: escalade "^3.1.1" node-releases "^1.1.71" +browserslist@^4.17.5, browserslist@^4.19.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== + dependencies: + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3795,6 +4880,11 @@ caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001208: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz#066a506046ba4be34cde5f74a08db7a396718fb7" integrity sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA== +caniuse-lite@^1.0.30001286: + version "1.0.30001301" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz#ebc9086026534cab0dab99425d9c3b4425e5f450" + integrity sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -3856,6 +4946,14 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -4307,6 +5405,14 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +core-js-compat@^3.20.0, core-js-compat@^3.20.2: + version "3.20.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" + integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== + dependencies: + browserslist "^4.19.1" + semver "7.0.0" + core-js-compat@^3.9.0, core-js-compat@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.10.1.tgz#62183a3a77ceeffcc420d907a3e6fc67d9b27f1c" @@ -4412,6 +5518,27 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +css-loader@^5.2.0: + version "5.2.7" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" + integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== + dependencies: + icss-utils "^5.1.0" + loader-utils "^2.0.0" + postcss "^8.2.15" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.5" + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + cssfilter@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" @@ -4495,6 +5622,13 @@ debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: dependencies: ms "^2.1.1" +debug@^4.3.1: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -4762,6 +5896,11 @@ electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.712: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.712.tgz#ae467ffe5f95961c6d41ceefe858fc36eb53b38f" integrity sha512-3kRVibBeCM4vsgoHHGKHmPocLqtFAGTrebXxxtgKs87hNUzXrX2NuS3jnBys7IozCnw7viQlozxKkmty2KNfrw== +electron-to-chromium@^1.4.17: + version "1.4.51" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.51.tgz#a432f5a5d983ace79278a33057300cf949627e63" + integrity sha512-JNEmcYl3mk1tGQmy0EvL5eik/CKSBuzAyGP0QFdG6LIgxQe3II0BL1m2zKc2MZMf3uGqHWE1TFddJML0RpjSHQ== + elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -4775,7 +5914,7 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -ember-auto-import@^1.10.1, ember-auto-import@^1.5.3: +ember-auto-import@^1.10.1: version "1.11.2" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.2.tgz#b6e9a0dddd88a10692830ffa4f5dfd8c137c8919" integrity sha512-Sm0x9qgAQEx+XSYeh5zeKj89Uo0c7XzULZxuziFPxbhtKy/G4pywhBuQ7EgDznTj8IZVxOdfe4ufcUxnJtbSgg== @@ -4810,40 +5949,41 @@ ember-auto-import@^1.10.1, ember-auto-import@^1.5.3: walk-sync "^0.3.3" webpack "^4.43.0" -ember-auto-import@^1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.12.0.tgz#52246b04891090e2608244e65c4c6af7710df12b" - integrity sha512-fzMGnyHGfUNFHchpLbJ98Vs/c5H2wZBMR9r/XwW+WOWPisZDGLUPPyhJQsSREPoUQ+o8GvyLaD/rkrKqW8bmgw== +ember-auto-import@^2.2.3, ember-auto-import@^2.2.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.4.0.tgz#91c4797f08315728086e35af954cb60bd23c14bc" + integrity sha512-BwF6iTaoSmT2vJ9NEHEGRBCh2+qp+Nlaz/Q7roqNSxl5oL5iMRwenPnHhOoBPTYZvPhcV/KgXR5e+pBQ107plQ== dependencies: - "@babel/core" "^7.1.6" - "@babel/preset-env" "^7.10.2" - "@babel/traverse" "^7.1.6" - "@babel/types" "^7.1.6" - "@embroider/core" "^0.33.0" - babel-core "^6.26.3" + "@babel/core" "^7.16.7" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-decorators" "^7.16.7" + "@babel/preset-env" "^7.16.7" + "@embroider/macros" "^1.0.0" + "@embroider/shared-internals" "^1.0.0" babel-loader "^8.0.6" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-htmlbars-inline-precompile "^5.2.1" babel-plugin-syntax-dynamic-import "^6.18.0" - babylon "^6.18.0" broccoli-debug "^0.6.4" - broccoli-node-api "^1.7.0" + broccoli-funnel "^3.0.8" + broccoli-merge-trees "^4.2.0" broccoli-plugin "^4.0.0" broccoli-source "^3.0.0" - debug "^3.1.0" - ember-cli-babel "^7.0.0" - enhanced-resolve "^4.0.0" + css-loader "^5.2.0" + debug "^4.3.1" fs-extra "^6.0.1" fs-tree-diff "^2.0.0" handlebars "^4.3.1" js-string-escape "^1.0.1" lodash "^4.17.19" - mkdirp "^0.5.1" + mini-css-extract-plugin "^2.5.2" + parse5 "^6.0.1" + resolve "^1.20.0" resolve-package-path "^3.1.0" - rimraf "^2.6.2" semver "^7.3.4" - symlink-or-copy "^1.2.0" + style-loader "^2.0.0" typescript-memoize "^1.0.0-alpha.3" - walk-sync "^0.3.3" - webpack "^4.43.0" + walk-sync "^3.0.0" ember-buffered-proxy@^2.0.0-beta.0: version "2.0.0-beta.0" @@ -4919,6 +6059,42 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember- rimraf "^3.0.1" semver "^5.5.0" +ember-cli-babel@^7.26.6: + version "7.26.11" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.11.tgz#50da0fe4dcd99aada499843940fec75076249a9f" + integrity sha512-JJYeYjiz/JTn34q7F5DSOjkkZqy8qwFOOxXfE6pe9yEJqWGu4qErKxlz8I22JoVEQ/aBUO+OcKTpmctvykM9YA== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.16.5" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-proposal-private-methods" "^7.16.5" + "@babel/plugin-proposal-private-property-in-object" "^7.16.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.16.5" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" + babel-plugin-ember-data-packages-polyfill "^0.1.2" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" + broccoli-babel-transpiler "^7.8.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" + calculate-cache-key-for-tree "^2.0.0" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^4.1.0" + ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" + rimraf "^3.0.1" + semver "^5.5.0" + ember-cli-dependency-checker@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.2.0.tgz#9202ad9e14d6fda33cffc22a11c343c2a8885330" @@ -5284,20 +6460,20 @@ ember-disable-prototype-extensions@^1.1.3: resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= -ember-exam@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ember-exam/-/ember-exam-6.1.0.tgz#1ea2c0ece27ac8ad6a80d959b1c207611b7dfdd7" - integrity sha512-H9tg7eUgqkjAsr1/15UzxGyZobGLgsyTi56Ng0ySnkYGCRfvVpwtVc3xgcNOFnUaa9RExUFpxC0adjW3K87Uxw== +ember-exam@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ember-exam/-/ember-exam-7.0.1.tgz#3735a0e3599e37f8cf5c758f4c7069da3c369a2d" + integrity sha512-m3EskoFrJ1KThlzdS0pjXImXQWgPWqqOJjAnCpz/XmUHUA+EVmvsu/A0F0jRpqXeQpTSFXRl8/TPVduN6+t17A== dependencies: - "@embroider/macros" "^0.36.0" - chalk "^4.1.0" + "@embroider/macros" "^0.47.0" + chalk "^4.1.1" cli-table3 "^0.6.0" debug "^4.2.0" - ember-auto-import "^1.10.1" + ember-auto-import "^2.2.3" ember-cli-babel "^7.21.0" ember-cli-version-checker "^5.1.2" execa "^4.0.3" - fs-extra "^9.0.1" + fs-extra "^10.0.0" js-yaml "^3.14.0" npmlog "^4.1.2" rimraf "^3.0.2" @@ -5559,6 +6735,14 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: memory-fs "^0.5.0" tapable "^1.0.0" +enhanced-resolve@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -5631,6 +6815,37 @@ es-abstract@^1.18.0-next.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.0" +es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -5701,6 +6916,14 @@ eslint-plugin-node@^10.0.0: resolve "^1.10.1" semver "^6.1.0" +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -5709,14 +6932,6 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-utils@^1.3.1, eslint-utils@^1.4.2: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" @@ -5912,7 +7127,7 @@ events-to-array@^1.0.1: resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= -events@^3.0.0: +events@^3.0.0, events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -6522,6 +7737,15 @@ fs-extra@^0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -6589,6 +7813,17 @@ fs-merger@^3.0.1, fs-merger@^3.1.0: rimraf "^2.6.3" walk-sync "^2.0.2" +fs-merger@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" + integrity sha512-AN6sX12liy0JE7C2evclwoo0aCG3PFulLjrTLsJpWh/2mM+DinhpSGqYLbHBBbIW1PLRNcFhJG8Axtz8mQW3ug== + dependencies: + broccoli-node-api "^1.7.0" + broccoli-node-info "^2.1.0" + fs-extra "^8.0.1" + fs-tree-diff "^2.0.1" + walk-sync "^2.2.0" + fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" @@ -6716,6 +7951,14 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -6803,6 +8046,11 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -6970,6 +8218,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== +graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== + graceful-fs@~1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" @@ -7068,6 +8321,13 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -7327,6 +8587,11 @@ iconv-lite@0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -7541,6 +8806,11 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== +is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" @@ -7548,6 +8818,13 @@ is-core-module@^2.2.0: dependencies: has "^1.0.3" +is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -7720,11 +8997,24 @@ is-regex@^1.1.2: call-bind "^1.0.2" has-symbols "^1.0.1" +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -7740,6 +9030,13 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== +is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -7759,6 +9056,13 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakref@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -7844,6 +9148,15 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +jest-worker@^27.4.1: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" + integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jquery@^3.4.1: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" @@ -8173,6 +9486,11 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== +loader-runner@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== + loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" @@ -8182,6 +9500,15 @@ loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + loader.js@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.7.0.tgz#a1a52902001c83631efde9688b8ab3799325ef1f" @@ -8400,7 +9727,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.6.1, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.6.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -8695,6 +10022,11 @@ mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + mime-match@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8" @@ -8709,6 +10041,13 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.26, mime-types@~2.1.19, dependencies: mime-db "1.47.0" +mime-types@^2.1.27: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -8736,6 +10075,13 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" +mini-css-extract-plugin@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz#b3b9b98320c2c054d92c16f6a94ddfdbbba13755" + integrity sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA== + dependencies: + schema-utils "^4.0.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -8893,6 +10239,11 @@ nanoid@^3.1.25: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== +nanoid@^3.1.30: + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -8920,7 +10271,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -9017,6 +10368,11 @@ node-releases@^1.1.71: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + node-watch@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.1.tgz#0caaa6a6833b0d533487f953c52a6c787769ba7c" @@ -9131,6 +10487,11 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== +object-inspect@^1.11.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" + integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== + object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" @@ -9409,7 +10770,7 @@ parse-static-imports@^1.1.0: resolved "https://registry.yarnpkg.com/parse-static-imports/-/parse-static-imports-1.1.0.tgz#ae2f18f18da1a993080ae406a5219455c0bbad5d" integrity sha512-HlxrZcISCblEV0lzXmAHheH/8qEkKgmqkdxyHTPbSqsTUV8GzqmN1L+SSti+VbNPfbBO3bYLPHDiUs2avbAdbA== -parse5@6.0.1: +parse5@6.0.1, parse5@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -9479,6 +10840,11 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + path-posix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" @@ -9536,6 +10902,11 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" @@ -9605,6 +10976,56 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: + version "6.0.9" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" + integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.2.15: + version "8.4.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + preact@^10.5.13: version "10.5.14" resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.14.tgz#0b14a2eefba3c10a57116b90d1a65f5f00cd2701" @@ -10208,6 +11629,13 @@ resolve-package-path@^3.1.0: path-root "^0.1.1" resolve "^1.17.0" +resolve-package-path@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-4.0.3.tgz#31dab6897236ea6613c72b83658d88898a9040aa" + integrity sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA== + dependencies: + path-root "^0.1.1" + resolve-path@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" @@ -10229,6 +11657,15 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.1 is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^1.20.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -10411,6 +11848,25 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -10426,7 +11882,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -10459,6 +11915,13 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" +serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + serve-static@1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" @@ -10731,6 +12194,11 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +source-map-js@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -10757,6 +12225,14 @@ source-map-support@~0.5.12, source-map-support@~0.5.19: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -10975,6 +12451,20 @@ string.prototype.matchall@^4.0.4: regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" +string.prototype.matchall@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.3.1" + side-channel "^1.0.4" + string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" @@ -11068,6 +12558,14 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +style-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + styled_string@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" @@ -11099,6 +12597,18 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -11167,6 +12677,11 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + temp@0.9.4: version "0.9.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" @@ -11190,6 +12705,17 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" +terser-webpack-plugin@^5.1.3: + version "5.3.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz#21641326486ecf91d8054161c816e464435bae9f" + integrity sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ== + dependencies: + jest-worker "^27.4.1" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + terser "^5.7.2" + terser@^4.1.2, terser@^4.3.9: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" @@ -11208,6 +12734,15 @@ terser@^5.3.0: source-map "~0.7.2" source-map-support "~0.5.19" +terser@^5.7.2: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + testem@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.0.tgz#48ab6b98e96085eeddac1fb46337872b13e9e06c" @@ -11553,6 +13088,11 @@ typescript-memoize@^1.0.0-alpha.3: resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.1.tgz#0a8199aa28f6fe18517f6e9308ef7bfbe9a98d59" integrity sha512-oJNge1qUrOK37d5Y6Ly2txKeuelYVsFtNF6U9kXIN7juudcQaHJQg2MxLOy0CqtkW65rVDYuTCOjnSIVPd8z3w== +typescript-memoize@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.1.0.tgz#4a8f512d06fc995167c703a3592219901db8bc79" + integrity sha512-LQPKVXK8QrBBkL/zclE6YgSWn0I8ew5m0Lf+XL00IwMhlotqRLlzHV+BRrljVQIc+NohUAuQP7mg4HQwrx5Xbg== + uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -11563,7 +13103,7 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== -unbox-primitive@^1.0.0: +unbox-primitive@^1.0.0, unbox-primitive@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== @@ -11888,6 +13428,16 @@ walk-sync@^2.0.0, walk-sync@^2.0.2, walk-sync@^2.2.0: matcher-collection "^2.0.0" minimatch "^3.0.4" +walk-sync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-3.0.0.tgz#67f882925021e20569a1edd560b8da31da8d171c" + integrity sha512-41TvKmDGVpm2iuH7o+DAOt06yyu/cSHpX3uzAwetzASvlNtVddgIjXIb2DfB/Wa20B1Jo86+1Dv1CraSU7hWdw== + dependencies: + "@types/minimatch" "^3.0.4" + ensure-posix-path "^1.1.0" + matcher-collection "^2.0.1" + minimatch "^3.0.4" + walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -11923,6 +13473,14 @@ watchpack@^1.7.4: chokidar "^3.4.1" watchpack-chokidar2 "^2.0.1" +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + watchr@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/watchr/-/watchr-1.0.0.tgz#ce023fd59edae9430523031915c1812ff2302c27" @@ -11963,6 +13521,11 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-list-map "^2.0.0" source-map "~0.6.1" +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + webpack@^4.43.0: version "4.46.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" @@ -11992,6 +13555,36 @@ webpack@^4.43.0: watchpack "^1.7.4" webpack-sources "^1.4.1" +webpack@^5.67.0: + version "5.67.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.67.0.tgz#cb43ca2aad5f7cc81c4cd36b626e6b819805dbfd" + integrity sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw== + dependencies: + "@types/eslint-scope" "^3.7.0" + "@types/estree" "^0.0.50" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-better-errors "^1.0.2" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" + websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f232bd5b7e..8b1e7fe447 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -135,6 +135,22 @@ module ApplicationHelper path end + def preload_vendor_scripts + scripts = ["vendor"] + + if ENV["EMBER_CLI_PROD_ASSETS"] == "1" + @@vendor_chunks ||= begin + all_assets = ActionController::Base.helpers.assets_manifest.assets + all_assets.keys.filter_map { |name| name[/\A(chunk\..*)\.js\z/, 1] } + end + scripts.push(*@@vendor_chunks) + end + + scripts.map do |name| + preload_script(name) + end.join("\n").html_safe + end + def preload_script(script) path = script_asset_path(script) preload_script_url(path) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index ed984a5bb5..98b4fca1a5 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -29,7 +29,7 @@ <%- if ExtraLocalesController.client_overrides_exist? %> <%= preload_script_url ExtraLocalesController.url('overrides') %> <%- end %> - <%= preload_script "vendor" %> + <%= preload_vendor_scripts %> <%= preload_script "application" %> <%- Discourse.find_plugin_js_assets(include_official: allow_plugins?, include_unofficial: allow_third_party_plugins?, request: request).each do |file| %> <%= preload_script file %> diff --git a/app/views/qunit/index.html.erb b/app/views/qunit/index.html.erb index 9912387a2d..b4708db959 100644 --- a/app/views/qunit/index.html.erb +++ b/app/views/qunit/index.html.erb @@ -6,7 +6,7 @@ <%= discourse_stylesheet_link_tag(:desktop, theme_id: nil) %> <%= discourse_stylesheet_link_tag(:test_helper, theme_id: nil) %> <%= preload_script "locales/#{I18n.locale}" %> - <%= preload_script "vendor" %> + <%= preload_vendor_scripts %> <%= preload_script "application" %> <%= preload_script "admin" %> <%= preload_script "discourse/tests/test-support-rails" %> diff --git a/app/views/users/activate_account.html.erb b/app/views/users/activate_account.html.erb index 790df1011c..ece50d8113 100644 --- a/app/views/users/activate_account.html.erb +++ b/app/views/users/activate_account.html.erb @@ -10,7 +10,7 @@
<%- content_for(:no_ember_head) do %> - <%= preload_script "vendor" %> + <%= preload_vendor_scripts %> <%= render_google_universal_analytics_code %> <%= tag.meta id: 'data-activate-account', data: { path: path('/session/hp') } %> <%- end %> From c52e8ef8b663bf2712417b90bde5bfbcc8b939d7 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Fri, 4 Feb 2022 14:18:21 +0100 Subject: [PATCH 086/194] DEV: dry up formatting of time options in time-shortcut-picker (#15810) --- .../discourse/app/components/bookmark.js | 4 +-- .../app/components/time-shortcut-picker.js | 34 +++++++++++-------- .../discourse/app/lib/time-shortcut.js | 22 ++++-------- 3 files changed, 26 insertions(+), 34 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/bookmark.js b/app/assets/javascripts/discourse/app/components/bookmark.js index 0e1bbc1049..13035912ea 100644 --- a/app/assets/javascripts/discourse/app/components/bookmark.js +++ b/app/assets/javascripts/discourse/app/components/bookmark.js @@ -297,9 +297,7 @@ export default Component.extend({ id: TIME_SHORTCUT_TYPES.POST_LOCAL_DATE, label: "time_shortcut.post_local_date", time: this._postLocalDate(), - timeFormatted: this._postLocalDate().format( - I18n.t("dates.long_no_year") - ), + timeFormatKey: "dates.long_no_year", hidden: false, }); } diff --git a/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js b/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js index 10219e71fc..5839191f48 100644 --- a/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js +++ b/app/assets/javascripts/discourse/app/components/time-shortcut-picker.js @@ -179,12 +179,6 @@ export default Component.extend({ let options = defaultShortcutOptions(userTimezone); this._hideDynamicOptions(options); - - customOptions.forEach((opt) => { - if (!opt.timeFormatted && opt.time) { - opt.timeFormatted = opt.time.format(I18n.t(opt.timeFormatKey)); - } - }); options = options.concat(customOptions); options.sort((a, b) => { @@ -205,9 +199,7 @@ export default Component.extend({ TIME_SHORTCUT_TYPES.LAST_CUSTOM ); lastCustom.time = this.parsedLastCustomDatetime; - lastCustom.timeFormatted = this.parsedLastCustomDatetime.format( - I18n.t("dates.long_no_year") - ); + lastCustom.timeFormatKey = "dates.long_no_year"; lastCustom.hidden = false; } @@ -221,12 +213,8 @@ export default Component.extend({ }); } - options.forEach((option) => { - if (customLabels[option.id]) { - option.label = customLabels[option.id]; - } - }); - + this._applyCustomLabels(options, customLabels); + this._formatTime(options); return options; }, @@ -276,6 +264,22 @@ export default Component.extend({ } }, + _applyCustomLabels(options, customLabels) { + options.forEach((option) => { + if (customLabels[option.id]) { + option.label = customLabels[option.id]; + } + }); + }, + + _formatTime(options) { + options.forEach((option) => { + if (option.time && option.timeFormatKey) { + option.timeFormatted = option.time.format(I18n.t(option.timeFormatKey)); + } + }); + }, + _hideDynamicOptions(options) { if (now(this.userTimezone).hour() >= LATER_TODAY_CUTOFF_HOUR) { this._hideOption(options, TIME_SHORTCUT_TYPES.LATER_TODAY); diff --git a/app/assets/javascripts/discourse/app/lib/time-shortcut.js b/app/assets/javascripts/discourse/app/lib/time-shortcut.js index 7ee30b041c..37d6585cdf 100644 --- a/app/assets/javascripts/discourse/app/lib/time-shortcut.js +++ b/app/assets/javascripts/discourse/app/lib/time-shortcut.js @@ -9,7 +9,6 @@ import { thisWeekend, tomorrow, } from "discourse/lib/time-utils"; -import I18n from "I18n"; export const TIME_SHORTCUT_TYPES = { LATER_TODAY: "later_today", @@ -32,32 +31,28 @@ export function defaultShortcutOptions(timezone) { id: TIME_SHORTCUT_TYPES.LATER_TODAY, label: "time_shortcut.later_today", time: laterToday(timezone), - timeFormatted: laterToday(timezone).format(I18n.t("dates.time")), + timeFormatKey: "dates.time", }, { icon: "far-sun", id: TIME_SHORTCUT_TYPES.TOMORROW, label: "time_shortcut.tomorrow", time: tomorrow(timezone), - timeFormatted: tomorrow(timezone).format(I18n.t("dates.time_short_day")), + timeFormatKey: "dates.time_short_day", }, { icon: "angle-double-right", id: TIME_SHORTCUT_TYPES.LATER_THIS_WEEK, label: "time_shortcut.later_this_week", time: laterThisWeek(timezone), - timeFormatted: laterThisWeek(timezone).format( - I18n.t("dates.time_short_day") - ), + timeFormatKey: "dates.time_short_day", }, { icon: "bed", id: TIME_SHORTCUT_TYPES.THIS_WEEKEND, label: "time_shortcut.this_weekend", time: thisWeekend(timezone), - timeFormatted: thisWeekend(timezone).format( - I18n.t("dates.time_short_day") - ), + timeFormatKey: "dates.time_short_day", }, { icon: "briefcase", @@ -68,16 +63,14 @@ export function defaultShortcutOptions(timezone) { ? "time_shortcut.start_of_next_business_week_alt" : "time_shortcut.start_of_next_business_week", time: nextBusinessWeekStart(timezone), - timeFormatted: nextBusinessWeekStart(timezone).format( - I18n.t("dates.long_no_year") - ), + timeFormatKey: "dates.long_no_year", }, { icon: "far-calendar-plus", id: TIME_SHORTCUT_TYPES.NEXT_MONTH, label: "time_shortcut.next_month", time: nextMonth(timezone), - timeFormatted: nextMonth(timezone).format(I18n.t("dates.long_no_year")), + timeFormatKey: "dates.long_no_year", }, ]; } @@ -89,7 +82,6 @@ export function specialShortcutOptions() { id: TIME_SHORTCUT_TYPES.LAST_CUSTOM, label: "time_shortcut.last_custom", time: null, - timeFormatted: null, hidden: true, }, { @@ -97,7 +89,6 @@ export function specialShortcutOptions() { id: TIME_SHORTCUT_TYPES.CUSTOM, label: "time_shortcut.custom", time: null, - timeFormatted: null, isCustomTimeShortcut: true, }, { @@ -105,7 +96,6 @@ export function specialShortcutOptions() { id: TIME_SHORTCUT_TYPES.NONE, label: "time_shortcut.none", time: null, - timeFormatted: null, }, ]; } From d13117fa059d7353f47eee7a28202abef0fb3cbb Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Fri, 4 Feb 2022 15:20:38 +0100 Subject: [PATCH 087/194] FEATURE: Select range in topic list with Shift + click (#15682) --- .../app/components/topic-list-item.js | 31 +++++++++++++++---- .../app/mixins/bulk-topic-selection.js | 1 + .../app/templates/components/topic-list.hbs | 1 + .../acceptance/topic-bulk-actions-test.js | 30 +++++++++++++++++- 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/topic-list-item.js b/app/assets/javascripts/discourse/app/components/topic-list-item.js index 21f11a04ba..7e3a46dec8 100644 --- a/app/assets/javascripts/discourse/app/components/topic-list-item.js +++ b/app/assets/javascripts/discourse/app/components/topic-list-item.js @@ -204,25 +204,44 @@ export default Component.extend({ } const topic = this.topic; - const target = $(e.target); - if (target.hasClass("bulk-select")) { + if (e.target.classList.contains("bulk-select")) { const selected = this.selected; - if (target.is(":checked")) { + if (e.target.checked) { selected.addObject(topic); + + if (this.lastChecked && e.shiftKey) { + const bulkSelects = Array.from( + document.querySelectorAll("input.bulk-select") + ), + from = bulkSelects.indexOf(e.target), + to = bulkSelects.findIndex((el) => el.id === this.lastChecked.id), + start = Math.min(from, to), + end = Math.max(from, to); + + bulkSelects + .slice(start, end) + .filter((el) => el.checked !== true) + .forEach((checkbox) => { + checkbox.click(); + }); + } + + this.set("lastChecked", e.target); } else { selected.removeObject(topic); + this.set("lastChecked", null); } } - if (target.hasClass("raw-topic-link")) { + if (e.target.classList.contains("raw-topic-link")) { if (wantsNewWindow(e)) { return true; } - return this.navigateToTopic(topic, target.attr("href")); + return this.navigateToTopic(topic, e.target.getAttribute("href")); } - if (target.closest("a.topic-status").length === 1) { + if (e.target.closest("a.topic-status")) { this.topic.togglePinnedForUser(); return false; } diff --git a/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js b/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js index 64489d4384..4703993b33 100644 --- a/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js +++ b/app/assets/javascripts/discourse/app/mixins/bulk-topic-selection.js @@ -11,6 +11,7 @@ export default Mixin.create({ bulkSelectEnabled: false, autoAddTopicsToBulkSelect: false, selected: null, + lastChecked: null, canBulkSelect: or("currentUser.staff", "showDismissRead", "showResetNew"), diff --git a/app/assets/javascripts/discourse/app/templates/components/topic-list.hbs b/app/assets/javascripts/discourse/app/templates/components/topic-list.hbs index 52ac41fbf6..3ff3f75731 100644 --- a/app/assets/javascripts/discourse/app/templates/components/topic-list.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/topic-list.hbs @@ -41,6 +41,7 @@ expandAllPinned=expandAllPinned lastVisitedTopic=lastVisitedTopic selected=selected + lastChecked=lastChecked tagsForUser=tagsForUser}} {{raw "list/visited-line" lastVisitedTopic=lastVisitedTopic topic=topic}} {{/each}} diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-bulk-actions-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-bulk-actions-test.js index bfd8e811ce..f31f4cb272 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-bulk-actions-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-bulk-actions-test.js @@ -4,7 +4,7 @@ import { queryAll, updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; -import { click, visit } from "@ember/test-helpers"; +import { click, triggerEvent, visit } from "@ember/test-helpers"; import { test } from "qunit"; import I18n from "I18n"; @@ -121,4 +121,32 @@ acceptance("Topic - Bulk Actions", function (needs) { "it closes the bulk select modal" ); }); + + test("bulk select - Shift click selection", async function (assert) { + updateCurrentUser({ moderator: true }); + await visit("/latest"); + await click("button.bulk-select"); + + await click(queryAll("input.bulk-select")[0]); + await triggerEvent(queryAll("input.bulk-select")[3], "click", { + shiftKey: true, + }); + assert.equal( + queryAll("input.bulk-select:checked").length, + 4, + "Shift click selects a range" + ); + + await click("button.bulk-clear-all"); + + await click(queryAll("input.bulk-select")[5]); + await triggerEvent(queryAll("input.bulk-select")[1], "click", { + shiftKey: true, + }); + assert.equal( + queryAll("input.bulk-select:checked").length, + 5, + "Bottom-up Shift click range selection works" + ); + }); }); From 778abb067f2965b57e3b79496ff2e78629db826b Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Fri, 4 Feb 2022 15:26:48 +0100 Subject: [PATCH 088/194] FIX: Caret moves to a wrong position when uploading an image via toolbar (#15684) When uploading an image, we change the uploading placeholder several times. Every time, we correct the position of the cursor after replacing. But we schedule repositioning of cursor to the afterRender queue in Ember Run Loop. As a result, sometimes we replace the placeholder several times but correct the cursor position only once at the end. It just cannot work correctly with scheduling, we'll always be dealing with cumulative error. Removing scheduling fixes the problem. Sadly, I cannot make the test work, I skipped it for now, going to give it another try later. --- .../discourse/app/components/d-editor.js | 4 +-- .../app/mixins/textarea-text-manipulation.js | 20 +++++++------- .../acceptance/composer-uploads-uppy-test.js | 26 ++++++++++++++++++- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/d-editor.js b/app/assets/javascripts/discourse/app/components/d-editor.js index 64dc6fe91b..80e63ce8fb 100644 --- a/app/assets/javascripts/discourse/app/components/d-editor.js +++ b/app/assets/javascripts/discourse/app/components/d-editor.js @@ -477,7 +477,7 @@ export default Component.extend(TextareaTextManipulation, { key: "#", afterComplete: (value) => { this.set("value", value); - return this._focusTextArea(); + schedule("afterRender", this, this._focusTextArea); }, transformComplete: (obj) => { return obj.text; @@ -504,7 +504,7 @@ export default Component.extend(TextareaTextManipulation, { key: ":", afterComplete: (text) => { this.set("value", text); - this._focusTextArea(); + schedule("afterRender", this, this._focusTextArea); }, onKeyUp: (text, cp) => { diff --git a/app/assets/javascripts/discourse/app/mixins/textarea-text-manipulation.js b/app/assets/javascripts/discourse/app/mixins/textarea-text-manipulation.js index ffdad12a25..896cfd9aea 100644 --- a/app/assets/javascripts/discourse/app/mixins/textarea-text-manipulation.js +++ b/app/assets/javascripts/discourse/app/mixins/textarea-text-manipulation.js @@ -25,18 +25,16 @@ export default Mixin.create({ // ensures textarea scroll position is correct _focusTextArea() { - schedule("afterRender", () => { - if (!this.element || this.isDestroying || this.isDestroyed) { - return; - } + if (!this.element || this.isDestroying || this.isDestroyed) { + return; + } - if (!this._textarea) { - return; - } + if (!this._textarea) { + return; + } - this._textarea.blur(); - this._textarea.focus(); - }); + this._textarea.blur(); + this._textarea.focus(); }, _insertBlock(text) { @@ -171,7 +169,7 @@ export default Mixin.create({ this._$textarea.prop("selectionStart", (pre + text).length + 2); this._$textarea.prop("selectionEnd", (pre + text).length + 2); - this._focusTextArea(); + schedule("afterRender", this, this._focusTextArea); }, _addText(sel, text, options) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js index f185994963..b976eb69c4 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-uploads-uppy-test.js @@ -10,7 +10,7 @@ import bootbox from "bootbox"; import { authorizedExtensions } from "discourse/lib/uploads"; import { click, fillIn, settled, visit } from "@ember/test-helpers"; import I18n from "I18n"; -import { test } from "qunit"; +import { skip, test } from "qunit"; import { Promise } from "rsvp"; function pretender(server, helper) { @@ -313,6 +313,30 @@ acceptance("Uppy Composer Attachment - Upload Placeholder", function (needs) { appEvents.trigger("composer:add-files", image); }); + skip("should place cursor properly after inserting a placeholder", async function (assert) { + const appEvents = loggedInUser().appEvents; + const done = assert.async(); + + await visit("/"); + await click("#create-topic"); + await fillIn(".d-editor-input", "The image:\ntext after image"); + const input = query(".d-editor-input"); + input.selectionStart = 10; + input.selectionEnd = 10; + + appEvents.on("composer:all-uploads-complete", () => { + // after uploading we have this in the textarea: + // "The image:\n![avatar.PNG|690x320](upload://yoj8pf9DdIeHRRULyw7i57GAYdz.jpeg)\ntext after image" + // cursor should be just before "text after image": + assert.equal(input.selectionStart, 76); + assert.equal(input.selectionEnd, 76); + done(); + }); + + const image = createFile("avatar.png"); + appEvents.trigger("composer:add-files", image); + }); + test("should be able to paste a table with files and not upload the files", async function (assert) { await visit("/"); await click("#create-topic"); From f0c15dc399ef53a88c9ee12437d0d860d77d0666 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Fri, 4 Feb 2022 15:40:54 +0100 Subject: [PATCH 089/194] Revert "FIX: Image sizes were slightly off in some cases (#15678)" (#15815) This reverts commit eff0106efbf1cec02d46a13460fcd686591e64d8. It causes visible layout issues, especially on mobile. --- app/assets/stylesheets/common/base/topic-post.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/common/base/topic-post.scss b/app/assets/stylesheets/common/base/topic-post.scss index 37ce8a326d..4ca310e6c4 100644 --- a/app/assets/stylesheets/common/base/topic-post.scss +++ b/app/assets/stylesheets/common/base/topic-post.scss @@ -191,6 +191,7 @@ $quote-share-maxwidth: 150px; img:not(.thumbnail):not(.ytp-thumbnail-image):not(.emoji) { max-width: 100%; + height: auto; } } From 0dfaaf49a52977c26e86ee262cfbe4cc3592d9ae Mon Sep 17 00:00:00 2001 From: Discourse Translator Bot Date: Fri, 4 Feb 2022 11:23:45 -0500 Subject: [PATCH 090/194] Update translations (#15816) --- config/locales/client.pl_PL.yml | 2 + config/locales/client.sv.yml | 1 + config/locales/client.tr_TR.yml | 6 ++ config/locales/client.uk.yml | 20 ++++ config/locales/server.ar.yml | 1 - config/locales/server.be.yml | 1 - config/locales/server.ca.yml | 1 - config/locales/server.da.yml | 1 - config/locales/server.de.yml | 5 +- config/locales/server.el.yml | 1 - config/locales/server.es.yml | 1 - config/locales/server.fa_IR.yml | 1 - config/locales/server.fi.yml | 1 - config/locales/server.fr.yml | 1 - config/locales/server.gl.yml | 1 - config/locales/server.he.yml | 2 +- config/locales/server.hu.yml | 3 + config/locales/server.hy.yml | 1 - config/locales/server.it.yml | 1 - config/locales/server.ja.yml | 1 - config/locales/server.ko.yml | 1 - config/locales/server.nb_NO.yml | 1 - config/locales/server.nl.yml | 1 - config/locales/server.pl_PL.yml | 34 +++---- config/locales/server.pt.yml | 1 - config/locales/server.pt_BR.yml | 1 - config/locales/server.ro.yml | 1 - config/locales/server.ru.yml | 6 +- config/locales/server.sv.yml | 4 +- config/locales/server.sw.yml | 1 - config/locales/server.tr_TR.yml | 5 +- config/locales/server.uk.yml | 92 ++++++++++++++++++- config/locales/server.ur.yml | 1 - config/locales/server.vi.yml | 1 - config/locales/server.zh_CN.yml | 1 - config/locales/server.zh_TW.yml | 1 - .../config/locales/client.fa_IR.yml | 1 + .../config/locales/client.he.yml | 1 + .../config/locales/client.hu.yml | 1 + .../config/locales/client.pl_PL.yml | 1 + .../config/locales/client.ru.yml | 1 + .../config/locales/client.tr_TR.yml | 1 + .../styleguide/config/locales/client.uk.yml | 2 + 43 files changed, 164 insertions(+), 48 deletions(-) diff --git a/config/locales/client.pl_PL.yml b/config/locales/client.pl_PL.yml index 9afeb4bab5..ef555640ce 100644 --- a/config/locales/client.pl_PL.yml +++ b/config/locales/client.pl_PL.yml @@ -1609,6 +1609,7 @@ pl_PL: expires_at: "Wygasa po" custom_message: "Opcjonalna wiadomość osobista" send_invite_email: "Zapisz i wyślij e-mail" + send_invite_email_instructions: "Ogranicz zaproszenie do emaila, aby wysłać email z zaproszeniem" save_invite: "Zapisz zaproszenie" invite_saved: "Zaproszenie zapisane." bulk_invite: @@ -4184,6 +4185,7 @@ pl_PL: Korzystanie z interfejsu API o określonym zakresie umożliwia bardziej szczegółowe dostosowywanie uprawnień. Możesz określić, które parametry będą dozwolone. Użyj przecinków, aby oddzielić wiele wartości. title: Zakresy + granular: Ograniczony read_only: Tylko do odczytu global: Globalny global_description: Klucz API nie ma ograniczeń i wszystkie punkty końcowe są dostępne. diff --git a/config/locales/client.sv.yml b/config/locales/client.sv.yml index 08cb2549b4..e9115c1d26 100644 --- a/config/locales/client.sv.yml +++ b/config/locales/client.sv.yml @@ -3074,6 +3074,7 @@ sv: default_list_filter: "Standardlistfilter:" allow_badges_label: "Tillåt utmärkelser i den här kategorin" edit_permissions: "Redigera behörigheter" + reviewable_by_group: "Förutom personal kan innehåll i denna kategori också granskas av:" review_group_name: "gruppnamn" require_topic_approval: "Kräv att en moderator godkänner alla nya ämnen" require_reply_approval: "Kräv att en moderator godkänner alla nya svar" diff --git a/config/locales/client.tr_TR.yml b/config/locales/client.tr_TR.yml index df59d07695..dc7c064e15 100644 --- a/config/locales/client.tr_TR.yml +++ b/config/locales/client.tr_TR.yml @@ -1693,6 +1693,7 @@ tr_TR: title: "Parola Sıfırlama" action: "Parolamı unuttum" invite: "Kullanıcı adınızı veya e-posta adresinizi girin, size bir parola sıfırlama e-postası gönderelim." + invite_no_username: "E-posta adresinizi girin, size bir şifre sıfırlama e-postası göndereceğiz." reset: "Parola Sıfırlama" complete_username: "%{username} kullanıcı adı ile eşleşen bir hesap bulunması durumunda, kısa bir süre içerisinde parolanızı nasıl sıfırlayacağınızı açıklayan bir e-posta alacaksınız." complete_email: "%{email} adresi ile eşleşen bir hesap bulunması durumunda, kısa bir süre içerisinde parolanızı nasıl sıfırlayacağınızı açıklayan bir e-posta alacaksınız." @@ -2031,6 +2032,8 @@ tr_TR: desc: "Son yanıt tarihini değiştirmeden yanıtla" reload: "Yeniden Yükle" ignore: "Yoksay" + image_alt_text: + aria_label: Resim için alternatif metin notifications: tooltip: regular: @@ -2169,6 +2172,7 @@ tr_TR: enter_hint: "veya Enter tuşuna basın" in_posts_by: "@%{username} kullancısına ait gönderilerde" browser_tip: "%{modifier} + f" + browser_tip_description: "yeniden yerel tarayıcı aramasını kullanmak için" recent: "Son Aramalar" clear_recent: "Son Aramaları Temizle" type: @@ -2808,6 +2812,7 @@ tr_TR: edit: "Üzgünüz, gönderiniz düzenlenirken bir hata oluştu. Lütfen yeniden deneyin." upload: "Üzgünüz, dosya yüklenirken bir hata oluştu. Lütfen yeniden deneyin." file_too_large: "Üzgünüz, bu dosya çok büyük (en fazla %{max_size_kb}kb). Neden paylaşımını bir bulut sağlayıcısına yükleyip bağlantısını paylaşmıyorsun ?" + file_too_large_humanized: "Üzgünüz, bu dosya çok büyük (en fazla %{max_size} olabilir). Neden dosyanı bir bulut sağlayıcısına yükleyip bağlantısını paylaşmıyorsun?" too_many_uploads: "Üzgünüz, aynı anda yalnızca tek dosya yüklenebilir." too_many_dragged_and_dropped_files: one: "Üzgünüz, tek seferde yalnızca %{count} dosya yükleyebilirsin." @@ -3830,6 +3835,7 @@ tr_TR: Kapsamları kullanırken, bir API anahtarını yalnızca belirli bir endpoint grubuyla kullanılacak şekilde kısıtlayabilirsiniz. Hangi parametrelere izin verileceğini de tanımlayabilirsiniz. Birden çok değer kullanacaksanız bunları ayırmak için virgül kullanın. title: Kapsamlar read_only: Salt okunur + global_description: API anahtarında herhangi bir kısıtlama yok ve tüm uç noktalar erişilebilir durumda. resource: Kaynak action: Eylem allowed_parameters: İzin Verilen Parametreler diff --git a/config/locales/client.uk.yml b/config/locales/client.uk.yml index fa9e56932a..1a3639498c 100644 --- a/config/locales/client.uk.yml +++ b/config/locales/client.uk.yml @@ -172,6 +172,7 @@ uk: url: "Скопіювати та поширити посилання" action_codes: public_topic: "робить цю тему публічною %{when}" + open_topic: "Перетворив це на тему %{when}" private_topic: "робить цю тему особистим повідомленням %{when}" split_topic: "розділив цю тему %{when}" invited_user: "запросив %{who} %{when}" @@ -218,6 +219,7 @@ uk: themes: default_description: "Промовчання" broken_theme_alert: "Ваш сайт може не працювати, тому що оформлення/компонент %{theme} містить помилки. Вимкніть його тут: %{path}." + broken_decorator_alert: "Повідомлення можуть показуватися неправильно, тому що один з декораторів вмісту публікації на вашому сайті викликав помилку. Перевірте інструменти розробника браузера для отримання додаткової інформації." s3: regions: ap_northeast_1: "Азія (Токіо)" @@ -755,6 +757,7 @@ uk: smtp_instructions: "Коли ви ввімкнете SMTP для групи, всі вихідні повідомлення електронної пошти, надіслані з групи, буде надіслано через вказані тут параметри SMTP, замість стандартного поштового сервера, налаштованого для інших листів." imap_title: "IMAP" imap_additional_settings: "Додаткові налаштування" + imap_instructions: 'Коли ви ввімкнете IMAP для групи, електронні листи синхронізуються між папкою вхідних груп і наданим сервером IMAP і поштовою скринькою. Перш ніж увімкнути протокол IMAP, необхідно ввімкнути SMTP з дійсними та перевіреними обліковими даними. Ім’я користувача та пароль електронної пошти, які використовуються для SMTP, будуть використовуватися для IMAP. Для отримання додаткової інформації див. анонс про функції на Discourse Meta.' imap_alpha_warning: "Попередження. Це функція на альфа-тестуванні. Офіційно підтримується лише Gmail. Використовуйте на свій страх і ризик!" imap_settings_valid: "Налаштування IMAP правильні." smtp_disable_confirm: "Якщо вимкнути SMTP, усі налаштування SMTP та IMAP будуть скинуті, а відповідна функціональність буде вимкнена. Ви впевнені, що хочете продовжити?" @@ -1112,9 +1115,15 @@ uk: no_messages_body: > Потрібна особиста розмова з кимось, поза звичайним спілкуванням? Надішліть їм повідомлення, вибравши їх аватар і натиснувши кнопку повідомлення %{icon}

Якщо вам потрібна допомога, ви можете надіслати повідомлення співробітнику. no_bookmarks_title: "Ви ще нічого не додали до закладок" + no_bookmarks_body: > + Почніть закладки повідомлень за допомогою кнопки %{icon}, і вони будуть перераховані тут для швидкого доступу. Ви також можете запланувати нагадування про закладку! no_bookmarks_search: "Немає закладок за таким пошуковим запитом." no_notifications_title: "У вас ще немає сповіщень" + no_notifications_body: > + На цій панелі ви будете сповіщені про активність, яка безпосередньо стосується вас, включаючи відповіді на ваші теми та публікації, коли хтось @згадує або цитує вас, а також відповідає на теми, які ви переглядаєте. Сповіщення також буде надіслано на вашу електронну пошту, якщо ви деякий час не входили в систему.

Знайдіть %{icon} щоб визначити, про які конкретні теми, категорії та теги ви хочете отримувати сповіщення. Щоб дізнатися більше, перегляньте свої налаштування сповіщень. no_notifications_page_title: "У вас ще немає сповіщень" + no_notifications_page_body: > + Ви отримуватимете сповіщення про діяльність, яка безпосередньо стосується вас, включаючи відповіді на ваші теми та публікації, коли хтось @згадує або цитує вас, а також відповідає на теми, які ви переглядаєте. Сповіщення також буде надіслано на вашу електронну пошту, якщо ви деякий час не входили в систему.

Використовуйте іконку %{icon} щоб визначити, про які конкретні теми, категорії та теги ви хочете отримувати сповіщення. Щоб дізнатися більше, перегляньте свої параметри сповіщень. first_notification: "Ваше перше сповіщення! Оберіть його, щоб почати." dynamic_favicon: "Показувати кількість на іконці браузера" skip_new_user_tips: @@ -1244,6 +1253,7 @@ uk: read_more_in_group: "Бажаєте дізнатися більше? Перегляньте інші повідомлення в %{groupLink}." read_more: "Хочете прочитати більше? Перегляньте інші повідомлення в особистих повідомленнях." read_more_group_pm_MF: "У вас { UNREAD, plural, =0 {} one { # непрочитане } few { # непрочитаних } other { # непрочитаних } } { NEW, plural, =0 {} one { {BOTH, select, true{и } false { } other{}} # нове повідомлення} few { {BOTH, select, true{і } false { } other{}} # нових повідомлень} other { {BOTH, select, true{і } false { } other{}} # нових повідомлень} }, ви також можете продивитись інші повідомлення в групі {groupLink}" + read_more_personal_pm_MF: "У вас { UNREAD, plural, =0 {} one { є # непрочитане } few { є # непрочитані } many { є # непрочитаних } other { є # непрочитані } } { NEW, plural, =0 {} one { {BOTH, select, true{та } false {є } other{}} # нове повідомлення} few {} many {} other { {BOTH, select, true{та } false {є } other{}} # нові повідомлення} } залишайтесь, або перегляньте інші приватні повідомлень" preferences_nav: account: "Обліковий запис" security: "Безпека" @@ -1497,9 +1507,11 @@ uk: every_month: "щомісяця" every_six_months: "що шість місяців" email_level: + title: "Надсилайте мені лист, коли мене цитують, відповідають, згадують моє ім’я користувача, або коли з’являться нові дії в категоріях, тегах чи темах, за якими я стежу" always: "завжди" only_when_away: "тільки коли вдалині" never: "ніколи" + email_messages_level: "Напишіть мені, коли я надсилаю особисте повідомлення" include_tl0_in_digests: "Включити контент від нових користувачів в зведення, що відправляються по електронній пошті" email_in_reply_to: "Додати попередні відповіді до кінця електронних листів" other_settings: "Інше" @@ -2056,6 +2068,11 @@ uk: few: "Згадуючи групу %{group}, ви тим самим відправите повідомлення %{count} користувачам - ви впевнені?" many: "Згадуючи групу %{group}, ви тим самим відправите повідомлення %{count} користувачам - ви впевнені?" other: "Згадуючи групу %{group}, ви тим самим відправите повідомлення %{count} користувачам - ви впевнені?" + cannot_see_mention: + category: "Ви згадали @%{username}, але вони не одержать повідомлення, тому що у них немає доступу до цього розділу. Вам потрібно додати їх до групи, що має доступ до цього розділу." + private: "Ви згадали @%{username} але вони не отримають сповіщення, оскільки не можуть побачити це особисте повідомлення. Вам потрібно буде запросити їх до цього особистого повідомлення." + muted_topic: "Ви згадали @%{username} але вони не отримають сповіщення, оскільки вимкнули сповіщення в цій темі." + not_allowed: "Ви згадали @%{username}, але вони не отримають сповіщення, оскільки їх не запросили до цієї теми." here_mention: one: "Згадуючи @%{here}, ви збираєтеся повідомити %{count} користувача - ви впевнені?" few: "Згадуючи @%{here}, ви збираєтеся повідомити %{count} користувачів - ви впевнені?" @@ -3323,6 +3340,7 @@ uk: default_list_filter: "Стандартний фільтр списку:" allow_badges_label: "Дозволити нагороджувати значками у цій категорії" edit_permissions: "Редагувати дозволи" + reviewable_by_group: "Крім персоналу, зміст цієї категорії також може бути переглянутий:" review_group_name: "назва групи" require_topic_approval: "З них потребують схвалення модератором всіх нових тем" require_reply_approval: "З них потребують схвалення модератором всіх нових відповідей" @@ -5447,7 +5465,9 @@ uk: grant_existing_holders: Надати додаткові нагороди існуючим власникам нагород emoji: title: "Іконки" + help: "Додайте нові емодзі, які будуть доступні для всіх. Перетягніть і додайте декілька файлів відразу без введення назви для створення емодзі використовуючи їхні назви файлів. Обрана група буде використовуватися для всіх файлів, які додаються одночасно. Ви також можете натиснути \"Додати нові емодзі\", щоб відкрити вікно вибору файлів." add: "Додати нову іконку" + choose_files: "Виберіть файли" uploading: "Завантаження…" name: "Ім'я" group: "Група" diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index d520f875eb..f031b0fdfd 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -1627,7 +1627,6 @@ ar: show_pinned_excerpt_mobile: "إظهار المقتطف في الموضوعات المثبَّتة فى طريقة عرض الجوَّال." show_pinned_excerpt_desktop: "إظهار المقتطف في الموضوعات المثبَّتة فى طريقة عرض سطح المكتب" post_onebox_maxlength: "الحد الأقصى لطول منشور Discourse في لوحة المعاينة بالأحرف." - blocked_onebox_domains: "قائمة بالنطاقات التي لن يتم عرضها في لوحة المعاينة أبدًا." allowed_inline_onebox_domains: "قائمة بالنطاقات التي سيتم وضعها في لوحة المعاينة في شكلٍ مصغَّر إذا تم ربطها دون عنوان" enable_inline_onebox_on_all_domains: "تجاهل إعداد الموقع inline_onebox_domain_allowlist والسماح بلوحة المعاينة المضمَّنة على جميع النطاقات." force_custom_user_agent_hosts: "المضيفات التي سيتم استخدام وكيل المستخدم للوحة المعاينة المخصَّصة في جميع طلباتها. (هذا الإعداد مفيد بشكلٍ خاص للمضيفات الذين تقيِّد الوصول حسب وكيل المستخدم)." diff --git a/config/locales/server.be.yml b/config/locales/server.be.yml index 289fc0a8a9..8dda5ef21f 100644 --- a/config/locales/server.be.yml +++ b/config/locales/server.be.yml @@ -920,7 +920,6 @@ be: show_pinned_excerpt_mobile: "Паказаць ўрывак на ўскладалі тэмы ў мабільным рэжыме." show_pinned_excerpt_desktop: "Паказаць ўрывак на ўскладалі тэмы з улікам працоўнага стала." post_onebox_maxlength: "Максімальная даўжыня oneboxed дыскурсу паста у знаках." - blocked_onebox_domains: "Спіс даменаў, якія ніколі не будуць oneboxed." allowed_inline_onebox_domains: "Спіс даменаў, якія будуць oneboxed ў мініятурным выглядзе, калі звязаныя без назвы" max_oneboxes_per_post: "Максімальную колькасць у раздзелах Onebox пасады." logo: "Малюнак лагатыпа ў левым верхнім куце сайта. Выкарыстоўвайце шырокае прамавугольнае малюнак з вышынёй 120 і суадносінамі бакоў больш, чым 3: 1. Калі пакінуць пустым, то назва сайта будзе паказаны тэкст." diff --git a/config/locales/server.ca.yml b/config/locales/server.ca.yml index 876f6bd93d..ee0ae913da 100644 --- a/config/locales/server.ca.yml +++ b/config/locales/server.ca.yml @@ -1233,7 +1233,6 @@ ca: show_pinned_excerpt_mobile: "Mostra l'extracte en els temes afixats en la vista per a mòbils." show_pinned_excerpt_desktop: "Mostra l'extracte en els temes afixats en la vista d'escriptori." post_onebox_maxlength: "Longitud màxima en caràcters d'una publicació en onebox de Discourse." - blocked_onebox_domains: "Llista de dominis que no es posaran mai en onebox." allowed_inline_onebox_domains: "Llista de dominis que es mostraran en miniatura 'onebox' si s'enllacen sense títol" max_oneboxes_per_post: "Nombre màxim de onebox en una publicació" logo: "La imatge del logotip a la part superior esquerra del vostre lloc web. Utilitzeu una imatge rectangular ampla amb una alçada de 120 i una relació d'aspecte superior a 3: 1. Si es deixa en blanc, es mostrarà el text del títol del lloc web." diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index d2192faf72..9fd32a2465 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -1357,7 +1357,6 @@ da: show_pinned_excerpt_mobile: "Vis uddrag af fastgjorte emner på mobilen." show_pinned_excerpt_desktop: "Vis uddrag af fastgjorte emner i desktop visning" post_onebox_maxlength: "Max længde af Discourse indlæg i tegn" - blocked_onebox_domains: "En liste af domæner som aldrig vil blive onebox'et." allowed_inline_onebox_domains: "En liste over domæner, der vil blive onebox'et i miniatureform, hvis de linkes uden en titel" enable_inline_onebox_on_all_domains: "Ignorer webstedsindstilling for inline_onebox_domain_allowlist, og tillad indlejret onebox på alle domæner." max_oneboxes_per_post: "Maksimalt antal onebox-forekomster i et opslag." diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index e6125ce32f..8a98935809 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -1381,6 +1381,7 @@ de: unreachable_themes: "Wir konnten die folgenden Themes nicht auf Updates prüfen:" watched_word_regexp_error: "Der reguläre Ausdruck für „%{action}“ überwachte Wörter ist ungültig. Bitte überprüfe deine Einstellungen für überwachte Wörter oder deaktiviere die Website-Einstellung „watched words regular expressions“." site_settings: + allow_bulk_invite: "Erlaube Masseneinladungen durch Hochladen einer CSV-Datei" disabled: "deaktiviert" display_local_time_in_user_card: "Zeigt die lokale Zeit basierend auf der Zeitzone eines Benutzers an, wenn die Benutzerkarte geöffnet wird." censored_words: "Wörter, die automatisch durch ■■■■ ersetzt werden" @@ -1445,7 +1446,7 @@ de: show_pinned_excerpt_mobile: "Zeige einen Auszug angehefteter Themen in der mobilen Ansicht." show_pinned_excerpt_desktop: "Zeige einen Auszug angehefteter Themen in der Desktop-Ansicht." post_onebox_maxlength: "Maximale Länge eines Onebox-Discourse-Beitrags in Zeichen." - blocked_onebox_domains: "Eine Liste von Domains, die nie in eine Onebox umgewandelt werden." + blocked_onebox_domains: "Eine Liste von Domains, die niemals in einer Onebox untergebracht werden, z.B. wikipedia.org\n(Wildcard-Symbole * ? nicht unterstützt)" allowed_inline_onebox_domains: "Eine Liste von Domains, die in verkleinerter Form in eine Onebox umgewandelt werden, wenn sie ohne Titel verlinkt werden" enable_inline_onebox_on_all_domains: "Ignoriere die Website-Einstellung `inline_onebox_domain_allowlist` und erlaube Inline-Oneboxen für alle Domains" force_custom_user_agent_hosts: "Hosts, bei denen der spezifische Onebox-Useragent für alle Anfragen genutzt wird. (Besonders hilfreich bei Hosts, die Zugriffe per Useragent limitieren.)" @@ -2097,6 +2098,7 @@ de: share_quote_visibility: "Bestimme, wann die Schaltflächen zum Teilen von Zitaten angezeigt werden sollen: nie, nur für anonyme Benutzer oder für alle Benutzer. " create_revision_on_bulk_topic_moves: "Erstelle eine Überarbeitung für die ersten Beiträge, wenn Themen massenweise in eine neue Kategorie verschoben werden." allow_changing_staged_user_tracking: "Erlauben Sie, dass die Kategorie- und Tag-Benachrichtigungseinstellungen eines bereitgestellten Benutzers von einem Administratorbenutzer geändert werden." + use_email_for_username_and_name_suggestions: "Verwende den ersten Teil der E-Mail-Adressen für Vorschläge für Benutzernamen und Namen. Dies macht es für die Öffentlichkeit einfacher, die vollständigen E-Mail-Adressen der Nutzer/innen zu erraten (da ein großer Teil der Menschen gemeinsame Dienste wie \"gmail.com\" nutzt)." errors: invalid_css_color: "Ungültige Farbe. Gib einen Farbnamen oder einen Hexadezimalwert ein." invalid_email: "Ungültige E-Mail-Adresse." @@ -2116,6 +2118,7 @@ de: invalid_json: "Ungültiges JSON." invalid_reply_by_email_address: "Wert muss „%{reply_key}“ enthalten und sich von der Benachrichtigungs-E-Mail unterscheiden." invalid_alternative_reply_by_email_addresses: "Alle Werte müssen „%{reply_key}“ enthalten und sich von der Benachrichtigungs-E-Mail unterscheiden." + invalid_domain_hostname: "Darf kein * oder ? Zeichen enthalten." pop3_polling_host_is_empty: "Du musst „pop3 polling host“ definieren, um POP3-Abfragen zu aktivieren." pop3_polling_username_is_empty: "Du musst „pop3 polling username“ definieren, um POP3-Abfragen zu aktivieren." pop3_polling_password_is_empty: "Du musst „pop3 polling password“ definieren, um POP3-Abfragen zu aktivieren." diff --git a/config/locales/server.el.yml b/config/locales/server.el.yml index a0b18e7fb7..32a7574cba 100644 --- a/config/locales/server.el.yml +++ b/config/locales/server.el.yml @@ -950,7 +950,6 @@ el: show_pinned_excerpt_mobile: "Εμφάνιση περίληψης σε καρφιτσωμένα νήματα στην περιήγηση από κινητά τηλέφωνα." show_pinned_excerpt_desktop: "Εμφάνιση περίληψης σε καρφιτσωμένα νήματα στην περιήγηση από ηλεκτρονικούς υπολογιστές." post_onebox_maxlength: "Μέγιστο μέγεθος μιας oneboxed ανάρτησης σε χαρακτήρες." - blocked_onebox_domains: "Μία λίστα τομέων που δεν θα είναι ποτέ oneboxed." allowed_inline_onebox_domains: "Μια λίστα από domains τα οποία θα γίνουν onebox σε σκίκρυνση αν αναφερθούν χωρίς τίτλο" max_oneboxes_per_post: "Ανώτατος αριθμός oneboxes σε μια ανάρτηση. " notification_email: "Η από: διεύθυνση email που χρησιμοποιείται για την αποστολή όλων των απαραιτήτων μηνυμάτων του συστήματος. Ο τομέας που καθορίζεται εδώ πρέπει να έχει SPF, DKIM και reverse PTR αρχεία ρυθμισμένα σωστά για να φθάσει το μήνυμα." diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index 3192498189..5dc3871ac4 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -1443,7 +1443,6 @@ es: show_pinned_excerpt_mobile: "Mostrar extracto de temas anclados en la vista móvil." show_pinned_excerpt_desktop: "Mostrar extracto de temas anclados en la vista de escritorio." post_onebox_maxlength: "Extensión máxima en caracteres de una publicación de Discourse en formato onebox." - blocked_onebox_domains: "Una lista de dominios que nunca será oneboxed." allowed_inline_onebox_domains: "Una lista de dominios que serán oneboxed en forma de miniatura si están vinculados sin título" enable_inline_onebox_on_all_domains: "Ignorar el ajuste del sitio inline_onebox_domain_allowlist y permitir inline onebox en todos los dominios." force_custom_user_agent_hosts: "Hosts que se utilizará para el agente usuario personalizado de onebox en todas las solicitudes. (Especialmente útil para hosts que limitan el acceso por usuario agente)." diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml index 378a10ebc8..30cca2198b 100644 --- a/config/locales/server.fa_IR.yml +++ b/config/locales/server.fa_IR.yml @@ -910,7 +910,6 @@ fa_IR: show_pinned_excerpt_mobile: "نمایش خلاصه موضوعات سنجاق شده در موبایل." show_pinned_excerpt_desktop: "نمایش خلاصه موضوعات سنجاق شده در کامپیوتر." post_onebox_maxlength: "حداکثر طول متن پیشنمایش لینک به نویسه." - blocked_onebox_domains: "لیست دامنه‌هایی که نباید پیش‌نمایش داشته باشند." max_oneboxes_per_post: "حداکثر تعداد پیش نمایش پیوند در یک نوشته" notification_email: "از: ایمیل آدرس زمان ارسال تمام ایمیل های ضروری سیستم استفاده شد. .دامنه مشخص شده در اینجا باید SPF, DKIM داشته باشد و سوابق PTR معکوس به درستی برای ورود ایمیل تنظیم شده باشد. " email_custom_headers: "فهرست pipe-delimited از سربرگ‌های ایمیل سفارشی " diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index 7d89f2240f..269247a7ea 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -1415,7 +1415,6 @@ fi: show_pinned_excerpt_mobile: "Näytä katkelma kiinnitetyistä ketjuista mobiilinäkymässä." show_pinned_excerpt_desktop: "Näytä katkelma kiinnitetyistä ketjuista työpöytänäkymässä." post_onebox_maxlength: "Discourse-viestin Onebox-esikatselun merkkien maksimimäärä." - blocked_onebox_domains: "Verkko-osoitteet, joista ei luoda Onebox-esikatselua." allowed_inline_onebox_domains: "Verkko-osoitteet, joista luodaan minimoitu Onebox-esikatselu, jos niihin linkitetään määrittämättä otsikkoa." enable_inline_onebox_on_all_domains: "Ohita inline_onebox_domain_whitelist-asetus ja salli Onebox-esikatselut kaikista verkko-osoitteista." force_custom_user_agent_hosts: "Isännät, joille käytetään mukautettua onebox-käyttäjäagenttia kaikissa pyynnöissä. (Erityisen hyödyllinen isännille, jotka rajoittavat käyttäjäagentin pääsyä)." diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index f21760d5df..f86c20fd76 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -1415,7 +1415,6 @@ fr: show_pinned_excerpt_mobile: "Afficher les extraits des sujets épinglés en vue mobile." show_pinned_excerpt_desktop: "Afficher les extraits des sujets épinglés en vue bureau." post_onebox_maxlength: "Longueur maximale en nombre de caractères d'un message Discourse intégré comme Onebox." - blocked_onebox_domains: "Une liste de domaines qui ne seront jamais transformés en Onebox." allowed_inline_onebox_domains: "Une liste de domaines qui seront transformés en Onebox s'ils ont été insérés sans titre" enable_inline_onebox_on_all_domains: "Ignorer le paramètre « inline_onebox_domain_allowlist » et permettre des Onebox en ligne pour tous les domaines." force_custom_user_agent_hosts: "Domaines pour lesquels utiliser un agent utilisateur personnalisé pour les requêtes de Onebox. (Cela est utile pour les domaines limitant les accès par agent utilisateur.)" diff --git a/config/locales/server.gl.yml b/config/locales/server.gl.yml index 4c8695c910..f72c6fc420 100644 --- a/config/locales/server.gl.yml +++ b/config/locales/server.gl.yml @@ -1370,7 +1370,6 @@ gl: show_pinned_excerpt_mobile: "Mostrar o extracto de temas pegados na vista móbil." show_pinned_excerpt_desktop: "Mostrar o extracto de temas pegados na vista de escritorio." post_onebox_maxlength: "Lonxitude máxima en caracteres dunha publicación de Discourse en formato caixa (onebox)." - blocked_onebox_domains: "Unha listaxe de dominios que nunca se mostrarán en formato onebox." allowed_inline_onebox_domains: "Unha listaxe de dominios que se mostrarán en formato onebox en miniatura se son ligados sen un título" enable_inline_onebox_on_all_domains: "Ignorar o axuste do sitio inline_onebox_domain_whitelist e permitir incluír onebox en todos os dominios." force_custom_user_agent_hosts: "Hosts que se utilizarán para o axente de usuario personalizado de onebox en todas as solicitudes (especialmente útil para hosts que limitan o acceso por axente de usuario)." diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index 9afd15487d..a892aa22b3 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -1465,6 +1465,7 @@ he: unreachable_themes: "לא הצלחתי לבדוק אם יש עדכונים לערכות העיצוב הבאות:" watched_word_regexp_error: "הביטוי הרגולרי למילים במעקב ‚%{action}’ שגוי. נא לבדוק את הגדרות המילים במעקב או ךהשבית את הגדרת האתר ‚ביטוי רגולרי למילים במעקב’." site_settings: + allow_bulk_invite: "לאפשר הזמנות במרוכז על ידי העלאת קובץ CSV" disabled: "מושבת" display_local_time_in_user_card: "להציג את הזמן המקומי בהתאם לאזור הזמן של המשתמש כאשר כרטיס המשתמש שלו נפתח." censored_words: "מלים שיוחלפו אוטומטית ב־■■■■" @@ -1529,7 +1530,6 @@ he: show_pinned_excerpt_mobile: "הצגת קטע בנושאים נעוצים במבט ניידים." show_pinned_excerpt_desktop: "הצגת קטע בנושאים נעוצים בתצוגת מחשב-שולחני." post_onebox_maxlength: "אורך מרבי של פוסט ב־Discourse בתיבת תחימה בתווים." - blocked_onebox_domains: "רשימת שמות תחום שלעולם לא יופיעו בתיבות תחימה." allowed_inline_onebox_domains: "רשימת שמות מתחם שיופיעו בתיבות תחימה בתצורה המזערית שלהם אם הקישור מופיע ללא כותרת" enable_inline_onebox_on_all_domains: "להתעלם מהגדרת האתר inline_onebox_domain_allowlist (רשימת היתר של שמות תחום לתיבת תחימה משולבת) ולאפשר תיבות תחימה לכל שמות המתחם." force_custom_user_agent_hosts: "מארחים שמולם משתמשים בסוכן משתמש onebox בהתאמה אישית לכל הבקשות. (חיוני במיוחד למארחים שמגבילים גישה בהתאם לסוכן משתמש)." diff --git a/config/locales/server.hu.yml b/config/locales/server.hu.yml index 5827c4fc8a..44accb85e0 100644 --- a/config/locales/server.hu.yml +++ b/config/locales/server.hu.yml @@ -887,6 +887,7 @@ hu: notify_users_after_responses_deleted_on_flagged_post: "Ha egy bejegyzést jelentenek, majd eltávolítanak, akkor minden olyan felhasználó értesítést kap, aki válaszolt a bejegyzésre, és ezért a válaszait eltávolították." post_excerpt_maxlength: "A bejegyzés kivonatának / összefoglalójának maximális hossza." topic_excerpt_maxlength: "A témakör kivonatának / összefoglalójának maximális hossza a téma első bejegyzéséből generálva." + blocked_onebox_domains: "Azok a domainek, amelyek soha nem kerülnek dobozba, például wikipedia.org\n(A * ? helyettesítő karakterek nem támogatottak)" enforce_second_factor: "Kényszeríti a felhasználókat, hogy engedélyezzék a kétfaktoros hitelesítést. Válassza az 'all' lehetőséget, hogy érvényesítse az összes felhasználó számára. Válassza a „személyzet” lehetőséget, hogy csak a személyzet felhasználói számára érvényesítse." use_admin_ip_allowlist: "Az adminokk csak akkor tudnak bejelentkezni, ha a Screened IPs listában megadott IP-címmel vannak megadva (Admin > Naplók > Screened Ips)." slow_down_crawler_user_agents: "A forgalmi korlátozás alá elő webes robotok felhasználói ügynökei, ahogy a „robotok sebességének lelassítása” beállításban meg van adva. Minden egyes értéknek legalább 3 karakteresnek kell lennie." @@ -925,6 +926,7 @@ hu: default_other_skip_new_user_tips: "A tippek és jelvények kihagyása az új felhasználók regisztrációjakor" default_other_like_notification_frequency: "A felhasználók értesítése a kedvelésekről alapértelmezett esetben." company_name: "Cégnév" + use_email_for_username_and_name_suggestions: "Használja az e-mail-címek első részét a felhasználónév- és névjavaslatokhoz. Vegye figyelembe, hogy ez megkönnyíti a nyilvánosság számára a teljes felhasználói e-mail-címek kitalálását (mivel az emberek nagy része olyan gyakori szolgáltatásokat használ, mint a „gmail.com”)." errors: invalid_email: "Érvénytelen e-mail cím." invalid_username: "Nincs ilyen nevű felhasználó." @@ -938,6 +940,7 @@ hu: invalid_string_min_max: "A karakterek számának %{min} és %{max} között kell lennie." invalid_string_min: "Nem lehet rövidebb, mint %{min} karakter." invalid_string_max: "Nem lehet hosszabb, mint %{max} karakter." + invalid_domain_hostname: "Nem tartalmazhatja a * vagy a ? karaktereket." min_username_length_range: "Nem lehet a legnagyobb értéknél nagyobb legkisebb értéket beállítani." max_username_length_range: "Nem lehet a legkisebb értéknél kisebb legnagyobb értéket beállítani." google_oauth2_hd_groups: "A beállítás engedélyezése előtt be kell ezt állítania: „google oauth2 hd”." diff --git a/config/locales/server.hy.yml b/config/locales/server.hy.yml index d1823ba543..7619578783 100644 --- a/config/locales/server.hy.yml +++ b/config/locales/server.hy.yml @@ -1106,7 +1106,6 @@ hy: show_pinned_excerpt_mobile: "Ցուցադրել հատվածը ամրագրված թեմաների վրա հեռախոսային տարբերակում:" show_pinned_excerpt_desktop: "Ցուցադրել հատվածը ամրագրված թեմաների վրա համակարգչային տարբերակում:" post_onebox_maxlength: "Սմարթ ներդիրի վերածված Discourse գրառման առավելագույն երկարությունը սիմվոլներով:" - blocked_onebox_domains: "Դոմենների ցանկը, որոնք երբեք չեն վերածվի սմարթ-ներդիրի:" allowed_inline_onebox_domains: "Դոմենների ցանկ, որոնք կվերածվեն սմարթ-ներդիրի փոքրացված տեսքով՝ առանց վերնագրի կապակցված լինելու դեպքում" max_oneboxes_per_post: "Գրառման մեջ սմարթ-ներդիրների առավելագույն քանակը:" logo: "Ձեր կայքի վերևի ձախ կողմում գտնվող լոգոյի նկարը: Օգտագործեք լայն ուղղանկյուն նկար 120 երկարությամբ և 3:1 -ից բարձր հարաբերակցությամբ: Եթե թողնեք դատարկ, կցուցադրվի կայքի վերնագրի տեքստը:" diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 97a5fd99e1..427475a61b 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -1440,7 +1440,6 @@ it: show_pinned_excerpt_mobile: "Mostra estratti sugli argomenti appuntati nella visualizzazione in mobilità." show_pinned_excerpt_desktop: "Mostra estratti sugli argomenti appuntati nella vista desktop." post_onebox_maxlength: "Lunghezza massima in caratteri di un messaggio Discourse in Onebox." - blocked_onebox_domains: "Un elenco di domini che non saranno mai trasformati in onebox." allowed_inline_onebox_domains: "Un elenco di domini che saranno trasformati in onebox in forma di miniatura se collegati senza un titolo" enable_inline_onebox_on_all_domains: "Ignora l'impostazione del sito inline_onebox_domain_allowlist e consenti onebox in linea per tutti i domini." force_custom_user_agent_hosts: "Host per i quali utilizzare l'user agent onebox personalizzato su tutte le richieste. (Particolarmente utile per gli host che limitano l'accesso con user agent)." diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index 0f88dc754a..cfd2a53e6a 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -1365,7 +1365,6 @@ ja: show_pinned_excerpt_mobile: "モバイルビューで固定トピックの抜粋を表示する。" show_pinned_excerpt_desktop: "デスクトップビューで固定トピックの抜粋を表示する。" post_onebox_maxlength: "Discourse OneBox 投稿の最大文字数。" - blocked_onebox_domains: "ワンボックス化されないドメインのリスト。" allowed_inline_onebox_domains: "タイトルなしでリンクされた場合、ミニチュア形式でワンボックス化されるドメインのリスト" enable_inline_onebox_on_all_domains: "inline_onebox_domain_allowlist サイト設定を無視し、すべてのドメインでインラインのワンボックスを許可する。" force_custom_user_agent_hosts: "すべてのリクエストでカスタムワンボックスユーザーエージェントを使用するホスト (特にユーザーエージェントごとにアクセスを制限するホストで役立ちます)。" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index 22ff6c6cbd..bf399362c3 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -1382,7 +1382,6 @@ ko: show_pinned_excerpt_mobile: "모바일 뷰에서 고정 토픽의 발췌 내용을 보여주기" show_pinned_excerpt_desktop: "데스크톱 뷰에서 고정 토픽의 발췌 내용을 보여주기" post_onebox_maxlength: "onebox가 적용된 Discourse 글에 허용되는 최대 글자수" - blocked_onebox_domains: "원박스화에서 제외 할 도메인 목록입니다." allowed_inline_onebox_domains: "제목없이 링크 된 경우 미니어처 형식으로 oneboxed 될 도메인 목록" enable_inline_onebox_on_all_domains: "inline_onebox_domain_whitelist 사이트 설정을 무시하고 모든 도메인에서 인라인 onebox를 허용하십시오." force_custom_user_agent_hosts: "모든 요청에서 사용자 정의 onebox 사용자 에이전트를 사용할 호스트. (특히 사용자 에이전트의 액세스를 제한하는 호스트에 유용합니다)." diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index e92d9a3c0a..e76484df67 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -978,7 +978,6 @@ nb_NO: show_pinned_excerpt_mobile: "Vis utdrag fra festede emner i mobil visning." show_pinned_excerpt_desktop: "Vis utdrag fra festede emner i desktop visning." post_onebox_maxlength: "Maksimal lengde på et onebox Discourse innlegg i antall tegn." - blocked_onebox_domains: "En liste over domener som aldri vil bli forsøkt oneboxet." allowed_inline_onebox_domains: "En liste over domener hvor onebox brukes i miniatyrstørrelse hvis lenken ikke har en tittel" max_oneboxes_per_post: "Maksimalt antall oneboxer i hvert innlegg." notification_email: "Adressen som skal brukes som avsender: på alle viktige system e-poster. Domenet som spesifiseres her må ha SPF, DKIM og reverse PTR record satt korrekt for at e-post skal nå frem." diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index 44ce441360..a60397b8b4 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -1325,7 +1325,6 @@ nl: show_pinned_excerpt_mobile: "Fragment tonen bij vastgemaakte topics in mobiele weergave." show_pinned_excerpt_desktop: "Fragment tonen bij vastgemaakte topics in desktopweergave." post_onebox_maxlength: "Maximale lengte van een 'oneboxed Discourse'-bericht in tekens." - blocked_onebox_domains: "Een lijst van domeinen die nooit in een onebox worden omgezet." allowed_inline_onebox_domains: "Een lijst van domeinen die in een onebox als miniatuur worden omgezet wanneer gekoppeld zonder titel" enable_inline_onebox_on_all_domains: "Website-instelling inline_onebox_domain_allowlist negeren en inline onebox op alle domeinen toestaan." force_custom_user_agent_hosts: "Hosts waarvoor bij alle aanvragen de aangepaste onebox-useragent wordt gebruikt. (Met name handig voor hosts die toegang beperken via de useragent)." diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index 04c5184d53..4d8b20ae1c 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -1493,14 +1493,14 @@ pl_PL: default_locale: "Domyślny język tego wystąpienia dyskursu. Tekst kategorii i tematów generowanych przez system można zastąpić w opcji Dostosuj / Tekst." allow_user_locale: "Zezwól użytkownikom na zmianę języka interfejsu we własnych ustawieniach" set_locale_from_accept_language_header: "ustaw język interfejsu dla anonimowych użytkowników na podstawie nagłówków języka z ich przeglądarki" - support_mixed_text_direction: "Obsługa mieszanych wskazówek tekstowych od lewej do prawej i od prawej do lewej." + support_mixed_text_direction: "Wspieraj mieszane kierunki tekstu od lewej do prawej i od prawej do lewej strony." min_post_length: "Minimalna długość wpisu w znakach" min_first_post_length: "Minimalna długość treści (liczba znaków) pierwszego wpisu w temacie " min_personal_message_post_length: "Minimalna długość treści wiadomości " max_post_length: "Maksymalna długość wpisu, w znakach" topic_featured_link_enabled: "Włącz dodawanie linków w tematach." show_topic_featured_link_in_digest: "Pokazuj polecany link tematu w podsumowaniu e-mailowym." - min_topic_views_for_delete_confirm: "Minimalna liczba wyświetleń, które musi mieć wątek aby pojawił się po usunięciu okna potwierdzającego" + min_topic_views_for_delete_confirm: "Minimalna liczba wyświetleń tematu, aby podczas jego usuwania pojawiło się okienko z potwierdzeniem." min_topic_title_length: "Minimalna długość tytułu tematu, w znakach" max_topic_title_length: "Maksymalna długość tytułu tematu, w znakach" min_personal_message_title_length: "Minimalna liczba znaków w temacie wiadomości " @@ -1535,14 +1535,14 @@ pl_PL: staff_edit_locks_post: "Wpisy zostaną zablokowane przed edycją, jeśli będą edytowane przez członków personelu" post_edit_time_limit: "Autor tl0 lub tl1 może edytować swój wpis przez (n) minut po opublikowaniu. Ustaw na zawsze na 0." tl2_post_edit_time_limit: "Autor tl2 + może edytować swój wpis przez (n) minut po opublikowaniu. Ustaw na zawsze na 0." - edit_history_visible_to_public: "Pozwól wszystkim przeglądać poprzednie wersje edytowanych wpisów. Gdy wyłączone, jedynie obsługa/staff może." + edit_history_visible_to_public: "Pozwól wszystkim zobaczyć poprzednie wersje edytowanego posta. Gdy wyłączone, tylko członkowie personelu mogą je przeglądać." delete_removed_posts_after: "Wpisy usunięte przez autora będą automatycznie zlikwidowane po (n) godzinach. Jeżeli liczba godzin będzie wynosić 0, to zostaną usunięte natychmiast. " notify_users_after_responses_deleted_on_flagged_post: "Gdy post zostanie oznaczony, a następnie usunięty, wszyscy użytkownicy, którzy na niego odpowiedzieli, a ich odpowiedzi zostały usunięte, zostaną powiadomieni." max_image_width: "Maksymalna szerokość miniaturki grafiki we wpisie. " max_image_height: "Maksymalna wysokość miniaturki grafiki we wpisie. " responsive_post_image_sizes: "Zmień rozmiar podglądu lightbox, aby umożliwić wyświetlanie ekranów o wysokiej rozdzielczości DPI o następujących proporcjach pikseli. Usuń wszystkie wartości, aby wyłączyć responsywne obrazy." fixed_category_positions: "Zaznacz, aby ręcznie ustawiać kolejność kategorii. Odznacz, aby kategorie były sortowane na podstawie aktywności. " - fixed_category_positions_on_create: "Jeżeli jest sprawdzone to porządkowanie kategorii będzie zależało od stworzonego tematu (requires fixed_category_positions). " + fixed_category_positions_on_create: "Jeśli zaznaczone, kolejność kategorii będzie utrzymywana w oknie dialogowym tworzenia tematu (wymaga fixed_category_positions)." add_rel_nofollow_to_user_content: 'Dodaj rel nofollow do wszystkich treści użytkownika, poza wewnętrznymi linkami (wliczając domeny nadrzędne). Jeśli to zmienisz, musisz rebake wszystkie wpisy poprzez: "rake post:rebake"' exclude_rel_nofollow_domains: "Lista domen, w których nofollow nie powinien być dodawany do linków. example.com automatycznie zezwoli również na sub.example.com. Jako minimum należy dodać domenę tej witryny, aby roboty indeksujące mogły znaleźć całą treść. Jeśli inne części witryny znajdują się w innych domenach, dodaj je również." post_excerpt_maxlength: "Maksymalna długość podsumowania / streszczenia wpisu." @@ -1550,7 +1550,6 @@ pl_PL: show_pinned_excerpt_mobile: "Pokaż fragment przypiętych tematów w widoku mobilnym" show_pinned_excerpt_desktop: "Pokaż fragment przypiętych tematów w widoku \"wersja komputerowa\"" post_onebox_maxlength: "Maksymalna długość (ilość znaków) treści wpisu osadzonego via Onebox" - blocked_onebox_domains: "Lista domen, które nigdy nie będą osadzane w poście." allowed_inline_onebox_domains: "Lista domen, które zostaną zamienione na osadzony onebox w zmniejszonej formie, jeśli będą umieszczone w poście bez tytułu" enable_inline_onebox_on_all_domains: "Ignoruj ustawienie witryny `inline_onebox_domain_whitelist` i zezwalaj na osadzanie ramek we wszystkich domenach." force_custom_user_agent_hosts: "Hosty, dla których ma być używany niestandardowy klient użytkownika Onebox przy wszystkich żądaniach. (Szczególnie przydatne dla hostów, które ograniczają dostęp do agenta użytkownika)." @@ -1665,7 +1664,7 @@ pl_PL: redirect_users_to_top_page: "Automatycznie kieruj nowych i długo nieobecnych użytkowników na stronę główną." top_page_default_timeframe: "Domyślne ramy czasowe dla strony widoku z góry." moderators_view_emails: "Zezwalaj moderatorom na przeglądanie wiadomości e-mail użytkowników" - prioritize_username_in_ux: "Pokaż nazwę użytkownika jako pierwszą na stronie użytkownika, karcie użytkownika i we wpisach (kiedy wyłączone imię jest pokazane jako pierwsze)" + prioritize_username_in_ux: "Pokaż nazwę użytkownika jako pierwszą na stronie użytkownika, jego karcie i w postach (gdy opcja jest wyłączona, pełna nazwa jest wyświetlana jako pierwsza)" enable_rich_text_paste: "Włącz automatyczną konwersję HTML do Markdown podczas wklejania tekstu do kompozytora. (Eksperymentalny)" send_old_credential_reminder_days: "Przypomnij o starych danych logowania po dniach" email_token_valid_hours: "Tokeny resetujące hasło / aktywujące konto są ważne przez (n) godzin." @@ -1717,19 +1716,19 @@ pl_PL: enable_local_logins_via_email: "Zezwalaj użytkownikom na żądanie linku logowania do jednego kliknięcia, który zostanie im przesłany pocztą e-mail." allow_new_registrations: "Zezwól na rejestrację nowych użytkowników. Odznacz opcję żeby uniemożliwić rejestrację nowych kont." enable_signup_cta: "Pokazuj wiadomość dla powracających użytkowników anonimowych, zachęcającą ich do założenia konta." - enable_google_oauth2_logins: "Włącz uwierzytelnianie Google Oauth2. Jest to metoda uwierzytelniania obsługiwana obecnie przez Google. Wymaga klucza i tajemnicy. Zobacz Konfigurowanie logowania Google do dyskursu ." + enable_google_oauth2_logins: "Włącz uwierzytelnianie Google Oauth2. Jest to metoda uwierzytelniania obsługiwana obecnie przez Google. Wymaga podania klucza i sekretu. Zobacz Konfigurowanie logowania Google dla Discourse." google_oauth2_client_id: "Client ID twojej aplikacji w Google" google_oauth2_client_secret: "Client Secret twojej aplikacji w Google" google_oauth2_prompt: "Opcjonalna lista wartości łańcuchowych rozdzielanych spacjami, która określa, czy serwer autoryzacji monituje użytkownika o ponowne uwierzytelnienie i zgodę. Możliwe wartości można znaleźć na https://developers.google.com/identity/protocols/OpenIDConnect#prompt ." google_oauth2_hd: "Opcjonalna domena Google Apps Hosted, do której logowanie będzie ograniczone. Więcej informacji można znaleźć na https://developers.google.com/identity/protocols/OpenIDConnect#hd-param" google_oauth2_hd_groups: "(eksperymentalne) Pobierz grupy dyskusyjne Google użytkowników w domenie hostowanej po uwierzytelnieniu. Pobrane grupy dyskusyjne Google mogą być używane do automatycznego przyznawania członkostwa w grupach Discourse (zobacz ustawienia grupy)." - enable_twitter_logins: "Włącz uwierzytelnianie na Twitterze, wymaga twitter_consumer_key i twitter_consumer_secret. Zobacz Konfigurowanie logowania na Twitterze (i bogatych osadzeń) dla dyskursu ." + enable_twitter_logins: "Włącz uwierzytelnianie przez Twittera, wymaga twitter_consumer_key i twitter_consumer_secret. Zobacz Konfigurowanie logowania przez Twittera (i bogatych embedów) dla Discourse." twitter_consumer_key: "Klucz klienta do uwierzytelnienia na Twitterze, zarejestrowany na https://developer.twitter.com/apps" twitter_consumer_secret: "Sekret klienta dotyczący uwierzytelniania na Twitterze, zarejestrowany na stronie https://developer.twitter.com/apps" - enable_facebook_logins: "Włącz uwierzytelnianie na Facebooku, wymaga facebook_app_id i facebook_app_secret. Zobacz Konfigurowanie logowania na Facebooku dla dyskursu ." + enable_facebook_logins: "Włącz uwierzytelnianie przez Facebooka, wymaga facebook_app_id i facebook_app_secret. Zobacz Konfigurowanie logowania przez Facebooka dla Discourse." facebook_app_id: "Identyfikator aplikacji do uwierzytelniania i udostępniania na Facebooku, zarejestrowany pod adresem https://developers.facebook.com/apps" facebook_app_secret: "Tajna aplikacja do uwierzytelniania na Facebooku, zarejestrowana na https://developers.facebook.com/apps" - enable_github_logins: "Włącz uwierzytelnianie GitHub, wymaga github_client_id i github_client_secret. Zobacz konfigurowanie logowania GitHub dla Discourse." + enable_github_logins: "Włącz uwierzytelnianie przez GitHub, wymaga github_client_id i github_client_secret. Zobacz Konfigurowanie logowania przez GitHub dla Discourse." github_client_id: "Identyfikator klienta do uwierzytelniania przez GitHub, zarejestrowany pod adresem https://github.com/settings/developers" github_client_secret: "Sekret klienta do uwierzytelniania przez GitHub, zarejestrowany pod adresem https://github.com/settings/developers" enable_discord_logins: "Zezwolić użytkownikom na uwierzytelnianie przy użyciu Discord?" @@ -1786,7 +1785,7 @@ pl_PL: clean_up_uploads: "Usuń osierocone pliki aby zapobiec wykorzystywaniu forum jako hosting. UWAGA: przed włączeniem tej opcji zaleca się wykonanie kopii katalogu /uploads." clean_orphan_uploads_grace_period_hours: "Okres karencji (w dniach) przed wysłaniem sierot zostanie skasowany." purge_deleted_uploads_grace_period_days: "Okres karencji (w dniach) przed usunięciem upload zostanie skasowany." - purge_unactivated_users_grace_period_days: "Okres karencji w dniach, po upływie którego nieaktywowane konto użytkownika zostaje usunięte. Ustaw 0, by nigdy nie usuwań nieaktywnych użytkowników." + purge_unactivated_users_grace_period_days: "Okres karencji w dniach, po upływie którego nieaktywowane konto użytkownika zostaje usunięte. Ustaw na 0, aby nigdy nie usuwać nieaktywowanych użytkowników." enable_s3_uploads: "Umieść przesyły w pamięci Amazon S3. Ważne: wymaga ważnych danych uwierzytelniających (zarówno klucza id i tajnego klucza dostępu)" s3_use_iam_profile: 'Użyj profilu instancji AWS EC2, aby przyznać dostęp do segmentu S3. UWAGA: włączenie tej opcji wymaga, aby dyskurs działał w odpowiednio skonfigurowanej instancji EC2 i zastępuje ustawienia „Identyfikatora klucza dostępu s3” i „Tajnego klucza dostępu s3”.' s3_upload_bucket: "Nazwa koszyka Amazon S3, do którego zostaną przesłane pliki. Ostrzeżenie: bez wielkich liter, kropek czy podkreślenia." @@ -2004,7 +2003,7 @@ pl_PL: delete_all_posts_max: "Maksymalna liczba wpisów jaka może zostać usunięta jednorazowo przyciskiem \"Usuń Wszystkie Wpisy\". Jeśli użytkownik ma więcej wpisów, ani one ani użytkownik nie mogą one być usunięte." delete_user_self_max_post_count: "Maksymalna liczba wpisów, jaką może posiadać użytkownik, umożliwiając usunięcie konta samoobsługowego. Ustaw na -1, aby wyłączyć usuwanie konta samoobsługowego." username_change_period: "Maksymalna liczba dni po rejestracji, w których konta mogą zmienić swoją nazwę użytkownika (0, aby uniemożliwić zmianę nazwy użytkownika)." - email_editable: "Allow users to change their e-mail address after registration." + email_editable: "Zezwól użytkownikom na zmianę adresu e-mail po rejestracji." logout_redirect: "Lokalizacja do przekierowania przeglądarki po wylogowaniu (np .: https://example.com/logout)" allow_uploaded_avatars: "Zezwól użytkownikom na przesyłanie niestandardowych zdjęć profilowych." default_avatars: "Adresy URL awatarów wykorzystywanych jako domyślne w przypadku nowych użytkowników do momentu, gdy je zmienią." @@ -2025,18 +2024,18 @@ pl_PL: public_user_custom_fields: "Lista niestandardowych pól użytkownika, które można uzyskać korzystających z interfejsu API." staff_user_custom_fields: "Lista pól niestandardowych użytkownika, które można uzyskać przez członków personelu korzystających z interfejsu API." enable_user_directory: "Dostarcz katalog użytkowników do wyszukiwania" - enable_group_directory: "Dostarcz katalog grup do wyszukiwania" + enable_group_directory: "Udostępnij katalog grup do przeglądania" enable_category_group_moderation: "Zezwalaj grupom na moderowanie treści w określonych kategoriach" group_in_subject: "Ustaw %%{optional_pm} w temacie wiadomości e-mail z nazwą pierwszej grupy w prywatnej wiadomości, zobacz: Dostosuj format tematu dla standardowych wiadomości e-mail" allow_anonymous_posting: "Zezwól użytkownikom na przechodzenie w tryb anonimowości." anonymous_posting_min_trust_level: "Minimalny poziom zaufania potrzebny by aktywować anonimowe wpisy" anonymous_account_duration_minutes: "Aby chronić anonimowość twórz nowe anonimowe konto co N minut dla każdego użytkownika. Przykład: jeśli ustawione na 600, dopóki nie minie 600 minut od ostatniego wpisu i użytkownik przełącza się na anon, zostanie utworzone nowe anonimowe konto." - hide_user_profiles_from_public: "Wyłącz karty, profile i katalogi użytkownika dla użytkownika anonimowego." + hide_user_profiles_from_public: "Wyłącz karty użytkownika, profile użytkowników i katalog użytkowników dla użytkowników anonimowych." allow_users_to_hide_profile: "Zezwalaj użytkownikom na ukrywanie swojego profilu i statusu dostępności." allow_featured_topic_on_user_profiles: "Zezwalaj użytkownikom na umieszczanie linków do tematu na ich karcie i profilu użytkownika." show_inactive_accounts: "Pozwól zalogowanym użytkownikom przeglądać profile nieaktywnych kont." hide_suspension_reasons: "Nie wyświetlaj publicznie powodów zawieszenia w profilach użytkowników." - log_personal_messages_views: "Rejestruj osobiste wyświetlenia wiadomości przez administratora dla innych użytkowników/grup." + log_personal_messages_views: "Rejestruj wyświetlenia wiadomości osobistych przez administratora dla innych użytkowników/grup." ignored_users_count_message_threshold: "Powiadom moderatorów, jeśli dany użytkownik jest ignorowany przez wielu innych użytkowników." ignored_users_message_gap_days: "Ile trzeba czekać, zanim ponownie powiadomimy moderatorów o użytkowniku, który został zignorowany przez wielu członków społeczność." clean_up_inactive_users_after_days: "Liczba dni do usunięcia nieaktywnego użytkownika (poziom zaufania 0 bez żadnych postów). Aby wyłączyć czyszczenie, ustaw na 0." @@ -2071,8 +2070,8 @@ pl_PL: penalty_step_hours: "Domyślne kary za wyciszanie lub zawieszanie użytkowników w godzinach. Pierwsze wykroczenie domyślnie jest pierwszą wartością, drugie wykroczenie jest domyślne do drugiej wartości, itd." svg_icon_subset: "Dodaj dodatkowe ikony FontAwesome 5, które chcesz umieścić w swoich zasobach. Użyj przedrostka 'fa-' dla wypełnionych ikon, 'far-' dla zwykłych ikon i 'fab-' dla ikon marek." max_prints_per_hour_per_user: "Maksymalna liczba /drukowanych stron (ustaw na 0, aby wyłączyć)" - full_name_required: "Pełne imię i nazwisko to wymagane pole w profilu użytkownika." - enable_names: "Pokaż pełną nazwę użytkownika na profilu, karcie użytkownika i w emailach. Wyłącz opcję ukrywania pełnej nazwy wszędzie." + full_name_required: "Pełna nazwa jest wymaganym polem profilu użytkownika." + enable_names: "Pokaż pełną nazwę użytkownika w jego profilu, karcie użytkownika i w e-mailach. Wyłącz, aby ukryć pełną nazwę użytkownika wszędzie." display_name_on_posts: "Pokazuj imię i nazwisko użytkownika przy jego wpisach, a także jego @nazwę użytkownika." show_time_gap_days: "Jeśli dwa wpisy zostały dodane w dużej przerwie, wyświetl okres w temacie." short_progress_text_threshold: "Po tym jak liczba wpisów w tym temacie przekroczy ten numer, ten pasek postępu pokaże tylko bieżącą liczbę wpisów. Jeśli zmienisz szerokość paska postępu, możliwe, że będziesz musiał zmienić tą wartość." @@ -2222,6 +2221,7 @@ pl_PL: invalid_json: "Nieprawidłowy JSON." invalid_reply_by_email_address: "Wartość musi zawierać '%{reply_key}' i musi być inna niż e-mail z powiadomieniem." invalid_alternative_reply_by_email_addresses: "Wszystkie wartości muszą zawierać '%{reply_key}' i być inne niż w emailu powiadamiającym." + invalid_domain_hostname: "Nie może zawierać znaków * lub ?" pop3_polling_host_is_empty: "Musisz ustawić 'pop3 polling host' przed włączeniem przeglądania cyklicznego POP3." pop3_polling_username_is_empty: "Musisz ustawić 'pop3 polling username' przed włączeniem przeglądania cyklicznego POP3." pop3_polling_password_is_empty: "Musisz ustawić 'pop3 polling password' przed włączeniem przeglądania cyklicznego POP3." diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index c971077789..159cd23646 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -1004,7 +1004,6 @@ pt: show_pinned_excerpt_mobile: "Mostrar excerto em publicações afixadas na vista móvel." show_pinned_excerpt_desktop: "Mostar excerto em publicações afixadas na vista de desktop." post_onebox_maxlength: "Tamanho máximo de uma mensagem Discourse de caixa única, em caracteres." - blocked_onebox_domains: "Uma lista de domínios para a qual nunca serão geradas pré-visualizações." max_oneboxes_per_post: "Número máximo de pré-visualizações numa publicação." manifest_screenshots: "Capturas de tela que mostrem os recursos e a funcionalidade da instância na página de incentivo à instalação. Todas as imagens devem ser envios locais e das mesmas dimensões." notification_email: "Para: endereço de email usado ao enviar emails essenciais do sistema. O domínio especificado aqui deverá ter SPF, DKIM e registos PTR inversos configurados corretamente para a chegada do email." diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index 3e9c5c0157..c03e4664e5 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -1443,7 +1443,6 @@ pt_BR: show_pinned_excerpt_mobile: "Mostre trecho de tópicos fixados na visualização para dispositivos móveis." show_pinned_excerpt_desktop: "Mostrar trecho de tópicos fixados na visualização para desktop." post_onebox_maxlength: "Tamanho máximo para uma postagem do Discourse no Onebox." - blocked_onebox_domains: "Uma lista de domínios que nunca serão transformados em Onebox." allowed_inline_onebox_domains: "Uma lista de domínios que serão colocados em miniatura no Onebox se forem vinculados sem um título" enable_inline_onebox_on_all_domains: "Ignore a configuração do site inline_onebox_domain_whitelist e permita inclusões de Onebox em todos os domínios." force_custom_user_agent_hosts: "Hosts para os quais usar um agente do(a) usuário(a) do Onebox em todos os pedidos. (Especialmente útil para hosts que limitam acesso do agente do(a) usuário(a).)" diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index 9667e4a786..dfba2c18a0 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -835,7 +835,6 @@ ro: show_pinned_excerpt_mobile: "Arată fragmente din subiectele fixate în vizualizarea de mobil." show_pinned_excerpt_desktop: "Arată fragmente din subiectele fixate în vizualizarea de desktop." post_onebox_maxlength: "Lungimea maximă a unei postări afișate în Onebox (în caractere)" - blocked_onebox_domains: "O listă cu domenii care nu vor putea fi utilizate cu onebox." max_oneboxes_per_post: "Numărul maxim de utilizări onebox per post." notification_email: "Adresă expeditor: adresa de email folosită când se trimit toate emailurile esențiale ale sistemului. Domeniul specificat aici trebuie să aibă setate corect SPF, DKIM și reverse PTR pentru ca emailul să poată fi livrat." email_custom_headers: "O listă delimitată cu simbolul | (pipe) a header-elor personalizate de email" diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index 3c5dd41502..cbbf43de8d 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -1487,6 +1487,7 @@ ru: unreachable_themes: "Нам не удалось проверить наличие обновлений для следующих тем:" watched_word_regexp_error: "Недопустимое регулярное выражение для контролируемых слов в разделе '%{action}'. Пожалуйста, проверьте корректность регулярных выражений, или отключите в настройках сайта настройку 'Контролируемые слова представлены регулярными выражениями'." site_settings: + allow_bulk_invite: "Разрешить массовые приглашения путём загрузки CSV-файла" disabled: "отключён" display_local_time_in_user_card: "Отображать местное время в карточке пользователя." censored_words: "Слова, которые будут автоматически заменены на ■■■■" @@ -1551,7 +1552,7 @@ ru: show_pinned_excerpt_mobile: "Показывать фрагменты закреплённых тем в мобильном представлении." show_pinned_excerpt_desktop: "Показывать фрагменты закреплённых тем в настольных устройствах." post_onebox_maxlength: "Максимальная длина сообщения в режиме умной вставки." - blocked_onebox_domains: "Список доменов, контент с которых не будет преобразовываться в умную вставку." + blocked_onebox_domains: "Список доменов, которые не будут преобразовываться в умную вставку, например wikipedia.org\n(подстановочные знаки '*' и '?' не поддерживаются)." allowed_inline_onebox_domains: "Список доменов, контент с которых будет преобразовываться в умную вставку, если ссылка указана без заголовка." enable_inline_onebox_on_all_domains: "Игнорировать параметр `inline_onebox_domain_whitelist` и разрешить умную вставку для всех доменов." force_custom_user_agent_hosts: "Хосты, для которых можно использовать пользовательский User-Agent умных вставок для всех запросов. (Особенно полезно для хостов, которые ограничивают доступ пользовательским агентам)." @@ -2223,6 +2224,7 @@ ru: invalid_json: "Недопустимый формат JSON." invalid_reply_by_email_address: "Значение должно содержать '%{reply_key}' и должно отличаться от письма уведомления." invalid_alternative_reply_by_email_addresses: "Все значения должны содержать '%{reply_key}' и должны отличаться от письма уведомления." + invalid_domain_hostname: "Доменное имя не должно содержать символы '*' или '?'." pop3_polling_host_is_empty: "Вы должны установить 'pop3 polling host' перед включением POP3 polling." pop3_polling_username_is_empty: "Вы должны установить 'pop3 polling username' перед включением POP3 polling." pop3_polling_password_is_empty: "Вы должны установить 'pop3 polling password' перед включением POP3 polling." @@ -4350,7 +4352,7 @@ ru: name: Первая умная вставка description: Опубликовал ссылку, которая была преобразована в умную вставку long_description: | - Эта награда выдается при первом размещении ссылки в отдельной строке, которая автоматически разворачивается в умную вставку, содержащую сводку, заголовок и (при наличии) изображение. + Эта награда выдаётся при первом размещении ссылки в отдельной строке, которая автоматически разворачивается в умную вставку, содержащую сводку, заголовок и (при наличии) изображение. first_reply_by_email: name: Первый ответ по почте description: Ответил на пост по электронной почте diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index 84da7ab632..216f1b1d9a 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -338,6 +338,8 @@ sv: too_many_links: one: "Tyvärr kan nya användare bara ha en länk i ett inlägg." other: "Tyvärr kan nya användare bara ha %{count} länkar i ett inlägg." + contains_blocked_word: "Tyvärr, du kan inte använda ordet '%{word}'; det är inte tillåtet." + contains_blocked_words: "Tyvärr, du kan inte skriva det. Ej tillåtet: %{words}." spamming_host: "Tyvärr kan du inte publicera en länk till den värden." user_is_suspended: "Avstängda användare har inte tillåtelse att göra inlägg" topic_not_found: "Något har gått fel. Kanske har ämnet stängts eller raderats medan du tittade på det?" @@ -1423,7 +1425,6 @@ sv: show_pinned_excerpt_mobile: "Visa utdrag för fästa ämnen i mobilen." show_pinned_excerpt_desktop: "Visa utdrag för fästa ämnen på datorn." post_onebox_maxlength: "Maximal teckenlängd för ett Discourse-inlägg i onebox." - blocked_onebox_domains: "En lista över domäner som aldrig placeras i onebox." allowed_inline_onebox_domains: "En lista över domäner som placeras i onebox i miniatyrform om de länkas utan en rubrik" enable_inline_onebox_on_all_domains: "Ignorera webbplatsinställningen inline_onebox_domain_allowlist och tillåt infogad onebox på alla domäner." force_custom_user_agent_hosts: "Värdar för vilka anpassad användaragent för onebox ska användas vid alla förfrågningar. (särskilt användbart för värdar som begränsar åtkomst av användaragent)." @@ -2075,6 +2076,7 @@ sv: share_quote_visibility: "Avgör när du ska visa citatdelningsknappar: aldrig, endast till anonyma användare eller för alla användare. " create_revision_on_bulk_topic_moves: "Skapa ny version av första inlägg när ämnen flyttas till en ny kategori i bulk." allow_changing_staged_user_tracking: "Tillåt att aviseringsinställningar för en arrangerad användares kategori och tagg kan ändras av en administratörsanvändare." + use_email_for_username_and_name_suggestions: "Använd den första delen av e-postadresser för användarnamn och namnförslag. Observera att detta gör det lättare för allmänheten att gissa användares fullständiga e-postadresser (eftersom en stor del av människor delar gemensamma tjänster som `gmail.com`)." errors: invalid_css_color: "Ogiltig färg. Ange ett färgnamn eller ett hexvärde." invalid_email: "Felaktig e-postadress." diff --git a/config/locales/server.sw.yml b/config/locales/server.sw.yml index 06d85e95ed..6997827af4 100644 --- a/config/locales/server.sw.yml +++ b/config/locales/server.sw.yml @@ -793,7 +793,6 @@ sw: max_image_width: "Kiwango cha juu cha upana wa kijipicha za picha kwenye chapisho" max_image_height: "Kiwango cha juu cha urefu wa kijipicha za picha kwenye chapisho" add_rel_nofollow_to_user_content: 'Ongeza rel nofollow kwenye maandishi yote mtumiaji aliyotoa, isipokuwa viungo vya ndani (pamoja na kikoa baba). Ukibadilisha hii, lazima urebake machapisho yote na: "rake machapishi:rebake"' - blocked_onebox_domains: "Orodha ya anwani za mitandao ambazo hazijawekwa kwenye boxi." allowed_inline_onebox_domains: "Orodha za anwani za mtandao ambazo zitawekwa kwenye boxi kama zikiunganishwa bila kichwa cha habari" summary_score_threshold: "Alama ya chini ambayo mada inahitaji kabla ya kuwekwa ndani ya 'Fupisha Hii Mada' " summary_percent_filter: "Mtumiaji akibonyeza 'Fupisha Hii Mada', onyesha % machapisho ya juu" diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index fa9eceed57..bd5c566fe3 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -1371,6 +1371,7 @@ tr_TR: unreachable_themes: "Aşağıdaki temalar için güncellemeleri kontrol edemedik:" watched_word_regexp_error: "İzlenen %{action} sözcükleri için düzenli ifade geçersiz. Lütfen İzlenen Sözcük ayarlarınızı kontrol edin veya 'izlenen sözcük düzenli ifadeleri' site ayarını devre dışı bırakın." site_settings: + allow_bulk_invite: "CSV dosyası yükleyerek toplu davete izin ver" disabled: "devredışı" display_local_time_in_user_card: "Kullanıcı kartı açıkken yerel saati kullanıcının saat dilimine göre görüntüle." censored_words: "otomatik olarak ■■■■ ile değiştirilecek sözcükler" @@ -1435,7 +1436,6 @@ tr_TR: show_pinned_excerpt_mobile: "Mobil görünümünde başa tutturulmuş konuların özetini göster." show_pinned_excerpt_desktop: "Masaüstü görünümünde başa tutturulmuş konuların özetini göster." post_onebox_maxlength: "Kutulanmış bir Discourse gönderisinin en fazla karakter uzunluğu" - blocked_onebox_domains: "Asla yayınlanmayacak alanların listesi." allowed_inline_onebox_domains: "Başlıksız bağlanırsa minyatür formda yayınlanacak alanların listesi" enable_inline_onebox_on_all_domains: "İnline_onebox_domain_whitelist site ayarını yok say ve tüm alan adlarında inline onebox'a izin ver." force_custom_user_agent_hosts: "Tüm isteklerde özel onebox kullanıcı aracısını kullanacak ana makineler. (Özellikle kullanıcı aracısıyla erişimi sınırlayan ana bilgisayarlar için kullanışlıdır)." @@ -2090,6 +2090,7 @@ tr_TR: invalid_json: "Geçersiz JSON." invalid_reply_by_email_address: "Değer '%{reply_key}' içermeli ve bildiri e-postasından farklı olmalı." invalid_alternative_reply_by_email_addresses: "Tüm değerler '%{reply_key}' içermeli ve bildirim e-postasından farklı olmalıdır." + invalid_domain_hostname: "* ya da ? karakteri içermemeli." pop3_polling_host_is_empty: "POP3 sorgulamasını etkinleştirmeden önce bir 'pop3 polling host' ayarlamanız gerekir." pop3_polling_username_is_empty: "POP3 sorgulamasını etkinleştirmeden önce bir 'pop3 polling username' ayarlamanız gerekir." pop3_polling_password_is_empty: "POP3 sorgulamasını etkinleştirmeden önce bir 'pop3 polling password' ayarlamanız gerekir." @@ -2497,6 +2498,8 @@ tr_TR: ``` Ayrıntılar için lütfen [topluluk yönergelerimizi](%{base_url}/guidelines) inceleyin. + flags_agreed_and_post_deleted_for_responders: + title: "Yanıt, personel tarafından işaretlenen gönderiden kaldırıldı" usage_tips: text_body_template: | Yeni bir kullanıcı olarak başlamak için birkaç küçük ipucu, [bu blog gönderisini inceleyin](https://blog.discourse.org/2016/12/discourse-new-user-tips-and-tricks/). diff --git a/config/locales/server.uk.yml b/config/locales/server.uk.yml index 94e9869a3b..3396bf8a56 100644 --- a/config/locales/server.uk.yml +++ b/config/locales/server.uk.yml @@ -244,6 +244,8 @@ uk:

Якщо ви пам'ятаєте ваш пароль, ви можете Увійти в акаунт.

В іншому випадку Відновіть пароль.

+ not_found_template_link: | +

Це запрошення на %{site_name} більше не можна використати. Попросіть того, хто вас запросив, надіслати вам нове запрошення.

user_exists: "Немає необхідності надсилати запрошення %{email}, такий акаунт вже існує!" invite_exists: "Ви вже запросили %{email}." invalid_email: "%{email} не є дійсною адресою електронної пошти." @@ -374,6 +376,8 @@ uk: few: "Даруйте, нові користувачі можуть вставляти тільки %{count} посилань в допис." many: "Даруйте, нові користувачі можуть вставляти тільки %{count} посилань в допис." other: "Даруйте, нові користувачі можуть вставляти тільки %{count} посилань в допис." + contains_blocked_word: "Ви не можете опублікувати слово '%{word}'; це не дозволено." + contains_blocked_words: "Вибачте, ви не можете опублікувати це. Ці слова заборонені: %{words}." spamming_host: "Даруйте, Ви не можете вставити посилання на цей хост." user_is_suspended: "Заблокованим користувачам заборонено писати." topic_not_found: "Щось пішло не так. Можливо цей допис було закрито або видалено, під час того, як ви його переглядали?" @@ -1447,6 +1451,7 @@ uk: qtt_like: Отримані вподобання description: "Топ-10 користувачів, які мали лайки від широкого кола людей." dashboard: + group_email_credentials_warning: 'Виникла проблема з обліковими даними електронної пошти для групи %{group_full_name}. Жодні електронні листи не надсилатимуться зі скриньки групи, доки цю проблему не буде вирішено. %{error}' rails_env_warning: "Ваш сервер працює в режимі %{env}." host_names_warning: "Ваш файл config/database.yml використовує локальне ім’я хоста за замовчуванням. Поміняйте його на ім’я хоста вашого веб-сайту." sidekiq_warning: 'Sidekiq is not running. Many tasks, like sending emails, are executed asynchronously by sidekiq. Please ensure at least one sidekiq process is running. Learn about Sidekiq here.' @@ -1540,7 +1545,6 @@ uk: show_pinned_excerpt_mobile: "Показати короткий виклад по закріплених темах в мобільному поданні." show_pinned_excerpt_desktop: "Показати витримку по закріплених темах в режимі робочого столу." post_onebox_maxlength: "Максимальна довжина повідомлення з форуму Discourse в режимі розумної вставки." - blocked_onebox_domains: "Список доменів, контент з яких ніколи не буде перетворено на розумну вставку." allowed_inline_onebox_domains: "Список доменів, контент з яких буде перетворено в мініатюрну вставку, якщо посилання вказане без заголовка" enable_inline_onebox_on_all_domains: "Ігнорувати налаштування сайту inline_onebox_domain_allowlist і дозволити вбудований контент для всіх доменів." force_custom_user_agent_hosts: "Хости, для яких використовується агент користувача розумних вставок для всіх запитів. (Особливо корисно для хостів, які обмежують доступ користувальницького агента)." @@ -1703,6 +1707,7 @@ uk: discourse_connect_overrides_card_background: "Змінити фон профілю користувача на значення, яке використовується в DiscourseConnect." discourse_connect_not_approved_url: "Перенаправити несхвалені DiscourseConnect-акаунти на цю URL-адресу" discourse_connect_allows_all_return_paths: "Не обмежувати параметр return_paths для домена, надані DiscourseConnect (за замовчуванням шлях повернення має бути на поточному сайті)" + enable_local_logins: "Увімкнути локальні облікові записи на основі імені користувача та пароля. ПОПЕРЕДЖЕННЯ: якщо цей параметр вимкнено, ви не зможете увійти, якщо раніше не налаштували хоча б один альтернативний метод входу." enable_local_logins_via_email: "Дозволити користувачам запитувати посилання для входу в один клік та надсилати їм електронною поштою цього посилання." allow_new_registrations: "Дозволити реєстрацію нових користувачів. Вимкніть, щоб заборонити відвідувачам створювати нові облікові записи." enable_signup_cta: "Покажіть повідомлення анонімним користувачам, які повернулися, з пропозицією зареєструвати обліковий запис." @@ -1711,6 +1716,7 @@ uk: google_oauth2_client_secret: "Client secret для вашого Google додатка" google_oauth2_prompt: "Необов’язковий розділений пробілом список значень, який вказує, чи запитує сервер авторизацію користувача для повторної автентифікації та згоди. Див. https://developers.google.com/identity/protocols/OpenIDConnect#prompt щодо можливих значень." google_oauth2_hd: "Необов’язковий домен, розміщений у Google Apps Hosted, до якого вхід буде обмежений. Див https://developers.google.com/identity/protocols/OpenIDConnect#hd-param для більш докладної інформації." + google_oauth2_hd_groups: "(експериментально) Отримати групи Google користувачів у розміщеному домені під час автентифікації. Отримані групи Google можна використовувати для надання автоматичного членства в групі Discourse (див. налаштування групи)." enable_twitter_logins: "Увімкніть автентифікацію Twitter, потрібні twitter_consumer_key та twitter_consumer_secret. Див. Configuring Twitter login (and rich embeds) for Discourse." twitter_consumer_key: "Ключ користувача для аутентифікації в Twitter, зареєстрований за адресою https://developer.twitter.com/apps" twitter_consumer_secret: "Секретний номер для перевірки справжності Twitter, зареєстрований в https://developer.twitter.com/apps" @@ -1723,19 +1729,28 @@ uk: enable_discord_logins: "Дозволити користувачам вхід за допомогою Discord?" discord_client_id: 'Discord ID клієнта (потрібен такий? відвідайте the Discord developer portal)' discord_secret: "Discord секретний ключ" + discord_trusted_guilds: 'Дозволяйте вхід в систему через Discord лише членам цих гільдій. Використовуйте цифровий ідентифікатор гільдії. Для отримання додаткової інформації перегляньте інструкції тут. Залиште порожнім, щоб дозволити будь-яку гільдію.' enable_backups: "Дозволити адміністраторам створювати резервні копії форуму" + allow_restore: "Дозволити відновлення, яке може замінити ВСІ дані сайту! Залиште вимкненим, якщо ви не плануєте відновити сайт з резервної копії" maximum_backups: "Максимальна кількість резервних копій для зберігання на диску. Старіші резервні копії автоматично видаляються" automatic_backups_enabled: "Запускайте автоматичні резервні копії, як визначено в частоті резервного копіювання" backup_frequency: "Кількість днів між резервними копіями." s3_backup_bucket: "Адреса папки віддаленого сервера для резервних копій. УВАГА: Переконайтеся, що місце призначення захищено від сторонніх." s3_endpoint: "Кінцеву точку можна змінити для резервного копіювання на службу, сумісну з S3, наприклад DigitalOcean Spaces або Minio. УВАГА: Не використовуйте AWS S3." + s3_configure_tombstone_policy: "Увімкнути політику автоматичного видалення завантажень, відмічених як \"видалені\". ВАЖЛИВО. Якщо цей параметр вимкнено, місце не буде звільнятися після видалення завантажень." + s3_disable_cleanup: "Запобігайте видаленню старих резервних копій із S3, якщо резервних копій більше, ніж максимально дозволено." + enable_s3_inventory: "Генерувати звіти та перевіряти завантаження за допомогою інвентарю Amazon S3. ВАЖЛИВО: потрібні дійсні облікові дані S3 (як ідентифікатор ключа доступу, так і секретний ключ доступу)." backup_time_of_day: "Час доби UTC, коли має відбуватися резервне копіювання" backup_with_uploads: "Додайте завантаження до запланованих резервних копій. Якщо вимкнути це, ви можете створити резервну копію бази даних." + backup_location: "Місце, де зберігаються резервні копії. ВАЖЛИВО: S3 вимагає дійсних облікових даних S3, введених у налаштуваннях Файлів." backup_gzip_compression_level_for_uploads: "Рівень стиснення Gzip, який використовується для стискання завантажень." include_thumbnails_in_backups: "Включіть створені ескізи в резервні копії. Якщо вимкнути цю функцію, резервні копії зменшаться, але потрібно буде перебудувати (rebake) всі повідомлення після відновлення." active_user_rate_limit_secs: "Як часто ми оновлюємо 'last_seen_at' поле, в секундах" verbose_localization: "Показувати ключі використовуваних рядків в інтерфейсі для перекладу на іншу мову" previous_visit_timeout_hours: "Скільки часу триває візит, перш ніж ми вважатимемо це 'попереднім' візитом, в годинах" + top_topics_formula_log_views_multiplier: "значення коефіцієнта множення переглядів журналу (n) у формулі топ-тем: `log(views_count) * (n) + op_likes_count * 0.5 + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_first_post_likes_multiplier: "значення коефіцієнта множення переглядів журналу (n) у формулі топ-тем: `log(views_count) * 2 + op_likes_count * (n) + LEAST(likes_count / posts_count, 3) + 10 + log(posts_count)`" + top_topics_formula_least_likes_per_post_multiplier: "значення коефіцієнта найменшої кількості лайків на допис (n) у формулі топ-тем: `log(views_count) * 2 + op_likes_count * 0.5 + LEAST(likes_count / posts_count, (n)) + 10 + log(posts_count)`" enable_safe_mode: "Дозволити користувачам входити в безпечний режим для налагодження плагінів." rate_limit_create_topic: "Користувачі не можуть створювати більше однієї нової теми за вказаний час, в секундах." rate_limit_create_post: "Користувачі не можуть писати більше одного нового допису за вказаний час, в секундах." @@ -1746,12 +1761,18 @@ uk: max_bookmarks_per_day: "Максимальна кількість створених закладок користувачем за день." max_edits_per_day: "Максимальна кількість редагувань користувачем за день." max_topics_per_day: "Максимальна кількість тем, які користувач може створити за один день." + max_personal_messages_per_day: "Максимальна кількість нових особистих повідомлень, які користувач може створювати за день." max_invites_per_day: "Максимальна кількість запрошень, яке може відправити користувач за один день." max_topic_invitations_per_day: "Максимальна кількість запрошень в тему, яке може відправити користувач протягом дня." max_logins_per_ip_per_hour: "Максимальна кількість входів в систему на IP-адресу за годину" max_logins_per_ip_per_minute: "Максимальна кількість входів в систему на IP-адресу за годину" + max_post_deletions_per_minute: "Максимальна кількість повідомлень, які користувач може видалити за хвилину. Встановіть значення 0, щоб відключити видалення повідомлень." + max_post_deletions_per_day: "Максимальна кількість повідомлень, які користувач може видалити за день. Встановіть значення 0, щоб відключити видалення повідомлень." + invite_link_max_redemptions_limit: "Максимальна кількість використання активацій із посилань запрошень." + invite_link_max_redemptions_limit_users: "Максимальна кількість використання активацій посилань із запрошень, створених користувачами." alert_admins_if_errors_per_minute: "Кількість помилок на хвилину для попередження адміністратора. Значення 0 відключає цю опцію. УВАГА: потрібне перезавантаження." alert_admins_if_errors_per_hour: "Кількість помилок на годину для попередження адміністратора. Значення 0 відключає цю опцію. УВАГА: потрібне перезавантаження." + categories_topics: "Кількість тем для показу на сторінці /categories. Якщо встановлено значення 0, тоді система автоматично намагатиметься знайти значення, щоб обидва стовпці (категорії та теми) були симетрично однакової довжини." suggested_topics: "Кількість рекомендованих тем, що відображаються внизу поточної тем." limit_suggested_to_category: "Показувати тільки теми з поточного розділу в списку рекомендованих тем." suggested_topics_max_days_old: "Пропоновані теми не повинні бути старше n днів." @@ -1903,8 +1924,10 @@ uk: reviewable_default_visibility: "Не показуйте елементи для перегляду, якщо вони не відповідають цьому пріоритету" high_trust_flaggers_auto_hide_posts: "Нові повідомлення користувачів автоматично приховуватимуться як спам, після позначення їх користувачем з рівнем довіри 3 та вище" cooldown_hours_until_reflag: "Скільки часу доведеться чекати користувачам, поки вони зможуть повторно додати позначку на повідомлення" + slow_mode_prevents_editing: "Забороняти при «Повільному режимі» редагування після закінчення пільгового періоду редагування editing_grace_period?" reply_by_email_enabled: "Увімкнути відповіді на теми електронною поштою." reply_by_email_address: "Шаблон адреси електронної скриньки у формі для відповідей через електронну пошту, наприклад: %%{reply_key}@reply.myforum.com" + alternative_reply_by_email_addresses: "Список альтернативних шаблонів для відповіді, який застосовується на основі вхідних адрес електронної пошти. Наприклад: %%{reply_key}@reply.example.com|replies+%%{reply_key}@example.com" incoming_email_prefer_html: "Використовуйте HTML замість тексту для вхідної електронної пошти." strip_incoming_email_lines: "Видаляти проміжні пробіли та пробіли з кожного рядка вхідних електронних листів." disable_emails: "Захистити Discourse від надсилання будь-яких електронних листів. Виберіть 'так', щоб вимкнути електронні листи для всіх користувачів. Виберіть 'не персонал', щоб вимкнути електронні листи лише для користувачів, які не є персоналом." @@ -1921,10 +1944,13 @@ uk: auto_generated_allowlist: "Список електронних адрес, які не перевірятимуться на автоматично створений вміст. Приклад: foo@bar.com|discourse@bar.com" block_auto_generated_emails: "Блокувати вхідні електронні листи, ідентифіковані як автоматично створені." ignore_by_title: "Ігнорувати вхідні електронні листи на основі їх заголовку." + mailgun_api_key: "Ключ API Mailgun Secret, який використовується для перевірки повідомлень webhook." soft_bounce_score: "Кількість відмов додається користувачеві, коли трапляється тимчасова відмова." hard_bounce_score: "Кількість відмов додається користувачеві, коли відбувається постійна відмова." bounce_score_threshold: "Максимальна кількість відмов, перш ніж ми перестанемо надсилати електронну пошту користувачеві." reset_bounce_score_after_days: "Автоматично скинути показник відмов через X днів." + blocked_attachment_content_types: "Список ключових слів, які використовуються для блокування вкладень залежно від типу вмісту." + blocked_attachment_filenames: "Список ключових слів, які використовуються для блокування вкладень на основі імені файлу." forwarded_emails_behaviour: "Як ставитись до пересланого електронного листа до Discourse" always_show_trimmed_content: "Завжди показуйте обрізану частину вхідних електронних листів. ПОПЕРЕДЖЕННЯ: можуть бути показані Email адреси." trim_incoming_emails: "Обрізати частину вхідних листів, якщо вони не актуальні." @@ -1959,10 +1985,12 @@ uk: imap_batch_import_email: "Мінімальна кількість нових листів, які запускають режим імпорту (вимикає поштові сповіщення)." email_prefix: "[Label], який використовується в темі електронних листів. За замовчуванням встановлено значення 'title', якщо воно явно не встановлено." email_site_title: "Назва сайту використовується як відправник електронних листів з сайту. Типове значення «title», якщо не встановлено. Якщо заголовок містить символи, які заборонено в рядках відправника електронної пошти, то буде використано цей параметр." + find_related_post_with_key: "Використовувати лише «ключ відповіді», щоб знайти відповідь на публікацію. УВАГА: відключення цього параметра дозволяє видавати себе за іншого користувача на основі адреси електронної пошти." minimum_topics_similar: "Скільки тем має існувати, перш ніж подібні теми будуть показані під час створення нових тем." relative_date_duration: "Кількість днів після публікації, коли дати публікації будуть відображені як відносні (7d), а не абсолютні (20 лютого)." delete_user_max_post_age: "Не дозволяти видаляти користувачів, чия перша публікація старша (x) днів." delete_all_posts_max: "Максимальне число дописів, які можна видалити за один раз кнопкою \"Видалити всі дописи\". Якщо користувач має більше дописів, ніж це число, їх не можна буде видалити за один раз, і користувача також." + delete_user_self_max_post_count: "Максимальна кількість повідомлень, які користувач може мати, при видаленні власного облікового запису. Встановіть значення -1, щоб вимкнути можливість видалення власного облікового запису." username_change_period: "Максимальна кількість днів після реєстрації, щоб облікові записи могли змінити своє ім'я користувача (0, щоб заборонити зміну імені користувача)." email_editable: "Дозволити користувачам змінювати свою електронну скриньку після реєстрації." logout_redirect: "URL для переадресації браузера після виходу (наприклад: https://example.com/logout)" @@ -1986,10 +2014,13 @@ uk: staff_user_custom_fields: "Список користувальницьких полів, які можна отримати для співробітників з API." enable_user_directory: "Надайте розділ користувачів для перегляду" enable_group_directory: "Надайте розділ груп для перегляду" + enable_category_group_moderation: "Дозволити групам модерувати вміст у певних категоріях" + group_in_subject: "Встановити змінну %%{optional_pm} в темі електронної пошти з ім'ям першої групи в профілі, докладніше: Налаштування формату теми для стандартних електронних листів" allow_anonymous_posting: "Дозволити користувачам переходити в анонімний режим" anonymous_posting_min_trust_level: "Мінімальний рівень довіри, необхідний для дозволу анонімних публікацій" anonymous_account_duration_minutes: "Для захисту анонімності створити новий анонімний обліковий запис кожні N хвилин для кожного користувача. Наприклад: якщо встановлено 600, як тільки минуло 600 хвилин з останнього повідомлення – користувач перейде на новий анонімний запис." hide_user_profiles_from_public: "Вимкнути картки, профілі та розділ користувачів для анонімних користувачів." + allow_users_to_hide_profile: "Дозволити користувачам приховувати свій профіль та присутність на форумі" allow_featured_topic_on_user_profiles: "Дозволити користувачам розміщувати посилання на тему на своїй картці та профілі користувача." show_inactive_accounts: "Дозволити авторизованим користувачам, переглядати профілі неактивних облікових записів." hide_suspension_reasons: "Не показуйте причини призупинення публічно в профілях користувачів." @@ -1997,7 +2028,9 @@ uk: ignored_users_count_message_threshold: "Повідомте модераторів, якщо певний користувач ігнорується більше ніж N користувачами." ignored_users_message_gap_days: "Як довго чекати, перш ніж повторно повідомити модераторів про користувача, якого ігнорувало багато інших." clean_up_inactive_users_after_days: "Кількість днів до видалення неактивного користувача (рівень довіри 0 без жодних публікацій). Щоб вимкнути очищення, встановіть значення 0." + clean_up_unused_staged_users_after_days: "Кількість днів до видалення невикористаного інсценованого користувача (без будь-яких повідомлень). Для відключення очищення встановіть значення 0." user_selected_primary_groups: "Дозволити користувачам створювати власну групу" + max_notifications_per_user: "Максимальна кількість сповіщень на користувача, якщо це число буде перевищено, старі сповіщення будуть видалені щотижня. Встановіть 0, щоб вимкнути" allowed_user_website_domains: "Веб-сайт користувача треба підтверджувати для цих доменів. Список з розмежуванням." allow_profile_backgrounds: "Дозволити користувачам завантажувати фони профілю." sequential_replies_threshold: "Кількість публікацій, які користувач повинен робити підряд по темі, перш ніж нагадувати про занадто багато послідовних відповідей." @@ -2168,6 +2201,7 @@ uk: placeholder: discourse_connect_provider_secrets: key: "www.example.com" + value: "Ключ DiscourseConnect" search: extreme_load_error: "Сайт перебуває під надзвичайним навантаженням, пошук вимкнено, повторіть спробу пізніше" within_post: "# %{post_number} від %{username}" @@ -2176,6 +2210,8 @@ uk: topic: "Результати" user: "Користувачі" results_page: "Результати пошуку для '%{term}'" + audio: "[audio]" + video: "[video]" discourse_connect: login_error: "Помилка входу" not_found: "Ваш обліковий запис не вдалося знайти. Зверніться до адміністратора сайту." @@ -2183,10 +2219,12 @@ uk: unknown_error: "Виникла проблема з вашим обліковим записом. Зверніться до адміністратора сайту." timeout_expired: "Час входу в обліковий запис вийшов. Спробуйте знову увійти." no_email: "Не вказано електронну адресу e-mail. Зверніться до адміністратора сайту." + blank_id_error: "Параметр \"external_id\" є обов'язковим, але поки не встановлений" email_error: "Не вдалося зареєструвати обліковий запис з електронною поштою %{email}. Зверніться до адміністратора сайту." original_poster: "Перший дописувач" most_recent_poster: "Автор останнього допису" frequent_poster: "Частий дописувач" + poster_description_joiner: ", " redirected_to_top_reasons: new_user: "Ласкаво просимо до нашої спільноти! Це найпопулярніші останні теми." not_seen_in_a_month: "З поверненням! Ми вас давно не бачили. Це найпопулярніші теми, відколи ви не відвідували форум." @@ -2199,6 +2237,7 @@ uk: errors: different_topics: "Повідомлення, що належать до різних тем, неможливо об’єднати." different_users: "Повідомлення, що належать різним користувачам, неможливо об’єднати." + max_post_length: "Публікації не можна об’єднати, оскільки сумарна довжина публікації перевищує дозволену." move_posts: new_topic_moderator_post: one: "Допис був розділений на нову тему: %{topic_link}" @@ -2225,6 +2264,7 @@ uk: publish_page: slug_errors: blank: "не може бути порожнім" + unavailable: "недоступний" invalid: "містить неприпустимі символи" topic_statuses: autoclosed_message_max_posts: @@ -2317,8 +2357,10 @@ uk: not_activated: "Ви ще не можете увійти. Ми надіслали Вам активаційного листа. Будь ласка, дотримуйтеся інструкцій у листі, щоб активувати свій обліковий запис." not_allowed_from_ip_address: "Ви не можете увійти як %{username} з цієї IP-адреси." admin_not_allowed_from_ip_address: "Ви не можете увійти як адміністратор з цієї IP-адреси." + reset_not_allowed_from_ip_address: "Ви не можете надіслати запит на скидання пароля з цієї IP-адреси." suspended: "Ви не можете входити до %{date}." suspended_with_reason: "Обліковий запис призупинено до %{date}: %{reason}" + suspended_with_reason_forever: "Обліковий запис призупинено: %{reason}" errors: "%{errors}" not_available: "Not available. Try %{suggestion}?" something_already_taken: "Щось пішло не так, можливо, ім'я користувача або електронна скринька вже зареєстровані. Спробуйте посилання \"Я забув пароль\"." @@ -2327,12 +2369,14 @@ uk: csrf_detected: "Час авторизації закінчено, або ви переключили браузери. Будь ласка спробуйте ще раз." request_error: "Під час запуску авторизації сталася помилка. Будь ласка спробуйте ще раз." invalid_iat: "Неможливо перевірити маркер авторизації через відмінності в часі сервера. Будь ласка спробуйте ще раз." + omniauth_error_unknown: "Сталася помилка під час обробки вашого входу. Спробуйте ще раз." omniauth_confirm_title: "Увійдіть, використовуючи %{provider}" omniauth_confirm_button: "Продовжити" authenticator_error_no_valid_email: "Не допускаються жодні адреси електронної пошти, пов'язані з %{account}. Можливо, вам доведеться налаштувати свій обліковий запис за допомогою іншої адреси електронної пошти." new_registrations_disabled: "Наразі реєстрація нових облікових записів заборонена." password_too_long: "Паролі обмежені 200 символами." email_too_long: "Ви вказали електронну пошту Email занадто довгу. Адреса поштової скриньки повинна містити не більше 254 символів, а доменні імена не більше 253 символів." + wrong_invite_code: "Введений вами код запрошення був неправильним." reserved_username: "Це ім’я користувача заборонено." missing_user_field: "Ви не заповнили всі поля користувача" auth_complete: "Автентифікація завершена." @@ -2340,6 +2384,7 @@ uk: second_factor_title: "Двофакторна автентифікація" second_factor_description: "Введіть необхідний код автентифікації у своєму додатку:" second_factor_backup_description: "Введіть один із резервних кодів:" + second_factor_backup_title: "Двофакторний резервний код" invalid_second_factor_code: "Недійсний код аутентифікації Кожен код може бути використаний лише один раз." invalid_security_key: "Недійсний ключ безпеки." missing_second_factor_name: "Будь ласка, вкажіть ім’я." @@ -2350,6 +2395,18 @@ uk: admin: email: sent_test: "надіслано!" + user: + merge_user: + updating_username: "Оновлення імені користувача..." + changing_post_ownership: "Зміна власника публікації..." + merging_given_daily_likes: "Об’єднання отриманих щоденних симпатій..." + merging_post_timings: "Об’єднання часу створення публікацій..." + merging_user_visits: "Об’єднання статистики відвідувань користувачів..." + updating_site_settings: "Оновлення налаштувань сайту..." + updating_user_stats: "Оновлення статистики користувача..." + merging_user_attributes: "Об'єднання атрибутів користувача..." + updating_user_ids: "Оновлення ідентифікаторів користувачів..." + deleting_source_user: "Видалення вихідного користувача..." user: deactivated: "Відключено через багато електронних листів, відхилених на '%{email}'." deactivated_by_staff: "Деактивовано персоналом" @@ -2360,6 +2417,7 @@ uk: other: "Автоматично деактивується через %{count} днів бездіяльності" activated_by_staff: "Активований персоналом" new_user_typed_too_fast: "Новий користувач набирає текст занадто швидко" + content_matches_auto_silence_regex: "Вміст відповідає автоматичному блокуванню за regex (регулярним виразом)" content_matches_auto_block_regex: "Вміст відповідає автоматичному блоку regex (регулярний вираз)" username: short: "має бути найменше %{min} символів" @@ -2377,6 +2435,7 @@ uk: not_allowed: "is not allowed from that email provider. Please use another email address." blocked: "не допускається." revoked: "Не надсилатимуть електронні листи на '%{email}' до %{date}." + does_not_exist: "Н/Д" ip_address: blocked: "Нові реєстрації заборонені з вашої IP-адреси." max_new_accounts_per_registration_ip: "Не дозволяються нові реєстрації з вашої IP-адреси (досягнуто максимального обмеження). Зверніться до співробітника." @@ -2389,15 +2448,21 @@ uk: same_ip_address: "Ідентична IP-адреса (%{ip_address}), як в інших користувачів" inactive_user: "Неактивний користувач" reviewable_reject_auto: "Автоматична обробка черги перегляду" + reviewable_reject: "Користувача після перегляду відхилено" email_in_spam_header: "Перше повідомлення користувача було позначено як спам" + already_silenced: "Користувач вже був заблокований співробітником %{staff} %{time_ago}." + already_suspended: "Користувач уже був призупинений %{staff} %{time_ago}." unsubscribe_mailer: title: "Відписатися від розсилки" subject_template: "Підтвердіть, що більше не хочете отримувати оновлення електронною поштою від %{site_title}" invite_mailer: + title: "Запросити Mailer" subject_template: "%{inviter_name} запросив вас приєднаися до '%{topic_title}' на %{site_domain_name}" custom_invite_mailer: + title: "Спеціальне запрошення на форум" subject_template: "%{inviter_name} запросив вас приєднаися до '%{topic_title}' на %{site_domain_name}" invite_forum_mailer: + title: "Спеціальне запрошення на форум" subject_template: "%{inviter_name} запрошує вас приднатися до %{site_domain_name}" custom_invite_forum_mailer: title: "Спеціальне запрошення на форум" @@ -2451,12 +2516,16 @@ uk: subject_template: "Повідомлення приховано через скарги спільноти, персонал повідомлено" queued_by_staff: title: "Допис потребує схвалення" + subject_template: "Повідомлення приховане персоналом, очікує схвалення" flags_disagreed: title: "Позначене повідомлення відновлено персоналом" subject_template: "Позначене повідомлення відновлено персоналом" flags_agreed_and_post_deleted: title: "Позначене повідомлення видалено персоналом" subject_template: "Позначене повідомлення видалено персоналом" + flags_agreed_and_post_deleted_for_responders: + title: "Відповідь вилучено з позначеного повідомлення персоналом" + subject_template: "Відповідь вилучено з позначеного повідомлення персоналом" welcome_user: title: "Ласкаво просимо, користувач" subject_template: "Ласкаво просимо до сайта %{site_name}!" @@ -2465,6 +2534,7 @@ uk: subject_template: "Дякуємо, що провели з нами час" welcome_staff: title: "Ласкаво просимо, персонал" + subject_template: "Вітаємо, ви отримали статус %{role}!" welcome_invite: title: "Ласкаво просимо" subject_template: "Ласкаво просимо до сайта %{site_name}!" @@ -2477,12 +2547,30 @@ uk: backup_failed: title: "Помилка резервного копіювання" subject_template: "Резервне копіювання не вдалося" + text_body_template: | + Не вдалося створити резервну копію. + + Ось журнал: + + %{logs} restore_succeeded: title: "Відновлення успішне" subject_template: "Відновлення даних успішно завершено" + text_body_template: | + Відновлення пройшло успішно. + + Ось журнал: + + %{logs} restore_failed: title: "Помилка відновлення" subject_template: "Відновлення даних не вдалося" + text_body_template: | + Помилка відновлення. + + Ось журнал: + + %{logs} bulk_invite_succeeded: title: "Запрошення вдалося успішно" subject_template: "Масове запрошення користувачів оброблено успішно" @@ -2503,6 +2591,8 @@ uk: csv_export_failed: title: "Не вдалося експортувати CSV" subject_template: "Експорт даних не здійснено" + email_reject_user_not_found: + title: "Електронний лист у випадку, коли користувача не знайдено" email_reject_screened_email: subject_template: "[%{email_prefix}] Проблема з електронною поштою — заблокована електронна пошта" email_reject_not_allowed_email: diff --git a/config/locales/server.ur.yml b/config/locales/server.ur.yml index edf33b30ad..d3b1bbab8b 100644 --- a/config/locales/server.ur.yml +++ b/config/locales/server.ur.yml @@ -1192,7 +1192,6 @@ ur: show_pinned_excerpt_mobile: "موبائل وِیو میں پِن ہوے ٹاپکس پر اقتباس دکھائیں۔" show_pinned_excerpt_desktop: "ڈیسک ٹاپ وِیو میں پِن ہوے ٹاپکس پر اقتباس دکھائیں۔" post_onebox_maxlength: "ایک وَن باکسڈ ڈِسکورس پوسٹ کے حروف کی زیادہ سے زیادہ لمبائی۔" - blocked_onebox_domains: "ڈومینز کی ایک فہرست جو کبھی بھی وَن باکسڈ نہیں کیے جائیں گے۔" allowed_inline_onebox_domains: "ڈومینز کی ایک فہرست جو چھوٹے فارم میں وَن باکسڈ کیے جائیں گے اگر وہ عنوان کے بغیر لنک کیے جائیں" max_oneboxes_per_post: "ایک پوسٹ میں وَن باکس کی زیادہ سے زیادہ تعداد۔" logo: "آپ کی سائٹ کے سب سے اوپر بائیں پر لوگو کی تصویر۔ 120 کی اونچائی اور 3:1 سے زائد اَیسپَیکٹ رَیشو والی وسیع مستطیل تصویر کا استعمال کریں۔ اگر خالی چھوڑ دیا گیا ہو تو سائٹ کا عنوان دکھایا جائے گا۔" diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml index dfa31979ee..cc441944c4 100644 --- a/config/locales/server.vi.yml +++ b/config/locales/server.vi.yml @@ -912,7 +912,6 @@ vi: add_rel_nofollow_to_user_content: 'Thêm rel=''nofollow'' cho tất cả các nội dung mà người dùng gửi, ngoại trừ các liên kết nội bộ (của tên miền chính). Nếu thay đổi, bạn phải thực hiện lại cho tất cả các bài viết với: "rake posts:rebake"' post_excerpt_maxlength: "Chiều dài tối đa của đoạn trích / tóm tắt chủ đề." post_onebox_maxlength: "Số ký tự tối đa của một bài onebox Discourse." - blocked_onebox_domains: "Danh sách các tên miền sẽ không bao giờ được oneboxed." notification_email: "Địa chỉ email 'Từ:' được dùng để gửi các email thiết yếu của hệ thống. Các tên miền quy định ở đây phải có SPF, DKIM và bản ghi PTR phải được thiết lập chính xác cho email đến." email_custom_headers: "Danh sách xác định email header tùy chỉnh" force_https: "Buộc trang web của bạn chỉ sử dụng HTTPS. CẢNH BÁO: KHÔNG kích hoạt tính năng này cho đến khi bạn xác minh HTTPS được thiết lập đầy đủ và hoạt động hoàn toàn ở mọi nơi! Bạn đã kiểm tra CDN của mình, tất cả thông tin đăng nhập xã hội và bất kỳ biểu trưng / phụ thuộc bên ngoài nào để đảm bảo tất cả chúng đều tương thích với HTTPS?" diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index bb7702364b..5e90427a4c 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -1386,7 +1386,6 @@ zh_CN: show_pinned_excerpt_mobile: "在移动视图中显示置顶话题的摘录。" show_pinned_excerpt_desktop: "在桌面视图中显示置顶话题的摘录。" post_onebox_maxlength: "Onebox Discourse 帖子的最大长度(以字符为单位)。" - blocked_onebox_domains: "永远不会进行 Onebox 处理的网域列表。" allowed_inline_onebox_domains: "如果在没有标题的情况下链接,将以微型形式进行 Onebox 处理的网域列表" enable_inline_onebox_on_all_domains: "忽略 inline_onebox_domain_allowlist 站点设置并在所有网域上允许内联 Onebox。" force_custom_user_agent_hosts: "对所有请求使用自定义 Onebox 用户代理的主机。(对于限制用户代理访问的主机特别有用)。" diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml index 81a25589db..93cb86b6c7 100644 --- a/config/locales/server.zh_TW.yml +++ b/config/locales/server.zh_TW.yml @@ -1127,7 +1127,6 @@ zh_TW: show_pinned_excerpt_mobile: "在行動版置頂主題顯示摘要。" show_pinned_excerpt_desktop: "在桌面版置頂主題顯示摘要。" post_onebox_maxlength: "展開連結預覽後的 Discourse 貼文最大字數限制。" - blocked_onebox_domains: "不會展開成連結預覽的網域列表。" allowed_inline_onebox_domains: "如果連結未包含 title,會被展開成連結預覽的網域白名單。" max_oneboxes_per_post: "貼文中允許的連結預覽數量上限。" logo: "網站左上角的Logo圖片,圖片高為120、寬高比大於3:1的寬矩形比例。 如果沒有設定 Logo,將顯示網站標題。" diff --git a/plugins/discourse-local-dates/config/locales/client.fa_IR.yml b/plugins/discourse-local-dates/config/locales/client.fa_IR.yml index 58afdba006..ff44b6205b 100644 --- a/plugins/discourse-local-dates/config/locales/client.fa_IR.yml +++ b/plugins/discourse-local-dates/config/locales/client.fa_IR.yml @@ -28,6 +28,7 @@ fa_IR: format_title: فرمت تاریخ timezone: منطقه‌ی زمانی until: تا وقتی که... + current_timezone: "منطقه‌ زمانی فعلی:" recurring: every_day: "هر روز" every_week: "هر هفته" diff --git a/plugins/discourse-local-dates/config/locales/client.he.yml b/plugins/discourse-local-dates/config/locales/client.he.yml index e87699d57a..2d7babd2eb 100644 --- a/plugins/discourse-local-dates/config/locales/client.he.yml +++ b/plugins/discourse-local-dates/config/locales/client.he.yml @@ -31,6 +31,7 @@ he: format_title: מבנה תאריך timezone: אזור זמן until: עד… + current_timezone: "אזור זמן נוכחי:" recurring: every_day: "כל יום" every_week: "כל שבוע" diff --git a/plugins/discourse-local-dates/config/locales/client.hu.yml b/plugins/discourse-local-dates/config/locales/client.hu.yml index 373cfbea76..7e6c9ae9b6 100644 --- a/plugins/discourse-local-dates/config/locales/client.hu.yml +++ b/plugins/discourse-local-dates/config/locales/client.hu.yml @@ -31,6 +31,7 @@ hu: format_title: Dátumformátum timezone: Időzóna until: Eddig… + current_timezone: "Jelenlegi időzóna:" recurring: every_day: "Naponta" every_week: "Hetente" diff --git a/plugins/discourse-local-dates/config/locales/client.pl_PL.yml b/plugins/discourse-local-dates/config/locales/client.pl_PL.yml index 45c4d5d196..0e267b9cd6 100644 --- a/plugins/discourse-local-dates/config/locales/client.pl_PL.yml +++ b/plugins/discourse-local-dates/config/locales/client.pl_PL.yml @@ -31,6 +31,7 @@ pl_PL: format_title: Format daty timezone: Strefa czasowa until: Do… + current_timezone: "Aktualna strefa czasowa:" recurring: every_day: "Codziennie" every_week: "Co tydzień" diff --git a/plugins/discourse-local-dates/config/locales/client.ru.yml b/plugins/discourse-local-dates/config/locales/client.ru.yml index c31d523a26..17beb2886b 100644 --- a/plugins/discourse-local-dates/config/locales/client.ru.yml +++ b/plugins/discourse-local-dates/config/locales/client.ru.yml @@ -31,6 +31,7 @@ ru: format_title: Формат даты timezone: Часовой пояс until: По... + current_timezone: "Текущий часовой пояс:" recurring: every_day: "Каждый день" every_week: "Каждую неделю" diff --git a/plugins/discourse-local-dates/config/locales/client.tr_TR.yml b/plugins/discourse-local-dates/config/locales/client.tr_TR.yml index a03042cc0f..42800c7511 100644 --- a/plugins/discourse-local-dates/config/locales/client.tr_TR.yml +++ b/plugins/discourse-local-dates/config/locales/client.tr_TR.yml @@ -31,6 +31,7 @@ tr_TR: format_title: Tarih formatı timezone: Saat dilimi until: A kadar... + current_timezone: "Geçerli saat dilimi:" recurring: every_day: "Her gün" every_week: "Her hafta" diff --git a/plugins/styleguide/config/locales/client.uk.yml b/plugins/styleguide/config/locales/client.uk.yml index 30f4c470bd..cc0ceab117 100644 --- a/plugins/styleguide/config/locales/client.uk.yml +++ b/plugins/styleguide/config/locales/client.uk.yml @@ -85,3 +85,5 @@ uk: title: "Значки заголовків" spinners: title: "Спінери" + empty_state: + title: "Порожній стан" From fe5bfc8d3bd6bafdb45a4b44183433ccf1aef53b Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 16:28:20 +0000 Subject: [PATCH 091/194] DEV: Route Sidekiq logs to Rails logger (#15817) Most of our logging goes through Rails.logger, and therefore appears in Logster at `/logs` on a site. The Sidekiq logger was bypassing this and writing directly to STDERR. Unfortunately it's not possible to do `Sidekiq.logger = Rails.logger` because `Sidekiq#logger=` applies a number of patches to the logger instance, causing our whole logging system to break. Instead, this commit adds a dedicated Logger instance with no output, which is then patched to forward all messages directly to `Rails.logger` --- config/initializers/100-sidekiq.rb | 16 +++++++++++----- lib/demon/sidekiq.rb | 5 ----- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/config/initializers/100-sidekiq.rb b/config/initializers/100-sidekiq.rb index b309e45123..99d9da4cfd 100644 --- a/config/initializers/100-sidekiq.rb +++ b/config/initializers/100-sidekiq.rb @@ -81,7 +81,16 @@ if Sidekiq.server? end end -Sidekiq.logger = Sidekiq::Logger.new(STDERR, level: Logger::WARN) +# Sidekiq#logger= applies patches to whichever logger we pass it. +# Therefore something like Sidekiq.logger = Rails.logger will break +# all logging in the application. +# +# Instead, this patch adds a dedicated logger instance and patches +# the #add method to forward messages to Rails.logger. +Sidekiq.logger = Logger.new(nil) +Sidekiq.logger.define_singleton_method(:add) do |severity, message = nil, progname = nil, &blk| + Rails.logger.add(severity, message, progname, &blk) +end class SidekiqLogsterReporter < Sidekiq::ExceptionHandler::Logger def call(ex, context = {}) @@ -111,8 +120,5 @@ class SidekiqLogsterReporter < Sidekiq::ExceptionHandler::Logger end end -unless Rails.env.development? - Sidekiq.error_handlers.clear -end - +Sidekiq.error_handlers.clear Sidekiq.error_handlers << SidekiqLogsterReporter.new diff --git a/lib/demon/sidekiq.rb b/lib/demon/sidekiq.rb index b8d418f928..ed7556d299 100644 --- a/lib/demon/sidekiq.rb +++ b/lib/demon/sidekiq.rb @@ -27,11 +27,6 @@ class Demon::Sidekiq < ::Demon::Base puts "Loading Sidekiq in process id #{Process.pid}" require 'sidekiq/cli' - # CLI will close the logger, if we have one set we can be in big - # trouble, if STDOUT is closed in our process all sort of weird - # will ensue, resetting the logger ensures it will reinit correctly - # parent process is in charge of the file anyway. - Sidekiq.logger = Sidekiq::Logger.new(STDERR, level: Logger::WARN) cli = Sidekiq::CLI.instance # Unicorn uses USR1 to indicate that log files have been rotated From 783912d305a3efc847460651d23f01c30b4348a3 Mon Sep 17 00:00:00 2001 From: Benson Muite Date: Fri, 4 Feb 2022 19:35:01 +0300 Subject: [PATCH 092/194] Increase geographical diversity of quotes (#15813) --- .../discourse-narrative-bot/config/locales/server.en.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins/discourse-narrative-bot/config/locales/server.en.yml b/plugins/discourse-narrative-bot/config/locales/server.en.yml index 9a5714d97f..cf69370c2a 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.en.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.en.yml @@ -84,6 +84,15 @@ en: "10": quote: "Whatever the mind of man can conceive and believe, it can achieve." author: "Napoleon Hill" + "11": + quote: "Peace at home, peace in the world." + author: "Mustafa Kemal Atatürk" + "12": + quote: "Education is not a way of escaping poverty, it is a way of fighting it." + author: "Julius Nyerere" + "13": + quote: "A journey of a thousand miles must begin with a single step." + author: "Lao Tzu" results: |- > :left_speech_bubble: _%{quote}_ — %{author} From 62029ec4ebecd5e807895becfeb4228944cdea53 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Fri, 4 Feb 2022 18:33:11 +0100 Subject: [PATCH 093/194] DEV: remove the includeMidFuture option on future-date-input (#15818) This option was always on. Essentially, we set it only in two places and always use `|| true` with it. Note that we're going to switch future-date-input-selector to another source of time shortcuts(https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/lib/time-shortcut.js) and also change its API to make it more customizable. Removing the includeMidFuture option is a part of that change. --- .../discourse/app/components/future-date-input.js | 1 - .../javascripts/discourse/app/lib/timeframes-builder.js | 8 ++++---- .../app/templates/components/future-date-input.hbs | 1 - .../app/templates/components/invite-link-panel.hbs | 1 - .../discourse/app/templates/modal/create-invite.hbs | 1 - .../app/templates/modal/ignore-duration-with-username.hbs | 1 - .../discourse/app/templates/modal/ignore-duration.hbs | 1 - .../discourse/tests/unit/lib/timeframes-builder-test.js | 1 - .../addon/components/future-date-input-selector.js | 1 - .../templates/styleguide/atoms/date-time-inputs.hbs | 1 - 10 files changed, 4 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/future-date-input.js b/app/assets/javascripts/discourse/app/components/future-date-input.js index 3f17a595ec..1367267b48 100644 --- a/app/assets/javascripts/discourse/app/components/future-date-input.js +++ b/app/assets/javascripts/discourse/app/components/future-date-input.js @@ -79,7 +79,6 @@ export default Component.extend({ now, day: now.day(), includeWeekend: this.includeWeekend, - includeMidFuture: this.includeMidFuture || true, includeFarFuture: this.includeFarFuture, includeDateTime: this.includeDateTime, canScheduleNow: this.includeNow || false, diff --git a/app/assets/javascripts/discourse/app/lib/timeframes-builder.js b/app/assets/javascripts/discourse/app/lib/timeframes-builder.js index cdfd0a3d2b..361ad2e336 100644 --- a/app/assets/javascripts/discourse/app/lib/timeframes-builder.js +++ b/app/assets/javascripts/discourse/app/lib/timeframes-builder.js @@ -68,7 +68,7 @@ const TIMEFRAMES = [ buildTimeframe({ id: "two_months", format: "MMM D", - enabled: (opts) => opts.includeMidFuture, + enabled: () => true, when: (time, timeOfDay) => time.add(2, "month").startOf("month").hour(timeOfDay).minute(0), icon: "briefcase", @@ -76,7 +76,7 @@ const TIMEFRAMES = [ buildTimeframe({ id: "three_months", format: "MMM D", - enabled: (opts) => opts.includeMidFuture, + enabled: () => true, when: (time, timeOfDay) => time.add(3, "month").startOf("month").hour(timeOfDay).minute(0), icon: "briefcase", @@ -84,7 +84,7 @@ const TIMEFRAMES = [ buildTimeframe({ id: "four_months", format: "MMM D", - enabled: (opts) => opts.includeMidFuture, + enabled: () => true, when: (time, timeOfDay) => time.add(4, "month").startOf("month").hour(timeOfDay).minute(0), icon: "briefcase", @@ -92,7 +92,7 @@ const TIMEFRAMES = [ buildTimeframe({ id: "six_months", format: "MMM D", - enabled: (opts) => opts.includeMidFuture, + enabled: () => true, when: (time, timeOfDay) => time.add(6, "month").startOf("month").hour(timeOfDay).minute(0), icon: "briefcase", diff --git a/app/assets/javascripts/discourse/app/templates/components/future-date-input.hbs b/app/assets/javascripts/discourse/app/templates/components/future-date-input.hbs index 5f3ee328b6..852c3915a2 100644 --- a/app/assets/javascripts/discourse/app/templates/components/future-date-input.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/future-date-input.hbs @@ -9,7 +9,6 @@ includeDateTime=includeDateTime includeWeekend=includeWeekend includeFarFuture=includeFarFuture - includeMidFuture=includeMidFuture includeNow=includeNow clearable=clearable onChangeInput=onChangeInput diff --git a/app/assets/javascripts/discourse/app/templates/components/invite-link-panel.hbs b/app/assets/javascripts/discourse/app/templates/components/invite-link-panel.hbs index 75bbb20e4a..8e5858a1bc 100644 --- a/app/assets/javascripts/discourse/app/templates/components/invite-link-panel.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/invite-link-panel.hbs @@ -35,7 +35,6 @@ {{future-date-input includeDateTime=true - includeMidFuture=true clearable=true onChangeInput=(action (mut inviteExpiresAt)) }} diff --git a/app/assets/javascripts/discourse/app/templates/modal/create-invite.hbs b/app/assets/javascripts/discourse/app/templates/modal/create-invite.hbs index 5acc3dfa1f..c5a854dd01 100644 --- a/app/assets/javascripts/discourse/app/templates/modal/create-invite.hbs +++ b/app/assets/javascripts/discourse/app/templates/modal/create-invite.hbs @@ -124,7 +124,6 @@ displayLabel=(i18n "user.invited.invite.expires_at") statusType="close" includeDateTime=true - includeMidFuture=true clearable=true input=buffered.expires_at onChangeInput=(action (mut buffered.expires_at)) diff --git a/app/assets/javascripts/discourse/app/templates/modal/ignore-duration-with-username.hbs b/app/assets/javascripts/discourse/app/templates/modal/ignore-duration-with-username.hbs index 84bef934e3..2cebb1831a 100644 --- a/app/assets/javascripts/discourse/app/templates/modal/ignore-duration-with-username.hbs +++ b/app/assets/javascripts/discourse/app/templates/modal/ignore-duration-with-username.hbs @@ -15,7 +15,6 @@ input=(readonly ignoredUntil) includeWeekend=true includeDateTime=false - includeMidFuture=true includeFarFuture=true onChangeInput=(action (mut ignoredUntil)) }} diff --git a/app/assets/javascripts/discourse/app/templates/modal/ignore-duration.hbs b/app/assets/javascripts/discourse/app/templates/modal/ignore-duration.hbs index 8cb1e0baa8..cabbb66960 100644 --- a/app/assets/javascripts/discourse/app/templates/modal/ignore-duration.hbs +++ b/app/assets/javascripts/discourse/app/templates/modal/ignore-duration.hbs @@ -4,7 +4,6 @@ input=ignoredUntil includeWeekend=true includeDateTime=false - includeMidFuture=true includeFarFuture=true onChangeInput=(action (mut ignoredUntil)) }} diff --git a/app/assets/javascripts/discourse/tests/unit/lib/timeframes-builder-test.js b/app/assets/javascripts/discourse/tests/unit/lib/timeframes-builder-test.js index 2d429fb563..0620878968 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/timeframes-builder-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/timeframes-builder-test.js @@ -4,7 +4,6 @@ import buildTimeframes from "discourse/lib/timeframes-builder"; const DEFAULT_OPTIONS = { includeWeekend: null, - includeMidFuture: true, includeFarFuture: null, includeDateTime: null, canScheduleNow: false, diff --git a/app/assets/javascripts/select-kit/addon/components/future-date-input-selector.js b/app/assets/javascripts/select-kit/addon/components/future-date-input-selector.js index 7263a27ca0..9806006ad7 100644 --- a/app/assets/javascripts/select-kit/addon/components/future-date-input-selector.js +++ b/app/assets/javascripts/select-kit/addon/components/future-date-input-selector.js @@ -29,7 +29,6 @@ export default ComboBoxComponent.extend(DatetimeMixin, { now, day: now.day(), includeWeekend: this.includeWeekend, - includeMidFuture: this.includeMidFuture || true, includeFarFuture: this.includeFarFuture, includeDateTime: this.includeDateTime, canScheduleNow: this.includeNow || false, diff --git a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/date-time-inputs.hbs b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/date-time-inputs.hbs index cbea914449..51cbad64f6 100644 --- a/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/date-time-inputs.hbs +++ b/plugins/styleguide/assets/javascripts/discourse/templates/styleguide/atoms/date-time-inputs.hbs @@ -22,7 +22,6 @@ {{future-date-input displayLabelIcon="far-clock" includeDateTime=true - includeMidFuture=true clearable=true }} {{/styleguide-example}} From 3a85c4d680d77f93f80becf2f2f9e8e0381b05a4 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 17:22:39 +0000 Subject: [PATCH 094/194] DEV: Ensure Sidekiq job arguments have stringified keys The latest version of Sidekiq introduced a warning when jobs are queued with arguments which 'do not stringify to JSON safely'. In the vast majority of cases, this is because a hash is passed with symbols as keys. When those args are passed to the job, the keys will be stringified. Our job wrapper already takes care of this issue by calling '.with_indifferent_access' on the args before passing them to `#execute`, so we don't need to change anything about our use. All we need to do is satisfy Sidekiq's warning system by 'stringifying' all the keys before enqueuing the job. --- app/jobs/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/base.rb b/app/jobs/base.rb index fdcd1dd55e..180adbe086 100644 --- a/app/jobs/base.rb +++ b/app/jobs/base.rb @@ -298,7 +298,7 @@ module Jobs if ::Jobs.run_later? hash = { 'class' => klass, - 'args' => [opts] + 'args' => [opts.deep_stringify_keys] } if delay = opts.delete(:delay_for) From c3a54eb30fe034bda39e02aeda6b46b6d91e725d Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 17:34:38 +0000 Subject: [PATCH 095/194] DEV: Use strings for :user_email job type argument Job arguments go via JSON, and so symbols will appear as strings in the Job's `#execute` method. The latest version of Sidekiq has started warning about this to reduce developer confusion. --- app/controllers/session_controller.rb | 2 +- app/controllers/users_controller.rb | 6 +++--- app/jobs/regular/suspicious_login.rb | 2 +- app/jobs/scheduled/enqueue_digest_emails.rb | 2 +- lib/email_updater.rb | 2 +- lib/tasks/admin.rake | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/controllers/session_controller.rb b/app/controllers/session_controller.rb index d24e3e9e03..62264baa60 100644 --- a/app/controllers/session_controller.rb +++ b/app/controllers/session_controller.rb @@ -444,7 +444,7 @@ class SessionController < ApplicationController if user RateLimiter.new(nil, "forgot-password-login-day-#{user.username}", 6, 1.day).performed! email_token = user.email_tokens.create!(email: user.email, scope: EmailToken.scopes[:password_reset]) - Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: user.id, email_token: email_token.token) + Jobs.enqueue(:critical_user_email, type: "forgot_password", user_id: user.id, email_token: email_token.token) else RateLimiter.new(nil, "forgot-password-login-hour-#{normalized_login_param}", 5, 1.hour).performed! end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 25355a4260..b99ff91232 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -737,7 +737,7 @@ class UsersController < ApplicationController session["user_created_message"] = activation.success_message if existing_user = User.find_by_email(user.primary_email&.email) - Jobs.enqueue(:critical_user_email, type: :account_exists, user_id: existing_user.id) + Jobs.enqueue(:critical_user_email, type: "account_exists", user_id: existing_user.id) end render json: { @@ -932,7 +932,7 @@ class UsersController < ApplicationController if user = User.with_email(params[:email]).admins.human_users.first email_token = user.email_tokens.create!(email: user.email, scope: EmailToken.scopes[:email_login]) - Jobs.enqueue(:critical_user_email, type: :admin_login, user_id: user.id, email_token: email_token.token) + Jobs.enqueue(:critical_user_email, type: "admin_login", user_id: user.id, email_token: email_token.token) @message = I18n.t("admin_login.success") else @message = I18n.t("admin_login.errors.unknown_email_address") @@ -967,7 +967,7 @@ class UsersController < ApplicationController email_token = user.email_tokens.create!(email: user.email, scope: EmailToken.scopes[:email_login]) Jobs.enqueue(:critical_user_email, - type: :email_login, + type: "email_login", user_id: user.id, email_token: email_token.token ) diff --git a/app/jobs/regular/suspicious_login.rb b/app/jobs/regular/suspicious_login.rb index 2c08776c5d..a45b820de0 100644 --- a/app/jobs/regular/suspicious_login.rb +++ b/app/jobs/regular/suspicious_login.rb @@ -13,7 +13,7 @@ module Jobs client_ip: args[:client_ip]) ::Jobs.enqueue(:critical_user_email, - type: :suspicious_login, + type: "suspicious_login", user_id: args[:user_id], client_ip: args[:client_ip], user_agent: args[:user_agent]) diff --git a/app/jobs/scheduled/enqueue_digest_emails.rb b/app/jobs/scheduled/enqueue_digest_emails.rb index 4496f2548b..e76a60d97e 100644 --- a/app/jobs/scheduled/enqueue_digest_emails.rb +++ b/app/jobs/scheduled/enqueue_digest_emails.rb @@ -10,7 +10,7 @@ module Jobs users = target_user_ids users.each do |user_id| - ::Jobs.enqueue(:user_email, type: :digest, user_id: user_id) + ::Jobs.enqueue(:user_email, type: "digest", user_id: user_id) end end diff --git a/lib/email_updater.rb b/lib/email_updater.rb index f5e41fc812..08cd8ebd83 100644 --- a/lib/email_updater.rb +++ b/lib/email_updater.rb @@ -24,7 +24,7 @@ class EmailUpdater if existing_user = User.find_by_email(email) if SiteSetting.hide_email_address_taken - Jobs.enqueue(:critical_user_email, type: :account_exists, user_id: existing_user.id) + Jobs.enqueue(:critical_user_email, type: "account_exists", user_id: existing_user.id) else error_message = +'change_email.error' error_message << '_staged' if existing_user.staged? diff --git a/lib/tasks/admin.rake b/lib/tasks/admin.rake index 104b042916..37ef651f2b 100644 --- a/lib/tasks/admin.rake +++ b/lib/tasks/admin.rake @@ -28,7 +28,7 @@ task "admin:invite", [:email] => [:environment] do |_, args| puts "Sending email!" email_token = user.email_tokens.create!(email: user.email, scope: EmailToken.scopes[:password_reset]) - Jobs.enqueue(:user_email, type: :account_created, user_id: user.id, email_token: email_token.token) + Jobs.enqueue(:user_email, type: "account_created", user_id: user.id, email_token: email_token.token) end desc "Creates a forum administrator" From be8c0baa181deafef9bbf093e5ad656def63b0ab Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 19:41:08 +0000 Subject: [PATCH 096/194] DEV: Include exception class in Discourse.warn_exception log (#15822) Sometimes, the 'message' portion of an exception isn't enough to work out what's happening. In these cases, including the exception class name can help with debugging. --- lib/discourse.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/discourse.rb b/lib/discourse.rb index c93b1dc42f..f65add734b 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -835,7 +835,7 @@ module Discourse # logster Rails.logger.add_with_opts( ::Logger::Severity::WARN, - "#{message} : #{e}", + "#{message} : #{e.class.name} : #{e}", "discourse-exception", backtrace: e.backtrace.join("\n"), env: env From 863262a5debcf48b1a89edb83a88dd5e0ebbeb0c Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 19:58:34 +0000 Subject: [PATCH 097/194] DEV: Update more Jobs#enqueue calls to use strings (#15823) Symbols are converted to strings anyway, so there is no change in behaviour. The latest version of sidekiq introduced a warning for this. --- app/controllers/admin/email_controller.rb | 2 +- app/services/notification_emailer.rb | 4 ++-- plugins/discourse-narrative-bot/plugin.rb | 18 +++++++++--------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/controllers/admin/email_controller.rb b/app/controllers/admin/email_controller.rb index 3b9224f1b3..806bf4636d 100644 --- a/app/controllers/admin/email_controller.rb +++ b/app/controllers/admin/email_controller.rb @@ -157,7 +157,7 @@ class Admin::EmailController < Admin::AdminController retry_count = 0 begin - Jobs.enqueue(:process_email, mail: email_raw, retry_on_rate_limit: true, source: :handle_mail) + Jobs.enqueue(:process_email, mail: email_raw, retry_on_rate_limit: true, source: "handle_mail") rescue JSON::GeneratorError, Encoding::UndefinedConversionError => e if retry_count == 0 email_raw = email_raw.force_encoding('iso-8859-1').encode("UTF-8") diff --git a/app/services/notification_emailer.rb b/app/services/notification_emailer.rb index a1e7f12efa..05e7a8b435 100644 --- a/app/services/notification_emailer.rb +++ b/app/services/notification_emailer.rb @@ -59,11 +59,11 @@ class NotificationEmailer notification_type = Notification.types[notification.notification_type] hash = { - type: type, + type: type.to_s, user_id: notification.user_id, notification_id: notification.id, notification_data_hash: notification.data_hash, - notification_type: notification_type, + notification_type: notification_type.to_s, } hash[:post_id] = post_id if post_id > 0 && notification_type != :post_approved diff --git a/plugins/discourse-narrative-bot/plugin.rb b/plugins/discourse-narrative-bot/plugin.rb index 2748dc9bc5..2eba865b37 100644 --- a/plugins/discourse-narrative-bot/plugin.rb +++ b/plugins/discourse-narrative-bot/plugin.rb @@ -223,7 +223,7 @@ after_initialize do Jobs.enqueue(:bot_input, user_id: user.id, post_id: post.id, - input: :reply + input: "reply" ) end end @@ -233,7 +233,7 @@ after_initialize do Jobs.enqueue(:bot_input, user_id: post.user.id, post_id: post.id, - input: :edit + input: "edit" ) end end @@ -244,7 +244,7 @@ after_initialize do user_id: user.id, post_id: post.id, topic_id: post.topic_id, - input: :delete + input: "delete" ) end end @@ -254,7 +254,7 @@ after_initialize do Jobs.enqueue(:bot_input, user_id: user.id, post_id: post.id, - input: :recover + input: "recover" ) end end @@ -264,11 +264,11 @@ after_initialize do input = case self.post_action_type_id when *PostActionType.flag_types.values - self.post_action_type_id == PostActionType.types[:inappropriate] ? :flag : :reply + self.post_action_type_id == PostActionType.types[:inappropriate] ? "flag" : "reply" when PostActionType.types[:like] - :like + "like" when PostActionType.types[:bookmark] - :bookmark + "bookmark" end if input @@ -283,7 +283,7 @@ after_initialize do self.add_model_callback(Bookmark, :after_commit, on: :create) do if self.post && self.user.enqueue_narrative_bot_job? - Jobs.enqueue(:bot_input, user_id: self.user_id, post_id: self.post_id, input: :bookmark) + Jobs.enqueue(:bot_input, user_id: self.user_id, post_id: self.post_id, input: "bookmark") end end @@ -294,7 +294,7 @@ after_initialize do Jobs.enqueue(:bot_input, user_id: user_id, topic_id: topic_id, - input: :topic_notification_level_changed + input: "topic_notification_level_changed" ) end end From f53d70ac63ed8bef243fa03ce4794f95c3c1ce0a Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 20:11:03 +0000 Subject: [PATCH 098/194] DEV: Ensure `delay_for` and `queue` are not passed as job arguments (#15824) This regressed in 3a85c4d680 because deep_stringify_keys makes a copy of the `opts` hash --- app/jobs/base.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/jobs/base.rb b/app/jobs/base.rb index 180adbe086..379ed72b98 100644 --- a/app/jobs/base.rb +++ b/app/jobs/base.rb @@ -297,8 +297,7 @@ module Jobs if ::Jobs.run_later? hash = { - 'class' => klass, - 'args' => [opts.deep_stringify_keys] + 'class' => klass } if delay = opts.delete(:delay_for) @@ -311,6 +310,8 @@ module Jobs hash['queue'] = queue end + hash['args'] = [opts.deep_stringify_keys] + DB.after_commit { klass.client_push(hash) } else # Otherwise execute the job right away From 5d82a695d01dadcb6d0fc9c6612fdd7faa62e529 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 23:14:35 +0000 Subject: [PATCH 099/194] DEV: Use string timestamp when enqueuing update_top_redirection (#15826) Job arguments go via JSON, and so DateTime objects will appear as strings in the Job's `#execute` method. The latest version of Sidekiq has started warning about this to reduce developer confusion. --- app/models/user_option.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/user_option.rb b/app/models/user_option.rb index 75003f4345..4c01632a11 100644 --- a/app/models/user_option.rb +++ b/app/models/user_option.rb @@ -106,7 +106,7 @@ class UserOption < ActiveRecord::Base Discourse.redis.expire(key, delay) # delay the update - Jobs.enqueue_in(delay / 2, :update_top_redirection, user_id: self.user_id, redirected_at: Time.zone.now) + Jobs.enqueue_in(delay / 2, :update_top_redirection, user_id: self.user_id, redirected_at: Time.zone.now.to_s) end def should_be_redirected_to_top From 9ddd1f739e4b8fdf59305326b12d61527a453699 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 4 Feb 2022 23:43:53 +0000 Subject: [PATCH 100/194] DEV: Update :critical_user_email calls to use strings (#15827) Symbols are converted to strings anyway, so there is no change in behaviour. The latest version of sidekiq introduced a warning for this. --- app/controllers/admin/users_controller.rb | 6 +++--- app/controllers/users_controller.rb | 2 +- app/jobs/scheduled/activation_reminder_emails.rb | 2 +- app/models/email_token.rb | 2 +- app/models/reviewable_user.rb | 2 +- lib/email_updater.rb | 8 ++++---- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index b29ceda5fb..d719db0ab8 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -127,7 +127,7 @@ class Admin::UsersController < Admin::AdminController if message.present? Jobs.enqueue( :critical_user_email, - type: :account_suspended, + type: "account_suspended", user_id: @user.id, user_history_id: user_history.id ) @@ -368,7 +368,7 @@ class Admin::UsersController < Admin::AdminController if silencer.silence Jobs.enqueue( :critical_user_email, - type: :account_silenced, + type: "account_silenced", user_id: @user.id, user_history_id: silencer.user_history.id ) @@ -412,7 +412,7 @@ class Admin::UsersController < Admin::AdminController Jobs.enqueue( :critical_user_email, - type: :account_second_factor_disabled, + type: "account_second_factor_disabled", user_id: @user.id ) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index b99ff91232..68cf75bd87 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1535,7 +1535,7 @@ class UsersController < ApplicationController Jobs.enqueue( :critical_user_email, - type: :account_second_factor_disabled, + type: "account_second_factor_disabled", user_id: current_user.id ) diff --git a/app/jobs/scheduled/activation_reminder_emails.rb b/app/jobs/scheduled/activation_reminder_emails.rb index c3203a273d..5bfbf9e9f3 100644 --- a/app/jobs/scheduled/activation_reminder_emails.rb +++ b/app/jobs/scheduled/activation_reminder_emails.rb @@ -16,7 +16,7 @@ module Jobs email_token = user.email_tokens.create!(email: user.email, scope: EmailToken.scopes[:signup]) ::Jobs.enqueue( :user_email, - type: :activation_reminder, + type: "activation_reminder", user_id: user.id, email_token: email_token.token ) diff --git a/app/models/email_token.rb b/app/models/email_token.rb index 1178352523..1db13a01d5 100644 --- a/app/models/email_token.rb +++ b/app/models/email_token.rb @@ -95,7 +95,7 @@ class EmailToken < ActiveRecord::Base def self.enqueue_signup_email(email_token, to_address: nil) Jobs.enqueue( :critical_user_email, - type: :signup, + type: "signup", user_id: email_token.user_id, email_token: email_token.token, to_address: to_address diff --git a/app/models/reviewable_user.rb b/app/models/reviewable_user.rb index 93bc96924e..02cbfe4bf0 100644 --- a/app/models/reviewable_user.rb +++ b/app/models/reviewable_user.rb @@ -31,7 +31,7 @@ class ReviewableUser < Reviewable if args[:send_email] != false && SiteSetting.must_approve_users? Jobs.enqueue( :critical_user_email, - type: :signup_after_approval, + type: "signup_after_approval", user_id: target.id ) end diff --git a/lib/email_updater.rb b/lib/email_updater.rb index 08cd8ebd83..c3e3ea8abf 100644 --- a/lib/email_updater.rb +++ b/lib/email_updater.rb @@ -68,10 +68,10 @@ class EmailUpdater if @change_req.change_state == EmailChangeRequest.states[:authorizing_old] @change_req.old_email_token = @user.email_tokens.create!(email: @user.email, scope: EmailToken.scopes[:email_update]) - send_email(add ? :confirm_old_email_add : :confirm_old_email, @change_req.old_email_token) + send_email(add ? "confirm_old_email_add" : "confirm_old_email", @change_req.old_email_token) elsif @change_req.change_state == EmailChangeRequest.states[:authorizing_new] @change_req.new_email_token = @user.email_tokens.create!(email: email, scope: EmailToken.scopes[:email_update]) - send_email(:confirm_new_email, @change_req.new_email_token) + send_email("confirm_new_email", @change_req.new_email_token) end @change_req.save! @@ -102,7 +102,7 @@ class EmailUpdater change_state: EmailChangeRequest.states[:authorizing_new], new_email_token: @user.email_tokens.create!(email: @change_req.new_email, scope: EmailToken.scopes[:email_update]) ) - send_email(:confirm_new_email, @change_req.new_email_token) + send_email("confirm_new_email", @change_req.new_email_token) confirm_result = :authorizing_new when EmailChangeRequest.states[:authorizing_new] @change_req.update!(change_state: EmailChangeRequest.states[:complete]) @@ -144,7 +144,7 @@ class EmailUpdater def send_email_notification(old_email, new_email) Jobs.enqueue :critical_user_email, to_address: @user.email, - type: old_email ? :notify_old_email : :notify_old_email_add, + type: old_email ? "notify_old_email" : "notify_old_email_add", user_id: @user.id, new_email: new_email end From 930f51e1754110cb7cd8a78db6a589a5f61b251e Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Wed, 26 Jan 2022 15:24:11 +0800 Subject: [PATCH 101/194] FEATURE: Split up text segmentation for Chinese and Japanese. * Chinese segmenetation will continue to rely on cppjieba * Japanese segmentation will use our port of TinySegmenter * Korean currently does not rely on segmentation which was dropped in c677877e4fe5381f613279901f36ae255c909573 * SiteSetting.search_tokenize_chinese_japanese_korean has been split into SiteSetting.search_tokenize_chinese and SiteSetting.search_tokenize_japanese respectively --- config/locales/server.en.yml | 7 +- config/site_settings.yml | 7 +- ...6052157_change_segment_cjk_site_setting.rb | 20 ++ lib/search.rb | 69 +++++-- lib/search/grouped_search_results.rb | 2 +- lib/site_settings/deprecated_settings.rb | 1 + lib/tiny_japanese_segmenter.rb | 173 ++++++++++++++++++ .../search_tokenize_chinese_validator.rb | 14 ++ .../search_tokenize_japanese_validator.rb | 14 ++ spec/components/search_spec.rb | 122 ++++++++---- .../search_tokenize_chinese_validator_spec.rb | 11 ++ ...search_tokenize_japanese_validator_spec.rb | 11 ++ spec/lib/search_spec.rb | 14 -- spec/lib/tiny_japanese_segmenter_spec.rb | 13 ++ 14 files changed, 406 insertions(+), 72 deletions(-) create mode 100644 db/migrate/20220126052157_change_segment_cjk_site_setting.rb create mode 100644 lib/tiny_japanese_segmenter.rb create mode 100644 lib/validators/search_tokenize_chinese_validator.rb create mode 100644 lib/validators/search_tokenize_japanese_validator.rb create mode 100644 spec/components/validators/search_tokenize_chinese_validator_spec.rb create mode 100644 spec/components/validators/search_tokenize_japanese_validator_spec.rb create mode 100644 spec/lib/tiny_japanese_segmenter_spec.rb diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index 490c983dc1..cefe57911f 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -1486,7 +1486,8 @@ en: min_personal_message_title_length: "Minimum allowed title length for a message in characters" max_emojis_in_title: "Maximum allowed emojis in topic title" min_search_term_length: "Minimum valid search term length in characters" - search_tokenize_chinese_japanese_korean: "Force search to tokenize Chinese/Japanese/Korean even on non CJK sites" + search_tokenize_chinese: "Force search to tokenize Chinese even on non Chinese sites" + search_tokenize_japanese: "Force search to tokenize Japanese even on non Japanese sites" search_prefer_recent_posts: "If searching your large forum is slow, this option tries an index of more recent posts first" search_recent_posts_size: "How many recent posts to keep in the index" log_search_queries: "Log search queries performed by users" @@ -1629,7 +1630,7 @@ en: allowed_iframes: "A list of iframe src domain prefixes that discourse can safely allow in posts" allowed_crawler_user_agents: "User agents of web crawlers that should be allowed to access the site. WARNING! SETTING THIS WILL DISALLOW ALL CRAWLERS NOT LISTED HERE!" blocked_crawler_user_agents: "Unique case insensitive word in the user agent string identifying web crawlers that should not be allowed to access the site. Does not apply if allowlist is defined." - slow_down_crawler_user_agents: "User agents of web crawlers that should be rate limited as configured in the \"slow down crawler rate\" setting. Each value must be at least 3 characters long." + slow_down_crawler_user_agents: 'User agents of web crawlers that should be rate limited as configured in the "slow down crawler rate" setting. Each value must be at least 3 characters long.' slow_down_crawler_rate: "If slow_down_crawler_user_agents is specified this rate will apply to all the crawlers (number of seconds delay between requests)" content_security_policy: "Enable Content-Security-Policy" content_security_policy_report_only: "Enable Content-Security-Policy-Report-Only" @@ -2396,6 +2397,8 @@ en: unicode_usernames_avatars: "The internal system avatars do not support Unicode usernames." list_value_count: "The list must contain exactly %{count} values." google_oauth2_hd_groups: "You must first set 'google oauth2 hd' before enabling this setting." + search_tokenize_chinese_enabled: "You must disable 'search_tokenize_chinese' before enabling this setting." + search_tokenize_japanese_enabled: "You must disable 'search_tokenize_japanese' before enabling this setting." placeholder: discourse_connect_provider_secrets: diff --git a/config/site_settings.yml b/config/site_settings.yml index a84fd9d588..9ca6bde4e7 100644 --- a/config/site_settings.yml +++ b/config/site_settings.yml @@ -2034,7 +2034,12 @@ search: zh_TW: 1 ko: 1 ja: 1 - search_tokenize_chinese_japanese_korean: false + search_tokenize_chinese: + default: false + validator: "SearchTokenizeChineseValidator" + search_tokenize_japanese: + default: false + validator: "SearchTokenizeJapaneseValidator" search_prefer_recent_posts: false search_recent_posts_size: default: 1000000 diff --git a/db/migrate/20220126052157_change_segment_cjk_site_setting.rb b/db/migrate/20220126052157_change_segment_cjk_site_setting.rb new file mode 100644 index 0000000000..4552c87b8b --- /dev/null +++ b/db/migrate/20220126052157_change_segment_cjk_site_setting.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +class ChangeSegmentCjkSiteSetting < ActiveRecord::Migration[6.1] + def up + execute <<~SQL + UPDATE site_settings + SET name = 'search_tokenize_chinese' + WHERE name = 'search_tokenize_chinese_japanese_korean' + SQL + + execute <<~SQL + DELETE FROM site_settings + WHERE name = 'search_tokenize_chinese_japanese_korean' + SQL + end + + def down + raise ActiveRecord::IrreversibleMigration + end +end diff --git a/lib/search.rb b/lib/search.rb index 4a3ab96da1..e9a9d30bd5 100644 --- a/lib/search.rb +++ b/lib/search.rb @@ -64,9 +64,17 @@ class Search end end - def self.segment_cjk? - ['zh_TW', 'zh_CN', 'ja'].include?(SiteSetting.default_locale) || - SiteSetting.search_tokenize_chinese_japanese_korean + def self.segment_chinese? + ['zh_TW', 'zh_CN'].include?(SiteSetting.default_locale) || SiteSetting.search_tokenize_chinese + end + + def self.segment_japanese? + SiteSetting.default_locale == "ja" || SiteSetting.search_tokenize_japanese + end + + def self.japanese_punctuation_regexp + # Regexp adapted from https://github.com/6/tiny_segmenter/blob/15a5b825993dfd2c662df3766f232051716bef5b/lib/tiny_segmenter.rb#L7 + @japanese_punctuation_regexp ||= Regexp.compile("[-–—―.。・()()[]{}{}【】⟨⟩、、,,،…‥〽「」『』〜~!!::??\"'|__“”‘’;/⁄/«»]") end def self.prepare_data(search_data, purpose = nil) @@ -74,22 +82,35 @@ class Search data.force_encoding("UTF-8") if purpose != :topic - # TODO cppjieba_rb is designed for chinese, we need something else for Japanese - # Korean appears to be safe cause words are already space separated - # For Japanese we should investigate using kakasi - if segment_cjk? + if segment_chinese? require 'cppjieba_rb' unless defined? CppjiebaRb - data = CppjiebaRb.segment(search_data, mode: :mix) - # TODO: we still want to tokenize here but the current stopword list is too wide - # in cppjieba leading to words such as volume to be skipped. PG already has an English - # stopword list so use that vs relying on cppjieba - if ts_config != 'english' - data = CppjiebaRb.filter_stop_word(data) - else - data = data.filter { |s| s.present? } + segmented_data = [] + + # We need to split up the string here because Cppjieba has a bug where text starting with numeric chars will + # be split into two segments. For example, '123abc' becomes '123' and 'abc' after segmentation. + data.scan(/(?[\p{Han}。,、“”《》…\.:?!;()]+)|([^\p{Han}]+)/) do + match_data = $LAST_MATCH_INFO + + if match_data[:chinese] + segments = CppjiebaRb.segment(match_data.to_s, mode: :mix) + + if ts_config != 'english' + segments = CppjiebaRb.filter_stop_word(segments) + end + + segments = segments.filter { |s| s.present? } + segmented_data << segments.join(' ') + else + segmented_data << match_data.to_s.squish + end end + data = segmented_data.join(' ') + elsif segment_japanese? + data.gsub!(japanese_punctuation_regexp, " ") + data = TinyJapaneseSegmenter.segment(data) + data = data.filter { |s| s.present? } data = data.join(' ') else data.squish! @@ -263,7 +284,7 @@ class Search end unless @filters.present? || @opts[:search_for_id] - min_length = @opts[:min_search_term_length] || SiteSetting.min_search_term_length + min_length = min_search_term_length terms = (@term || '').split(/\s(?=(?:[^"]|"[^"]*")*$)/).reject { |t| t.length < min_length } if terms.blank? @@ -571,7 +592,7 @@ class Search SQL # a bit yucky but we got to add the term back in - elsif match.to_s.length >= SiteSetting.min_search_term_length + elsif match.to_s.length >= min_search_term_length posts.where <<~SQL posts.id IN ( SELECT post_id FROM post_search_data pd1 @@ -1304,4 +1325,18 @@ class Search !readonly_mode && @opts[:type_filter] != "exclude_topics" end + + def min_search_term_length + return @opts[:min_search_term_length] if @opts[:min_search_term_length] + + if SiteSetting.search_tokenize_chinese + return SiteSetting.defaults.get('min_search_term_length', 'zh_CN') + end + + if SiteSetting.search_tokenize_japanese + return SiteSetting.defaults.get('min_search_term_length', 'ja') + end + + SiteSetting.min_search_term_length + end end diff --git a/lib/search/grouped_search_results.rb b/lib/search/grouped_search_results.rb index 8182fe90bc..611ee168e8 100644 --- a/lib/search/grouped_search_results.rb +++ b/lib/search/grouped_search_results.rb @@ -87,7 +87,7 @@ class Search blurb_length: @blurb_length } - if post.post_search_data.version > SearchIndexer::MIN_POST_REINDEX_VERSION && !Search.segment_cjk? + if post.post_search_data.version > SearchIndexer::MIN_POST_REINDEX_VERSION && !Search.segment_chinese? && !Search.segment_japanese? if SiteSetting.use_pg_headlines_for_excerpt scrubbed_headline = post.headline.gsub(SCRUB_HEADLINE_REGEXP, '\1') prefix_omission = scrubbed_headline.start_with?(post.leading_raw_data) ? '' : OMISSION diff --git a/lib/site_settings/deprecated_settings.rb b/lib/site_settings/deprecated_settings.rb index 9e13541b35..36c0dfd55c 100644 --- a/lib/site_settings/deprecated_settings.rb +++ b/lib/site_settings/deprecated_settings.rb @@ -31,6 +31,7 @@ module SiteSettings::DeprecatedSettings ['sso_overrides_card_background', 'discourse_connect_overrides_card_background', true, '2.8'], ['external_auth_skip_create_confirm', 'auth_skip_create_confirm', true, '2.8'], ['external_auth_immediately', 'auth_immediately', true, '2.8'], + ['search_tokenize_chinese_japanese_korean', 'search_tokenize_chinese', true, '2.9'], ] def setup_deprecated_methods diff --git a/lib/tiny_japanese_segmenter.rb b/lib/tiny_japanese_segmenter.rb new file mode 100644 index 0000000000..5da3175a36 --- /dev/null +++ b/lib/tiny_japanese_segmenter.rb @@ -0,0 +1,173 @@ +# frozen_string_literal: true + +# Ruby port of http://chasen.org/~taku/software/TinySegmenter/tiny_segmenter-0.2.js +# This is esstentially a trained machine learning model used to segment words in Japanese. +# Discourse core uses it for "best effort" segmentation of Japanese text for search. +class TinyJapaneseSegmenter + CHARTYPE = { + "[一二三四五六七八九十百千万億兆]" => "M", + "[一-龠々〆ヵヶ]" => "H", + "[ぁ-ん]" => "I", + "[ァ-ヴーア-ン゙ー]" => "K", + "[a-zA-Za-zA-Z]" => "A", + "[0-90-9]" => "N" + }.map do |pattern, value| + [Regexp.compile(pattern), value] + end + + BIAS = -322 + BC1 = { "HH" => 6, "II" => 2461, "KH" => 406, "OH" => -1378 } + BC2 = { "AA" => -3267, "AI" => 2744, "AN" => -878, "HH" => -4070, "HM" => -1711, "HN" => 4012, "HO" => 3761, "IA" => 1327, "IH" => -1184, "II" => -1332, "IK" => 1721, "IO" => 5492, "KI" => 3831, "KK" => -8741, "MH" => -3132, "MK" => 3334, "OO" => -2920 } + BC3 = { "HH" => 996, "HI" => 626, "HK" => -721, "HN" => -1307, "HO" => -836, "IH" => -301, "KK" => 2762, "MK" => 1079, "MM" => 4034, "OA" => -1652, "OH" => 266 } + BP1 = { "BB" => 295, "OB" => 304, "OO" => -125, "UB" => 352 } + BP2 = { "BO" => 60, "OO" => -1762 } + BQ1 = { "BHH" => 1150, "BHM" => 1521, "BII" => -1158, "BIM" => 886, "BMH" => 1208, "BNH" => 449, "BOH" => -91, "BOO" => -2597, "OHI" => 451, "OIH" => -296, "OKA" => 1851, "OKH" => -1020, "OKK" => 904, "OOO" => 2965 } + BQ2 = { "BHH" => 118, "BHI" => -1159, "BHM" => 466, "BIH" => -919, "BKK" => -1720, "BKO" => 864, "OHH" => -1139, "OHM" => -181, "OIH" => 153, "UHI" => -1146 } + BQ3 = { "BHH" => -792, "BHI" => 2664, "BII" => -299, "BKI" => 419, "BMH" => 937, "BMM" => 8335, "BNN" => 998, "BOH" => 775, "OHH" => 2174, "OHM" => 439, "OII" => 280, "OKH" => 1798, "OKI" => -793, "OKO" => -2242, "OMH" => -2402, "OOO" => 11699 } + BQ4 = { "BHH" => -3895, "BIH" => 3761, "BII" => -4654, "BIK" => 1348, "BKK" => -1806, "BMI" => -3385, "BOO" => -12396, "OAH" => 926, "OHH" => 266, "OHK" => -2036, "ONN" => -973 } + BW1 = { ",と" => 660, ",同" => 727, "B1あ" => 1404, "B1同" => 542, "、と" => 660, "、同" => 727, "」と" => 1682, "あっ" => 1505, "いう" => 1743, "いっ" => -2055, "いる" => 672, "うし" => -4817, "うん" => 665, "から" => 3472, "がら" => 600, "こう" => -790, "こと" => 2083, "こん" => -1262, "さら" => -4143, "さん" => 4573, "した" => 2641, "して" => 1104, "すで" => -3399, "そこ" => 1977, "それ" => -871, "たち" => 1122, "ため" => 601, "った" => 3463, "つい" => -802, "てい" => 805, "てき" => 1249, "でき" => 1127, "です" => 3445, "では" => 844, "とい" => -4915, "とみ" => 1922, "どこ" => 3887, "ない" => 5713, "なっ" => 3015, "など" => 7379, "なん" => -1113, "にし" => 2468, "には" => 1498, "にも" => 1671, "に対" => -912, "の一" => -501, "の中" => 741, "ませ" => 2448, "まで" => 1711, "まま" => 2600, "まる" => -2155, "やむ" => -1947, "よっ" => -2565, "れた" => 2369, "れで" => -913, "をし" => 1860, "を見" => 731, "亡く" => -1886, "京都" => 2558, "取り" => -2784, "大き" => -2604, "大阪" => 1497, "平方" => -2314, "引き" => -1336, "日本" => -195, "本当" => -2423, "毎日" => -2113, "目指" => -724, "B1あ" => 1404, "B1同" => 542, "」と" => 1682 } + BW2 = { ".." => -11822, "11" => -669, "――" => -5730, "−−" => -13175, "いう" => -1609, "うか" => 2490, "かし" => -1350, "かも" => -602, "から" => -7194, "かれ" => 4612, "がい" => 853, "がら" => -3198, "きた" => 1941, "くな" => -1597, "こと" => -8392, "この" => -4193, "させ" => 4533, "され" => 13168, "さん" => -3977, "しい" => -1819, "しか" => -545, "した" => 5078, "して" => 972, "しな" => 939, "その" => -3744, "たい" => -1253, "たた" => -662, "ただ" => -3857, "たち" => -786, "たと" => 1224, "たは" => -939, "った" => 4589, "って" => 1647, "っと" => -2094, "てい" => 6144, "てき" => 3640, "てく" => 2551, "ては" => -3110, "ても" => -3065, "でい" => 2666, "でき" => -1528, "でし" => -3828, "です" => -4761, "でも" => -4203, "とい" => 1890, "とこ" => -1746, "とと" => -2279, "との" => 720, "とみ" => 5168, "とも" => -3941, "ない" => -2488, "なが" => -1313, "など" => -6509, "なの" => 2614, "なん" => 3099, "にお" => -1615, "にし" => 2748, "にな" => 2454, "によ" => -7236, "に対" => -14943, "に従" => -4688, "に関" => -11388, "のか" => 2093, "ので" => -7059, "のに" => -6041, "のの" => -6125, "はい" => 1073, "はが" => -1033, "はず" => -2532, "ばれ" => 1813, "まし" => -1316, "まで" => -6621, "まれ" => 5409, "めて" => -3153, "もい" => 2230, "もの" => -10713, "らか" => -944, "らし" => -1611, "らに" => -1897, "りし" => 651, "りま" => 1620, "れた" => 4270, "れて" => 849, "れば" => 4114, "ろう" => 6067, "われ" => 7901, "を通" => -11877, "んだ" => 728, "んな" => -4115, "一人" => 602, "一方" => -1375, "一日" => 970, "一部" => -1051, "上が" => -4479, "会社" => -1116, "出て" => 2163, "分の" => -7758, "同党" => 970, "同日" => -913, "大阪" => -2471, "委員" => -1250, "少な" => -1050, "年度" => -8669, "年間" => -1626, "府県" => -2363, "手権" => -1982, "新聞" => -4066, "日新" => -722, "日本" => -7068, "日米" => 3372, "曜日" => -601, "朝鮮" => -2355, "本人" => -2697, "東京" => -1543, "然と" => -1384, "社会" => -1276, "立て" => -990, "第に" => -1612, "米国" => -4268, "11" => -669 } + BW3 = { "あた" => -2194, "あり" => 719, "ある" => 3846, "い." => -1185, "い。" => -1185, "いい" => 5308, "いえ" => 2079, "いく" => 3029, "いた" => 2056, "いっ" => 1883, "いる" => 5600, "いわ" => 1527, "うち" => 1117, "うと" => 4798, "えと" => 1454, "か." => 2857, "か。" => 2857, "かけ" => -743, "かっ" => -4098, "かに" => -669, "から" => 6520, "かり" => -2670, "が," => 1816, "が、" => 1816, "がき" => -4855, "がけ" => -1127, "がっ" => -913, "がら" => -4977, "がり" => -2064, "きた" => 1645, "けど" => 1374, "こと" => 7397, "この" => 1542, "ころ" => -2757, "さい" => -714, "さを" => 976, "し," => 1557, "し、" => 1557, "しい" => -3714, "した" => 3562, "して" => 1449, "しな" => 2608, "しま" => 1200, "す." => -1310, "す。" => -1310, "する" => 6521, "ず," => 3426, "ず、" => 3426, "ずに" => 841, "そう" => 428, "た." => 8875, "た。" => 8875, "たい" => -594, "たの" => 812, "たり" => -1183, "たる" => -853, "だ." => 4098, "だ。" => 4098, "だっ" => 1004, "った" => -4748, "って" => 300, "てい" => 6240, "てお" => 855, "ても" => 302, "です" => 1437, "でに" => -1482, "では" => 2295, "とう" => -1387, "とし" => 2266, "との" => 541, "とも" => -3543, "どう" => 4664, "ない" => 1796, "なく" => -903, "など" => 2135, "に," => -1021, "に、" => -1021, "にし" => 1771, "にな" => 1906, "には" => 2644, "の," => -724, "の、" => -724, "の子" => -1000, "は," => 1337, "は、" => 1337, "べき" => 2181, "まし" => 1113, "ます" => 6943, "まっ" => -1549, "まで" => 6154, "まれ" => -793, "らし" => 1479, "られ" => 6820, "るる" => 3818, "れ," => 854, "れ、" => 854, "れた" => 1850, "れて" => 1375, "れば" => -3246, "れる" => 1091, "われ" => -605, "んだ" => 606, "んで" => 798, "カ月" => 990, "会議" => 860, "入り" => 1232, "大会" => 2217, "始め" => 1681, "市" => 965, "新聞" => -5055, "日," => 974, "日、" => 974, "社会" => 2024, "カ月" => 990 } + TC1 = { "AAA" => 1093, "HHH" => 1029, "HHM" => 580, "HII" => 998, "HOH" => -390, "HOM" => -331, "IHI" => 1169, "IOH" => -142, "IOI" => -1015, "IOM" => 467, "MMH" => 187, "OOI" => -1832 } + TC2 = { "HHO" => 2088, "HII" => -1023, "HMM" => -1154, "IHI" => -1965, "KKH" => 703, "OII" => -2649 } + TC3 = { "AAA" => -294, "HHH" => 346, "HHI" => -341, "HII" => -1088, "HIK" => 731, "HOH" => -1486, "IHH" => 128, "IHI" => -3041, "IHO" => -1935, "IIH" => -825, "IIM" => -1035, "IOI" => -542, "KHH" => -1216, "KKA" => 491, "KKH" => -1217, "KOK" => -1009, "MHH" => -2694, "MHM" => -457, "MHO" => 123, "MMH" => -471, "NNH" => -1689, "NNO" => 662, "OHO" => -3393 } + TC4 = { "HHH" => -203, "HHI" => 1344, "HHK" => 365, "HHM" => -122, "HHN" => 182, "HHO" => 669, "HIH" => 804, "HII" => 679, "HOH" => 446, "IHH" => 695, "IHO" => -2324, "IIH" => 321, "III" => 1497, "IIO" => 656, "IOO" => 54, "KAK" => 4845, "KKA" => 3386, "KKK" => 3065, "MHH" => -405, "MHI" => 201, "MMH" => -241, "MMM" => 661, "MOM" => 841 } + TQ1 = { "BHHH" => -227, "BHHI" => 316, "BHIH" => -132, "BIHH" => 60, "BIII" => 1595, "BNHH" => -744, "BOHH" => 225, "BOOO" => -908, "OAKK" => 482, "OHHH" => 281, "OHIH" => 249, "OIHI" => 200, "OIIH" => -68 } + TQ2 = { "BIHH" => -1401, "BIII" => -1033, "BKAK" => -543, "BOOO" => -5591 } + TQ3 = { "BHHH" => 478, "BHHM" => -1073, "BHIH" => 222, "BHII" => -504, "BIIH" => -116, "BIII" => -105, "BMHI" => -863, "BMHM" => -464, "BOMH" => 620, "OHHH" => 346, "OHHI" => 1729, "OHII" => 997, "OHMH" => 481, "OIHH" => 623, "OIIH" => 1344, "OKAK" => 2792, "OKHH" => 587, "OKKA" => 679, "OOHH" => 110, "OOII" => -685 } + TQ4 = { "BHHH" => -721, "BHHM" => -3604, "BHII" => -966, "BIIH" => -607, "BIII" => -2181, "OAAA" => -2763, "OAKK" => 180, "OHHH" => -294, "OHHI" => 2446, "OHHO" => 480, "OHIH" => -1573, "OIHH" => 1935, "OIHI" => -493, "OIIH" => 626, "OIII" => -4007, "OKAK" => -8156 } + TW1 = { "につい" => -4681, "東京都" => 2026 } + TW2 = { "ある程" => -2049, "いった" => -1256, "ころが" => -2434, "しょう" => 3873, "その後" => -4430, "だって" => -1049, "ていた" => 1833, "として" => -4657, "ともに" => -4517, "もので" => 1882, "一気に" => -792, "初めて" => -1512, "同時に" => -8097, "大きな" => -1255, "対して" => -2721, "社会党" => -3216 } + TW3 = { "いただ" => -1734, "してい" => 1314, "として" => -4314, "につい" => -5483, "にとっ" => -5989, "に当た" => -6247, "ので," => -727, "ので、" => -727, "のもの" => -600, "れから" => -3752, "十二月" => -2287 } + TW4 = { "いう." => 8576, "いう。" => 8576, "からな" => -2348, "してい" => 2958, "たが," => 1516, "たが、" => 1516, "ている" => 1538, "という" => 1349, "ました" => 5543, "ません" => 1097, "ようと" => -4258, "よると" => 5865 } + UC1 = { "A" => 484, "K" => 93, "M" => 645, "O" => -505 } + UC2 = { "A" => 819, "H" => 1059, "I" => 409, "M" => 3987, "N" => 5775, "O" => 646 } + UC3 = { "A" => -1370, "I" => 2311 } + UC4 = { "A" => -2643, "H" => 1809, "I" => -1032, "K" => -3450, "M" => 3565, "N" => 3876, "O" => 6646 } + UC5 = { "H" => 313, "I" => -1238, "K" => -799, "M" => 539, "O" => -831 } + UC6 = { "H" => -506, "I" => -253, "K" => 87, "M" => 247, "O" => -387 } + UP1 = { "O" => -214 } + UP2 = { "B" => 69, "O" => 935 } + UP3 = { "B" => 189 } + UQ1 = { "BH" => 21, "BI" => -12, "BK" => -99, "BN" => 142, "BO" => -56, "OH" => -95, "OI" => 477, "OK" => 410, "OO" => -2422 } + UQ2 = { "BH" => 216, "BI" => 113, "OK" => 1759 } + UQ3 = { "BA" => -479, "BH" => 42, "BI" => 1913, "BK" => -7198, "BM" => 3160, "BN" => 6427, "BO" => 14761, "OI" => -827, "ON" => -3212 } + UW1 = { "," => 156, "、" => 156, "「" => -463, "あ" => -941, "う" => -127, "が" => -553, "き" => 121, "こ" => 505, "で" => -201, "と" => -547, "ど" => -123, "に" => -789, "の" => -185, "は" => -847, "も" => -466, "や" => -470, "よ" => 182, "ら" => -292, "り" => 208, "れ" => 169, "を" => -446, "ん" => -137, "・" => -135, "主" => -402, "京" => -268, "区" => -912, "午" => 871, "国" => -460, "大" => 561, "委" => 729, "市" => -411, "日" => -141, "理" => 361, "生" => -408, "県" => -386, "都" => -718, "「" => -463, "・" => -135 } + UW2 = { "," => -829, "、" => -829, "〇" => 892, "「" => -645, "」" => 3145, "あ" => -538, "い" => 505, "う" => 134, "お" => -502, "か" => 1454, "が" => -856, "く" => -412, "こ" => 1141, "さ" => 878, "ざ" => 540, "し" => 1529, "す" => -675, "せ" => 300, "そ" => -1011, "た" => 188, "だ" => 1837, "つ" => -949, "て" => -291, "で" => -268, "と" => -981, "ど" => 1273, "な" => 1063, "に" => -1764, "の" => 130, "は" => -409, "ひ" => -1273, "べ" => 1261, "ま" => 600, "も" => -1263, "や" => -402, "よ" => 1639, "り" => -579, "る" => -694, "れ" => 571, "を" => -2516, "ん" => 2095, "ア" => -587, "カ" => 306, "キ" => 568, "ッ" => 831, "三" => -758, "不" => -2150, "世" => -302, "中" => -968, "主" => -861, "事" => 492, "人" => -123, "会" => 978, "保" => 362, "入" => 548, "初" => -3025, "副" => -1566, "北" => -3414, "区" => -422, "大" => -1769, "天" => -865, "太" => -483, "子" => -1519, "学" => 760, "実" => 1023, "小" => -2009, "市" => -813, "年" => -1060, "強" => 1067, "手" => -1519, "揺" => -1033, "政" => 1522, "文" => -1355, "新" => -1682, "日" => -1815, "明" => -1462, "最" => -630, "朝" => -1843, "本" => -1650, "東" => -931, "果" => -665, "次" => -2378, "民" => -180, "気" => -1740, "理" => 752, "発" => 529, "目" => -1584, "相" => -242, "県" => -1165, "立" => -763, "第" => 810, "米" => 509, "自" => -1353, "行" => 838, "西" => -744, "見" => -3874, "調" => 1010, "議" => 1198, "込" => 3041, "開" => 1758, "間" => -1257, "「" => -645, "」" => 3145, "ッ" => 831, "ア" => -587, "カ" => 306, "キ" => 568 } + UW3 = { "," => 4889, "1" => -800, "−" => -1723, "、" => 4889, "々" => -2311, "〇" => 5827, "」" => 2670, "〓" => -3573, "あ" => -2696, "い" => 1006, "う" => 2342, "え" => 1983, "お" => -4864, "か" => -1163, "が" => 3271, "く" => 1004, "け" => 388, "げ" => 401, "こ" => -3552, "ご" => -3116, "さ" => -1058, "し" => -395, "す" => 584, "せ" => 3685, "そ" => -5228, "た" => 842, "ち" => -521, "っ" => -1444, "つ" => -1081, "て" => 6167, "で" => 2318, "と" => 1691, "ど" => -899, "な" => -2788, "に" => 2745, "の" => 4056, "は" => 4555, "ひ" => -2171, "ふ" => -1798, "へ" => 1199, "ほ" => -5516, "ま" => -4384, "み" => -120, "め" => 1205, "も" => 2323, "や" => -788, "よ" => -202, "ら" => 727, "り" => 649, "る" => 5905, "れ" => 2773, "わ" => -1207, "を" => 6620, "ん" => -518, "ア" => 551, "グ" => 1319, "ス" => 874, "ッ" => -1350, "ト" => 521, "ム" => 1109, "ル" => 1591, "ロ" => 2201, "ン" => 278, "・" => -3794, "一" => -1619, "下" => -1759, "世" => -2087, "両" => 3815, "中" => 653, "主" => -758, "予" => -1193, "二" => 974, "人" => 2742, "今" => 792, "他" => 1889, "以" => -1368, "低" => 811, "何" => 4265, "作" => -361, "保" => -2439, "元" => 4858, "党" => 3593, "全" => 1574, "公" => -3030, "六" => 755, "共" => -1880, "円" => 5807, "再" => 3095, "分" => 457, "初" => 2475, "別" => 1129, "前" => 2286, "副" => 4437, "力" => 365, "動" => -949, "務" => -1872, "化" => 1327, "北" => -1038, "区" => 4646, "千" => -2309, "午" => -783, "協" => -1006, "口" => 483, "右" => 1233, "各" => 3588, "合" => -241, "同" => 3906, "和" => -837, "員" => 4513, "国" => 642, "型" => 1389, "場" => 1219, "外" => -241, "妻" => 2016, "学" => -1356, "安" => -423, "実" => -1008, "家" => 1078, "小" => -513, "少" => -3102, "州" => 1155, "市" => 3197, "平" => -1804, "年" => 2416, "広" => -1030, "府" => 1605, "度" => 1452, "建" => -2352, "当" => -3885, "得" => 1905, "思" => -1291, "性" => 1822, "戸" => -488, "指" => -3973, "政" => -2013, "教" => -1479, "数" => 3222, "文" => -1489, "新" => 1764, "日" => 2099, "旧" => 5792, "昨" => -661, "時" => -1248, "曜" => -951, "最" => -937, "月" => 4125, "期" => 360, "李" => 3094, "村" => 364, "東" => -805, "核" => 5156, "森" => 2438, "業" => 484, "氏" => 2613, "民" => -1694, "決" => -1073, "法" => 1868, "海" => -495, "無" => 979, "物" => 461, "特" => -3850, "生" => -273, "用" => 914, "町" => 1215, "的" => 7313, "直" => -1835, "省" => 792, "県" => 6293, "知" => -1528, "私" => 4231, "税" => 401, "立" => -960, "第" => 1201, "米" => 7767, "系" => 3066, "約" => 3663, "級" => 1384, "統" => -4229, "総" => 1163, "線" => 1255, "者" => 6457, "能" => 725, "自" => -2869, "英" => 785, "見" => 1044, "調" => -562, "財" => -733, "費" => 1777, "車" => 1835, "軍" => 1375, "込" => -1504, "通" => -1136, "選" => -681, "郎" => 1026, "郡" => 4404, "部" => 1200, "金" => 2163, "長" => 421, "開" => -1432, "間" => 1302, "関" => -1282, "雨" => 2009, "電" => -1045, "非" => 2066, "駅" => 1620, "1" => -800, "」" => 2670, "・" => -3794, "ッ" => -1350, "ア" => 551, "グ" => 1319, "ス" => 874, "ト" => 521, "ム" => 1109, "ル" => 1591, "ロ" => 2201, "ン" => 278 } + UW4 = { "," => 3930, "." => 3508, "―" => -4841, "、" => 3930, "。" => 3508, "〇" => 4999, "「" => 1895, "」" => 3798, "〓" => -5156, "あ" => 4752, "い" => -3435, "う" => -640, "え" => -2514, "お" => 2405, "か" => 530, "が" => 6006, "き" => -4482, "ぎ" => -3821, "く" => -3788, "け" => -4376, "げ" => -4734, "こ" => 2255, "ご" => 1979, "さ" => 2864, "し" => -843, "じ" => -2506, "す" => -731, "ず" => 1251, "せ" => 181, "そ" => 4091, "た" => 5034, "だ" => 5408, "ち" => -3654, "っ" => -5882, "つ" => -1659, "て" => 3994, "で" => 7410, "と" => 4547, "な" => 5433, "に" => 6499, "ぬ" => 1853, "ね" => 1413, "の" => 7396, "は" => 8578, "ば" => 1940, "ひ" => 4249, "び" => -4134, "ふ" => 1345, "へ" => 6665, "べ" => -744, "ほ" => 1464, "ま" => 1051, "み" => -2082, "む" => -882, "め" => -5046, "も" => 4169, "ゃ" => -2666, "や" => 2795, "ょ" => -1544, "よ" => 3351, "ら" => -2922, "り" => -9726, "る" => -14896, "れ" => -2613, "ろ" => -4570, "わ" => -1783, "を" => 13150, "ん" => -2352, "カ" => 2145, "コ" => 1789, "セ" => 1287, "ッ" => -724, "ト" => -403, "メ" => -1635, "ラ" => -881, "リ" => -541, "ル" => -856, "ン" => -3637, "・" => -4371, "ー" => -11870, "一" => -2069, "中" => 2210, "予" => 782, "事" => -190, "井" => -1768, "人" => 1036, "以" => 544, "会" => 950, "体" => -1286, "作" => 530, "側" => 4292, "先" => 601, "党" => -2006, "共" => -1212, "内" => 584, "円" => 788, "初" => 1347, "前" => 1623, "副" => 3879, "力" => -302, "動" => -740, "務" => -2715, "化" => 776, "区" => 4517, "協" => 1013, "参" => 1555, "合" => -1834, "和" => -681, "員" => -910, "器" => -851, "回" => 1500, "国" => -619, "園" => -1200, "地" => 866, "場" => -1410, "塁" => -2094, "士" => -1413, "多" => 1067, "大" => 571, "子" => -4802, "学" => -1397, "定" => -1057, "寺" => -809, "小" => 1910, "屋" => -1328, "山" => -1500, "島" => -2056, "川" => -2667, "市" => 2771, "年" => 374, "庁" => -4556, "後" => 456, "性" => 553, "感" => 916, "所" => -1566, "支" => 856, "改" => 787, "政" => 2182, "教" => 704, "文" => 522, "方" => -856, "日" => 1798, "時" => 1829, "最" => 845, "月" => -9066, "木" => -485, "来" => -442, "校" => -360, "業" => -1043, "氏" => 5388, "民" => -2716, "気" => -910, "沢" => -939, "済" => -543, "物" => -735, "率" => 672, "球" => -1267, "生" => -1286, "産" => -1101, "田" => -2900, "町" => 1826, "的" => 2586, "目" => 922, "省" => -3485, "県" => 2997, "空" => -867, "立" => -2112, "第" => 788, "米" => 2937, "系" => 786, "約" => 2171, "経" => 1146, "統" => -1169, "総" => 940, "線" => -994, "署" => 749, "者" => 2145, "能" => -730, "般" => -852, "行" => -792, "規" => 792, "警" => -1184, "議" => -244, "谷" => -1000, "賞" => 730, "車" => -1481, "軍" => 1158, "輪" => -1433, "込" => -3370, "近" => 929, "道" => -1291, "選" => 2596, "郎" => -4866, "都" => 1192, "野" => -1100, "銀" => -2213, "長" => 357, "間" => -2344, "院" => -2297, "際" => -2604, "電" => -878, "領" => -1659, "題" => -792, "館" => -1984, "首" => 1749, "高" => 2120, "「" => 1895, "」" => 3798, "・" => -4371, "ッ" => -724, "ー" => -11870, "カ" => 2145, "コ" => 1789, "セ" => 1287, "ト" => -403, "メ" => -1635, "ラ" => -881, "リ" => -541, "ル" => -856, "ン" => -3637 } + UW5 = { "," => 465, "." => -299, "1" => -514, "E2" => -32768, "]" => -2762, "、" => 465, "。" => -299, "「" => 363, "あ" => 1655, "い" => 331, "う" => -503, "え" => 1199, "お" => 527, "か" => 647, "が" => -421, "き" => 1624, "ぎ" => 1971, "く" => 312, "げ" => -983, "さ" => -1537, "し" => -1371, "す" => -852, "だ" => -1186, "ち" => 1093, "っ" => 52, "つ" => 921, "て" => -18, "で" => -850, "と" => -127, "ど" => 1682, "な" => -787, "に" => -1224, "の" => -635, "は" => -578, "べ" => 1001, "み" => 502, "め" => 865, "ゃ" => 3350, "ょ" => 854, "り" => -208, "る" => 429, "れ" => 504, "わ" => 419, "を" => -1264, "ん" => 327, "イ" => 241, "ル" => 451, "ン" => -343, "中" => -871, "京" => 722, "会" => -1153, "党" => -654, "務" => 3519, "区" => -901, "告" => 848, "員" => 2104, "大" => -1296, "学" => -548, "定" => 1785, "嵐" => -1304, "市" => -2991, "席" => 921, "年" => 1763, "思" => 872, "所" => -814, "挙" => 1618, "新" => -1682, "日" => 218, "月" => -4353, "査" => 932, "格" => 1356, "機" => -1508, "氏" => -1347, "田" => 240, "町" => -3912, "的" => -3149, "相" => 1319, "省" => -1052, "県" => -4003, "研" => -997, "社" => -278, "空" => -813, "統" => 1955, "者" => -2233, "表" => 663, "語" => -1073, "議" => 1219, "選" => -1018, "郎" => -368, "長" => 786, "間" => 1191, "題" => 2368, "館" => -689, "1" => -514, "E2" => -32768, "「" => 363, "イ" => 241, "ル" => 451, "ン" => -343 } + UW6 = { "," => 227, "." => 808, "1" => -270, "E1" => 306, "、" => 227, "。" => 808, "あ" => -307, "う" => 189, "か" => 241, "が" => -73, "く" => -121, "こ" => -200, "じ" => 1782, "す" => 383, "た" => -428, "っ" => 573, "て" => -1014, "で" => 101, "と" => -105, "な" => -253, "に" => -149, "の" => -417, "は" => -236, "も" => -206, "り" => 187, "る" => -135, "を" => 195, "ル" => -673, "ン" => -496, "一" => -277, "中" => 201, "件" => -800, "会" => 624, "前" => 302, "区" => 1792, "員" => -1212, "委" => 798, "学" => -960, "市" => 887, "広" => -695, "後" => 535, "業" => -697, "相" => 753, "社" => -507, "福" => 974, "空" => -822, "者" => 1811, "連" => 463, "郎" => 1082, "1" => -270, "E1" => 306, "ル" => -673, "ン" => -496 } + + class << self + def segment(text) + return [] if text.nil? || text.strip.length == 0 + + result = [] + + segments = ["B3", "B2", "B1"] + ctypes = ["O", "O", "O"] + + text.chars.each do |char| + segments << char + ctypes << ctype(char) + end + + segments.concat(["E1", "E2", "E3"]) + ctypes.concat(["O", "O", "O"]) + + word = segments[3] + p1 = "U" + p2 = "U" + p3 = "U" + + 4.upto(segments.size - 4) do |i| + score = BIAS + w1 = segments[i - 3] + w2 = segments[i - 2] + w3 = segments[i - 1] + w4 = segments[i] + w5 = segments[i + 1] + w6 = segments[i + 2] + c1 = ctypes[i - 3] + c2 = ctypes[i - 2] + c3 = ctypes[i - 1] + c4 = ctypes[i] + c5 = ctypes[i + 1] + c6 = ctypes[i + 2] + score += UP1[p1].to_i + score += UP2[p2].to_i + score += UP3[p3].to_i + score += BP1[p1 + p2].to_i + score += BP2[p2 + p3].to_i + score += UW1[w1].to_i + score += UW2[w2].to_i + score += UW3[w3].to_i + score += UW4[w4].to_i + score += UW5[w5].to_i + score += UW6[w6].to_i + score += BW1[w2 + w3].to_i + score += BW2[w3 + w4].to_i + score += BW3[w4 + w5].to_i + score += TW1[w1 + w2 + w3].to_i + score += TW2[w2 + w3 + w4].to_i + score += TW3[w3 + w4 + w5].to_i + score += TW4[w4 + w5 + w6].to_i + score += UC1[c1].to_i + score += UC2[c2].to_i + score += UC3[c3].to_i + score += UC4[c4].to_i + score += UC5[c5].to_i + score += UC6[c6].to_i + score += BC1[c2 + c3].to_i + score += BC2[c3 + c4].to_i + score += BC3[c4 + c5].to_i + score += TC1[c1 + c2 + c3].to_i + score += TC2[c2 + c3 + c4].to_i + score += TC3[c3 + c4 + c5].to_i + score += TC4[c4 + c5 + c6].to_i + # score += TC5[c4 + c5 + c6].to_i + score += UQ1[p1 + c1].to_i + score += UQ2[p2 + c2].to_i + score += UQ3[p3 + c3].to_i + score += BQ1[p2 + c2 + c3].to_i + score += BQ2[p2 + c3 + c4].to_i + score += BQ3[p3 + c2 + c3].to_i + score += BQ4[p3 + c3 + c4].to_i + score += TQ1[p2 + c1 + c2 + c3].to_i + score += TQ2[p2 + c2 + c3 + c4].to_i + score += TQ3[p3 + c1 + c2 + c3].to_i + score += TQ4[p3 + c2 + c3 + c4].to_i + + p = "O" + + if score > 0 + result.push(word) + word = "" + p = "B" + end + + p1 = p2 + p2 = p3 + p3 = p + word += segments[i] + end + + result.push(word) + + result + end + + private + + def ctype(text) + CHARTYPE.each do |regexp, value| + if text.match(regexp) + return value + end + end + + "O" + end + end +end diff --git a/lib/validators/search_tokenize_chinese_validator.rb b/lib/validators/search_tokenize_chinese_validator.rb new file mode 100644 index 0000000000..0cda74ea10 --- /dev/null +++ b/lib/validators/search_tokenize_chinese_validator.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class SearchTokenizeChineseValidator + def initialize(opts = {}) + end + + def valid_value?(value) + !SiteSetting.search_tokenize_japanese + end + + def error_message + I18n.t("site_settings.errors.search_tokenize_japanese_enabled") + end +end diff --git a/lib/validators/search_tokenize_japanese_validator.rb b/lib/validators/search_tokenize_japanese_validator.rb new file mode 100644 index 0000000000..7ad07a9c88 --- /dev/null +++ b/lib/validators/search_tokenize_japanese_validator.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class SearchTokenizeJapaneseValidator + def initialize(opts = {}) + end + + def valid_value?(value) + !SiteSetting.search_tokenize_chinese + end + + def error_message + I18n.t("site_settings.errors.search_tokenize_chinese_enabled") + end +end diff --git a/spec/components/search_spec.rb b/spec/components/search_spec.rb index f47ca2438e..cff820c602 100644 --- a/spec/components/search_spec.rb +++ b/spec/components/search_spec.rb @@ -1099,26 +1099,85 @@ describe Search do end - describe 'Chinese search' do - let(:sentence) { 'Discourse中国的基础设施网络正在组装' } - let(:sentence_t) { 'Discourse太平山森林遊樂區' } + context 'Japanese search' do + let!(:topic) { Fabricate(:topic) } + let!(:post) { Fabricate(:post, topic: topic, raw: 'This is some japanese text 日本が大好きです。') } + let!(:topic_2) { Fabricate(:topic, title: '日本の話題、 more japanese text') } + let!(:post_2) { Fabricate(:post, topic: topic_2) } - it 'splits English / Chinese and filter out stop words' do + describe '.prepare_data' do + it 'removes punctuations' do + SiteSetting.search_tokenize_japanese = true + + expect(Search.prepare_data(post.raw)).to eq("This is some japanese text 日本 が 大好き です") + end + end + + describe '.execute' do + before do + @old_default = SiteSetting.defaults.get(:min_search_term_length) + SiteSetting.defaults.set_regardless_of_locale(:min_search_term_length, 1) + SiteSetting.refresh! + end + + after do + SiteSetting.defaults.set_regardless_of_locale(:min_search_term_length, @old_default) + SiteSetting.refresh! + end + + it 'finds posts containing Japanese text if tokenization is forced' do + SiteSetting.search_tokenize_japanese = true + + expect(Search.execute('日本').posts.map(&:id)).to eq([post_2.id, post.id]) + expect(Search.execute('日').posts.map(&:id)).to eq([post_2.id, post.id]) + end + + it "find posts containing search term when site's locale is set to Japanese" do + SiteSetting.default_locale = 'ja' + + expect(Search.execute('日本').posts.map(&:id)).to eq([post_2.id, post.id]) + expect(Search.execute('日').posts.map(&:id)).to eq([post_2.id, post.id]) + end + + it 'does not include superfluous spaces in blurbs' do + SiteSetting.default_locale = 'ja' + + post.update!(raw: '場サアマネ織企ういかせ竹域ヱイマ穂基ホ神3予読ずねいぱ松査ス禁多サウ提懸イふ引小43改こょドめ。深とつぐ主思料農ぞかル者杯検める活分えほづぼ白犠') + + results = Search.execute('ういかせ竹域', type_filter: 'topic') + + expect(results.posts.length).to eq(1) + expect(results.blurb(results.posts.first)).to include('ういかせ竹域') + end + end + end + + describe 'Chinese search' do + let(:sentence) { 'Discourse is a software company 中国的基础设施网络正在组装。' } + let(:sentence_t) { 'Discourse is a software company 太平山森林遊樂區。' } + + it 'splits English / Chinese and filter out Chinese stop words' do SiteSetting.default_locale = 'zh_CN' - data = Search.prepare_data(sentence).split(' ') - expect(data).to eq(["Discourse", "中国", "基础设施", "网络", "正在", "组装"]) + data = Search.prepare_data(sentence) + expect(data).to eq("Discourse is a software company 中国 基础设施 网络 正在 组装") end it 'splits for indexing and filter out stop words' do SiteSetting.default_locale = 'zh_CN' - data = Search.prepare_data(sentence, :index).split(' ') - expect(data).to eq(["Discourse", "中国", "基础设施", "网络", "正在", "组装"]) + data = Search.prepare_data(sentence, :index) + expect(data).to eq("Discourse is a software company 中国 基础设施 网络 正在 组装") end it 'splits English / Traditional Chinese and filter out stop words' do SiteSetting.default_locale = 'zh_TW' - data = Search.prepare_data(sentence_t).split(' ') - expect(data).to eq(["Discourse", "太平山", "森林", "遊樂區"]) + data = Search.prepare_data(sentence_t) + expect(data).to eq("Discourse is a software company 太平山 森林 遊樂區") + end + + it 'does not split strings beginning with numeric chars into different segments' do + SiteSetting.default_locale = 'zh_TW' + data = Search.prepare_data("#{sentence} 123abc") + expect(data).to eq("Discourse is a software company 中国 基础设施 网络 正在 组装 123abc") end it 'finds chinese topic based on title' do @@ -1126,6 +1185,7 @@ describe Search do SiteSetting.default_locale = 'zh_TW' SiteSetting.min_search_term_length = 1 + topic = Fabricate(:topic, title: 'My Title Discourse社區指南') post = Fabricate(:post, topic: topic) @@ -1136,14 +1196,23 @@ describe Search do it 'finds chinese topic based on title if tokenization is forced' do skip("skipped until pg app installs the db correctly") if RbConfig::CONFIG["arch"] =~ /darwin/ - SiteSetting.search_tokenize_chinese_japanese_korean = true - SiteSetting.min_search_term_length = 1 + begin + SiteSetting.search_tokenize_chinese = true + default_min_search_term_length = SiteSetting.defaults.get(:min_search_term_length) + SiteSetting.defaults.set_regardless_of_locale(:min_search_term_length, 1) + SiteSetting.refresh! - topic = Fabricate(:topic, title: 'My Title Discourse社區指南') - post = Fabricate(:post, topic: topic) + topic = Fabricate(:topic, title: 'My Title Discourse社區指南') + post = Fabricate(:post, topic: topic) - expect(Search.execute('社區指南').posts.first.id).to eq(post.id) - expect(Search.execute('指南').posts.first.id).to eq(post.id) + expect(Search.execute('社區指南').posts.first.id).to eq(post.id) + expect(Search.execute('指南').posts.first.id).to eq(post.id) + ensure + if default_min_search_term_length + SiteSetting.defaults.set_regardless_of_locale(:min_search_term_length, default_min_search_term_length) + SiteSetting.refresh! + end + end end end @@ -1818,27 +1887,6 @@ describe Search do end end - context 'CJK segmentation' do - before do - SiteSetting.search_tokenize_chinese_japanese_korean = true - SiteSetting.min_search_term_length = 1 - end - - let!(:post1) do - Fabricate(:post, raw: '場サアマネ織企ういかせ竹域ヱイマ穂基ホ神3予読ずねいぱ松査ス禁多サウ提懸イふ引小43改こょドめ。深とつぐ主思料農ぞかル者杯検める活分えほづぼ白犠') - end - - it('does not include superfluous spaces in blurbs') do - - results = Search.execute('ういかせ竹域', type_filter: 'topic') - expect(results.posts.length).to eq(1) - - expect(results.blurb(results.posts.first)).to include('ういかせ竹域') - - end - - end - context 'include_diacritics' do before { SiteSetting.search_ignore_accents = false } let!(:post1) { Fabricate(:post, raw: 'สวัสดี Régis hello') } diff --git a/spec/components/validators/search_tokenize_chinese_validator_spec.rb b/spec/components/validators/search_tokenize_chinese_validator_spec.rb new file mode 100644 index 0000000000..e0378145ae --- /dev/null +++ b/spec/components/validators/search_tokenize_chinese_validator_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe SearchTokenizeChineseValidator do + it 'does not allow search_tokenize_chinese to be enabled when search_tokenize_japanese is enabled' do + SiteSetting.search_tokenize_japanese = true + + expect { SiteSetting.search_tokenize_chinese = true }.to raise_error(Discourse::InvalidParameters) + end +end diff --git a/spec/components/validators/search_tokenize_japanese_validator_spec.rb b/spec/components/validators/search_tokenize_japanese_validator_spec.rb new file mode 100644 index 0000000000..dc65f4245a --- /dev/null +++ b/spec/components/validators/search_tokenize_japanese_validator_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe SearchTokenizeJapaneseValidator do + it 'does not allow search_tokenize_japanese to be enabled when search_tokenize_chinese is enabled' do + SiteSetting.search_tokenize_chinese = true + + expect { SiteSetting.search_tokenize_japanese = true }.to raise_error(Discourse::InvalidParameters) + end +end diff --git a/spec/lib/search_spec.rb b/spec/lib/search_spec.rb index 1d10264f63..bfdfa7009e 100644 --- a/spec/lib/search_spec.rb +++ b/spec/lib/search_spec.rb @@ -4,20 +4,6 @@ require 'rails_helper' describe Search do - context "#prepare_data" do - it "does not remove English stop words in mixed mode" do - SiteSetting.search_tokenize_chinese_japanese_korean = true - - tokenized = Search.prepare_data("monkey 吃香蕉 in a loud volume") - expect(tokenized).to eq("monkey 吃 香蕉 in a loud volume") - - SiteSetting.default_locale = 'zh_CN' - - tokenized = Search.prepare_data("monkey 吃香蕉 in a loud volume") - expect(tokenized).to eq("monkey 吃 香蕉 loud") - end - end - context "#ts_config" do it "maps locales to correct Postgres dictionaries" do expect(Search.ts_config).to eq("english") diff --git a/spec/lib/tiny_japanese_segmenter_spec.rb b/spec/lib/tiny_japanese_segmenter_spec.rb new file mode 100644 index 0000000000..2fc1d853f1 --- /dev/null +++ b/spec/lib/tiny_japanese_segmenter_spec.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe TinyJapaneseSegmenter do + describe '.segment' do + it 'generates the segments for a given japanese text' do + expect(TinyJapaneseSegmenter.segment("TinySegmenterはJavascriptだけ書かれた極めてコンパクトな日本語分かち書きソフトウェアです。")).to eq( + %w{TinySegmenter は Javascript だけ 書か れ た 極め て コンパクト な 日本 語分 かち 書き ソフトウェア です 。} + ) + end + end +end From 65f46ad4eda9517cbef29eace8f3a65c5b5eb62a Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Mon, 24 Jan 2022 15:56:18 +0800 Subject: [PATCH 102/194] FIX: Better param guards for `wiki` and `post_type` posts controller. --- app/controllers/posts_controller.rb | 5 ++++- spec/requests/posts_controller_spec.rb | 25 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index b3014a111f..7a0da6d043 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -546,6 +546,7 @@ class PostsController < ApplicationController def wiki post = find_post_from_params + params.require(:wiki) guardian.ensure_can_wiki!(post) post.revise(current_user, wiki: params[:wiki]) @@ -555,8 +556,10 @@ class PostsController < ApplicationController def post_type guardian.ensure_can_change_post_type! - post = find_post_from_params + params.require(:post_type) + raise Discourse::InvalidParameters.new(:post_type) if Post.types[params[:post_type].to_i].blank? + post.revise(current_user, post_type: params[:post_type].to_i) render body: nil diff --git a/spec/requests/posts_controller_spec.rb b/spec/requests/posts_controller_spec.rb index 883eef44b4..6c5d171451 100644 --- a/spec/requests/posts_controller_spec.rb +++ b/spec/requests/posts_controller_spec.rb @@ -656,6 +656,14 @@ describe PostsController do let!(:post) { post_by_user } + it "returns 400 when wiki parameter is not present" do + sign_in(admin) + + put "/posts/#{post.id}/wiki.json", params: {} + + expect(response.status).to eq(400) + end + it "raises an error if the user doesn't have permission to wiki the post" do put "/posts/#{post.id}/wiki.json", params: { wiki: 'true' } expect(response).to be_forbidden @@ -706,18 +714,31 @@ describe PostsController do describe "when logged in" do before do - sign_in(user) + sign_in(moderator) end let!(:post) { post_by_user } it "raises an error if the user doesn't have permission to change the post type" do + sign_in(user) + put "/posts/#{post.id}/post_type.json", params: { post_type: 2 } expect(response).to be_forbidden end + it "returns 400 if post_type parameter is not present" do + put "/posts/#{post.id}/post_type.json", params: {} + + expect(response.status).to eq(400) + end + + it "returns 400 if post_type parameters is invalid" do + put "/posts/#{post.id}/post_type.json", params: { post_type: -1 } + + expect(response.status).to eq(400) + end + it "can change the post type" do - sign_in(moderator) put "/posts/#{post.id}/post_type.json", params: { post_type: 2 } post.reload From cc7a04afdc70fffa2aa5c140cdafbeb6da7ea97d Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Fri, 14 Jan 2022 10:12:08 +0800 Subject: [PATCH 103/194] DEV: Improve test paths pattern for Ember CLI. Ember tests follows a convention where test files have a postfix of `-test.js`. This ensures that any files in the tests folder which follows this pattern is included. --- app/assets/javascripts/discourse/ember-cli-build.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/app/assets/javascripts/discourse/ember-cli-build.js b/app/assets/javascripts/discourse/ember-cli-build.js index e6a01988ad..18b770d977 100644 --- a/app/assets/javascripts/discourse/ember-cli-build.js +++ b/app/assets/javascripts/discourse/ember-cli-build.js @@ -71,13 +71,7 @@ module.exports = function (defaults) { }); let tests = concat(appTestTrees, { - inputFiles: [ - "**/tests/acceptance/*.js", - "**/tests/integration/*.js", - "**/tests/integration/**/*.js", - "**/tests/unit/*.js", - "**/tests/unit/**/*.js", - ], + inputFiles: ["**/tests/**/*-test.js"], headerFiles: ["vendor/ember-cli/tests-prefix.js"], footerFiles: ["vendor/ember-cli/app-config.js"], outputFile: "/assets/core-tests.js", From a16184ab0d60aa80011db489c24df3e891783d44 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 6 Feb 2022 21:14:55 +0000 Subject: [PATCH 104/194] Build(deps): Bump excon from 0.90.0 to 0.91.0 Bumps [excon](https://github.com/excon/excon) from 0.90.0 to 0.91.0. - [Release notes](https://github.com/excon/excon/releases) - [Changelog](https://github.com/excon/excon/blob/master/changelog.txt) - [Commits](https://github.com/excon/excon/compare/v0.90.0...v0.91.0) --- updated-dependencies: - dependency-name: excon dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 0be7aa51b1..50ad444127 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -129,7 +129,7 @@ GEM sprockets (>= 3.3, < 4.1) ember-source (2.18.2) erubi (1.10.0) - excon (0.90.0) + excon (0.91.0) execjs (2.8.1) exifr (1.3.9) fabrication (2.27.0) From ac8e5f0df7eb13df3e1fc70f8c728e9a198a51b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 6 Feb 2022 21:02:42 +0000 Subject: [PATCH 105/194] Build(deps-dev): Bump rb-fsevent from 0.11.0 to 0.11.1 Bumps [rb-fsevent](https://github.com/thibaudgg/rb-fsevent) from 0.11.0 to 0.11.1. - [Release notes](https://github.com/thibaudgg/rb-fsevent/releases) - [Commits](https://github.com/thibaudgg/rb-fsevent/compare/v0.11.0...v0.11.1) --- updated-dependencies: - dependency-name: rb-fsevent dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 50ad444127..e6fd9bbba3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -343,7 +343,7 @@ GEM rainbow (3.1.1) raindrops (0.20.0) rake (13.0.6) - rb-fsevent (0.11.0) + rb-fsevent (0.11.1) rb-inotify (0.10.1) ffi (~> 1.0) rbtrace (0.4.14) From f805aa9e90edf57d65d08a1a7da93f498853d27c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 6 Feb 2022 21:01:09 +0000 Subject: [PATCH 106/194] Build(deps): Bump ipaddr from 1.2.3 to 1.2.4 Bumps [ipaddr](https://github.com/ruby/ipaddr) from 1.2.3 to 1.2.4. - [Release notes](https://github.com/ruby/ipaddr/releases) - [Changelog](https://github.com/ruby/ipaddr/blob/master/CHANGELOG.md) - [Commits](https://github.com/ruby/ipaddr/compare/v1.2.3...v1.2.4) --- updated-dependencies: - dependency-name: ipaddr dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index e6fd9bbba3..1f5e54ab8a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -185,7 +185,7 @@ GEM progress (~> 3.0, >= 3.0.1) image_size (3.0.1) in_threads (1.5.4) - ipaddr (1.2.3) + ipaddr (1.2.4) jmespath (1.5.0) jquery-rails (4.4.0) rails-dom-testing (>= 1, < 3) From 81e175e6ba90a7ed2c3da9a6bf4f1250c738bf20 Mon Sep 17 00:00:00 2001 From: Ayke Halder Date: Mon, 7 Feb 2022 02:28:26 +0100 Subject: [PATCH 107/194] FIX: allow native lazy loading attribute for quoted avatar image (#15834) --- .../pretty-text/engines/discourse-markdown/quotes.js | 2 +- spec/components/pretty_text_spec.rb | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/quotes.js b/app/assets/javascripts/pretty-text/engines/discourse-markdown/quotes.js index f43fceec0d..8eaf6dd406 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/quotes.js +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/quotes.js @@ -170,7 +170,7 @@ export function setup(helper) { md.block.bbcode.ruler.push("quotes", rule); }); - helper.allowList(["img[class=avatar]"]); + helper.allowList(["img[class=avatar]", "img[loading=lazy]"]); helper.allowList({ custom(tag, name, value) { if (tag === "aside" && name === "class") { diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 8e180c5eb5..7382700734 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -226,7 +226,7 @@ describe PrettyText do

ddd

@@ -248,7 +248,7 @@ describe PrettyText do

ddd

@@ -269,7 +269,7 @@ describe PrettyText do

ddd

@@ -296,7 +296,7 @@ describe PrettyText do

- {{group-manage-save-button model=group disabled=(not emailSettingsValid) beforeSave=beforeSave afterSave=afterSave tabindex="14"}} + {{group-manage-save-button model=group disabled=(not emailSettingsValid) beforeSave=beforeSave afterSave=afterSave tabindex="15"}}
diff --git a/app/assets/javascripts/discourse/app/templates/components/group-smtp-email-settings.hbs b/app/assets/javascripts/discourse/app/templates/components/group-smtp-email-settings.hbs index 2b807460c7..525b66091b 100644 --- a/app/assets/javascripts/discourse/app/templates/components/group-smtp-email-settings.hbs +++ b/app/assets/javascripts/discourse/app/templates/components/group-smtp-email-settings.hbs @@ -8,11 +8,11 @@
- {{input type="text" name="smtp_server" value=form.smtp_server tabindex="3" onChange=(action "resetSettingsValid")}} + {{input type="text" name="smtp_server" value=form.smtp_server tabindex="4" onChange=(action "resetSettingsValid")}}
@@ -25,7 +25,15 @@
- {{input type="text" name="smtp_port" value=form.smtp_port tabindex="4" onChange=(action "resetSettingsValid" form.smtp_port)}} + {{input type="text" name="smtp_port" value=form.smtp_port tabindex="5" onChange=(action "resetSettingsValid" form.smtp_port)}} +
+ + +
+
+ + {{input type="text" name="from_alias" id="from_alias" value=form.email_from_alias onChange=(action "resetSettingsValid") tabindex="3"}} +

{{i18n "groups.manage.email.settings.from_alias_hint"}}

@@ -43,7 +51,7 @@ action=(action "testSmtpSettings") icon="cog" label="groups.manage.email.test_settings" - tabindex="6" + tabindex="7" title="groups.manage.email.settings_required" }} diff --git a/app/assets/javascripts/discourse/tests/acceptance/group-manage-email-settings-test.js b/app/assets/javascripts/discourse/tests/acceptance/group-manage-email-settings-test.js index 49ae5dd9f2..cff0acf17b 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/group-manage-email-settings-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/group-manage-email-settings-test.js @@ -106,6 +106,8 @@ acceptance( await fillIn('input[name="username"]', "myusername@gmail.com"); await fillIn('input[name="password"]', "password@gmail.com"); + await fillIn("#from_alias", "akasomegroup@example.com"); + await click(".test-smtp-settings"); assert.ok(exists(".smtp-settings-ok"), "tested settings are ok"); diff --git a/app/assets/stylesheets/common/base/group.scss b/app/assets/stylesheets/common/base/group.scss index 7ca7384c57..5f1087ecd9 100644 --- a/app/assets/stylesheets/common/base/group.scss +++ b/app/assets/stylesheets/common/base/group.scss @@ -252,7 +252,7 @@ table.group-category-permissions { .group-imap-email-settings { .groups-form { display: grid; - grid-template-columns: 1fr 3fr; + grid-template-columns: 1fr 1fr 1fr; margin-bottom: 0; &.groups-form-imap { diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 2ca448e323..4d1687fab0 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -713,6 +713,7 @@ class GroupsController < ApplicationController :imap_updated_at, :email_username, :email_password, + :email_from_alias, :primary_group, :visibility_level, :members_visibility_level, diff --git a/app/mailers/group_smtp_mailer.rb b/app/mailers/group_smtp_mailer.rb index ce12e4b0cc..25bb887b0d 100644 --- a/app/mailers/group_smtp_mailer.rb +++ b/app/mailers/group_smtp_mailer.rb @@ -48,7 +48,7 @@ class GroupSmtpMailer < ActionMailer::Base add_re_to_subject: true, locale: SiteSetting.default_locale, delivery_method_options: delivery_options, - from: from_group.email_username, + from: from_group.smtp_from_address, from_alias: I18n.t('email_from_without_site', user_name: group_name), html_override: html_override(post), cc: cc_addresses diff --git a/app/models/group.rb b/app/models/group.rb index a53d7e3ce3..3c64ab49d1 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -110,7 +110,8 @@ class Group < ActiveRecord::Base "imap_port", "imap_ssl", "email_username", - "email_password" + "email_password", + "email_from_alias" ] ALIAS_LEVELS = { @@ -290,6 +291,10 @@ class Group < ActiveRecord::Base end end + def smtp_from_address + self.email_from_alias.present? ? self.email_from_alias : self.email_username + end + def downcase_incoming_email self.incoming_email = (incoming_email || "").strip.downcase.presence end @@ -708,7 +713,9 @@ class Group < ActiveRecord::Base def self.find_by_email(email) self.where( - "email_username = :email OR string_to_array(incoming_email, '|') @> ARRAY[:email]", + "email_username = :email OR + string_to_array(incoming_email, '|') @> ARRAY[:email] OR + email_from_alias = :email", email: Email.downcase(email) ).first end @@ -1128,6 +1135,7 @@ end # imap_enabled :boolean default(FALSE) # imap_updated_at :datetime # imap_updated_by_id :integer +# email_from_alias :string # # Indexes # diff --git a/app/serializers/group_show_serializer.rb b/app/serializers/group_show_serializer.rb index 0b51aed01b..f3b520d19a 100644 --- a/app/serializers/group_show_serializer.rb +++ b/app/serializers/group_show_serializer.rb @@ -32,6 +32,7 @@ class GroupShowSerializer < BasicGroupSerializer :imap_updated_by, :email_username, :email_password, + :email_from_alias, :imap_last_error, :imap_old_emails, :imap_new_emails, diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index cbb3e1eda5..80b7b8fda1 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -754,6 +754,8 @@ en: title: "Settings" allow_unknown_sender_topic_replies: "Allow unknown sender topic replies." allow_unknown_sender_topic_replies_hint: "Allows unknown senders to reply to group topics. If this is not enabled, replies from email addresses not already invited to the topic will create a new topic." + from_alias: "From Alias" + from_alias_hint: "Alias to use as the from address when sending group SMTP emails. Note this may not be supported by all mail providers, please consult your mail provider's documentation." mailboxes: synchronized: "Synchronized Mailbox" none_found: "No mailboxes were found in this email account." diff --git a/db/migrate/20220124003259_add_email_from_alias_to_groups.rb b/db/migrate/20220124003259_add_email_from_alias_to_groups.rb new file mode 100644 index 0000000000..260dd01bde --- /dev/null +++ b/db/migrate/20220124003259_add_email_from_alias_to_groups.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddEmailFromAliasToGroups < ActiveRecord::Migration[6.1] + def change + add_column :groups, :email_from_alias, :string, null: true + end +end diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index 0bd4eff451..54bf74c230 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -1225,6 +1225,23 @@ describe Group do expect(group.smtp_updated_by).to eq(user) end + it "records the change for singular setting changes" do + group.update( + smtp_port: 587, + smtp_ssl: true, + smtp_server: "smtp.gmail.com", + email_username: "test@gmail.com", + email_password: "password", + ) + group.record_email_setting_changes!(user) + group.reload + + old_updated_at = group.smtp_updated_at + group.update(email_from_alias: "somealias@gmail.com") + group.record_email_setting_changes!(user) + expect(group.reload.smtp_updated_at).not_to eq_time(old_updated_at) + end + it "enables imap and records the change" do group.update( imap_port: 587, @@ -1314,5 +1331,12 @@ describe Group do expect(Group.find_by_email("support@test.com")).to eq(group) expect(Group.find_by_email("nope@test.com")).to eq(nil) end + + it "finds the group by its email_from_alias" do + group.update!(email_username: "abc@test.com", email_from_alias: "somealias@test.com") + expect(Group.find_by_email("abc@test.com")).to eq(group) + expect(Group.find_by_email("somealias@test.com")).to eq(group) + expect(Group.find_by_email("nope@test.com")).to eq(nil) + end end end diff --git a/spec/requests/api/schemas/json/group_response.json b/spec/requests/api/schemas/json/group_response.json index a3bf6d151c..a649b8133a 100644 --- a/spec/requests/api/schemas/json/group_response.json +++ b/spec/requests/api/schemas/json/group_response.json @@ -221,6 +221,12 @@ "null" ] }, + "email_from_alias": { + "type": [ + "string", + "null" + ] + }, "email_password": { "type": [ "string", From 357186ab7ebd100c38d4776e9e05e9d2d988f570 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Mon, 7 Feb 2022 16:58:27 +1000 Subject: [PATCH 112/194] FIX: User option fields definition was being mutated on save (#15837) In the commit d8bf2810ffe49619077371d854fc12cba81f80fa we hoisted the userOptionFields array to a module-level variable, but kept the code inside save() the same. This causes an issue where if save() is called twice on the same user with some array of user option fields, the userOptionFields array is mutated, which means the second save is likely not saving the fields intended. This commit fixes the issue by not mutating the array. We cannot change them into consts though, because we have an API to add more items to the array. --- .../javascripts/discourse/app/models/user.js | 11 ++++- .../discourse/tests/acceptance/user-test.js | 46 +++++++++++++++++++ .../discourse/tests/unit/models/user-test.js | 2 +- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/discourse/app/models/user.js b/app/assets/javascripts/discourse/app/models/user.js index 83f36723b6..4f9cca7a4d 100644 --- a/app/assets/javascripts/discourse/app/models/user.js +++ b/app/assets/javascripts/discourse/app/models/user.js @@ -334,13 +334,16 @@ const User = RestModel.extend({ userFields.filter((uf) => !fields || fields.indexOf(uf) !== -1) ); + let filteredUserOptionFields = []; if (fields) { - userOptionFields = userOptionFields.filter( + filteredUserOptionFields = userOptionFields.filter( (uo) => fields.indexOf(uo) !== -1 ); + } else { + filteredUserOptionFields = userOptionFields; } - userOptionFields.forEach((s) => { + filteredUserOptionFields.forEach((s) => { data[s] = this.get(`user_option.${s}`); }); @@ -379,6 +382,10 @@ const User = RestModel.extend({ } }); + return this._saveUserData(data, updatedState); + }, + + _saveUserData(data, updatedState) { // TODO: We can remove this when migrated fully to rest model. this.set("isSaving", true); return ajax(userPath(`${this.username_lower}.json`), { diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-test.js index 32375c88b3..121ccb9e48 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-test.js @@ -1,3 +1,7 @@ +import EmberObject from "@ember/object"; +import User from "discourse/models/user"; +import selectKit from "discourse/tests/helpers/select-kit-helper"; +import sinon from "sinon"; import { acceptance, exists, @@ -131,3 +135,45 @@ acceptance("User Routes - Moderator viewing warnings", function (needs) { assert.ok($("div.alert-info").length, "has the permissions alert"); }); }); + +acceptance("User - Saving user options", function (needs) { + needs.user({ + admin: false, + moderator: false, + username: "eviltrout", + id: 1, + user_option: EmberObject.create({}), + }); + + needs.settings({ + disable_mailing_list_mode: false, + }); + + needs.pretender((server, helper) => { + server.put("/u/eviltrout.json", () => { + return helper.response(200, { user: {} }); + }); + }); + + test("saving user options", async function (assert) { + const spy = sinon.spy(User.current(), "_saveUserData"); + + await visit("/u/eviltrout/preferences/emails"); + await click(".pref-mailing-list-mode input[type='checkbox']"); + await click(".save-changes"); + + assert.ok( + spy.calledWithMatch({ mailing_list_mode: true }), + "sends a PUT request to update the specified user option" + ); + + await selectKit("#user-email-messages-level").expand(); + await selectKit("#user-email-messages-level").selectRowByValue(2); // never option + await click(".save-changes"); + + assert.ok( + spy.calledWithMatch({ email_messages_level: 2 }), + "is able to save a different user_option on a subsequent request" + ); + }); +}); diff --git a/app/assets/javascripts/discourse/tests/unit/models/user-test.js b/app/assets/javascripts/discourse/tests/unit/models/user-test.js index fe80430aa2..5b8a6a4726 100644 --- a/app/assets/javascripts/discourse/tests/unit/models/user-test.js +++ b/app/assets/javascripts/discourse/tests/unit/models/user-test.js @@ -1,8 +1,8 @@ import * as ajaxlib from "discourse/lib/ajax"; import { module, test } from "qunit"; +import sinon from "sinon"; import Group from "discourse/models/group"; import User from "discourse/models/user"; -import sinon from "sinon"; module("Unit | Model | user", function () { test("staff", function (assert) { From 404f882e5cff7e057ccb128664d0b69b14854c16 Mon Sep 17 00:00:00 2001 From: Andrei Prigorshnev Date: Mon, 7 Feb 2022 13:02:26 +0100 Subject: [PATCH 113/194] FEATURE: in result.rb don't use email for username suggestions until enabled in settings (#15586) --- lib/auth/result.rb | 4 ++- .../omniauth_callbacks_controller_spec.rb | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/auth/result.rb b/lib/auth/result.rb index 1a3efcf303..09298af2d4 100644 --- a/lib/auth/result.rb +++ b/lib/auth/result.rb @@ -196,7 +196,9 @@ class Auth::Result end def username_suggester_attributes - [username, name, email] + attributes = [username, name] + attributes << email if SiteSetting.use_email_for_username_and_name_suggestions + attributes end def authenticator diff --git a/spec/requests/omniauth_callbacks_controller_spec.rb b/spec/requests/omniauth_callbacks_controller_spec.rb index 46f81b1d99..4378c4bd4f 100644 --- a/spec/requests/omniauth_callbacks_controller_spec.rb +++ b/spec/requests/omniauth_callbacks_controller_spec.rb @@ -241,6 +241,32 @@ RSpec.describe Users::OmniauthCallbacksController do expect(data["associate_url"]).to eq(nil) end + it 'does not use email for username suggestions if disabled in settings' do + SiteSetting.use_email_for_username_and_name_suggestions = false + username = "" + name = "" + email = "billmailbox@test.com" + mock_auth(email, username, name) + + get "/auth/google_oauth2/callback.json" + data = JSON.parse(cookies[:authentication_data]) + + expect(data["username"]).to eq("user1") # not "billmailbox" that can be extracted from email + end + + it 'uses email for username suggestions if enabled in settings' do + SiteSetting.use_email_for_username_and_name_suggestions = true + username = "" + name = "" + email = "billmailbox@test.com" + mock_auth(email, username, name) + + get "/auth/google_oauth2/callback.json" + data = JSON.parse(cookies[:authentication_data]) + + expect(data["username"]).to eq("billmailbox") + end + describe 'when site is invite_only' do before do SiteSetting.invite_only = true From 45c00c72bd72036416477696a39dfc775e457431 Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Mon, 7 Feb 2022 13:51:07 +0100 Subject: [PATCH 114/194] FIX: Do not override mobile scroll on docked progress element (#15840) --- .../javascripts/discourse/app/components/topic-navigation.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/assets/javascripts/discourse/app/components/topic-navigation.js b/app/assets/javascripts/discourse/app/components/topic-navigation.js index f40882cf87..9c2b2ef70a 100644 --- a/app/assets/javascripts/discourse/app/components/topic-navigation.js +++ b/app/assets/javascripts/discourse/app/components/topic-navigation.js @@ -163,6 +163,10 @@ export default Component.extend(PanEvents, { }, panStart(e) { + if (e.originalEvent.target.classList.contains("docked")) { + return; + } + e.originalEvent.preventDefault(); const center = e.center; const $centeredElement = $(document.elementFromPoint(center.x, center.y)); From bc5f2d0c4ef969dddbf1a6fc16a837700657f1d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Feb 2022 14:11:52 +0100 Subject: [PATCH 115/194] Build(deps): Bump in_threads from 1.5.4 to 1.6.0 (#15642) Bumps [in_threads](https://github.com/toy/in_threads) from 1.5.4 to 1.6.0. - [Release notes](https://github.com/toy/in_threads/releases) - [Changelog](https://github.com/toy/in_threads/blob/master/CHANGELOG.markdown) - [Commits](https://github.com/toy/in_threads/compare/v1.5.4...v1.6.0) --- updated-dependencies: - dependency-name: in_threads dependency-type: indirect update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 1f5e54ab8a..a6ac15c138 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -184,7 +184,7 @@ GEM in_threads (~> 1.3) progress (~> 3.0, >= 3.0.1) image_size (3.0.1) - in_threads (1.5.4) + in_threads (1.6.0) ipaddr (1.2.4) jmespath (1.5.0) jquery-rails (4.4.0) From 64be371749756abc574c511c7d112d3b4f52041c Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Feb 2022 13:16:57 +0000 Subject: [PATCH 116/194] DEV: Improve handling of invalid requests (#15841) Our discourse_public_exceptions middleware is designed to catch bubbled exceptions from lower in the stack, and then use `ApplicationController.rescue_with_handler` to render an appropriate error response. When the request itself is invalid, we had an escape-hatch to skip re-dispatching the request to ApplicationController. However, it was possible to work around this by 'layering' the errors. For example, if you made a request which resulted in a 404, but **also** had some other invalidity, the escape hatch would not be triggered. This commit ensures that these kind of 'layered' errors are properly handled, without logging warnings. It also adds detection for invalid JSON bodies and badly-formed multipart requests. The user-facing behavior is unchanged. This commit simply prevents warnings being logged for invalid requests. --- lib/middleware/discourse_public_exceptions.rb | 20 +++++++--- spec/integration/invalid_request_spec.rb | 39 +++++++++++++++++++ 2 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 spec/integration/invalid_request_spec.rb diff --git a/lib/middleware/discourse_public_exceptions.rb b/lib/middleware/discourse_public_exceptions.rb index fcc2b5ed26..9a9ea11571 100644 --- a/lib/middleware/discourse_public_exceptions.rb +++ b/lib/middleware/discourse_public_exceptions.rb @@ -4,6 +4,11 @@ # we need to handle certain exceptions here module Middleware class DiscoursePublicExceptions < ::ActionDispatch::PublicExceptions + INVALID_REQUEST_ERRORS = Set.new([ + Rack::QueryParser::InvalidParameterError, + ActionController::BadRequest, + ActionDispatch::Http::Parameters::ParseError, + ]) def initialize(path) super @@ -18,12 +23,7 @@ module Middleware exception = env["action_dispatch.exception"] response = ActionDispatch::Response.new - # Special handling for invalid params, in this case we can not re-dispatch - # the Request object has a "broken" .params which can not be accessed - exception = nil if Rack::QueryParser::InvalidParameterError === exception - - # We also can not dispatch bad requests as no proper params - exception = nil if ActionController::BadRequest === exception + exception = nil if INVALID_REQUEST_ERRORS.include?(exception) if exception begin @@ -38,6 +38,13 @@ module Middleware return [400, { "Cache-Control" => "private, max-age=0, must-revalidate" }, ["Invalid MIME type"]] end + # Or badly formatted multipart requests + begin + request.POST + rescue EOFError + return [400, { "Cache-Control" => "private, max-age=0, must-revalidate" }, ["Invalid request"]] + end + if ApplicationController.rescue_with_handler(exception, object: fake_controller) body = response.body if String === body @@ -46,6 +53,7 @@ module Middleware return [response.status, response.headers, body] end rescue => e + return super if INVALID_REQUEST_ERRORS.include?(e.class) Discourse.warn_exception(e, message: "Failed to handle exception in exception app middleware") end diff --git a/spec/integration/invalid_request_spec.rb b/spec/integration/invalid_request_spec.rb new file mode 100644 index 0000000000..2ac20d2d7a --- /dev/null +++ b/spec/integration/invalid_request_spec.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe 'invalid requests', type: :request do + before do + @orig_logger = Rails.logger + Rails.logger = @fake_logger = FakeLogger.new + end + + after do + Rails.logger = @orig_logger + end + + it "handles NotFound with invalid json body" do + post "/latest.json", params: "{some: malformed: json", headers: { "content-type" => "application/json" } + expect(response.status).to eq(404) + expect(@fake_logger.warnings.length).to eq(0) + expect(@fake_logger.errors.length).to eq(0) + end + + it "handles EOFError when multipart request is malformed" do + post "/latest.json", params: "somecontent", headers: { + "content-type" => "multipart/form-data; boundary=abcde", + "content-length" => "1" + } + expect(response.status).to eq(400) + expect(@fake_logger.warnings.length).to eq(0) + expect(@fake_logger.errors.length).to eq(0) + end + + it "handles invalid parameters" do + post "/latest.json", params: { "foo" => "\255bar" } + expect(response.status).to eq(404) + expect(@fake_logger.warnings.length).to eq(0) + expect(@fake_logger.errors.length).to eq(0) + end + +end From 492226a9737fc6c8d672383316569b7d2c523a55 Mon Sep 17 00:00:00 2001 From: Osama Sayegh Date: Mon, 7 Feb 2022 16:25:31 +0300 Subject: [PATCH 117/194] DEV: Add context in `AdminConstraint` (#15838) This allows plugins to override the permissions required to access specific things like the Logster and Sidekiq web UI without the changes leaking to the rest of Discourse routes. --- config/routes.rb | 4 ++-- lib/admin_constraint.rb | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 32e5a05c1d..854fdbfc8b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -32,8 +32,8 @@ Discourse::Application.routes.draw do mount Logster::Web => "/logs" else # only allow sidekiq in master site - mount Sidekiq::Web => "/sidekiq", constraints: AdminConstraint.new(require_master: true) - mount Logster::Web => "/logs", constraints: AdminConstraint.new + mount Sidekiq::Web => "/sidekiq", constraints: AdminConstraint.new(require_master: true, context: "sidekiq") + mount Logster::Web => "/logs", constraints: AdminConstraint.new(context: "logster") end end diff --git a/lib/admin_constraint.rb b/lib/admin_constraint.rb index 7146eedfee..e2c2a2db69 100644 --- a/lib/admin_constraint.rb +++ b/lib/admin_constraint.rb @@ -4,12 +4,16 @@ class AdminConstraint def initialize(options = {}) @require_master = options[:require_master] + # @context isn't used here, but it exists to give plugins extra context + # about the destination of the request. + # possible values are: sidekiq, logster and app (default). + @context = options[:context] || "app" end def matches?(request) return false if @require_master && RailsMultisite::ConnectionManagement.current_db != "default" - current_user = CurrentUser.lookup_from_env(request.env) - current_user&.admin? && custom_admin_check(request) + @current_user = CurrentUser.lookup_from_env(request.env) + @current_user&.admin? && custom_admin_check(request) rescue Discourse::InvalidAccess, Discourse::ReadOnly false end From ea2fd75d10e81687334f8d29e0d3e786dbdb4a53 Mon Sep 17 00:00:00 2001 From: Canapin Date: Mon, 7 Feb 2022 16:16:46 +0100 Subject: [PATCH 118/194] DEV: Fix some regexes in phpBB3 import script (#15829) 1. bbcode hashes don't always have exactly 8 characters. 2. colors aren't always hex values, it can be a color string ("red", "blue", etc). 3. The closing tag of smileys doesn't always include a `:` character (the start of the regex was already right for this particular issue) --- script/import_scripts/phpbb3/support/smiley_processor.rb | 2 +- script/import_scripts/phpbb3/support/text_processor.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/script/import_scripts/phpbb3/support/smiley_processor.rb b/script/import_scripts/phpbb3/support/smiley_processor.rb index 36df4035bb..618f99ddd2 100644 --- a/script/import_scripts/phpbb3/support/smiley_processor.rb +++ b/script/import_scripts/phpbb3/support/smiley_processor.rb @@ -18,7 +18,7 @@ module ImportScripts::PhpBB3 def replace_smilies(text) # :) is encoded as :) - text.gsub!(/.*?/) do + text.gsub!(/.*?/) do emoji($1) end end diff --git a/script/import_scripts/phpbb3/support/text_processor.rb b/script/import_scripts/phpbb3/support/text_processor.rb index f49765d648..622f0a931c 100644 --- a/script/import_scripts/phpbb3/support/text_processor.rb +++ b/script/import_scripts/phpbb3/support/text_processor.rb @@ -78,10 +78,10 @@ module ImportScripts::PhpBB3 # Many phpbb bbcode tags have a hash attached to them. Examples: # [url=https://google.com:1qh1i7ky]click here[/url:1qh1i7ky] # [quote="cybereality":b0wtlzex]Some text.[/quote:b0wtlzex] - text.gsub!(/:(?:\w{8})\]/, ']') + text.gsub!(/:(?:\w{5,8})\]/, ']') # remove color tags - text.gsub!(/\[\/?color(=#[a-z0-9]*)?\]/i, "") + text.gsub!(/\[\/?color(=#?[a-z0-9]*)?\]/i, "") end def bbcode_to_md(text) From 1b622667bc8c08e56707b3f0a43828808d024787 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Feb 2022 15:25:57 +0000 Subject: [PATCH 119/194] DEV: Make Ember CLI assets the default in production (#15843) This can be disabled by setting `EMBER_CLI_PROD_ASSETS=0`, but this option will not be available for long. If your theme/plugin/site has issues under Ember CLI, please open a topic on https://meta.discourse.org --- app/controllers/qunit_controller.rb | 2 +- app/helpers/application_helper.rb | 2 +- config/application.rb | 2 +- lib/tasks/assets.rake | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/qunit_controller.rb b/app/controllers/qunit_controller.rb index 003b343024..2abd0744e4 100644 --- a/app/controllers/qunit_controller.rb +++ b/app/controllers/qunit_controller.rb @@ -23,7 +23,7 @@ class QunitController < ApplicationController @is_proxied = is_ember_cli_proxy? @legacy_ember = if Rails.env.production? - ENV['EMBER_CLI_PROD_ASSETS'] != "1" + ENV['EMBER_CLI_PROD_ASSETS'] == "0" else !@is_proxied end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8b1e7fe447..c60e06cde0 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -138,7 +138,7 @@ module ApplicationHelper def preload_vendor_scripts scripts = ["vendor"] - if ENV["EMBER_CLI_PROD_ASSETS"] == "1" + if ENV["EMBER_CLI_PROD_ASSETS"] != "0" @@vendor_chunks ||= begin all_assets = ActionController::Base.helpers.assets_manifest.assets all_assets.keys.filter_map { |name| name[/\A(chunk\..*)\.js\z/, 1] } diff --git a/config/application.rb b/config/application.rb index 1c4a0bb51b..072b86f6d1 100644 --- a/config/application.rb +++ b/config/application.rb @@ -180,7 +180,7 @@ module Discourse discourse/tests/test_starter.js } - if ENV['EMBER_CLI_PROD_ASSETS'] != "1" + if ENV['EMBER_CLI_PROD_ASSETS'] == "0" config.assets.precompile += %w{ discourse/tests/test-support-rails.js discourse/tests/test-helpers-rails.js diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake index f57971cee9..00ad394cc7 100644 --- a/lib/tasks/assets.rake +++ b/lib/tasks/assets.rake @@ -35,7 +35,7 @@ task 'assets:precompile:before' do require 'sprockets' require 'digest/sha1' - if ENV['EMBER_CLI_PROD_ASSETS'] + if ENV['EMBER_CLI_PROD_ASSETS'] != "0" # Remove the assets that Ember CLI will handle for us Rails.configuration.assets.precompile.reject! do |asset| asset.is_a?(String) && @@ -312,7 +312,7 @@ end task 'assets:precompile' => 'assets:precompile:before' do - copy_ember_cli_assets if ENV['EMBER_CLI_PROD_ASSETS'] + copy_ember_cli_assets if ENV['EMBER_CLI_PROD_ASSETS'] != '0' refresh_days = GlobalSetting.refresh_maxmind_db_during_precompile_days From a8325c9016230f5171e0b72d7bff069784f64d16 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Feb 2022 17:58:54 +0000 Subject: [PATCH 120/194] DEV: Load all vendor files for theme-qunit under prod ember-cli (#15844) This regressed in f4c6a6185517a7d8a17c3faefb7e2e8cc67c44a8 --- app/helpers/qunit_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/qunit_helper.rb b/app/helpers/qunit_helper.rb index 9dec03aa21..01bfbac59c 100644 --- a/app/helpers/qunit_helper.rb +++ b/app/helpers/qunit_helper.rb @@ -4,7 +4,7 @@ module QunitHelper def vendor_theme_tests return preload_script("vendor-theme-tests") if @legacy_ember - preload_script("vendor") + preload_vendor_scripts end def support_bundles From c8c23ba557321aeac974bc4bdd183ec362c2bf25 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Feb 2022 17:59:55 +0000 Subject: [PATCH 121/194] DEV: Introduce deprecation warning for non-json Job arguments (#15842) This commit introduces our own handling and warning for Sidekiq's new 'non-json-serializable' warning. This decouples us from Sidekiq's own deprecation cycle, and allows us to use our own deprecation system. It also means that the dump/parse happens in test mode, which will help us to catch occurrences before they reach production. --- app/jobs/base.rb | 31 +++++++++++++++++++++--------- config/initializers/100-sidekiq.rb | 2 ++ spec/jobs/jobs_spec.rb | 2 +- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/jobs/base.rb b/app/jobs/base.rb index 379ed72b98..0693fb9bbd 100644 --- a/app/jobs/base.rb +++ b/app/jobs/base.rb @@ -293,32 +293,45 @@ module Jobs opts[:current_site_id] ||= RailsMultisite::ConnectionManagement.current_db end - # If we are able to queue a job, do it + delay = opts.delete(:delay_for) + queue = opts.delete(:queue) + + # Only string keys are allowed in JSON. We call `.with_indifferent_access` + # in Jobs::Base#perform, so this is invisible to developers + opts = opts.stringify_keys + + # Simulate the args being dumped/parsed through JSON + parsed_opts = JSON.parse(JSON.dump(opts)) + if opts != parsed_opts + Discourse.deprecate(<<~MSG.squish, since: "v2.9", drop_from: "3.0") + #{klass.name} was enqueued with argument values which do not cleanly serialize to/from JSON. + This means that the job will be run with slightly different values than the ones supplied to `enqueue`. + Argument values should be strings, booleans, numbers, or nil (or arrays/hashes of those value types). + MSG + end + opts = parsed_opts if ::Jobs.run_later? hash = { - 'class' => klass + 'class' => klass, + 'args' => [opts] } - if delay = opts.delete(:delay_for) + if delay if delay.to_f > 0 hash['at'] = Time.now.to_f + delay.to_f end end - if queue = opts.delete(:queue) + if queue hash['queue'] = queue end - hash['args'] = [opts.deep_stringify_keys] - DB.after_commit { klass.client_push(hash) } else # Otherwise execute the job right away - opts.delete(:delay_for) - opts.delete(:queue) + opts["sync_exec"] = true - opts[:sync_exec] = true if Rails.env == "development" Scheduler::Defer.later("job") do klass.new.perform(opts) diff --git a/config/initializers/100-sidekiq.rb b/config/initializers/100-sidekiq.rb index 99d9da4cfd..4f7a77b69a 100644 --- a/config/initializers/100-sidekiq.rb +++ b/config/initializers/100-sidekiq.rb @@ -122,3 +122,5 @@ end Sidekiq.error_handlers.clear Sidekiq.error_handlers << SidekiqLogsterReporter.new + +Sidekiq.strict_args! diff --git a/spec/jobs/jobs_spec.rb b/spec/jobs/jobs_spec.rb index 113f8e5788..ad130c2530 100644 --- a/spec/jobs/jobs_spec.rb +++ b/spec/jobs/jobs_spec.rb @@ -108,7 +108,7 @@ describe Jobs do end it "executes the job right away" do - Jobs::ProcessPost.any_instance.expects(:perform).with(post_id: 1, sync_exec: true, current_site_id: "default") + Jobs::ProcessPost.any_instance.expects(:perform).with("post_id" => 1, "sync_exec" => true, "current_site_id" => "default") Jobs.enqueue(:process_post, post_id: 1) end From 9bfe5e58d30a0f229437d9a6419873ac2c680e24 Mon Sep 17 00:00:00 2001 From: Osama Sayegh Date: Mon, 7 Feb 2022 21:05:19 +0300 Subject: [PATCH 122/194] Revert "DEV: Add context in `AdminConstraint` (#15838)" (#15845) This reverts commit 492226a9737fc6c8d672383316569b7d2c523a55. --- config/routes.rb | 4 ++-- lib/admin_constraint.rb | 8 ++------ 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 854fdbfc8b..32e5a05c1d 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -32,8 +32,8 @@ Discourse::Application.routes.draw do mount Logster::Web => "/logs" else # only allow sidekiq in master site - mount Sidekiq::Web => "/sidekiq", constraints: AdminConstraint.new(require_master: true, context: "sidekiq") - mount Logster::Web => "/logs", constraints: AdminConstraint.new(context: "logster") + mount Sidekiq::Web => "/sidekiq", constraints: AdminConstraint.new(require_master: true) + mount Logster::Web => "/logs", constraints: AdminConstraint.new end end diff --git a/lib/admin_constraint.rb b/lib/admin_constraint.rb index e2c2a2db69..7146eedfee 100644 --- a/lib/admin_constraint.rb +++ b/lib/admin_constraint.rb @@ -4,16 +4,12 @@ class AdminConstraint def initialize(options = {}) @require_master = options[:require_master] - # @context isn't used here, but it exists to give plugins extra context - # about the destination of the request. - # possible values are: sidekiq, logster and app (default). - @context = options[:context] || "app" end def matches?(request) return false if @require_master && RailsMultisite::ConnectionManagement.current_db != "default" - @current_user = CurrentUser.lookup_from_env(request.env) - @current_user&.admin? && custom_admin_check(request) + current_user = CurrentUser.lookup_from_env(request.env) + current_user&.admin? && custom_admin_check(request) rescue Discourse::InvalidAccess, Discourse::ReadOnly false end From cd460155aa1ff77c8ff3b57799734eb23f37a983 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Feb 2022 18:39:34 +0000 Subject: [PATCH 123/194] DEV: Add Ember-CLI backwards compatibility for Discourse.Site (#15847) --- .../discourse/app/initializers/inject-objects.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/assets/javascripts/discourse/app/initializers/inject-objects.js b/app/assets/javascripts/discourse/app/initializers/inject-objects.js index b325542587..e195d4349e 100644 --- a/app/assets/javascripts/discourse/app/initializers/inject-objects.js +++ b/app/assets/javascripts/discourse/app/initializers/inject-objects.js @@ -1,6 +1,7 @@ import { setDefaultOwner } from "discourse-common/lib/get-owner"; import { isLegacyEmber } from "discourse-common/config/environment"; import User from "discourse/models/user"; +import Site from "discourse/models/site"; import deprecated from "discourse-common/lib/deprecated"; export default { @@ -35,6 +36,18 @@ export default { return User; }, }); + Object.defineProperty(app, "Site", { + get() { + deprecated( + `import discourse/models/site instead of using Discourse.Site`, + { + since: "2.8", + dropFrom: "2.9", + } + ); + return Site; + }, + }); } }, }; From e83d603bbc3c1ec4936e1c869598c7e515c4a61b Mon Sep 17 00:00:00 2001 From: Penar Musaraj Date: Mon, 7 Feb 2022 20:15:26 +0100 Subject: [PATCH 124/194] DEV: Send message to DiscourseHub when dismissing (#15849) --- .../javascripts/discourse/app/widgets/quick-access-panel.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js b/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js index e87ec97bbb..16b6fff5cd 100644 --- a/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js +++ b/app/assets/javascripts/discourse/app/widgets/quick-access-panel.js @@ -3,6 +3,7 @@ import { Promise } from "rsvp"; import Session from "discourse/models/session"; import { createWidget } from "discourse/widgets/widget"; import { h } from "virtual-dom"; +import { postRNWebviewMessage } from "discourse/lib/utilities"; /** * This tries to enforce a consistent flow of fetching, caching, refreshing, @@ -75,6 +76,7 @@ export default createWidget("quick-access-panel", { markRead() { return this.markReadRequest().then(() => { this.refreshNotifications(this.state); + postRNWebviewMessage("markRead", "1"); }); }, From 7223d5e0121aff276b14421818b7c5dc251dfab9 Mon Sep 17 00:00:00 2001 From: Jordan Vidrine <30537603+jordanvidrine@users.noreply.github.com> Date: Mon, 7 Feb 2022 13:31:03 -0600 Subject: [PATCH 125/194] UX: Fix login header z-index (#15848) --- app/assets/stylesheets/mobile/login.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/mobile/login.scss b/app/assets/stylesheets/mobile/login.scss index 60d121b9ee..0ea664e63f 100644 --- a/app/assets/stylesheets/mobile/login.scss +++ b/app/assets/stylesheets/mobile/login.scss @@ -190,6 +190,7 @@ width: calc(100% - 2em); position: sticky; position: -webkit-sticky; + z-index: z("header"); top: 0; background-color: var(--secondary); } From ecd88e9abb83893148c26187ef25292768cfcc4b Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Feb 2022 20:18:17 +0000 Subject: [PATCH 126/194] DEV: Make `:send_system_message` arguments strings (#15851) --- app/models/post.rb | 2 +- app/models/reviewable_flagged_post.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/post.rb b/app/models/post.rb index 04df7e932f..50ecee6986 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -574,7 +574,7 @@ class Post < ActiveRecord::Base 5.seconds, :send_system_message, user_id: user.id, - message_type: message, + message_type: message.to_s, message_options: options ) end diff --git a/app/models/reviewable_flagged_post.rb b/app/models/reviewable_flagged_post.rb index 3795f05267..68e04c19c8 100644 --- a/app/models/reviewable_flagged_post.rb +++ b/app/models/reviewable_flagged_post.rb @@ -321,7 +321,7 @@ private Jobs.enqueue( :send_system_message, user_id: post.user_id, - message_type: :flags_disagreed, + message_type: "flags_disagreed", message_options: { flagged_post_raw_content: post.raw, url: post.url From 15cff27bfec8e1af91a96660f5c1a8de610e36d9 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Feb 2022 20:28:45 +0000 Subject: [PATCH 127/194] DEV: Stringify keys of nested hashes in job arguments (#15850) This provides symmetry with the `.with_indifferent_access` usage in `Jobs#perform`, which is also recursive. --- app/jobs/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/base.rb b/app/jobs/base.rb index 0693fb9bbd..29db06c99f 100644 --- a/app/jobs/base.rb +++ b/app/jobs/base.rb @@ -298,7 +298,7 @@ module Jobs # Only string keys are allowed in JSON. We call `.with_indifferent_access` # in Jobs::Base#perform, so this is invisible to developers - opts = opts.stringify_keys + opts = opts.deep_stringify_keys # Simulate the args being dumped/parsed through JSON parsed_opts = JSON.parse(JSON.dump(opts)) From e92f57255de429fcf12c4259235d88c5485d934f Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Feb 2022 20:31:10 +0000 Subject: [PATCH 128/194] Revert "DEV: Make Ember CLI assets the default in production (#15843)" (#15852) This reverts 1b622667bc8c08e56707b3f0a43828808d024787 We have had reports of issues rebuilding under memory-constrained environments. Reverting while we investigate further. --- app/controllers/qunit_controller.rb | 2 +- app/helpers/application_helper.rb | 2 +- config/application.rb | 2 +- lib/tasks/assets.rake | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/qunit_controller.rb b/app/controllers/qunit_controller.rb index 2abd0744e4..003b343024 100644 --- a/app/controllers/qunit_controller.rb +++ b/app/controllers/qunit_controller.rb @@ -23,7 +23,7 @@ class QunitController < ApplicationController @is_proxied = is_ember_cli_proxy? @legacy_ember = if Rails.env.production? - ENV['EMBER_CLI_PROD_ASSETS'] == "0" + ENV['EMBER_CLI_PROD_ASSETS'] != "1" else !@is_proxied end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c60e06cde0..8b1e7fe447 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -138,7 +138,7 @@ module ApplicationHelper def preload_vendor_scripts scripts = ["vendor"] - if ENV["EMBER_CLI_PROD_ASSETS"] != "0" + if ENV["EMBER_CLI_PROD_ASSETS"] == "1" @@vendor_chunks ||= begin all_assets = ActionController::Base.helpers.assets_manifest.assets all_assets.keys.filter_map { |name| name[/\A(chunk\..*)\.js\z/, 1] } diff --git a/config/application.rb b/config/application.rb index 072b86f6d1..1c4a0bb51b 100644 --- a/config/application.rb +++ b/config/application.rb @@ -180,7 +180,7 @@ module Discourse discourse/tests/test_starter.js } - if ENV['EMBER_CLI_PROD_ASSETS'] == "0" + if ENV['EMBER_CLI_PROD_ASSETS'] != "1" config.assets.precompile += %w{ discourse/tests/test-support-rails.js discourse/tests/test-helpers-rails.js diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake index 00ad394cc7..31ba3ba30f 100644 --- a/lib/tasks/assets.rake +++ b/lib/tasks/assets.rake @@ -35,7 +35,7 @@ task 'assets:precompile:before' do require 'sprockets' require 'digest/sha1' - if ENV['EMBER_CLI_PROD_ASSETS'] != "0" + if ENV['EMBER_CLI_PROD_ASSETS'] == "1" # Remove the assets that Ember CLI will handle for us Rails.configuration.assets.precompile.reject! do |asset| asset.is_a?(String) && @@ -312,7 +312,7 @@ end task 'assets:precompile' => 'assets:precompile:before' do - copy_ember_cli_assets if ENV['EMBER_CLI_PROD_ASSETS'] != '0' + copy_ember_cli_assets if ENV['EMBER_CLI_PROD_ASSETS'] == '1' refresh_days = GlobalSetting.refresh_maxmind_db_during_precompile_days From 820fea835cd949fd67b9df808ff3dec964023218 Mon Sep 17 00:00:00 2001 From: Dan Ungureanu Date: Mon, 7 Feb 2022 23:03:01 +0200 Subject: [PATCH 129/194] FIX: Further reduce the input of to_tsvector (#15716) Random strings can result into much longer tsvectors. For example parsing a Base64 string of ~600kb can result in a tsvector of over 1MB, which is the maximum size of a tsvector. Follow-up-to: 823c3f09d44ab89e88c4910abe36899bb23d601d --- app/services/search_indexer.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/services/search_indexer.rb b/app/services/search_indexer.rb index e774ad4df6..36a846fdf2 100644 --- a/app/services/search_indexer.rb +++ b/app/services/search_indexer.rb @@ -120,11 +120,11 @@ class SearchIndexer a_weight: topic_title, b_weight: category_name, c_weight: topic_tags, - # Length of a tsvector must be less than 1_048_576 bytes. - # The difference between the max ouptut limit and imposed input limit - # accounts for the fact that sometimes the output tsvector may be - # slighlty longer than the input. - d_weight: scrub_html_for_search(cooked)[0..1_000_000] + # The tsvector resulted from parsing a string can be double the size of + # the original string. Since there is no way to estimate the length of + # the expected tsvector, we limit the input to ~50% of the maximum + # length of a tsvector (1_048_576 bytes). + d_weight: scrub_html_for_search(cooked)[0..600_000] ) do |params| params["private_message"] = private_message end From d602c60e7de9c5dedc26d2242243347b4f7eb741 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Feb 2022 16:29:24 -0500 Subject: [PATCH 130/194] Build(deps): Bump sidekiq from 6.4.0 to 6.4.1 (#15853) Bumps [sidekiq](https://github.com/mperham/sidekiq) from 6.4.0 to 6.4.1. - [Release notes](https://github.com/mperham/sidekiq/releases) - [Changelog](https://github.com/mperham/sidekiq/blob/main/Changes.md) - [Commits](https://github.com/mperham/sidekiq/compare/v6.4.0...v6.4.1) --- updated-dependencies: - dependency-name: sidekiq dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index a6ac15c138..33e6f7ef33 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -435,7 +435,7 @@ GEM activesupport (>= 3.1) shoulda-matchers (5.1.0) activesupport (>= 5.2.0) - sidekiq (6.4.0) + sidekiq (6.4.1) connection_pool (>= 2.2.2) rack (~> 2.0) redis (>= 4.2.0) From 4cceb55621aa5a25c72415d78a43bd62be68d68d Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 7 Feb 2022 22:41:07 +0000 Subject: [PATCH 131/194] Revert "PERF: Update ember-auto-import (#15814)" (#15854) This reverts commit f4c6a6185517a7d8a17c3faefb7e2e8cc67c44a8 and a8325c9016230f5171e0b72d7bff069784f64d16 This update of ember-auto-import and webpack causes significantly higher memory use during rebuilds. This made ember-cli totally unusable on 1GB RAM / 2GB swap environments. We don't have a specific need for this upgrade right now, so reverting for now. --- app/assets/javascripts/admin/package.json | 5 +- .../javascripts/discourse-common/package.json | 13 +- .../javascripts/discourse-hbr/package.json | 5 +- .../discourse-widget-hbs/package.json | 5 +- app/assets/javascripts/discourse/package.json | 9 +- .../javascripts/pretty-text/package.json | 5 +- .../javascripts/select-kit/package.json | 3 +- .../javascripts/truth-helpers/package.json | 5 +- app/assets/javascripts/yarn.lock | 1785 +---------------- app/helpers/application_helper.rb | 16 - app/helpers/qunit_helper.rb | 2 +- app/views/layouts/application.html.erb | 2 +- app/views/qunit/index.html.erb | 2 +- app/views/users/activate_account.html.erb | 2 +- 14 files changed, 121 insertions(+), 1738 deletions(-) diff --git a/app/assets/javascripts/admin/package.json b/app/assets/javascripts/admin/package.json index bd0e0da1a7..8608b42a45 100644 --- a/app/assets/javascripts/admin/package.json +++ b/app/assets/javascripts/admin/package.json @@ -15,11 +15,10 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", "ember-cli-htmlbars": "^4.2.0", - "xss": "^1.0.8", - "webpack": "^5.67.0" + "xss": "^1.0.8" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse-common/package.json b/app/assets/javascripts/discourse-common/package.json index 68f1a4c629..9f39f2e1ad 100644 --- a/app/assets/javascripts/discourse-common/package.json +++ b/app/assets/javascripts/discourse-common/package.json @@ -15,18 +15,17 @@ "start": "ember serve" }, "dependencies": { + "ember-cli-babel": "^7.13.0", + "ember-cli-htmlbars": "^4.2.0", + "ember-auto-import": "^1.5.3", + "handlebars": "^4.7.0", + "truth-helpers": "^1.0.0", "@uppy/aws-s3": "^2.0.4", "@uppy/aws-s3-multipart": "^2.1.0", "@uppy/core": "^2.1.0", "@uppy/drop-target": "^1.1.0", "@uppy/utils": "^4.0.3", - "@uppy/xhr-upload": "^2.0.4", - "ember-auto-import": "^2.2.4", - "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "handlebars": "^4.7.0", - "truth-helpers": "^1.0.0", - "webpack": "^5.67.0" + "@uppy/xhr-upload": "^2.0.4" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse-hbr/package.json b/app/assets/javascripts/discourse-hbr/package.json index c93fc5c69f..0b290a071f 100644 --- a/app/assets/javascripts/discourse-hbr/package.json +++ b/app/assets/javascripts/discourse-hbr/package.json @@ -15,10 +15,9 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "webpack": "^5.67.0" + "ember-cli-htmlbars": "^4.2.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse-widget-hbs/package.json b/app/assets/javascripts/discourse-widget-hbs/package.json index 9efdb12804..06a8626fd8 100644 --- a/app/assets/javascripts/discourse-widget-hbs/package.json +++ b/app/assets/javascripts/discourse-widget-hbs/package.json @@ -15,10 +15,9 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "webpack": "^5.67.0" + "ember-cli-htmlbars": "^4.2.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/discourse/package.json b/app/assets/javascripts/discourse/package.json index 013f5cedba..7b234f6291 100644 --- a/app/assets/javascripts/discourse/package.json +++ b/app/assets/javascripts/discourse/package.json @@ -34,7 +34,7 @@ "discourse-common": "^1.0.0", "discourse-hbr": "^1.0.0", "discourse-widget-hbs": "^1.0.0", - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.12.0", "ember-buffered-proxy": "^2.0.0-beta.0", "ember-cli": "~3.25.3", "ember-cli-app-version": "^4.0.0", @@ -44,7 +44,7 @@ "ember-cli-inject-live-reload": "^2.0.1", "ember-cli-sri": "^2.1.1", "ember-cli-terser": "^4.0.1", - "ember-exam": "^7.0.1", + "ember-exam": "6.1.0", "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.1", "ember-maybe-import-regenerator": "^0.1.6", @@ -67,8 +67,7 @@ "sass": "^1.32.8", "select-kit": "^1.0.0", "sinon": "^9.2.0", - "virtual-dom": "^2.1.1", - "webpack": "^5.67.0" + "virtual-dom": "^2.1.1" }, "engines": { "node": "12.* || 14.* || >= 16", @@ -85,6 +84,6 @@ ] }, "devDependencies": { - "ember-exam": "^7.0.1" + "ember-exam": "6.1.0" } } diff --git a/app/assets/javascripts/pretty-text/package.json b/app/assets/javascripts/pretty-text/package.json index 59c35d79fa..9619aa7198 100644 --- a/app/assets/javascripts/pretty-text/package.json +++ b/app/assets/javascripts/pretty-text/package.json @@ -15,11 +15,10 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", "ember-cli-htmlbars": "^4.2.0", - "xss": "^1.0.8", - "webpack": "^5.67.0" + "xss": "^1.0.8" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/select-kit/package.json b/app/assets/javascripts/select-kit/package.json index d7b1f548de..eb95c12d0b 100644 --- a/app/assets/javascripts/select-kit/package.json +++ b/app/assets/javascripts/select-kit/package.json @@ -17,8 +17,7 @@ "dependencies": { "ember-cli-babel": "^7.13.0", "ember-cli-htmlbars": "^4.2.0", - "ember-auto-import": "^2.2.4", - "webpack": "^5.67.0" + "ember-auto-import": "^1.5.3" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/truth-helpers/package.json b/app/assets/javascripts/truth-helpers/package.json index 20ea6f12a0..132705b564 100644 --- a/app/assets/javascripts/truth-helpers/package.json +++ b/app/assets/javascripts/truth-helpers/package.json @@ -15,10 +15,9 @@ "start": "ember serve" }, "dependencies": { - "ember-auto-import": "^2.2.4", + "ember-auto-import": "^1.5.3", "ember-cli-babel": "^7.13.0", - "ember-cli-htmlbars": "^4.2.0", - "webpack": "^5.67.0" + "ember-cli-htmlbars": "^4.2.0" }, "devDependencies": { "@ember/optional-features": "^1.1.0", diff --git a/app/assets/javascripts/yarn.lock b/app/assets/javascripts/yarn.lock index 7c1f0500cb..80a80588c2 100644 --- a/app/assets/javascripts/yarn.lock +++ b/app/assets/javascripts/yarn.lock @@ -16,23 +16,11 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15", "@babel/compat-data@^7.13.8": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== -"@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" - integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== - "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.14.3", "@babel/core@^7.3.4": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" @@ -54,27 +42,6 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/core@^7.16.7": - version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" - integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.16.7" - "@babel/parser" "^7.16.12" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.10" - "@babel/types" "^7.16.8" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - "@babel/generator@^7.14.2", "@babel/generator@^7.14.3": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" @@ -84,15 +51,6 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" - integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== - dependencies: - "@babel/types" "^7.16.8" - jsesc "^2.5.1" - source-map "^0.5.0" - "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" @@ -100,13 +58,6 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" @@ -115,14 +66,6 @@ "@babel/helper-explode-assignable-expression" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" - integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-compilation-targets@^7.12.0", "@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.13", "@babel/helper-compilation-targets@^7.13.16", "@babel/helper-compilation-targets@^7.13.8": version "7.13.16" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" @@ -133,16 +76,6 @@ browserslist "^4.14.5" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - "@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.13.11", "@babel/helper-create-class-features-plugin@^7.5.5": version "7.13.11" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" @@ -154,19 +87,6 @@ "@babel/helper-replace-supers" "^7.13.0" "@babel/helper-split-export-declaration" "^7.12.13" -"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" - integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-create-regexp-features-plugin@^7.12.13": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" @@ -175,14 +95,6 @@ "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-create-regexp-features-plugin@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" - integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - regexpu-core "^4.7.1" - "@babel/helper-define-polyfill-provider@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz#a640051772045fedaaecc6f0c6c69f02bdd34bf1" @@ -197,27 +109,6 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-define-polyfill-provider@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" - integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== - dependencies: - "@babel/helper-compilation-targets" "^7.13.0" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/traverse" "^7.13.0" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-explode-assignable-expression@^7.12.13": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" @@ -225,13 +116,6 @@ dependencies: "@babel/types" "^7.13.0" -"@babel/helper-explode-assignable-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" - integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" @@ -241,15 +125,6 @@ "@babel/template" "^7.12.13" "@babel/types" "^7.14.2" -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" @@ -257,13 +132,6 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-hoist-variables@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" @@ -272,13 +140,6 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-member-expression-to-functions@^7.13.0", "@babel/helper-member-expression-to-functions@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" @@ -286,13 +147,6 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-member-expression-to-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" - integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" @@ -300,13 +154,6 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.14.2": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" @@ -321,20 +168,6 @@ "@babel/traverse" "^7.14.2" "@babel/types" "^7.14.2" -"@babel/helper-module-transforms@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" - integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -342,23 +175,11 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-optimise-call-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" - integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== -"@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - "@babel/helper-remap-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" @@ -368,15 +189,6 @@ "@babel/helper-wrap-function" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-remap-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" - integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-wrap-function" "^7.16.8" - "@babel/types" "^7.16.8" - "@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0", "@babel/helper-replace-supers@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" @@ -387,17 +199,6 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.12" -"@babel/helper-replace-supers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" - integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-member-expression-to-functions" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/helper-simple-access@^7.12.13", "@babel/helper-simple-access@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" @@ -405,13 +206,6 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -419,13 +213,6 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - "@babel/helper-split-export-declaration@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" @@ -433,33 +220,16 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - "@babel/helper-wrap-function@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" @@ -470,16 +240,6 @@ "@babel/traverse" "^7.13.0" "@babel/types" "^7.13.0" -"@babel/helper-wrap-function@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" - integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== - dependencies: - "@babel/helper-function-name" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.8" - "@babel/types" "^7.16.8" - "@babel/helpers@^7.14.0": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" @@ -489,15 +249,6 @@ "@babel/traverse" "^7.14.0" "@babel/types" "^7.14.0" -"@babel/helpers@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" - integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" @@ -507,32 +258,11 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@babel/parser@^7.12.13", "@babel/parser@^7.12.3", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.4.5", "@babel/parser@^7.7.0": version "7.14.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== -"@babel/parser@^7.16.10", "@babel/parser@^7.16.12", "@babel/parser@^7.16.7": - version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" - integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" - integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz#a3484d84d0b549f3fc916b99ee4783f26fabad2a" @@ -542,15 +272,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-proposal-optional-chaining" "^7.13.12" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" - integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions@^7.13.15": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz#80e549df273a3b3050431b148c892491df1bcc5b" @@ -560,15 +281,6 @@ "@babel/helper-remap-async-to-generator" "^7.13.0" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-async-generator-functions@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" - integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" @@ -577,23 +289,6 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-class-properties@^7.16.5", "@babel/plugin-proposal-class-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" - integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-class-static-block@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" - integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-proposal-decorators@^7.13.5": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.15.tgz#e91ccfef2dc24dd5bd5dcc9fc9e2557c684ecfb8" @@ -603,15 +298,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-decorators" "^7.12.13" -"@babel/plugin-proposal-decorators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.7.tgz#922907d2e3e327f5b07d2246bcfc0bd438f360d2" - integrity sha512-DoEpnuXK14XV9btI1k8tzNGCutMclpj4yru8aXKoHlVmbO1s+2A+g2+h4JhcjrxkFJqzbymnLG6j/niOf3iFXQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-decorators" "^7.16.7" - "@babel/plugin-proposal-dynamic-import@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" @@ -620,14 +306,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-dynamic-import@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" - integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" @@ -636,14 +314,6 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" - integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-proposal-json-strings@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" @@ -652,14 +322,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" - integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-proposal-logical-assignment-operators@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" @@ -668,14 +330,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" - integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" @@ -684,14 +338,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" - integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-proposal-numeric-separator@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" @@ -700,14 +346,6 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-numeric-separator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" - integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" @@ -719,17 +357,6 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.13.0" -"@babel/plugin-proposal-object-rest-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" - integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" @@ -738,14 +365,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-catch-binding@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" - integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-proposal-optional-chaining@^7.13.12": version "7.13.12" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz#ba9feb601d422e0adea6760c2bd6bbb7bfec4866" @@ -755,15 +374,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" - integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-proposal-private-methods@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" @@ -772,24 +382,6 @@ "@babel/helper-create-class-features-plugin" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-proposal-private-methods@^7.16.11", "@babel/plugin-proposal-private-methods@^7.16.5": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" - integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.10" - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-proposal-private-property-in-object@^7.16.5", "@babel/plugin-proposal-private-property-in-object@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" - integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-create-class-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" @@ -798,14 +390,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-proposal-unicode-property-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" - integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -820,13 +404,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-decorators@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" @@ -834,13 +411,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-decorators@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.7.tgz#f66a0199f16de7c1ef5192160ccf5d069739e3d3" - integrity sha512-vQ+PxL+srA7g6Rx6I1e15m55gftknl2X8GCUW1JTlkTaXZLJOS0UcaY0eK9jYT7IYf4awn6qwyghVHLDz1WyMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -904,13 +474,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-top-level-await@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" @@ -918,13 +481,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript@^7.12.13", "@babel/plugin-syntax-typescript@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" @@ -939,13 +495,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-arrow-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" - integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-async-to-generator@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" @@ -955,15 +504,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-remap-async-to-generator" "^7.13.0" -"@babel/plugin-transform-async-to-generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" - integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-remap-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" @@ -971,13 +511,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoped-functions@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" - integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-block-scoping@^7.12.13", "@babel/plugin-transform-block-scoping@^7.6.2": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" @@ -985,13 +518,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" - integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-classes@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" @@ -1005,20 +531,6 @@ "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" -"@babel/plugin-transform-classes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" - integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-optimise-call-expression" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - globals "^11.1.0" - "@babel/plugin-transform-computed-properties@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" @@ -1026,13 +538,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-computed-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" - integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-destructuring@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" @@ -1040,13 +545,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-destructuring@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" - integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" @@ -1055,14 +553,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-dotall-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" - integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-duplicate-keys@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" @@ -1070,13 +560,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-duplicate-keys@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" - integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" @@ -1085,14 +568,6 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-exponentiation-operator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" - integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-for-of@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" @@ -1100,13 +575,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-for-of@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" - integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-function-name@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" @@ -1115,15 +583,6 @@ "@babel/helper-function-name" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" - integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== - dependencies: - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-literals@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" @@ -1131,13 +590,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" - integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-member-expression-literals@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" @@ -1145,13 +597,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-member-expression-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" - integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" @@ -1161,15 +606,6 @@ "@babel/helper-plugin-utils" "^7.13.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-amd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" - integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-commonjs@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" @@ -1180,16 +616,6 @@ "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" - integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-systemjs@^7.13.8": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" @@ -1201,17 +627,6 @@ "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" - integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== - dependencies: - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - babel-plugin-dynamic-import-node "^2.3.3" - "@babel/plugin-transform-modules-umd@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" @@ -1220,14 +635,6 @@ "@babel/helper-module-transforms" "^7.13.0" "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-modules-umd@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" - integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" @@ -1235,13 +642,6 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.12.13" -"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" - integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/plugin-transform-new-target@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" @@ -1249,13 +649,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-new-target@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" - integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-object-assign@^7.2.0": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.12.13.tgz#d9b9200a69e03403a813e44a933ad9f4bddfd050" @@ -1271,14 +664,6 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-object-super@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" - integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-replace-supers" "^7.16.7" - "@babel/plugin-transform-parameters@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" @@ -1286,13 +671,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-parameters@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" - integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-property-literals@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" @@ -1300,13 +678,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-property-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" - integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-regenerator@^7.13.15": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz#e5eb28945bf8b6563e7f818945f966a8d2997f39" @@ -1314,13 +685,6 @@ dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-regenerator@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" - integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== - dependencies: - regenerator-transform "^0.14.2" - "@babel/plugin-transform-reserved-words@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" @@ -1328,13 +692,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-reserved-words@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" - integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-runtime@^7.12.1", "@babel/plugin-transform-runtime@^7.13.9": version "7.13.15" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.15.tgz#2eddf585dd066b84102517e10a577f24f76a9cd7" @@ -1354,13 +711,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-shorthand-properties@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" - integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-spread@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" @@ -1369,14 +719,6 @@ "@babel/helper-plugin-utils" "^7.13.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" -"@babel/plugin-transform-spread@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" - integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-transform-sticky-regex@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" @@ -1384,13 +726,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-sticky-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" - integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-template-literals@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" @@ -1398,13 +733,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.13.0" -"@babel/plugin-transform-template-literals@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" - integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-typeof-symbol@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" @@ -1412,13 +740,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-typeof-symbol@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" - integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-typescript@^7.13.0": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" @@ -1452,13 +773,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-unicode-escapes@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" - integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-transform-unicode-regex@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" @@ -1467,14 +781,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-unicode-regex@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" - integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/polyfill@^7.11.5": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.12.1.tgz#1f2d6371d1261bbd961f3c5d5909150e12d0bd96" @@ -1558,86 +864,6 @@ core-js-compat "^3.9.0" semver "^6.3.0" -"@babel/preset-env@^7.16.5", "@babel/preset-env@^7.16.7": - version "7.16.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" - integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== - dependencies: - "@babel/compat-data" "^7.16.8" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-async-generator-functions" "^7.16.8" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-class-static-block" "^7.16.7" - "@babel/plugin-proposal-dynamic-import" "^7.16.7" - "@babel/plugin-proposal-export-namespace-from" "^7.16.7" - "@babel/plugin-proposal-json-strings" "^7.16.7" - "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" - "@babel/plugin-proposal-numeric-separator" "^7.16.7" - "@babel/plugin-proposal-object-rest-spread" "^7.16.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" - "@babel/plugin-proposal-optional-chaining" "^7.16.7" - "@babel/plugin-proposal-private-methods" "^7.16.11" - "@babel/plugin-proposal-private-property-in-object" "^7.16.7" - "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.16.7" - "@babel/plugin-transform-async-to-generator" "^7.16.8" - "@babel/plugin-transform-block-scoped-functions" "^7.16.7" - "@babel/plugin-transform-block-scoping" "^7.16.7" - "@babel/plugin-transform-classes" "^7.16.7" - "@babel/plugin-transform-computed-properties" "^7.16.7" - "@babel/plugin-transform-destructuring" "^7.16.7" - "@babel/plugin-transform-dotall-regex" "^7.16.7" - "@babel/plugin-transform-duplicate-keys" "^7.16.7" - "@babel/plugin-transform-exponentiation-operator" "^7.16.7" - "@babel/plugin-transform-for-of" "^7.16.7" - "@babel/plugin-transform-function-name" "^7.16.7" - "@babel/plugin-transform-literals" "^7.16.7" - "@babel/plugin-transform-member-expression-literals" "^7.16.7" - "@babel/plugin-transform-modules-amd" "^7.16.7" - "@babel/plugin-transform-modules-commonjs" "^7.16.8" - "@babel/plugin-transform-modules-systemjs" "^7.16.7" - "@babel/plugin-transform-modules-umd" "^7.16.7" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" - "@babel/plugin-transform-new-target" "^7.16.7" - "@babel/plugin-transform-object-super" "^7.16.7" - "@babel/plugin-transform-parameters" "^7.16.7" - "@babel/plugin-transform-property-literals" "^7.16.7" - "@babel/plugin-transform-regenerator" "^7.16.7" - "@babel/plugin-transform-reserved-words" "^7.16.7" - "@babel/plugin-transform-shorthand-properties" "^7.16.7" - "@babel/plugin-transform-spread" "^7.16.7" - "@babel/plugin-transform-sticky-regex" "^7.16.7" - "@babel/plugin-transform-template-literals" "^7.16.7" - "@babel/plugin-transform-typeof-symbol" "^7.16.7" - "@babel/plugin-transform-unicode-escapes" "^7.16.7" - "@babel/plugin-transform-unicode-regex" "^7.16.7" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.16.8" - babel-plugin-polyfill-corejs2 "^0.3.0" - babel-plugin-polyfill-corejs3 "^0.5.0" - babel-plugin-polyfill-regenerator "^0.3.0" - core-js-compat "^3.20.2" - semver "^6.3.0" - "@babel/preset-modules@^0.1.4": version "0.1.4" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" @@ -1649,17 +875,6 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - "@babel/runtime@7.12.18": version "7.12.18" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" @@ -1683,15 +898,6 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - "@babel/traverse@^7.1.6", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" @@ -1706,22 +912,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.16.10", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" - integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.16.10" - "@babel/types" "^7.16.8" - debug "^4.1.0" - globals "^11.1.0" - "@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.14.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" @@ -1730,14 +920,6 @@ "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" -"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" - integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1836,6 +1018,45 @@ walk-sync "^1.1.3" wrap-legacy-hbs-plugin-if-needed "^1.0.1" +"@embroider/core@0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@embroider/core/-/core-0.36.0.tgz#fbbd60d29c3fcbe02b4e3e63e6043a43de2b9ce3" + integrity sha512-J6esENP+aNt+/r070cF1RCJyCi/Rn1I6uFp37vxyLWwvGDuT0E7wGcaPU29VBkBFqxi4Z1n4F796BaGHv+kX6w== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.12.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.12.1" + "@babel/runtime" "^7.12.5" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/macros" "0.36.0" + assert-never "^1.1.0" + babel-plugin-syntax-dynamic-import "^6.18.0" + broccoli-node-api "^1.7.0" + broccoli-persistent-filter "^3.1.2" + broccoli-plugin "^4.0.1" + broccoli-source "^3.0.0" + debug "^3.1.0" + escape-string-regexp "^4.0.0" + fast-sourcemap-concat "^1.4.0" + filesize "^4.1.2" + fs-extra "^7.0.1" + fs-tree-diff "^2.0.0" + handlebars "^4.4.2" + js-string-escape "^1.0.1" + jsdom "^16.4.0" + json-stable-stringify "^1.0.1" + lodash "^4.17.10" + pkg-up "^3.1.0" + resolve "^1.8.1" + resolve-package-path "^1.2.2" + semver "^7.3.2" + strip-bom "^3.0.0" + typescript-memoize "^1.0.0-alpha.3" + walk-sync "^1.1.3" + wrap-legacy-hbs-plugin-if-needed "^1.0.1" + "@embroider/macros@0.33.0": version "0.33.0" resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.33.0.tgz#d5826ea7565bb69b57ba81ed528315fe77acbf9d" @@ -1851,59 +1072,21 @@ resolve "^1.8.1" semver "^7.3.2" -"@embroider/macros@^0.47.0": - version "0.47.2" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.47.2.tgz#23cbe92cac3c24747f054e1eea2a22538bf7ebd0" - integrity sha512-ViNWluJCeM5OPlM3rs8kdOz3RV5rpfXX5D2rDnc/q86xRS0xf4NFEjYRV7W6fBcD0b3v5jSHDTwrjq9Kee4rHg== +"@embroider/macros@0.36.0", "@embroider/macros@^0.36.0": + version "0.36.0" + resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-0.36.0.tgz#5330f1e6f12112f0f68e34b3e4855dc7dd3c69a5" + integrity sha512-w37G4uXG+Wi3K3EHSFBSr/n6kGFXYG8nzZ9ptzDOC7LP3Oh5/MskBnVZW3+JkHXUPEqKsDGlxPxCVpPl1kQyjQ== dependencies: - "@embroider/shared-internals" "0.47.2" - assert-never "^1.2.1" - ember-cli-babel "^7.26.6" - find-up "^5.0.0" - lodash "^4.17.21" - resolve "^1.20.0" + "@babel/core" "^7.12.3" + "@babel/traverse" "^7.12.1" + "@babel/types" "^7.12.1" + "@embroider/core" "0.36.0" + assert-never "^1.1.0" + ember-cli-babel "^7.23.0" + lodash "^4.17.10" + resolve "^1.8.1" semver "^7.3.2" -"@embroider/macros@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@embroider/macros/-/macros-1.0.0.tgz#2dfab550ba4e03cbf6e3524759949749ced98cc2" - integrity sha512-RutDJ27j1eFQulyv83yJm27oSypsMd/UZyy62Q0NU00TIsIgQPCXaDiGIONWcJuAAVbtBRP3X4LMvaBAeq5g+A== - dependencies: - "@embroider/shared-internals" "1.0.0" - assert-never "^1.2.1" - babel-import-util "^1.1.0" - ember-cli-babel "^7.26.6" - find-up "^5.0.0" - lodash "^4.17.21" - resolve "^1.20.0" - semver "^7.3.2" - -"@embroider/shared-internals@0.47.2": - version "0.47.2" - resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-0.47.2.tgz#24e9fa0dd9c529d5c996ee1325729ea08d1fa19f" - integrity sha512-SxdZYjAE0fiM5zGDz+12euWIsQZ1tsfR1k+NKmiWMyLhA5T3pNgbR2/Djvx/cVIxOtEavGGSllYbzRKBtV4xMg== - dependencies: - babel-import-util "^0.2.0" - ember-rfc176-data "^0.3.17" - fs-extra "^9.1.0" - lodash "^4.17.21" - resolve-package-path "^4.0.1" - semver "^7.3.5" - typescript-memoize "^1.0.1" - -"@embroider/shared-internals@1.0.0", "@embroider/shared-internals@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@embroider/shared-internals/-/shared-internals-1.0.0.tgz#b081708ac79e4582f17ba0f3e3796e6612a8976c" - integrity sha512-Vx3dmejJxI5MG/qC7or3EUZY0AZBSBNOAR50PYotX3LxUSb4lAm5wISPnFbwEY4bbo2VhL/6XtWjMv8ZMcaP+g== - dependencies: - babel-import-util "^1.1.0" - ember-rfc176-data "^0.3.17" - fs-extra "^9.1.0" - lodash "^4.17.21" - resolve-package-path "^4.0.1" - semver "^7.3.5" - typescript-memoize "^1.0.1" - "@eslint/eslintrc@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14" @@ -2171,27 +1354,6 @@ dependencies: "@types/node" "*" -"@types/eslint-scope@^3.7.0": - version "3.7.3" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304" - integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^0.0.50": - version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - "@types/express-serve-static-core@^4.17.18": version "4.17.19" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.19.tgz#00acfc1632e729acac4f1530e9e16f6dd1508a1d" @@ -2233,11 +1395,6 @@ "@types/minimatch" "*" "@types/node" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - "@types/json-schema@^7.0.5": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" @@ -2253,11 +1410,6 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== -"@types/minimatch@^3.0.4": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - "@types/node@*": version "14.14.37" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" @@ -2362,14 +1514,6 @@ "@uppy/utils" "^4.0.3" nanoid "^3.1.25" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -2379,31 +1523,16 @@ "@webassemblyjs/helper-wasm-bytecode" "1.9.0" "@webassemblyjs/wast-parser" "1.9.0" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - "@webassemblyjs/floating-point-hex-parser@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - "@webassemblyjs/helper-api-error@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - "@webassemblyjs/helper-buffer@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" @@ -2428,35 +1557,11 @@ dependencies: "@webassemblyjs/ast" "1.9.0" -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - "@webassemblyjs/helper-wasm-bytecode@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/helper-wasm-section@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" @@ -2467,13 +1572,6 @@ "@webassemblyjs/helper-wasm-bytecode" "1.9.0" "@webassemblyjs/wasm-gen" "1.9.0" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - "@webassemblyjs/ieee754@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" @@ -2481,13 +1579,6 @@ dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - "@webassemblyjs/leb128@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" @@ -2495,30 +1586,11 @@ dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - "@webassemblyjs/utf8@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - "@webassemblyjs/wasm-edit@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" @@ -2533,17 +1605,6 @@ "@webassemblyjs/wasm-parser" "1.9.0" "@webassemblyjs/wast-printer" "1.9.0" -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - "@webassemblyjs/wasm-gen@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" @@ -2555,16 +1616,6 @@ "@webassemblyjs/leb128" "1.9.0" "@webassemblyjs/utf8" "1.9.0" -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wasm-opt@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" @@ -2575,18 +1626,6 @@ "@webassemblyjs/wasm-gen" "1.9.0" "@webassemblyjs/wasm-parser" "1.9.0" -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - "@webassemblyjs/wasm-parser@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" @@ -2611,14 +1650,6 @@ "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - "@webassemblyjs/wast-printer@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" @@ -2664,11 +1695,6 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" @@ -2694,11 +1720,6 @@ acorn@^8.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.1.tgz#fb0026885b9ac9f48bac1e185e4af472971149ff" integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g== -acorn@^8.4.1: - version "8.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" - integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== - acorn@^8.5.0: version "8.6.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" @@ -2721,26 +1742,12 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2750,16 +1757,6 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.8.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" - integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - ajv@^8.0.1: version "8.5.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.5.0.tgz#695528274bcb5afc865446aa275484049a18ae4b" @@ -2992,7 +1989,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-never@^1.1.0, assert-never@^1.2.1: +assert-never@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== @@ -3284,16 +2281,6 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-import-util@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-0.2.0.tgz#b468bb679919601a3570f9e317536c54f2862e23" - integrity sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag== - -babel-import-util@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-1.1.0.tgz#4156b16ef090c4f0d3cdb869ff799202f24aeb93" - integrity sha512-sfzgAiJsUT1es9yrHAuJZuJfBkkOE7Og6rovAIwK/gNJX6MjDfWTprbPngdJZTd5ye4F3FvpvpQmvKXObRzVYA== - babel-loader@^8.0.6: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" @@ -3384,17 +2371,6 @@ babel-plugin-htmlbars-inline-precompile@^5.0.0: parse-static-imports "^1.1.0" string.prototype.matchall "^4.0.4" -babel-plugin-htmlbars-inline-precompile@^5.2.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-5.3.1.tgz#5ba272e2e4b6221522401f5f1d98a73b1de38787" - integrity sha512-QWjjFgSKtSRIcsBhJmEwS2laIdrA6na8HAlc/pEAhjHgQsah/gMiBFRZvbQTy//hWxR4BMwV7/Mya7q5H8uHeA== - dependencies: - babel-plugin-ember-modules-api-polyfill "^3.5.0" - line-column "^1.0.2" - magic-string "^0.25.7" - parse-static-imports "^1.1.0" - string.prototype.matchall "^4.0.5" - babel-plugin-module-resolver@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" @@ -3426,15 +2402,6 @@ babel-plugin-polyfill-corejs2@^0.2.0: "@babel/helper-define-polyfill-provider" "^0.2.0" semver "^6.1.1" -babel-plugin-polyfill-corejs2@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" - integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== - dependencies: - "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.3.1" - semver "^6.1.1" - babel-plugin-polyfill-corejs3@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz#f4b4bb7b19329827df36ff56f6e6d367026cb7a2" @@ -3443,14 +2410,6 @@ babel-plugin-polyfill-corejs3@^0.2.0: "@babel/helper-define-polyfill-provider" "^0.2.0" core-js-compat "^3.9.1" -babel-plugin-polyfill-corejs3@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" - integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - core-js-compat "^3.20.0" - babel-plugin-polyfill-regenerator@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz#853f5f5716f4691d98c84f8069c7636ea8da7ab8" @@ -3458,13 +2417,6 @@ babel-plugin-polyfill-regenerator@^0.2.0: dependencies: "@babel/helper-define-polyfill-provider" "^0.2.0" -babel-plugin-polyfill-regenerator@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" - integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.1" - babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -4268,19 +3220,6 @@ broccoli-funnel@^3.0.3: path-posix "^1.0.0" walk-sync "^2.0.2" -broccoli-funnel@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-3.0.8.tgz#f5b62e2763c3918026a15a3c833edc889971279b" - integrity sha512-ng4eIhPYiXqMw6SyGoxPHR3YAwEd2lr9FgBI1CyTbspl4txZovOsmzFkMkGAlu88xyvYXJqHiM2crfLa65T1BQ== - dependencies: - array-equal "^1.0.0" - broccoli-plugin "^4.0.7" - debug "^4.1.1" - fs-tree-diff "^2.0.1" - heimdalljs "^0.2.0" - minimatch "^3.0.0" - walk-sync "^2.0.2" - broccoli-kitchen-sink-helpers@^0.2.5: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" @@ -4501,19 +3440,6 @@ broccoli-plugin@^4.0.0, broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2, broccoli rimraf "^3.0.2" symlink-or-copy "^1.3.1" -broccoli-plugin@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-4.0.7.tgz#dd176a85efe915ed557d913744b181abe05047db" - integrity sha512-a4zUsWtA1uns1K7p9rExYVYG99rdKeGRymW0qOCNkvDPHQxVi3yVyJHhQbM3EZwdt2E0mnhr5e0c/bPpJ7p3Wg== - dependencies: - broccoli-node-api "^1.7.0" - broccoli-output-wrapper "^3.2.5" - fs-merger "^3.2.1" - promise-map-series "^0.3.0" - quick-temp "^0.1.8" - rimraf "^3.0.2" - symlink-or-copy "^1.3.1" - broccoli-slow-trees@^3.0.1, broccoli-slow-trees@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/broccoli-slow-trees/-/broccoli-slow-trees-3.1.0.tgz#8e48903f59e061bf1213963733b9e61dec2ee5d7" @@ -4727,17 +3653,6 @@ browserslist@^4.14.5, browserslist@^4.16.3: escalade "^3.1.1" node-releases "^1.1.71" -browserslist@^4.17.5, browserslist@^4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== - dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -4880,11 +3795,6 @@ caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001208: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz#066a506046ba4be34cde5f74a08db7a396718fb7" integrity sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA== -caniuse-lite@^1.0.30001286: - version "1.0.30001301" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001301.tgz#ebc9086026534cab0dab99425d9c3b4425e5f450" - integrity sha512-csfD/GpHMqgEL3V3uIgosvh+SVIQvCh43SNu9HRbP1lnxkKm1kjDG4f32PP571JplkLjfS+mg2p1gxR7MYrrIA== - capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -4946,14 +3856,6 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -5405,14 +4307,6 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js-compat@^3.20.0, core-js-compat@^3.20.2: - version "3.20.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" - integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== - dependencies: - browserslist "^4.19.1" - semver "7.0.0" - core-js-compat@^3.9.0, core-js-compat@^3.9.1: version "3.10.1" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.10.1.tgz#62183a3a77ceeffcc420d907a3e6fc67d9b27f1c" @@ -5518,27 +4412,6 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-loader@^5.2.0: - version "5.2.7" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae" - integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg== - dependencies: - icss-utils "^5.1.0" - loader-utils "^2.0.0" - postcss "^8.2.15" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^3.0.0" - semver "^7.3.5" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - cssfilter@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" @@ -5622,13 +4495,6 @@ debug@^3.0.1, debug@^3.1.0, debug@^3.1.1: dependencies: ms "^2.1.1" -debug@^4.3.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -5896,11 +4762,6 @@ electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.712: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.712.tgz#ae467ffe5f95961c6d41ceefe858fc36eb53b38f" integrity sha512-3kRVibBeCM4vsgoHHGKHmPocLqtFAGTrebXxxtgKs87hNUzXrX2NuS3jnBys7IozCnw7viQlozxKkmty2KNfrw== -electron-to-chromium@^1.4.17: - version "1.4.51" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.51.tgz#a432f5a5d983ace79278a33057300cf949627e63" - integrity sha512-JNEmcYl3mk1tGQmy0EvL5eik/CKSBuzAyGP0QFdG6LIgxQe3II0BL1m2zKc2MZMf3uGqHWE1TFddJML0RpjSHQ== - elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -5914,7 +4775,7 @@ elliptic@^6.5.3: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -ember-auto-import@^1.10.1: +ember-auto-import@^1.10.1, ember-auto-import@^1.5.3: version "1.11.2" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.11.2.tgz#b6e9a0dddd88a10692830ffa4f5dfd8c137c8919" integrity sha512-Sm0x9qgAQEx+XSYeh5zeKj89Uo0c7XzULZxuziFPxbhtKy/G4pywhBuQ7EgDznTj8IZVxOdfe4ufcUxnJtbSgg== @@ -5949,41 +4810,40 @@ ember-auto-import@^1.10.1: walk-sync "^0.3.3" webpack "^4.43.0" -ember-auto-import@^2.2.3, ember-auto-import@^2.2.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.4.0.tgz#91c4797f08315728086e35af954cb60bd23c14bc" - integrity sha512-BwF6iTaoSmT2vJ9NEHEGRBCh2+qp+Nlaz/Q7roqNSxl5oL5iMRwenPnHhOoBPTYZvPhcV/KgXR5e+pBQ107plQ== +ember-auto-import@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-1.12.0.tgz#52246b04891090e2608244e65c4c6af7710df12b" + integrity sha512-fzMGnyHGfUNFHchpLbJ98Vs/c5H2wZBMR9r/XwW+WOWPisZDGLUPPyhJQsSREPoUQ+o8GvyLaD/rkrKqW8bmgw== dependencies: - "@babel/core" "^7.16.7" - "@babel/plugin-proposal-class-properties" "^7.16.7" - "@babel/plugin-proposal-decorators" "^7.16.7" - "@babel/preset-env" "^7.16.7" - "@embroider/macros" "^1.0.0" - "@embroider/shared-internals" "^1.0.0" + "@babel/core" "^7.1.6" + "@babel/preset-env" "^7.10.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.1.6" + "@embroider/core" "^0.33.0" + babel-core "^6.26.3" babel-loader "^8.0.6" - babel-plugin-ember-modules-api-polyfill "^3.5.0" - babel-plugin-htmlbars-inline-precompile "^5.2.1" babel-plugin-syntax-dynamic-import "^6.18.0" + babylon "^6.18.0" broccoli-debug "^0.6.4" - broccoli-funnel "^3.0.8" - broccoli-merge-trees "^4.2.0" + broccoli-node-api "^1.7.0" broccoli-plugin "^4.0.0" broccoli-source "^3.0.0" - css-loader "^5.2.0" - debug "^4.3.1" + debug "^3.1.0" + ember-cli-babel "^7.0.0" + enhanced-resolve "^4.0.0" fs-extra "^6.0.1" fs-tree-diff "^2.0.0" handlebars "^4.3.1" js-string-escape "^1.0.1" lodash "^4.17.19" - mini-css-extract-plugin "^2.5.2" - parse5 "^6.0.1" - resolve "^1.20.0" + mkdirp "^0.5.1" resolve-package-path "^3.1.0" + rimraf "^2.6.2" semver "^7.3.4" - style-loader "^2.0.0" + symlink-or-copy "^1.2.0" typescript-memoize "^1.0.0-alpha.3" - walk-sync "^3.0.0" + walk-sync "^0.3.3" + webpack "^4.43.0" ember-buffered-proxy@^2.0.0-beta.0: version "2.0.0-beta.0" @@ -6059,42 +4919,6 @@ ember-cli-babel@^7.0.0, ember-cli-babel@^7.11.0, ember-cli-babel@^7.11.1, ember- rimraf "^3.0.1" semver "^5.5.0" -ember-cli-babel@^7.26.6: - version "7.26.11" - resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.11.tgz#50da0fe4dcd99aada499843940fec75076249a9f" - integrity sha512-JJYeYjiz/JTn34q7F5DSOjkkZqy8qwFOOxXfE6pe9yEJqWGu4qErKxlz8I22JoVEQ/aBUO+OcKTpmctvykM9YA== - dependencies: - "@babel/core" "^7.12.0" - "@babel/helper-compilation-targets" "^7.12.0" - "@babel/plugin-proposal-class-properties" "^7.16.5" - "@babel/plugin-proposal-decorators" "^7.13.5" - "@babel/plugin-proposal-private-methods" "^7.16.5" - "@babel/plugin-proposal-private-property-in-object" "^7.16.5" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-runtime" "^7.13.9" - "@babel/plugin-transform-typescript" "^7.13.0" - "@babel/polyfill" "^7.11.5" - "@babel/preset-env" "^7.16.5" - "@babel/runtime" "7.12.18" - amd-name-resolver "^1.3.1" - babel-plugin-debug-macros "^0.3.4" - babel-plugin-ember-data-packages-polyfill "^0.1.2" - babel-plugin-ember-modules-api-polyfill "^3.5.0" - babel-plugin-module-resolver "^3.2.0" - broccoli-babel-transpiler "^7.8.0" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.2" - broccoli-source "^2.1.2" - calculate-cache-key-for-tree "^2.0.0" - clone "^2.1.2" - ember-cli-babel-plugin-helpers "^1.1.1" - ember-cli-version-checker "^4.1.0" - ensure-posix-path "^1.0.2" - fixturify-project "^1.10.0" - resolve-package-path "^3.1.0" - rimraf "^3.0.1" - semver "^5.5.0" - ember-cli-dependency-checker@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.2.0.tgz#9202ad9e14d6fda33cffc22a11c343c2a8885330" @@ -6460,20 +5284,20 @@ ember-disable-prototype-extensions@^1.1.3: resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" integrity sha1-GWkTUhdlS14nj5/i2dTkm1cgMp4= -ember-exam@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ember-exam/-/ember-exam-7.0.1.tgz#3735a0e3599e37f8cf5c758f4c7069da3c369a2d" - integrity sha512-m3EskoFrJ1KThlzdS0pjXImXQWgPWqqOJjAnCpz/XmUHUA+EVmvsu/A0F0jRpqXeQpTSFXRl8/TPVduN6+t17A== +ember-exam@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ember-exam/-/ember-exam-6.1.0.tgz#1ea2c0ece27ac8ad6a80d959b1c207611b7dfdd7" + integrity sha512-H9tg7eUgqkjAsr1/15UzxGyZobGLgsyTi56Ng0ySnkYGCRfvVpwtVc3xgcNOFnUaa9RExUFpxC0adjW3K87Uxw== dependencies: - "@embroider/macros" "^0.47.0" - chalk "^4.1.1" + "@embroider/macros" "^0.36.0" + chalk "^4.1.0" cli-table3 "^0.6.0" debug "^4.2.0" - ember-auto-import "^2.2.3" + ember-auto-import "^1.10.1" ember-cli-babel "^7.21.0" ember-cli-version-checker "^5.1.2" execa "^4.0.3" - fs-extra "^10.0.0" + fs-extra "^9.0.1" js-yaml "^3.14.0" npmlog "^4.1.2" rimraf "^3.0.2" @@ -6735,14 +5559,6 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.5.0: memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - enquirer@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -6815,37 +5631,6 @@ es-abstract@^1.18.0-next.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.0" -es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -6916,14 +5701,6 @@ eslint-plugin-node@^10.0.0: resolve "^1.10.1" semver "^6.1.0" -eslint-scope@5.1.1, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -6932,6 +5709,14 @@ eslint-scope@^4.0.3: esrecurse "^4.1.0" estraverse "^4.1.1" +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + eslint-utils@^1.3.1, eslint-utils@^1.4.2: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" @@ -7127,7 +5912,7 @@ events-to-array@^1.0.1: resolved "https://registry.yarnpkg.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6" integrity sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y= -events@^3.0.0, events@^3.2.0: +events@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -7737,15 +6522,6 @@ fs-extra@^0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-extra@^4.0.2, fs-extra@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -7813,17 +6589,6 @@ fs-merger@^3.0.1, fs-merger@^3.1.0: rimraf "^2.6.3" walk-sync "^2.0.2" -fs-merger@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" - integrity sha512-AN6sX12liy0JE7C2evclwoo0aCG3PFulLjrTLsJpWh/2mM+DinhpSGqYLbHBBbIW1PLRNcFhJG8Axtz8mQW3ug== - dependencies: - broccoli-node-api "^1.7.0" - broccoli-node-info "^2.1.0" - fs-extra "^8.0.1" - fs-tree-diff "^2.0.1" - walk-sync "^2.2.0" - fs-tree-diff@^0.5.2, fs-tree-diff@^0.5.3, fs-tree-diff@^0.5.4, fs-tree-diff@^0.5.6, fs-tree-diff@^0.5.7: version "0.5.9" resolved "https://registry.yarnpkg.com/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz#a4ec6182c2f5bd80b9b83c8e23e4522e6f5fd946" @@ -7951,14 +6716,6 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -8046,11 +6803,6 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -8218,11 +6970,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== -graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - graceful-fs@~1.2.0: version "1.2.3" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" @@ -8321,13 +7068,6 @@ has-to-string-tag-x@^1.2.0: dependencies: has-symbol-support-x "^1.4.1" -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -8587,11 +7327,6 @@ iconv-lite@0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - ieee754@^1.1.4: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -8806,11 +7541,6 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== -is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - is-core-module@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" @@ -8818,13 +7548,6 @@ is-core-module@^2.2.0: dependencies: has "^1.0.3" -is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== - dependencies: - has "^1.0.3" - is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -8997,24 +7720,11 @@ is-regex@^1.1.2: call-bind "^1.0.2" has-symbols "^1.0.1" -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== - is-stream@^1.0.0, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -9030,13 +7740,6 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== -is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -9056,13 +7759,6 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-weakref@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -9148,15 +7844,6 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -jest-worker@^27.4.1: - version "27.4.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" - integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jquery@^3.4.1: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" @@ -9486,11 +8173,6 @@ loader-runner@^2.4.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - loader-utils@^1.2.3, loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" @@ -9500,15 +8182,6 @@ loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - loader.js@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/loader.js/-/loader.js-4.7.0.tgz#a1a52902001c83631efde9688b8ab3799325ef1f" @@ -9727,7 +8400,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.6.1, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.4, lodash@^4.6.1, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -10022,11 +8695,6 @@ mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== -mime-db@1.51.0: - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - mime-match@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8" @@ -10041,13 +8709,6 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@^2.1.26, mime-types@~2.1.19, dependencies: mime-db "1.47.0" -mime-types@^2.1.27: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -10075,13 +8736,6 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" -mini-css-extract-plugin@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz#b3b9b98320c2c054d92c16f6a94ddfdbbba13755" - integrity sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA== - dependencies: - schema-utils "^4.0.0" - minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -10239,11 +8893,6 @@ nanoid@^3.1.25: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== -nanoid@^3.1.30: - version "3.2.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" - integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== - nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -10271,7 +8920,7 @@ negotiator@0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== -neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1, neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -10368,11 +9017,6 @@ node-releases@^1.1.71: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - node-watch@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.1.tgz#0caaa6a6833b0d533487f953c52a6c787769ba7c" @@ -10487,11 +9131,6 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.11.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - object-inspect@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" @@ -10770,7 +9409,7 @@ parse-static-imports@^1.1.0: resolved "https://registry.yarnpkg.com/parse-static-imports/-/parse-static-imports-1.1.0.tgz#ae2f18f18da1a993080ae406a5219455c0bbad5d" integrity sha512-HlxrZcISCblEV0lzXmAHheH/8qEkKgmqkdxyHTPbSqsTUV8GzqmN1L+SSti+VbNPfbBO3bYLPHDiUs2avbAdbA== -parse5@6.0.1, parse5@^6.0.1: +parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -10840,11 +9479,6 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - path-posix@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-posix/-/path-posix-1.0.0.tgz#06b26113f56beab042545a23bfa88003ccac260f" @@ -10902,11 +9536,6 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" @@ -10976,56 +9605,6 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.9" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz#ee71c3b9ff63d9cd130838876c13a2ec1a992b2f" - integrity sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.2.15: - version "8.4.5" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" - integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - preact@^10.5.13: version "10.5.14" resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.14.tgz#0b14a2eefba3c10a57116b90d1a65f5f00cd2701" @@ -11629,13 +10208,6 @@ resolve-package-path@^3.1.0: path-root "^0.1.1" resolve "^1.17.0" -resolve-package-path@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/resolve-package-path/-/resolve-package-path-4.0.3.tgz#31dab6897236ea6613c72b83658d88898a9040aa" - integrity sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA== - dependencies: - path-root "^0.1.1" - resolve-path@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" @@ -11657,15 +10229,6 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.1 is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.20.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -11848,25 +10411,6 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - semver@7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -11882,7 +10426,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -11915,13 +10459,6 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - serve-static@1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" @@ -12194,11 +10731,6 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-js@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -12225,14 +10757,6 @@ source-map-support@~0.5.12, source-map-support@~0.5.19: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -12451,20 +10975,6 @@ string.prototype.matchall@^4.0.4: regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" -string.prototype.matchall@^4.0.5: - version "4.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" - integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - get-intrinsic "^1.1.1" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.3.1" - side-channel "^1.0.4" - string.prototype.trimend@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" @@ -12558,14 +11068,6 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" - integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - styled_string@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/styled_string/-/styled_string-0.0.1.tgz#d22782bd81295459bc4f1df18c4bad8e94dd124a" @@ -12597,18 +11099,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -12677,11 +11167,6 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - temp@0.9.4: version "0.9.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" @@ -12705,17 +11190,6 @@ terser-webpack-plugin@^1.4.3: webpack-sources "^1.4.0" worker-farm "^1.7.0" -terser-webpack-plugin@^5.1.3: - version "5.3.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz#21641326486ecf91d8054161c816e464435bae9f" - integrity sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ== - dependencies: - jest-worker "^27.4.1" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - terser "^5.7.2" - terser@^4.1.2, terser@^4.3.9: version "4.8.0" resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" @@ -12734,15 +11208,6 @@ terser@^5.3.0: source-map "~0.7.2" source-map-support "~0.5.19" -terser@^5.7.2: - version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - testem@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.0.tgz#48ab6b98e96085eeddac1fb46337872b13e9e06c" @@ -13088,11 +11553,6 @@ typescript-memoize@^1.0.0-alpha.3: resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.1.tgz#0a8199aa28f6fe18517f6e9308ef7bfbe9a98d59" integrity sha512-oJNge1qUrOK37d5Y6Ly2txKeuelYVsFtNF6U9kXIN7juudcQaHJQg2MxLOy0CqtkW65rVDYuTCOjnSIVPd8z3w== -typescript-memoize@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.1.0.tgz#4a8f512d06fc995167c703a3592219901db8bc79" - integrity sha512-LQPKVXK8QrBBkL/zclE6YgSWn0I8ew5m0Lf+XL00IwMhlotqRLlzHV+BRrljVQIc+NohUAuQP7mg4HQwrx5Xbg== - uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" @@ -13103,7 +11563,7 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== -unbox-primitive@^1.0.0, unbox-primitive@^1.0.1: +unbox-primitive@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== @@ -13428,16 +11888,6 @@ walk-sync@^2.0.0, walk-sync@^2.0.2, walk-sync@^2.2.0: matcher-collection "^2.0.0" minimatch "^3.0.4" -walk-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/walk-sync/-/walk-sync-3.0.0.tgz#67f882925021e20569a1edd560b8da31da8d171c" - integrity sha512-41TvKmDGVpm2iuH7o+DAOt06yyu/cSHpX3uzAwetzASvlNtVddgIjXIb2DfB/Wa20B1Jo86+1Dv1CraSU7hWdw== - dependencies: - "@types/minimatch" "^3.0.4" - ensure-posix-path "^1.1.0" - matcher-collection "^2.0.1" - minimatch "^3.0.4" - walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -13473,14 +11923,6 @@ watchpack@^1.7.4: chokidar "^3.4.1" watchpack-chokidar2 "^2.0.1" -watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - watchr@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/watchr/-/watchr-1.0.0.tgz#ce023fd59edae9430523031915c1812ff2302c27" @@ -13521,11 +11963,6 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - webpack@^4.43.0: version "4.46.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" @@ -13555,36 +11992,6 @@ webpack@^4.43.0: watchpack "^1.7.4" webpack-sources "^1.4.1" -webpack@^5.67.0: - version "5.67.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.67.0.tgz#cb43ca2aad5f7cc81c4cd36b626e6b819805dbfd" - integrity sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw== - dependencies: - "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.50" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.3" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" - webpack-sources "^3.2.3" - websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 8b1e7fe447..f232bd5b7e 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -135,22 +135,6 @@ module ApplicationHelper path end - def preload_vendor_scripts - scripts = ["vendor"] - - if ENV["EMBER_CLI_PROD_ASSETS"] == "1" - @@vendor_chunks ||= begin - all_assets = ActionController::Base.helpers.assets_manifest.assets - all_assets.keys.filter_map { |name| name[/\A(chunk\..*)\.js\z/, 1] } - end - scripts.push(*@@vendor_chunks) - end - - scripts.map do |name| - preload_script(name) - end.join("\n").html_safe - end - def preload_script(script) path = script_asset_path(script) preload_script_url(path) diff --git a/app/helpers/qunit_helper.rb b/app/helpers/qunit_helper.rb index 01bfbac59c..9dec03aa21 100644 --- a/app/helpers/qunit_helper.rb +++ b/app/helpers/qunit_helper.rb @@ -4,7 +4,7 @@ module QunitHelper def vendor_theme_tests return preload_script("vendor-theme-tests") if @legacy_ember - preload_vendor_scripts + preload_script("vendor") end def support_bundles diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 98b4fca1a5..ed984a5bb5 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -29,7 +29,7 @@ <%- if ExtraLocalesController.client_overrides_exist? %> <%= preload_script_url ExtraLocalesController.url('overrides') %> <%- end %> - <%= preload_vendor_scripts %> + <%= preload_script "vendor" %> <%= preload_script "application" %> <%- Discourse.find_plugin_js_assets(include_official: allow_plugins?, include_unofficial: allow_third_party_plugins?, request: request).each do |file| %> <%= preload_script file %> diff --git a/app/views/qunit/index.html.erb b/app/views/qunit/index.html.erb index b4708db959..9912387a2d 100644 --- a/app/views/qunit/index.html.erb +++ b/app/views/qunit/index.html.erb @@ -6,7 +6,7 @@ <%= discourse_stylesheet_link_tag(:desktop, theme_id: nil) %> <%= discourse_stylesheet_link_tag(:test_helper, theme_id: nil) %> <%= preload_script "locales/#{I18n.locale}" %> - <%= preload_vendor_scripts %> + <%= preload_script "vendor" %> <%= preload_script "application" %> <%= preload_script "admin" %> <%= preload_script "discourse/tests/test-support-rails" %> diff --git a/app/views/users/activate_account.html.erb b/app/views/users/activate_account.html.erb index ece50d8113..790df1011c 100644 --- a/app/views/users/activate_account.html.erb +++ b/app/views/users/activate_account.html.erb @@ -10,7 +10,7 @@ <%- content_for(:no_ember_head) do %> - <%= preload_vendor_scripts %> + <%= preload_script "vendor" %> <%= render_google_universal_analytics_code %> <%= tag.meta id: 'data-activate-account', data: { path: path('/session/hp') } %> <%- end %> From eadf618752175b001fca01d3ef5da8bd5f124256 Mon Sep 17 00:00:00 2001 From: Jordan Vidrine <30537603+jordanvidrine@users.noreply.github.com> Date: Mon, 7 Feb 2022 18:18:17 -0600 Subject: [PATCH 132/194] FIX: Align progress text (#15856) --- app/assets/stylesheets/wizard.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/wizard.scss b/app/assets/stylesheets/wizard.scss index 579231ee99..bf154a0b70 100644 --- a/app/assets/stylesheets/wizard.scss +++ b/app/assets/stylesheets/wizard.scss @@ -991,6 +991,7 @@ body.wizard { color: var(--secondary-or-primary); z-index: 13; left: 1.5em; + line-height: 1.4em; } .screen { From 6f03b2694d6c58ce27318567dade7aab6ce59c2b Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Tue, 8 Feb 2022 09:04:53 +0800 Subject: [PATCH 133/194] DEV: Fix typo. (#15857) --- app/jobs/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/jobs/base.rb b/app/jobs/base.rb index 29db06c99f..8d82e2d2df 100644 --- a/app/jobs/base.rb +++ b/app/jobs/base.rb @@ -303,7 +303,7 @@ module Jobs # Simulate the args being dumped/parsed through JSON parsed_opts = JSON.parse(JSON.dump(opts)) if opts != parsed_opts - Discourse.deprecate(<<~MSG.squish, since: "v2.9", drop_from: "3.0") + Discourse.deprecate(<<~MSG.squish, since: "2.9", drop_from: "3.0") #{klass.name} was enqueued with argument values which do not cleanly serialize to/from JSON. This means that the job will be run with slightly different values than the ones supplied to `enqueue`. Argument values should be strings, booleans, numbers, or nil (or arrays/hashes of those value types). From 6758835387c0737c74ee595dcf3c9f5d0f605ef5 Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Tue, 8 Feb 2022 02:31:08 +0100 Subject: [PATCH 134/194] FIX: Overridden MessageFormat fallbacks (#15855) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …were missing pluralization rules This resulted in errors like `MessageFormat.locale.en is not a function` --- lib/js_locale_helper.rb | 7 +++ spec/components/js_locale_helper_spec.rb | 57 ++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/lib/js_locale_helper.rb b/lib/js_locale_helper.rb index 4ca3cd5864..d5a319b41e 100644 --- a/lib/js_locale_helper.rb +++ b/lib/js_locale_helper.rb @@ -289,6 +289,13 @@ module JsLocaleHelper result = +"MessageFormat = {locale: {}};\n" result << "I18n._compiledMFs = {#{formats}};\n" result << File.read(filename) << "\n" + + if locale != "en" + # Include "en" pluralization rules for use in fallbacks + _, en_filename = find_message_format_locale(["en"], fallback_to_english: false) + result << File.read(en_filename) << "\n" + end + result << File.read("#{Rails.root}/lib/javascripts/messageformat-lookup.js") << "\n" end diff --git a/spec/components/js_locale_helper_spec.rb b/spec/components/js_locale_helper_spec.rb index 887ae8dc0d..27c8290ef9 100644 --- a/spec/components/js_locale_helper_spec.rb +++ b/spec/components/js_locale_helper_spec.rb @@ -87,7 +87,7 @@ describe JsLocaleHelper do end it 'handles message format special keys' do - JsLocaleHelper.set_translations('en', "en" => { + JsLocaleHelper.set_translations('en', "en" => { "js" => { "hello" => "world", "test_MF" => "{HELLO} {COUNT, plural, one {1 duck} other {# ducks}}", @@ -113,7 +113,7 @@ describe JsLocaleHelper do expect(ctx.eval('I18n.messageFormat("foo_MF", { HELLO: "hi", COUNT: 4 })')).to eq("hi 4 ducks") end - it 'load pluralizations rules before precompile' do + it 'load pluralization rules before precompile' do message = JsLocaleHelper.compile_message_format(message_format_filename('ru'), 'ru', 'format') expect(message).not_to match 'Plural Function not found' end @@ -186,6 +186,43 @@ describe JsLocaleHelper do end end + it "correctly evaluates message formats in en fallback" do + JsLocaleHelper.set_translations("en", "en" => { + "js" => { + "something_MF" => "en mf", + }, + }) + + JsLocaleHelper.set_translations("de", "de" => { + "js" => { + "something_MF" => "de mf", + }, + }) + + TranslationOverride.upsert!("en", "js.something_MF", <<~MF.strip) + There { + UNREAD, plural, + =0 {are no} + one {is one unread} + other {are # unread} + } + MF + + ctx = MiniRacer::Context.new + ctx.eval("var window = this;") + ctx.load(Rails.root + "app/assets/javascripts/locales/i18n.js") + ctx.eval(JsLocaleHelper.output_locale("de")) + ctx.eval(JsLocaleHelper.output_client_overrides("de")) + ctx.eval(<<~JS) + for (let [key, value] of Object.entries(I18n._mfOverrides || {})) { + key = key.replace(/^[a-z_]*js\./, ""); + I18n._compiledMFs[key] = value; + } + JS + + expect(ctx.eval("I18n.messageFormat('something_MF', { UNREAD: 1 })")).to eq("There is one unread") + end + LocaleSiteSetting.values.each do |locale| it "generates valid date helpers for #{locale[:value]} locale" do js = JsLocaleHelper.output_locale(locale[:value]) @@ -207,12 +244,24 @@ describe JsLocaleHelper do end describe ".find_message_format_locale" do + it "finds locale's message format rules" do + locale, filename = JsLocaleHelper.find_message_format_locale([:de], fallback_to_english: false) + expect(locale).to eq("de") + expect(filename).to end_with("/de.js") + end + it "finds locale for en_GB" do - locale, filename = JsLocaleHelper.find_message_format_locale([:en_GB], fallback_to_english: false) + locale, filename = JsLocaleHelper.find_message_format_locale([:en_GB], fallback_to_english: false) expect(locale).to eq("en") expect(filename).to end_with("/en.js") - locale, filename = JsLocaleHelper.find_message_format_locale(["en_GB"], fallback_to_english: false) + locale, filename = JsLocaleHelper.find_message_format_locale(["en_GB"], fallback_to_english: false) + expect(locale).to eq("en") + expect(filename).to end_with("/en.js") + end + + it "falls back to en when locale doesn't have own message format rules" do + locale, filename = JsLocaleHelper.find_message_format_locale([:nonexistent], fallback_to_english: true) expect(locale).to eq("en") expect(filename).to end_with("/en.js") end From 4ef56b0ca4d997e5d0b331c488c83b7f574721df Mon Sep 17 00:00:00 2001 From: jbrw Date: Mon, 7 Feb 2022 21:02:32 -0500 Subject: [PATCH 135/194] FIX: Explicitly set `allowfullscreen` on Wistia Oneboxes (#15828) --- lib/onebox/engine/wistia_onebox.rb | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/onebox/engine/wistia_onebox.rb b/lib/onebox/engine/wistia_onebox.rb index 4abb2ff7fc..0c4744d417 100644 --- a/lib/onebox/engine/wistia_onebox.rb +++ b/lib/onebox/engine/wistia_onebox.rb @@ -11,7 +11,25 @@ module Onebox always_https def to_html - get_oembed.html + oembed = get_oembed + extracted_url = oembed.html.match(/iframe\ src\=\"(.*?)\"/) + + if extracted_url + iframe_src = extracted_url[1] + + <<-HTML + + HTML + else + oembed.html + end end def placeholder_html From 6a2b85710baee85fdf60130a5b3b9cb7cf39ecd3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Feb 2022 13:05:35 +1100 Subject: [PATCH 136/194] Build(deps): Bump request_store from 1.5.0 to 1.5.1 (#15641) Bumps [request_store](https://github.com/steveklabnik/request_store) from 1.5.0 to 1.5.1. - [Release notes](https://github.com/steveklabnik/request_store/releases) - [Commits](https://github.com/steveklabnik/request_store/compare/v1.5.0...v1.5.1) --- updated-dependencies: - dependency-name: request_store dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 33e6f7ef33..aa54a6373b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -355,7 +355,7 @@ GEM redis-namespace (1.8.1) redis (>= 3.0.4) regexp_parser (2.2.0) - request_store (1.5.0) + request_store (1.5.1) rack (>= 1.4) rexml (3.2.5) rinku (2.0.6) From 7afe768d60ce749d78532f928cb51c5b91d8a7c6 Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Tue, 8 Feb 2022 13:04:32 +0800 Subject: [PATCH 137/194] DEV: Add tests for wistia onebox. (#15860) Follow-up to 4ef56b0ca4d997e5d0b331c488c83b7f574721df --- lib/onebox/engine/wistia_onebox.rb | 18 +++++++------- spec/lib/onebox/engine/wistia_onebox_spec.rb | 26 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 spec/lib/onebox/engine/wistia_onebox_spec.rb diff --git a/lib/onebox/engine/wistia_onebox.rb b/lib/onebox/engine/wistia_onebox.rb index 0c4744d417..c8fe3a2ae3 100644 --- a/lib/onebox/engine/wistia_onebox.rb +++ b/lib/onebox/engine/wistia_onebox.rb @@ -17,15 +17,15 @@ module Onebox if extracted_url iframe_src = extracted_url[1] - <<-HTML - + <<~HTML + HTML else oembed.html diff --git a/spec/lib/onebox/engine/wistia_onebox_spec.rb b/spec/lib/onebox/engine/wistia_onebox_spec.rb new file mode 100644 index 0000000000..ebd0b74e4d --- /dev/null +++ b/spec/lib/onebox/engine/wistia_onebox_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require "rails_helper" + +describe Onebox::Engine::WistiaOnebox do + before do + body = '{"version":"1.0","type":"video","html":"\u003ciframe src=\"https://fast.wistia.net/embed/iframe/26sk4lmiix\" title=\"Nice. Video\" allow=\"autoplay; fullscreen\" allowtransparency=\"true\" frameborder=\"0\" scrolling=\"no\" class=\"wistia_embed\" name=\"wistia_embed\" msallowfullscreen width=\"960\" height=\"540\"\u003e\u003c/iframe\u003e\n\u003cscript src=\"https://fast.wistia.net/assets/external/E-v1.js\" async\u003e\u003c/script\u003e","width":960,"height":540,"provider_name":"Wistia, Inc.","provider_url":"https://wistia.com","title":"Nice. ","thumbnail_url":"https://embed-ssl.wistia.com/deliveries/56cacb9a5d6ea04b1f29defaf4b55d1ec979e1b0.jpg?image_crop_resized=960x540","thumbnail_width":960,"thumbnail_height":540,"player_color":"f27398","duration":44.42}' + + stub_request(:get, "https://fast.wistia.com/oembed?embedType=iframe&url=https://support.wistia.com/medias/26sk4lmiix") + .to_return(status: 200, body: body, headers: {}) + end + + it "returns the right HTML markup for the onebox" do + expect(Onebox.preview('https://support.wistia.com/medias/26sk4lmiix').to_s.chomp).to eq( + '' + ) + end + + describe '#placeholder_html' do + it "returns the right img HTML markup" do + expect(Onebox.preview('https://support.wistia.com/medias/26sk4lmiix').placeholder_html).to eq( + "" + ) + end + end +end From ecc07fd8dce6d0c599f7452be6b4200f250cd91c Mon Sep 17 00:00:00 2001 From: David Taylor Date: Tue, 8 Feb 2022 10:03:53 +0000 Subject: [PATCH 138/194] DEV: Make Ember CLI assets the default in production (#15861) This was reverted in e92f57255de429fcf12c4259235d88c5485d934f due to memory usage concerns. This memory issue was resolved by 4cceb55621aa5a25c72415d78a43bd62be68d68d. --- app/controllers/qunit_controller.rb | 2 +- config/application.rb | 2 +- lib/tasks/assets.rake | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/qunit_controller.rb b/app/controllers/qunit_controller.rb index 003b343024..2abd0744e4 100644 --- a/app/controllers/qunit_controller.rb +++ b/app/controllers/qunit_controller.rb @@ -23,7 +23,7 @@ class QunitController < ApplicationController @is_proxied = is_ember_cli_proxy? @legacy_ember = if Rails.env.production? - ENV['EMBER_CLI_PROD_ASSETS'] != "1" + ENV['EMBER_CLI_PROD_ASSETS'] == "0" else !@is_proxied end diff --git a/config/application.rb b/config/application.rb index 1c4a0bb51b..072b86f6d1 100644 --- a/config/application.rb +++ b/config/application.rb @@ -180,7 +180,7 @@ module Discourse discourse/tests/test_starter.js } - if ENV['EMBER_CLI_PROD_ASSETS'] != "1" + if ENV['EMBER_CLI_PROD_ASSETS'] == "0" config.assets.precompile += %w{ discourse/tests/test-support-rails.js discourse/tests/test-helpers-rails.js diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake index 31ba3ba30f..00ad394cc7 100644 --- a/lib/tasks/assets.rake +++ b/lib/tasks/assets.rake @@ -35,7 +35,7 @@ task 'assets:precompile:before' do require 'sprockets' require 'digest/sha1' - if ENV['EMBER_CLI_PROD_ASSETS'] == "1" + if ENV['EMBER_CLI_PROD_ASSETS'] != "0" # Remove the assets that Ember CLI will handle for us Rails.configuration.assets.precompile.reject! do |asset| asset.is_a?(String) && @@ -312,7 +312,7 @@ end task 'assets:precompile' => 'assets:precompile:before' do - copy_ember_cli_assets if ENV['EMBER_CLI_PROD_ASSETS'] == '1' + copy_ember_cli_assets if ENV['EMBER_CLI_PROD_ASSETS'] != '0' refresh_days = GlobalSetting.refresh_maxmind_db_during_precompile_days From 03b7d718278bbbdd96be1a35db7b6e8638db2800 Mon Sep 17 00:00:00 2001 From: David Taylor Date: Tue, 8 Feb 2022 10:45:36 +0000 Subject: [PATCH 139/194] DEV: Ensure that Discourse global is available for widget init (#15862) Under ember-cli, we rely on the `ember-export-application-global` addon to make `window.Discourse` available. This happens in an initializer. Previously this inititalizer would run after `auto-load-modules`, and so any widget/helper modules would not be able to access it. This commit sets some `after` parameters on the `auto-load-modules` and `inject-objects` initializers to ensure that `export-application-global` is run first. --- .../javascripts/discourse/app/initializers/auto-load-modules.js | 1 + .../javascripts/discourse/app/initializers/inject-objects.js | 1 + 2 files changed, 2 insertions(+) diff --git a/app/assets/javascripts/discourse/app/initializers/auto-load-modules.js b/app/assets/javascripts/discourse/app/initializers/auto-load-modules.js index 01c1db9ec9..3c827a9ccd 100644 --- a/app/assets/javascripts/discourse/app/initializers/auto-load-modules.js +++ b/app/assets/javascripts/discourse/app/initializers/auto-load-modules.js @@ -36,5 +36,6 @@ export function autoLoadModules(container, registry) { export default { name: "auto-load-modules", + after: "inject-objects", initialize: (container) => autoLoadModules(container, container.registry), }; diff --git a/app/assets/javascripts/discourse/app/initializers/inject-objects.js b/app/assets/javascripts/discourse/app/initializers/inject-objects.js index e195d4349e..6f3c229da6 100644 --- a/app/assets/javascripts/discourse/app/initializers/inject-objects.js +++ b/app/assets/javascripts/discourse/app/initializers/inject-objects.js @@ -6,6 +6,7 @@ import deprecated from "discourse-common/lib/deprecated"; export default { name: "inject-objects", + after: isLegacyEmber() ? null : "export-application-global", initialize(container, app) { // This is required for Ember CLI tests to work setDefaultOwner(app.__container__); From 6f7364e48bf3546e5a279fe483549d6e62cb3272 Mon Sep 17 00:00:00 2001 From: Dan Ungureanu Date: Tue, 8 Feb 2022 14:07:47 +0200 Subject: [PATCH 140/194] FEATURE: RS512, RS384 and RS256 COSE algorithms (#15804) * FEATURE: RS512, RS384 and RS256 COSE algorithms These algorithms are not implemented by cose-ruby, but used in the web authentication API and were marked as supported. * FEATURE: Use all algorithms supported by cose-ruby Previously only a subset of the algorithms were allowed. --- lib/freedom_patches/cose_rsapkcs1.rb | 50 +++++++++++++++++++ lib/webauthn.rb | 2 +- ...ecurity_key_authentication_service_spec.rb | 6 +++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 lib/freedom_patches/cose_rsapkcs1.rb diff --git a/lib/freedom_patches/cose_rsapkcs1.rb b/lib/freedom_patches/cose_rsapkcs1.rb new file mode 100644 index 0000000000..d407260dc8 --- /dev/null +++ b/lib/freedom_patches/cose_rsapkcs1.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require 'cose' +require 'openssl/signature_algorithm/rsapkcs1' + +# 'cose' gem does not implement all algorithms from the Web Authentication +# (WebAuthn) standard specification. This patch implements one of the missing +# ones, RSASSA-PKCS1-v1_5. +module COSE + module Algorithm + def self.registered_algorithm_ids + @registered_by_id.keys + end + + class RSAPKCS1 < SignatureAlgorithm + attr_reader :hash_function + + def initialize(*args, hash_function:) + super(*args) + + @hash_function = hash_function + end + + private + + def valid_key?(key) + to_cose_key(key).is_a?(COSE::Key::RSA) + end + + def signature_algorithm_class + OpenSSL::SignatureAlgorithm::RSAPKCS1 + end + + def to_pkey(key) + case key + when COSE::Key::RSA + key.to_pkey + when OpenSSL::PKey::RSA + key + else + raise(COSE::Error, 'Incompatible key for algorithm') + end + end + end + + register(RSAPKCS1.new(-257, 'RS256', hash_function: 'SHA256')) + register(RSAPKCS1.new(-258, 'RS384', hash_function: 'SHA384')) + register(RSAPKCS1.new(-259, 'RS512', hash_function: 'SHA512')) + end +end diff --git a/lib/webauthn.rb b/lib/webauthn.rb index 4734b660ca..089913f31c 100644 --- a/lib/webauthn.rb +++ b/lib/webauthn.rb @@ -10,7 +10,7 @@ module Webauthn # -7 - ES256 # -257 - RS256 (Windows Hello supported alg.) - SUPPORTED_ALGORITHMS = [-7, -257].freeze + SUPPORTED_ALGORITHMS = COSE::Algorithm.registered_algorithm_ids.freeze VALID_ATTESTATION_FORMATS = ['none', 'packed', 'fido-u2f'].freeze class SecurityKeyError < StandardError; end diff --git a/spec/lib/webauthn/security_key_authentication_service_spec.rb b/spec/lib/webauthn/security_key_authentication_service_spec.rb index 52e18c7988..ee83dde77e 100644 --- a/spec/lib/webauthn/security_key_authentication_service_spec.rb +++ b/spec/lib/webauthn/security_key_authentication_service_spec.rb @@ -157,4 +157,10 @@ describe Webauthn::SecurityKeyAuthenticationService do ) end end + + it 'all supported algorithms are implemented' do + Webauthn::SUPPORTED_ALGORITHMS.each do |alg| + expect(COSE::Algorithm.find(alg)).not_to be_nil + end + end end From fa9b2b4f428a5866faae60baa0a3947b75752931 Mon Sep 17 00:00:00 2001 From: Discourse Translator Bot Date: Tue, 8 Feb 2022 08:13:14 -0500 Subject: [PATCH 141/194] Update translations (#15864) --- config/locales/client.fa_IR.yml | 1 + config/locales/client.he.yml | 39 ++++++----- config/locales/client.hu.yml | 1 + config/locales/client.it.yml | 13 ++++ config/locales/client.ru.yml | 2 + config/locales/server.ar.yml | 1 - config/locales/server.ca.yml | 1 - config/locales/server.da.yml | 1 - config/locales/server.de.yml | 3 +- config/locales/server.el.yml | 1 - config/locales/server.es.yml | 3 +- config/locales/server.fa_IR.yml | 1 - config/locales/server.fi.yml | 1 - config/locales/server.fr.yml | 1 - config/locales/server.gl.yml | 1 - config/locales/server.he.yml | 66 ++++++++++--------- config/locales/server.hu.yml | 6 +- config/locales/server.hy.yml | 1 - config/locales/server.it.yml | 7 +- config/locales/server.ja.yml | 1 - config/locales/server.ko.yml | 1 - config/locales/server.nb_NO.yml | 1 - config/locales/server.nl.yml | 1 - config/locales/server.pl_PL.yml | 4 +- config/locales/server.pt.yml | 1 - config/locales/server.pt_BR.yml | 3 +- config/locales/server.ro.yml | 1 - config/locales/server.ru.yml | 7 +- config/locales/server.sk.yml | 1 - config/locales/server.sv.yml | 10 ++- config/locales/server.tr_TR.yml | 7 +- config/locales/server.uk.yml | 3 +- config/locales/server.ur.yml | 1 - config/locales/server.vi.yml | 1 - config/locales/server.zh_CN.yml | 1 - config/locales/server.zh_TW.yml | 1 - .../config/locales/client.de.yml | 1 + .../config/locales/client.sv.yml | 1 + .../config/locales/server.da.yml | 9 +++ .../config/locales/server.de.yml | 9 +++ .../config/locales/server.he.yml | 9 +++ .../config/locales/server.hu.yml | 9 +++ .../config/locales/server.it.yml | 9 +++ .../config/locales/server.pl_PL.yml | 6 ++ .../config/locales/server.ru.yml | 9 +++ .../config/locales/server.sv.yml | 9 +++ .../config/locales/server.tr_TR.yml | 9 +++ 47 files changed, 190 insertions(+), 85 deletions(-) diff --git a/config/locales/client.fa_IR.yml b/config/locales/client.fa_IR.yml index cefdbe617b..a69e93b5a2 100644 --- a/config/locales/client.fa_IR.yml +++ b/config/locales/client.fa_IR.yml @@ -685,6 +685,7 @@ fa_IR: title: "تنظیمات" allow_unknown_sender_topic_replies: "پاسخ‌های موضوع فرستنده ناشناس را مجاز کنید." allow_unknown_sender_topic_replies_hint: "به فرستندگان ناشناس اجازه می‌دهد تا به موضوعات گروه پاسخ دهند. اگر این مورد فعال نباشد، پاسخ‌هایی از آدرس‌های ایمیلی که قبلاً به موضوع دعوت نشده‌اند، موضوع جدیدی ایجاد می‌کنند." + from_alias: "از نام مستعار" mailboxes: synchronized: "صندوق پستی همگام شده" none_found: "هیچ صندوق پستی در این حساب ایمیل یافت نشد." diff --git a/config/locales/client.he.yml b/config/locales/client.he.yml index 3ccccbbd4d..44e3dc477b 100644 --- a/config/locales/client.he.yml +++ b/config/locales/client.he.yml @@ -414,7 +414,7 @@ he: uploaded: "הועלה!" pasting: "מדביק..." enable: "לאפשר" - disable: "לנטרל" + disable: "השבתה" continue: "המשך" undo: "לבטל פעולה" revert: "להחזיר" @@ -780,6 +780,8 @@ he: title: "הגדרות" allow_unknown_sender_topic_replies: "לאפשר תגובות לנושאים משולחים בלתי־ידועים." allow_unknown_sender_topic_replies_hint: "מאפשר לשולחים בלתי־ידועים להגיב לנושאים קבוצתיים. אם האפשרות מבוטלת, תגובות מכתובות דוא״ל שטרם הוזמנו לנושא תיצורנה נושא חדש." + from_alias: "כינוי מאת" + from_alias_hint: "כינוי בו יש להשתמש בתור כתוב מאת בעת שליחת הודעות SMTP קבוצתיות בדוא״ל. נא לשים לב שאולי חלק מספקי הדוא״ל לא תומכים בזה, נא להיעזר בתיעוד של ספק הדוא״ל שלך." mailboxes: synchronized: "תיבת דוא״ל מסונכרנת" none_found: "לא נמצאו תיבות דוא״ל בחשבון הדוא״ל הזה." @@ -919,7 +921,7 @@ he: description: "תקבלו התראה על כל פוסט חדש במסגרת כל הודעה, וסך התשובות יוצג." watching_first_post: title: "צפייה בפוסט הראשון" - description: "תקבל התראה עבור הודעות חדשות בקבוצה זו אבל לא לתגובות עליהן." + description: "תישלח אליך התראה על הודעות חדשות בקבוצה זו אבל לא לתגובות עליהן." tracking: title: "במעקב" description: "תישלח אליך התראה אם מישהו מזכיר את @שמך או עונה לך, ותופיע ספירה של תגובות חדשות." @@ -2067,6 +2069,11 @@ he: two: "על ידי אזכור %{group}, אתם עומדים ליידע %{count} אנשים – אתם בטוחים?" many: "על ידי אזכור %{group}, אתם עומדים ליידע %{count} אנשים – אתם בטוחים?" other: "על ידי אזכור %{group}, אתם עומדים ליידע %{count} אנשים – אתם בטוחים?" + cannot_see_mention: + category: "אזכרת את ‎@%{username} אבל לא תישלח התראה עקב העדר גישה לקטגוריה הזו. עליך להוסיף את מי שאוזכר לקבוצה שיש לה גישה לקטגוריה הזאת." + private: "אזכרת את ‎@%{username} אבל לא תישלח התראה עקב העדר גישה לצפייה בהודעה האישית הזאת. עליך להזמין את מי שאוזכר להודעה האישית הזאת." + muted_topic: "אזכרת את ‎@%{username} אבל לא תישלח התראה עקב השתקת הנושא הזה." + not_allowed: "אזכרת את ‎@%{username} אבל לא תישלח התראה כיוון שמי שאוזכר לא הוזמן לנושא הזה." here_mention: one: "אזכור של ‎@%{here} יודיע למשתמש %{count}, להמשיך?" two: "אזכור של ‎@%{here} יודיע ל־%{count} משתמשים, להמשיך?" @@ -2332,16 +2339,16 @@ he: clear_search: "פינוי החיפוש" sort_or_bulk_actions: "מיון או בחירת תוצאות במרוכז" result_count: - one: "תוצאה אחת עבור %{term}" - two: "%{count}%{plus} תוצאות עבור %{term}" - many: "%{count}%{plus} תוצאות עבור%{term}" + one: "תוצאה %{count} עבור %{term}" + two: "%{count}%{plus} תוצאות עבור %{term}" + many: "%{count}%{plus} תוצאות עבור %{term}" other: "%{count}%{plus} תוצאות עבור %{term}" title: "חיפוש" full_page_title: "חיפוש" no_results: "אין תוצאות." no_more_results: "לא נמצאו עוד תוצאות." post_format: "#%{post_number} מאת %{username}" - results_page: "חפש תוצאות עבור '%{term}'" + results_page: "תוצאות לחיפוש אחר ‚%{term}’" more_results: "יש עוד תוצאות. אנא צמצם את קריטריוני החיפוש." cant_find: "לא מצליחים למצוא את מה שחיפשתם?" start_new_topic: "אולי תפתחו נושא חדש?" @@ -2535,7 +2542,7 @@ he: title: "העברה לדואר נכנס" help: "החזרת הודעה לדואר נכנס" edit_message: - help: "ערוך פוסט ראשון של ההודעה" + help: "עריכת פוסט ראשון של ההודעה" title: "עריכה" defer: help: "סימון כלא נקראו" @@ -2776,7 +2783,7 @@ he: remove_banner: "הסרת נושא באנר" reply: title: "תגובה" - help: "התחל לערוך תגובה לנושא זה" + help: "להתחיל לכתוב תגובה לנושא זה" share: title: "שיתוף" extended_title: "שתף קישור" @@ -2812,7 +2819,7 @@ he: pin: "גרמו לנושא זה להופיע בראש קטגוריה %{categoryLink} עד" unpin: "הסרת נושא זה מראש הקטגוריה %{categoryLink}." unpin_until: "גרמו לנושא זה להופיע בראש הקטגוריה %{categoryLink} או המתינו עד %{until}." - pin_note: "משתמשים יכולים לבטל עצמאית את נעיצת הנושא עבורם בלבד." + pin_note: "משתמשים יכולים לנתק את הנושא עצמאית עבור עצמם." pin_validation: "דרוש תאריך על מנת לנעוץ את הנושא." not_pinned: "אין נושאים שננעצו בקטגוריה %{categoryLink}." already_pinned: @@ -3082,7 +3089,7 @@ he: undo_like: "בטל 'אהוב'" edit: "עירכו פוסט זה" edit_action: "עריכה" - edit_anonymous: "מצטערים, אך עליכם להיות מחוברים בכדי לערוך פוסט זה." + edit_anonymous: "עליך להיכנס כדי לערוך פוסט זה, עמך הסליחה." flag: "דגלו פוסט זה באופן פרטי לתשומת לב או שלחו התראה פרטית עליו" delete: "מחק פוסט זה" undelete: "שחזר פוסט זה" @@ -3297,7 +3304,7 @@ he: inherited: 'הרשאה זו התקבלה בירושה מתוך „כולם”' special_warning: "אזהרה: קטגוריה זו הגיעה מראש והגדרות האבטחה שלה אינן ניתנות לשינוי. אם אתם מעוניינים להשתמש בקטגוריה זו, מחקו אותה במקום להשתמש בה מחדש." uncategorized_security_warning: "קטגוריה זו היא מיוחדת. היא מיועדת להחזקת מגוון של נושאים שאין להם קטגוריה, לא יכולות להיות לקבוצה זו הגדרות אבטחה." - uncategorized_general_warning: 'קטגוריה זו היא מיוחדת. היא משמשת כקטגוריית בררת המחדל לנושאים חדשים שלא נבחרה עבורם קטגוריה. אם ברצונך למנוע את ההתנהגות הזאת ולאלץ בחירת קטגוריה, נא לנטרל את ההגדרה הזאת כאן. אם מעניין אותך לשנות את השם או את התיאור, עליך לגשת אל התאמה אישית / תוכן טקסט.' + uncategorized_general_warning: 'קטגוריה זו היא מיוחדת. היא משמשת כקטגוריית בררת המחדל לנושאים חדשים שלא נבחרה עבורם קטגוריה. כדי למנוע את ההתנהגות הזאת ולאלץ בחירת קטגוריה, נא להשבית את ההגדרה הזאת כאן. אם מעניין אותך לשנות את השם או את התיאור, עליך לגשת אל התאמה אישית / תוכן טקסט.' pending_permission_change_alert: "לא הוספת %{group} לקטגוריה הזאת, יש ללחוץ על הכפתור הזה כדי להוסיף אותן." images: "תמונות" email_in: "כתובת דואר נכנס מותאמת אישית:" @@ -5158,7 +5165,7 @@ he: send_activation_email_failed: "הייתה בעיה בשליחת הודעת האישור. %{error}" activate: "הפעלת חשבון" activate_failed: "הייתה בעיה בהפעלת המשתמש." - deactivate_account: "נטרל חשבון" + deactivate_account: "השבתת חשבון" deactivate_failed: "הייתה בעיה בהשבתת חשבון המשתמש." unsilence_failed: "אירעה תקלה בעת ביטול השתקת המשתמש." silence_failed: "אירעה תקלה בעת השתקת המשתמש." @@ -5168,7 +5175,7 @@ he: reset_bounce_score: label: "איפוס" title: "איפוס ניקוד-החזר" - visit_profile: "בקרו בדף ההעדפות של משתמש/ת זה/זו כדי לערוך את הפרופיל שלהם" + visit_profile: "ביקור בדף ההעדפות של אותו המשתמש מאפשר את עריכת הפרופיל" deactivate_explanation: "חשבון משתמש מושבת נדרש לאמת דוא״ל מחדש." suspended_explanation: "משתמש מושעה לא יכול להיכנס." silence_explanation: "משתמש מושתק לא יכול לפרסם או לפתוח נושאים." @@ -5271,9 +5278,9 @@ he: multiselect: "מגוון בחירות" site_text: description: "ניתן להתאים כל טקסט בפורום שלך. נא להתחיל בחיפוש שלהלן:" - search: "חפשו טקסט שברצונכם לערוך" + search: "חיפוש הטקסט שמיועד לעריכה" title: "טקסט" - edit: "ערוך" + edit: "עריכה" revert: "ביטול שינויים" revert_confirm: "לבטל את השינויים שלך?" go_back: "חזרה לחיפוש" @@ -5457,7 +5464,7 @@ he: host: "שרתים מורשים" class_name: "שם מחלקה" allowed_paths: "רשימת נתיבים מותרים" - edit: "ערוך" + edit: "עריכה" category: "פרסם לקטגוריה" add_host: "הוספת שרת" settings: "הגדרות הטמעה" diff --git a/config/locales/client.hu.yml b/config/locales/client.hu.yml index 82e68cdf11..95e7156e77 100644 --- a/config/locales/client.hu.yml +++ b/config/locales/client.hu.yml @@ -689,6 +689,7 @@ hu: title: "Beállítások" allow_unknown_sender_topic_replies: "Engedélyezze az ismeretlen feladóktól érkező témaválaszokat." allow_unknown_sender_topic_replies_hint: "Lehetővé teszi az ismeretlen feladók számára, hogy válaszoljanak a csoport témáira. Ha ez nincs engedélyezve, akkor az e-mail szálban még nem szereplő címekről érkező válaszok új témát hoznak létre." + from_alias: "Álnévből" mailboxes: synchronized: "Szinkronizált postafiók" none_found: "Ebben az e-mail fiókban nem találhatók postaládák." diff --git a/config/locales/client.it.yml b/config/locales/client.it.yml index 3d7a8cedb3..f6f82f9a01 100644 --- a/config/locales/client.it.yml +++ b/config/locales/client.it.yml @@ -173,6 +173,7 @@ it: themes: default_description: "Predefinito" broken_theme_alert: "Il tuo sito potrebbe non funzionare perché il tema / componente %{theme} contiene degli errori. Disabilitalo qui %{path}." + broken_decorator_alert: "I messaggi potrebbero non essere visualizzati correttamente perché uno dei decoratori di contenuti sul tuo sito ha generato un errore. Per maggiori informazioni, controlla gli strumenti di sviluppo del browser." s3: regions: ap_northeast_1: "Asia Pacifico (Tokyo)" @@ -689,6 +690,7 @@ it: title: "Impostazioni" allow_unknown_sender_topic_replies: "Consenti a mittenti sconosciuti di rispondere agli argomenti." allow_unknown_sender_topic_replies_hint: "Consenti a mittenti sconosciuti di rispondere agli argomenti del gruppo. Se l'opzione è disabilitata, le risposte provenienti da indirizzi e-mail non invitati all'argomento causeranno la creazione di un nuovo argomento in cui saranno incluse." + from_alias: "Da Alias" mailboxes: synchronized: "Maibox sincronizzata" none_found: "Nessuna mailbox trovata in questo account e-mail." @@ -1482,13 +1484,16 @@ it: show_advanced: "Mostra Opzioni Avanzate" hide_advanced: "Nascondi opzioni avanzate" restrict: "Limita a" + restrict_email: "Limita all'e-mail" restrict_domain: "Limita al dominio" email_or_domain_placeholder: "nome@esempio.com o esempio.com" max_redemptions_allowed: "Limite max di utilizzi" add_to_groups: "Aggiungi ai gruppi" + invite_to_topic: "Arriva all'argomento" expires_at: "Scadenza:" custom_message: "Messaggio personale facoltativo" send_invite_email: "Salva e invia Email" + send_invite_email_instructions: "Limita l'invito all'e-mail per inviare un'e-mail di invito" save_invite: "Salva invito" invite_saved: "Invito salvato." bulk_invite: @@ -1685,10 +1690,12 @@ it: disclaimer: "Registrandoti accetti Informativa sulla privacy e termini del servizio." title: "Crea il tuo account" failed: "Qualcosa non ha funzionato. Forse questa email è già registrata, prova a usare il link di recupero password" + associate: "Hai già un account? Accedi per collegare il tuo account %{provider}." forgot_password: title: "Reimposta Password" action: "Ho dimenticato la password" invite: "Inserisci il nome utente o l'indirizzo email. Ti manderemo un'email per reimpostare la password." + invite_no_username: "Inserisci il tuo indirizzo di posta elettronica e ti spediremo un'e-mail per reimpostare la password." reset: "Reimposta Password" complete_username: "Se un account corrisponde al nome utente %{username}, a breve dovresti ricevere un'email con le istruzioni per ripristinare la tua password." complete_email: "Se un account corrisponde a %{email}, a breve dovresti ricevere un'email contenente le istruzioni per ripristinare la password." @@ -1762,21 +1769,27 @@ it: google_oauth2: name: "Google" title: "con Google" + sr_title: "Accedi con Google" twitter: name: "Twitter" title: "con Twitter" + sr_title: "Accedi con Twitter" instagram: name: "Instagram" title: "con Instagram" + sr_title: "Accedi con Instagram" facebook: name: "Facebook" title: "con Facebook" + sr_title: "Accedi con Facebook" github: name: "GitHub" title: "con GitHub" + sr_title: "Accedi con GitHub" discord: name: "Discord" title: "con Discord" + sr_title: "Accedi con Discord" second_factor_toggle: totp: "Utilizzare un'app di autenticazione" backup_code: "Utilizza un codice di backup" diff --git a/config/locales/client.ru.yml b/config/locales/client.ru.yml index 0e66af9990..2016201509 100644 --- a/config/locales/client.ru.yml +++ b/config/locales/client.ru.yml @@ -780,6 +780,8 @@ ru: title: "Настройки" allow_unknown_sender_topic_replies: "Разрешать в теме ответы от неизвестного отправителя." allow_unknown_sender_topic_replies_hint: "Разрешать неизвестным отправителям отвечать в групповой теме. Если этот параметр не включен, ответы с адресов электронной почты пользователей, не приглашенных в тему, создадут новую тему." + from_alias: "Псевдоним отправителя" + from_alias_hint: "Псевдоним для использования в качестве адреса отправителя групповых SMTP-писем. Обратите внимание, что этот функционал может не поддерживаться всеми почтовыми провайдерами, пожалуйста, обратитесь к документации вашего почтового провайдера." mailboxes: synchronized: "Синхронизированный почтовый ящик" none_found: "В этой учётной записи электронной почты не найдено ни одного почтового ящика." diff --git a/config/locales/server.ar.yml b/config/locales/server.ar.yml index f031b0fdfd..2f86f071dd 100644 --- a/config/locales/server.ar.yml +++ b/config/locales/server.ar.yml @@ -1584,7 +1584,6 @@ ar: min_personal_message_title_length: "الحد الأدنى المسموح به لطول عنوان الرسالة بالأحرف" max_emojis_in_title: "الحد الأقصى المسموح به من الرموز التعبيرية في عنوان الموضوع" min_search_term_length: "الحد الأدنى الصالح لطول مصطلح البحث بالأحرف" - search_tokenize_chinese_japanese_korean: "فرض تقسيم جمل البحث في اللغات الصينية واليابانية والكورية إلى كلمات حتى على المواقع التي لا تدعم تلك اللغات" search_prefer_recent_posts: "سيحاول هذا الخيار البحث في فهرس أحدث المنشورات أولًا إذا كان البحث في منتداك الكبير بطيئًا" search_recent_posts_size: "عدد المنشورات الحديثة التي سيتم الإبقاء عليها في الفهرس" log_search_queries: "تسجيل استعلامات البحث التي يجريها المستخدمون" diff --git a/config/locales/server.ca.yml b/config/locales/server.ca.yml index ee0ae913da..8994e15a35 100644 --- a/config/locales/server.ca.yml +++ b/config/locales/server.ca.yml @@ -1194,7 +1194,6 @@ ca: min_personal_message_title_length: "Longitud mínima permesa de títol de tema en caràcters per a un missatge" max_emojis_in_title: "Emojis màxims permesos en el títol del tema" min_search_term_length: "Longitud mínima vàlida del terme de cerca en caràcters" - search_tokenize_chinese_japanese_korean: "Força la cerca per a segmentar xinès/japonès/coreà fins i tot en llocs web no-CJK." search_prefer_recent_posts: "Si la cerca en el vostre fòrum és lenta, aquesta opció prova primer amb un índex de publicacions més recents." search_recent_posts_size: "Quantes publicacions recents es mantenen en l'índex" log_search_queries: "Registra les cerques fetes pels usuaris" diff --git a/config/locales/server.da.yml b/config/locales/server.da.yml index 9fd32a2465..c34f92fff5 100644 --- a/config/locales/server.da.yml +++ b/config/locales/server.da.yml @@ -1322,7 +1322,6 @@ da: min_personal_message_title_length: "Minimumslængde af emnetitel i tegn." max_emojis_in_title: "Maksimum tilladte humørikoner i emnetitel" min_search_term_length: "Antal tegn i søgefeltet skal have et minimum" - search_tokenize_chinese_japanese_korean: "Tving søg til at \"tokenize\" Chinese/Japanese/Korean selv på sites som ikke er CJK" search_prefer_recent_posts: "Såfremt søgning på forum er langsomt, kan denne option indeksere og vise nyeste indlæg først" search_recent_posts_size: "Hvor mange nye indlæg skal der gemmes i index" log_search_queries: "Log søgeforespørgsler udført af brugere" diff --git a/config/locales/server.de.yml b/config/locales/server.de.yml index 8a98935809..ebacecbdfe 100644 --- a/config/locales/server.de.yml +++ b/config/locales/server.de.yml @@ -1402,7 +1402,6 @@ de: min_personal_message_title_length: "Minimal zulässige Zeichenanzahl für den Titel von Nachrichten." max_emojis_in_title: "Maximal erlaubte Emoji-Anzahl in Thementiteln" min_search_term_length: "Minimal zulässige Länge eines Suchbegriffs in Zeichen." - search_tokenize_chinese_japanese_korean: "Zwinge die Suche, Chinesisch/Japanisch/Koreanisch zu tokenisieren, auch wenn Websites keine dieser Sprachen nutzen" search_prefer_recent_posts: "Wenn das Durchsuchen deines großen Forums langsam ist, dann versucht es diese Option zuerst mit einem Index der letzten Beiträge." search_recent_posts_size: "Anzahl aktueller Beiträge im Index" log_search_queries: "Protokolliere Suchanfragen von Benutzern" @@ -1534,7 +1533,7 @@ de: allowed_iframes: "Eine Liste von iframe-src-Domain-Präfixen, die Discourse in Beiträgen sicher erlauben kann." allowed_crawler_user_agents: "Browserkennungen von Webcrawlern, denen der Zugriff auf die Website erlaubt sein soll. WARNUNG! DIESE EINSTELLUNG BLOCKIERT ALLE HIER NICHT GELISTETEN CRAWLER!" blocked_crawler_user_agents: "Eindeutiges Wort unter Vernachlässigung der Groß- und Kleinschreibung in der Zeichenfolge der Browserkennung, das Webcrawler identifiziert, die nicht auf die Website zugreifen dürfen. Gilt nicht, wenn die Positivliste definiert ist." - slow_down_crawler_user_agents: "Benutzeragenten von Web-Crawlern, die wie in der Einstellung \"Crawler-Rate verlangsamen\" konfiguriert, begrenzt werden sollen. Jeder Wert muss mindestens 3 Zeichen lang sein." + slow_down_crawler_user_agents: 'Benutzeragenten von Web-Crawlern, die wie in der Einstellung "Crawler-Rate verlangsamen" konfiguriert, begrenzt werden sollen. Jeder Wert muss mindestens 3 Zeichen lang sein.' slow_down_crawler_rate: "Wenn slow_down_crawler_user_agents ausgewählt ist, wird diese Anfragenbegrenzung auf alle Crawler angewendet (Anzahl der Sekunden zwischen zwei Anfragen)" content_security_policy: "Aktiviere Content-Security-Policy" content_security_policy_report_only: "Aktiviere Content-Security-Policy-Report-Only" diff --git a/config/locales/server.el.yml b/config/locales/server.el.yml index 32a7574cba..b7e621ec8f 100644 --- a/config/locales/server.el.yml +++ b/config/locales/server.el.yml @@ -922,7 +922,6 @@ el: max_topic_title_length: "Μέγιστο επιτρεπτό μήκος τίτλου νήματος σε χαρακτήρες" min_personal_message_title_length: "Ελάχιστο επιτρεπτό μήκος τίτλου για ένα μήνυμα σε χαρακτήρες" min_search_term_length: "Ελάχιστο έγκυρο μήκος όρου αναζήτησης σε χαρακτήρες" - search_tokenize_chinese_japanese_korean: "Ανάγκασε την αναζήτηση να κάνει tokenize Κινέζικα / Ιαπωνικά / κορεατικά, ακόμη και σε μη CJK ιστότοπους" search_prefer_recent_posts: "Εάν η αναζήτηση στην ιστοσελίδα σας είναι αργή, αυτή η επιλογή δημιουργεί κατάλογο των πιο πρόσφατων αναρτήσεων πρώτα" search_recent_posts_size: "Πόσες πρόσφατες αναρτήσεις να κρατηθούν στο ευρετήριο " log_search_queries: "Κατέγραψε τις αναζητήσεις που εκτελούνται από χρήστες" diff --git a/config/locales/server.es.yml b/config/locales/server.es.yml index 5dc3871ac4..953fedade1 100644 --- a/config/locales/server.es.yml +++ b/config/locales/server.es.yml @@ -1399,7 +1399,6 @@ es: min_personal_message_title_length: "Longitud mínima del título para un mensaje en número de caracteres" max_emojis_in_title: "Cantidad máxima de emojis en el título del tema" min_search_term_length: "Extensión mínima de una búsqueda válida en número de caracteres" - search_tokenize_chinese_japanese_korean: "Forzar la búsqueda a tokenizar Chino/Japonés/Coreano incluso en sitios no basados en esos idiomas" search_prefer_recent_posts: "Si la búsqueda en tu foro grande es lenta, esta opción prueba primero en un índice de publicaciones más recientes" search_recent_posts_size: "Cantidad de publicaciones recientes que se mantienen en el índice" log_search_queries: "Registro de búsquedas realizadas por los usuarios" @@ -1530,7 +1529,7 @@ es: allowed_iframes: "Una lista de prefijos de dominios para iframe src que discourse puede permitir de forma segura en publicaciones" allowed_crawler_user_agents: "Agentes de usuario de crawlers a los que se debe permitir el acceso al sitio. ¡ADVERTENCIA! ¡CONFIGURAR ESTO INHABILITARÁ A TODOS LOS CRAWLERS QUE NO SE ENCUENTRAN AQUÍ!" blocked_crawler_user_agents: "Palabra única insensible a mayúsculas y minúsculas en la cadena del agente de usuario que identifica a los que no se debe permitir el acceso al sitio. No se aplica si se define una lista de permitidos." - slow_down_crawler_user_agents: "Agentes de usuario de rastreadores web a los que se les debe limitar la velocidad según lo configurado en el ajuste «slow down crawler rate». Cada valor debe tener al menos 3 caracteres." + slow_down_crawler_user_agents: 'Agentes de usuario de rastreadores web a los que se les debe limitar la velocidad según lo configurado en el ajuste «slow down crawler rate». Cada valor debe tener al menos 3 caracteres.' slow_down_crawler_rate: "Si slow_down_crawler_user_agents es especificado, esta proporción aplicará para todos los crawlers (número de segundos de demora entre solicitudes)" content_security_policy: "Activar la política de seguridad de contenido (CSP)" content_security_policy_report_only: "Activar solo el informe de la política de seguridad de contenido (CPS)" diff --git a/config/locales/server.fa_IR.yml b/config/locales/server.fa_IR.yml index 30cca2198b..d36cd02fd7 100644 --- a/config/locales/server.fa_IR.yml +++ b/config/locales/server.fa_IR.yml @@ -883,7 +883,6 @@ fa_IR: max_topic_title_length: "حداکثر طول مجاز عنوان موضوع به نویسه" min_personal_message_title_length: "حداقل طول مجاز عنوان برای پیام به نویسه" min_search_term_length: "حداقل طول واژه جستجوی معتبر به نویسه" - search_tokenize_chinese_japanese_korean: "اجبار جستجو برای tokenize کردن چینی/ژاپنی/کره‌ای حتی در سایت هایی که از این زبان‌ها استفاده نمی‌کنند" search_prefer_recent_posts: "اگر در انجمن بزرگ شما سرعت جست‌وجو کم است، این گزینه در ابتدا نمایه‌ی آخرین فرسته‌ها را می‌گردد." search_recent_posts_size: "تعداد فرسته‌های اخیر برای قرار گرفتن در نمایه" log_search_queries: "کارنامه جستجوهای انجام شده توسط کاربران" diff --git a/config/locales/server.fi.yml b/config/locales/server.fi.yml index 269247a7ea..84cc118935 100644 --- a/config/locales/server.fi.yml +++ b/config/locales/server.fi.yml @@ -1373,7 +1373,6 @@ fi: min_personal_message_title_length: "Yksityisviestin otsikon vähimmäismerkkimäärä" max_emojis_in_title: "Kuinka monta emojia enintään otsikossa" min_search_term_length: "Haun merkkien minimimäärä" - search_tokenize_chinese_japanese_korean: "Pakota haku käsittelemään kiinaa/japania/koreaa myös muunkielisillä sivustoilla" search_prefer_recent_posts: "Jos hakeminen suurelta foorumilta on hidasta, tämä asetus kokeilee indeksiä, jossa tuoreimmat viestit ovat ensin" search_recent_posts_size: "Kuinka monta tuoretta viestiä pidetään indeksissä" log_search_queries: "Pidä lokia käyttäjien tekemistä hauista" diff --git a/config/locales/server.fr.yml b/config/locales/server.fr.yml index f86c20fd76..f6d82010a0 100644 --- a/config/locales/server.fr.yml +++ b/config/locales/server.fr.yml @@ -1373,7 +1373,6 @@ fr: min_personal_message_title_length: "Longueur minimale pour un titre de message en nombre de caractères" max_emojis_in_title: "Nombre maximal d'émojis permis dans le titre d'un sujet" min_search_term_length: "Longueur minimale en caractères du terme à rechercher" - search_tokenize_chinese_japanese_korean: "Forcer la recherche à segmenter les textes chinois, japonais et coréens, même sur les sites n'utilisant pas ces langues par défaut." search_prefer_recent_posts: "Si les recherches dans votre forum sont lentes, cette option effectue l'indexation des messages les plus récents en premier" search_recent_posts_size: "Combien de messages récents à garder dans l'index" log_search_queries: "Archiver les requêtes de recherche des utilisateurs" diff --git a/config/locales/server.gl.yml b/config/locales/server.gl.yml index f72c6fc420..b3ff8475aa 100644 --- a/config/locales/server.gl.yml +++ b/config/locales/server.gl.yml @@ -1330,7 +1330,6 @@ gl: min_personal_message_title_length: "Extensión mínima do título dunha mensaxe en número de caracteres" max_emojis_in_title: "Número máximo de emojis permitido no título dun tema" min_search_term_length: "Extensión mínima dunha busca válida en número de caracteres" - search_tokenize_chinese_japanese_korean: "Forzar a busca para tokenizar chinés/xaponés/coreano incluso en sitios que non sexan CXC" search_prefer_recent_posts: "Se a busca no foro é lenta, esta opción proba primeiro nun índice das publicacións máis recentes" search_recent_posts_size: "Número de publicacións recentes que se manteñen no índice" log_search_queries: "Rexistro de buscas realizadas polos usuarios" diff --git a/config/locales/server.he.yml b/config/locales/server.he.yml index a892aa22b3..dcabd77318 100644 --- a/config/locales/server.he.yml +++ b/config/locales/server.he.yml @@ -1486,7 +1486,8 @@ he: min_personal_message_title_length: "אורך הכותרת המזערי המותר להודעה בתווים" max_emojis_in_title: "מספר האמוג׳ים המרבי בכותרת נושא" min_search_term_length: "מספר התווים המינמלי התקין כאורך מונח לחיפוש" - search_tokenize_chinese_japanese_korean: "אלצו את החיפוש לנתח סינית/יפנית/קוריאנית גם באתרים שאינם בשפות אלו" + search_tokenize_chinese: "לכפות על החיפוש לפרק טקסט בסינית אפילו באתרים שאינם סיניים" + search_tokenize_japanese: "לכפות על החיפוש לפרק טקסט ביפנית אפילו באתרים שאינם יפניים" search_prefer_recent_posts: "אם חיפוש בפורום הגדול שלך אטי, אפשרות זו מנסה לסדר במפתח את הפוסטים החדשים יותר בהתחלה" search_recent_posts_size: "כמה פוסטים חדשים לשמור באינדקס" log_search_queries: "רישום שאילתות חיפוש שמתבצעות על ידי משתמשים" @@ -1513,7 +1514,7 @@ he: editing_grace_period_max_diff: "מספר תווים מרבי שמותר לשנות בטווח עריכת חסד, אם נערכו למעלה מהכמות הזאת יש ליצור מהדורה חדשה לפוסט (דרגות אמון 0 ו־1)" editing_grace_period_max_diff_high_trust: "מספר תווים מרבי שמותר לשנות בטווח עריכת חסד, אם נערכו למעלה מהכמות הזאת יש ליצור מהדורה חדשה לפוסט (דרגות אמון 2 ומעלה)" staff_edit_locks_post: "פוסטים יינעלו מפני עריכה אם נערכו על ידי הסגל." - post_edit_time_limit: "יוצרי פוסטים בדרגת אמון 1 או 0 יכולים לערוך את הפוסטים שלהם עד (n) דקות לאחר הפרסום. 0 כדי לאפשר לערוך לעד.
" + post_edit_time_limit: "יוצרי פוסטים בדרגת אמון 1 או 0 יכולים לערוך את הפוסטים שלהם עד (n) דקות לאחר הפרסום. 0 כדי לאפשר לערוך לעד." tl2_post_edit_time_limit: "מחברים בדרגת אמון 2 ומעלה יכולים לערוך את הפוסטים שלהם (n) דקות לאחר פרסומם. 0 ישבית את ההגבלה הזאת." edit_history_visible_to_public: "לאפשר לכולם לראות גרסאות קודמות של פוסט ערוך. כאשר אפשרות זו מושבתת, רק חברי סגל יכולים לצפות בהן." delete_removed_posts_after: "פוסטים שהוסרו על ידי מחבריהם ימחקו באופן אוטומטי לאחר (n) שעות. אם הגדרה זו מכוונת ל-0, פוסטים ימחקו מיידית." @@ -1524,12 +1525,13 @@ he: fixed_category_positions: "אם אפשרות זו מסומנת, תוכלו לארגן את הקטגוריות כך שיופיעו בסדר קבוע. אם האופציות אינן מסומנות, הקטגוריות יסודרו על פי סדר הפעילות שהתבצעה בהן." fixed_category_positions_on_create: "אם האפשרות תסומן, סדר הקטגוריות יוגדר בתפריט יצירת נושא (דורש fixed_category_positions)." add_rel_nofollow_to_user_content: 'הוספת התווית rel nofollow לכל תוכן שפורסם על ידי המשתמש/ת, פרט לקישורים פנימיים (כולל מתחם הורה parent domains). אם תשנו אפשרות זו, עליכם לאפות מחדש את כל הפרסומים עם: "rake posts:rebake"' - exclude_rel_nofollow_domains: "רשימת שמות התחום שיש להוסיף לקישורים אליהם nofollow. הוספת example.com תאפשר אוטומטית גם את sub.example.com. בתור התחלה, עליך להוסיף את שם התחום של האתר הזה כדי לסייע לסורקי רשת (crawlers) למצוא את כל התוכן. אם חלקים אחרים מהאתר שלך מתארחים בשמות תחום אחרים, אז גם אותם." + exclude_rel_nofollow_domains: "רשימת שמות התחום שאין להוסיף לקישורים אליהם nofollow. הוספת example.com תאפשר אוטומטית גם את sub.example.com. בתור התחלה, עליך להוסיף את שם התחום של האתר הזה כדי לסייע לסורקי רשת (crawlers) למצוא את כל התוכן. אם חלקים אחרים מהאתר שלך מתארחים בשמות תחום אחרים, אז גם אותם." post_excerpt_maxlength: "אורך מקסימלי של קטע פוסט / סיכום." topic_excerpt_maxlength: "האורך המרבי של מקטע מתוך / סיכום של נושא, נוצר מהפוסט הראשון בנושא." show_pinned_excerpt_mobile: "הצגת קטע בנושאים נעוצים במבט ניידים." show_pinned_excerpt_desktop: "הצגת קטע בנושאים נעוצים בתצוגת מחשב-שולחני." post_onebox_maxlength: "אורך מרבי של פוסט ב־Discourse בתיבת תחימה בתווים." + blocked_onebox_domains: "רשימה של שמות תחום שלא יתחמו בתיבה, למשל: wikipedia.org\n(אין תמיכה בתווי הכללה כגון * או ?)" allowed_inline_onebox_domains: "רשימת שמות מתחם שיופיעו בתיבות תחימה בתצורה המזערית שלהם אם הקישור מופיע ללא כותרת" enable_inline_onebox_on_all_domains: "להתעלם מהגדרת האתר inline_onebox_domain_allowlist (רשימת היתר של שמות תחום לתיבת תחימה משולבת) ולאפשר תיבות תחימה לכל שמות המתחם." force_custom_user_agent_hosts: "מארחים שמולם משתמשים בסוכן משתמש onebox בהתאמה אישית לכל הבקשות. (חיוני במיוחד למארחים שמגבילים גישה בהתאם לסוכן משתמש)." @@ -1565,7 +1567,7 @@ he: enable_system_message_replies: "מאפשר למשתמשים להגיב להודעות מערכת אפילו כשהודעות אישיות מושבתות" enable_long_polling: "באס הודעות שמשמש להתראות יכול להשתמש בתשאול ארוך (long polling)" enable_chunked_encoding: "הפעלת תגובות קידוד מחולקות מצד השרת. תכונה זו עובדת ברוב התצורות אך חלק מהמתווכים עשויים לכלוא כצעד ביניים, מה שעלול לגרום להאטה" - long_polling_base_url: "בסיס ה-URL שנמצא בשימוש עבור long polling (כאשר CDN מחזיר תוכן דינמי, זכרו להגדיר את ערך זה ל-Origin pull, דוגמת http://origin.site.com)" + long_polling_base_url: "כתובת הבסיס שמשמשת לתשאול ארוך (כאשר CDN מגיש תוכן דינמי, יש להגדיר זאת למשיכה המקורית) למשל: http://origin.site.com" long_polling_interval: "כמות הזמן שהשרת צריך לחכות לפני שעונה ללקוחות, כאשר אין מידע לשליחה (משתמשים רשומים מחוברים למערכת בלבד)" polling_interval: "כאשר לא מבצעים תשאול ארוך (long polling), כל כמה זמן לקוחות מחוברים למערכת יבצעו poll, במילי-שניות" anon_polling_interval: "באיזו תכיפות לקוחות אלמוניים יתשאלו, במילישניות" @@ -1573,12 +1575,12 @@ he: hide_post_sensitivity: "הסבירות שפוסט שסומן בדגל יוסתר" silence_new_user_sensitivity: "הסבירות שמשתמש חדש יושתק עקב סימוני דגל ספאם" auto_close_topic_sensitivity: "הסבירות שנושא שסומן בדגל ייסגר אוטומטית" - cooldown_minutes_after_hiding_posts: "מספר הדקות שמשתמשים חייבים לחכות לפני שהם יכולים לערוך פוסט שהוסתר בגלל דיגלול קהילתי" + cooldown_minutes_after_hiding_posts: "מספר הדקות שמשתמשים חייבים לחכות לפני שהם יכולים לערוך פוסט שהוסתר בגלל סימון קהילתי" max_topics_in_first_day: "הכמות המקסימלית של נושאים שמשתמשים מורשים ליצור ב 24 השעות הראשונות לאחר הפוסט הראשון שלהם" max_replies_in_first_day: "הכמות המקסימלית של תגובות שמשתמשים מורשים ליצור ב 24 השעות הראשונות אחרי יצירת הפוסט הראשון שלהם" - tl2_additional_likes_per_day_multiplier: "להגדיל את כמות הלייקים האפשרית ביום עבור tl2 (משתמש) באמצעות הכפלה במספר זה. " + tl2_additional_likes_per_day_multiplier: "להגדיל את כמות הלייקים האפשרית ביום עבור דרגת אמון 2 (חברים) באמצעות הכפלה במספר זה" tl3_additional_likes_per_day_multiplier: "הכפלה במספר הזה מגדילה את מגבלת הלייקים ליום עבור דרגת אמון 3 (רגיל)" - tl4_additional_likes_per_day_multiplier: "להגדיל את כמות הלייקים האפשרית ביום עבור tl4 (מנהיג) באמצעות הכפלה במספר זה. " + tl4_additional_likes_per_day_multiplier: "להגדיל את כמות הלייקים האפשרית ביום עבור דרגת אמון 4 (הנהגה) באמצעות הכפלה במספר זה" tl2_additional_edits_per_day_multiplier: "להגדיל את כמות העריכות האפשרית ביום עבור דרגת אמון 2 (חברים) באמצעות הכפלה במספר זה" tl3_additional_edits_per_day_multiplier: "להגדיל את כמות העריכות האפשרית ביום עבור דרגת אמון 3 (רגיל) באמצעות הכפלה במספר זה" tl4_additional_edits_per_day_multiplier: "להגדיל את כמות העריכות האפשרית ביום עבור דרגת אמון 4 (הנהגה) באמצעות הכפלה במספר זה" @@ -1616,14 +1618,14 @@ he: allowed_iframes: "רשימה של קידומות שמות מתחם בתור מקור של iframe שאפשר לאפשר בבטחה בפוסטים ב־Discourse" allowed_crawler_user_agents: "סוכני משתמשים של סורקי רשת שמורשים לגשת לאתר. אזהרה! שינוי הגדרה זו תחסום את כל הסורקים שאינם מופיעים כאן!" blocked_crawler_user_agents: "מילה ייחודית שאינה תלוית רישיות במחרוזת סוכן המשתמש (user agent) שמגדירה לאילו סורקי רשת אין הרשאת גישה לאתר. לא חל במקרה שהגדרת רשימת היתר." - slow_down_crawler_user_agents: "סוכני משתמשים של סורקי רשת שכמות הגישה שלהם תוגבל בהתאם להגדרה „האטת קצב סורקי רשת”. כל ערך חייב להיות באורך של 3 תווים לפחות." + slow_down_crawler_user_agents: 'סוכני משתמשים של סורקי רשת שכמות הגישה שלהם תוגבל בהתאם להגדרה „האטת קצב סורקי רשת”. כל ערך חייב להיות באורך של 3 תווים לפחות.' slow_down_crawler_rate: "אם הוגדר slow_down_crawler_user_agents (האטת סורקי אינטרנט) קצב זה יחול על כל סורקי האינטרנט (כמות ההמתנה בשניות בין בקשות)" content_security_policy: "הפעלת Content-Security-Policy (מדיניות אבטחת תוכן)" content_security_policy_report_only: "הפעלת Content-Security-Policy-Report-Only (מדיניות אבטחת תוכן בדיווח בלבד)" content_security_policy_collect_reports: "הפעלת איסוף דוחות הפרה של CSP (מדיניות אבטחת תוכן) תחת ‎/csp_reports" content_security_policy_frame_ancestors: "להגביל מי יכול להטמיע את האתר הזה עם מסגרות iframes דרך CSP. ניתן לשלוח במארחים המורשים דרך הטמעה" content_security_policy_script_src: "מקורות סקריפטים נוספים ברשימת ההיתר. המארח וה־CDN הנוכחיים נכללים כבררת מחדל. ניתן לעיין בהתקפות XSS בעזרת CSP - מדיניות אבטחת תוכן." - invalidate_inactive_admin_email_after_days: "חשבונות מנהלים שלא ביקרו באתר מעל כמות כזו של ימים יאלצו לאמת מחדש את כתובת הדוא״ל שלהם כדי לשוב ולהיכנס. להגדיר כ־0 כדי לנטרל." + invalidate_inactive_admin_email_after_days: "חשבונות מנהלים שלא ביקרו באתר מעל כמות כזו של ימים יאלצו לאמת מחדש את כתובת הדוא״ל שלהם כדי לשוב ולהיכנס. להגדיר כ־0 כדי להשבית." top_menu: "החליטו אילו פריטים יופיעו בניווט עמוד הבית ובאיזה סדר לדוגמה |אחרונים|חדשים|קטגוריות|מובילים|נקראו|פורסמו|סימניות" post_menu: "החליטו אילו פריטים מופיעים בתפריט הפוסט, ובאיזה סדר. למשל like|edit|flag|delete|share|bookmark|reply" post_menu_hidden_items: "פריטי התפריט להסתרה כברירת מחדל בתפריט הפוסט, אלא אם כן נלחץ לחצן ההרחבה." @@ -1754,8 +1756,8 @@ he: max_post_deletions_per_day: "מספר הפוסטים המרבי שמשתמש יכול למחוק ביום אחד. 0 ישבית מחיקת פוסטים." invite_link_max_redemptions_limit: "כמות הניצולים המרבית שמורשית לקישורים הזמנה לא יכולה לעבור את הערך הזה." invite_link_max_redemptions_limit_users: "כמות הניצולים המרבית שמורשית לקישורי הזמנה שנוצרו על ידי משתמשים רגילים לא יכולה לעבור את הערך הזה." - alert_admins_if_errors_per_minute: "מספר השגיאות בדקה לפני ששולחים התראה למנהל. ערך של 0 מנטרל אפשרות זו. שימו לב: מצריך הרצה מחדש." - alert_admins_if_errors_per_hour: "מספר השגיאות בשעה לפני ששולחים התראה למנהל. ערך של 0 מנטרל אפשרות זו. שימו לב: מצריך הרצה מחדש." + alert_admins_if_errors_per_minute: "מספר השגיאות בדקה לפני שליחת התראה למנהל. 0 משבית אפשרות זו. לתשומת לבך: דורש הפעלה מחדש." + alert_admins_if_errors_per_hour: "מספר השגיאות בשעה לפני שליחת התראה למנהל. 0 משבית אפשרות זו. לתשומת לבך: דורש הפעלה מחדש." categories_topics: "מספר הנושאים להציג בעמוד ה־‎/categories (קטגוריות). אם הוגדר ל־0, יתבצע ניסיון למצוא ערך שישאיר את שתי העמודות סימטריות (קטגוריות ונושאים)." suggested_topics: "מספר הנושאים המוצעים שיופיעו בתחתית הנושא המוצג." limit_suggested_to_category: "להציג רק נושאים מהקטגוריה הנוכחית ברשימת הנושאים המומלצים." @@ -1848,7 +1850,7 @@ he: max_here_mentioned: "מספר האנשים המרבי שמוזכרים על ידי ‎@here." min_trust_level_for_here_mention: "דרגת האמון המזערית המורשית להזכיר את ‎@here." create_thumbnails: "יצירת תמונות מוקטנות והארת תמונות גדולות מידי מלהיכלל בפוסט." - email_time_window_mins: "המתינו (n) דקות לפני משלוח כל התראת מייל, כדי לאפשר למשתמשים הזדמנות לערוך ולוודא באופן סופי את הפוסטים שלהם." + email_time_window_mins: "להמתין (n) דקות בטרם כל שליחת התראה בדוא״ל, כדי לאפשר למשתמשים הזדמנות לערוך ולוודא באופן סופי את הפוסטים שלהם." personal_email_time_window_seconds: "להמתין (n) שניות בטרם שליחת הודעות בדוא״ל עם התראות על הודעות אישיות, כדי לתת למשתמשים הזדמנות לסיים את עריכת ההודעות שלהם." email_posts_context: "כמה תגובות קודמות יש לכלול כהקשר בהתראות בדוא״ל." flush_timings_secs: "באיזו תדירות אנחנו מזרימים מידע לשרת, בשניות." @@ -1862,14 +1864,14 @@ he: min_title_similar_length: "האורך המינימלי של כותרת לפני שהיא נבדקת עבור איתור נושאים דומים." desktop_category_page_style: "סגנון ויזואלי לדף /categories." category_colors: "רשימה של ערכי צבעים הקסדצימליים מותרים לסימון קטגוריות." - category_style: "סגנון ויזואלי עבור עיטורי קטגוריות." + category_style: "סגנון חזותי עבור עיטורי קטגוריות." default_dark_mode_color_scheme_id: "ערכת הצבעים לשימוש במצב כהה." dark_mode_none: "בלי" max_image_size_kb: "גודל ההעלאה המרבי בקילובתים. יש להגדיר זאת ב־nginx‏ (client_max_body_size) / apache או גם למתווך. תמונות שחורגות מהגודל הזה וקטנות מההגדרה client_max_body_size יערכו כך שגודלן יתאים להעלאה." max_attachment_size_kb: "הגודל המקסימלי בקילו-בתים (kBs) של קבצים להעלאה. הגדרה זו חייבת להיות מוגדרת ב-nginx (client_max_body_size) / apache או בפרוקסי." authorized_extensions: "רשימה של סיומות מותרות להעלאה (השתמשו ב '*' כדי לאפשר את כל סוגי הקבצים)" authorized_extensions_for_staff: "רשימת סיומות קבצים שמותר לחברי סגל להעלות בנוסף לרשימה שמוגדרת תחת הגדרת האתר `authorized_extensions` (‚*’ כדי לקבל את כל סוגי הקבצים)" - theme_authorized_extensions: "רשימת סיומות קבצים שמורשות עבור העלאת תמות (השתמשו ב '*' כדי לאפשר את כל סוגי הקבצים)" + theme_authorized_extensions: "רשימת סיומות קבצים שמורשים במסגרת העלאת ערכת עיצוב (‚*’ כדי לאפשר את כל סוגי הקבצים)" max_similar_results: "כמה נושאים דומים להציג מעל לעורך כאשר מחברים נושא חדש. ההשוואה מבוססת על הכותרת וגוף הפוסט." max_image_megapixels: "מספר המגה פיקסלים המרבי שמותר בתמונה. תמונות עם מגה פיקסלים מעבר לכמות זו תידחנה." title_prettify: "מניעת טעויות נפוצות בכותרת, בכללן טעויות עם אותיות גדולות באנגלית, מספר ! ו ?, נקודה מיותרת בסוף, וכד׳" @@ -1904,7 +1906,7 @@ he: num_flaggers_to_close_topic: "מספר מינימלי של דגלים שונים שנדרש כדי להשהות באופן אוטומטי אפשות להתערב בנושא" num_hours_to_close_topic: "מספר שעות לעצירת נושא לצורך התערבות." auto_respond_to_flag_actions: "הפעלת תגובה אוטומטית עם הסרת דגל." - min_first_post_typing_time: "זמן מינימלי במילי-שניות שמשתמש חייב להקיש בזמן הפוסט הראשון, אם הסף לא נעבר הפוסט אוטומטית יכנס לתור של אלו שצריכים אישור. קיבעו 0 כדי לנטרל (לא מומלץ)" + min_first_post_typing_time: "הזמן המזערי במילישניות שעל משתמש להקליד במהלך הפוסט הראשון, אם לא הגיע לסף הפוסט ייכנס אוטומטית לתור ההמתנה לאישור. 0 להשבתה (לא מומלץ)" auto_silence_fast_typers_on_first_post: "להשתיק אוטומטית משתמשים שאינם עונים ל־min_first_post_typing_time (זמן התגובה המזערי לפוסט ראשון)" auto_silence_fast_typers_max_trust_level: "דרגת האמון המרבית להשתקה אוטומטית של קלדנים נמרצים" reviewable_claiming: "האם צריך לדרוש תוכן שמיועד לסקירה לפני שאפשר לפעול לגביו?" @@ -1919,7 +1921,7 @@ he: alternative_reply_by_email_addresses: "רשימה של כמה תבניות לתגובות במייל באמצעות כתובות מייל נכנסות. למשל: %%{reply_key}@reply.example.com|replies+%%{reply_key}@example.com" incoming_email_prefer_html: "להשתמש ב־HTML במקום בטקסט בהודעות דוא״ל נכנסות." strip_incoming_email_lines: "להסיר רווחים מובילים וסוגרים בכל שורה בהודעות דוא״ל נכנסות." - disable_emails: "למנוע מ־Discourse לשלוח כל סוג של הודעות דוא״ל. יש לבחור ב־‚כן’ כדי לנטרל את כל הודעות הדוא״ל לכל המשתמשים. ניתן גם לבחור ב־‚ללא סגל’ כדי לנטרל את ההודעות למשתמשים שאינם נמנים עם הסגל." + disable_emails: "למנוע מ־Discourse לשלוח כל סוג של הודעות דוא״ל. יש לבחור ב־‚כן’ כדי להשבית את כל הודעות הדוא״ל לכל המשתמשים. ניתן גם לבחור ב־‚ללא סגל’ כדי להשבית את ההודעות למשתמשים שאינם נמנים עם הסגל." strip_images_from_short_emails: "הסרת תמונות מהודעות דוא״ל שגודלן אינו עולה על 2800 בתים" short_email_length: "אורכו של דוא״ל קצר בבתים" display_name_on_email_from: "להציג שמות מלאים בשדה „מאת” בדוא״ל" @@ -2024,7 +2026,7 @@ he: allow_profile_backgrounds: "אפשרו למשתמשים להעלות רקעים לפרופיל." sequential_replies_threshold: "מספר הפוסטים שעל משתמש לפרסם אחד-לאחר-השני בנושא לפני שמזכירים לו שהוא משאיר יותר מידי תגובות ברצף." get_a_room_threshold: "מספר פוסטים שמשתמשים צריכים להכין לאותו אדם באותו הנושא לפני שהם מוזהרים." - enable_mobile_theme: "מכשירים ניידים משתמשים בתבנית ידידותית אליהם, עם היכולת להחליף אותה לאתר המלא. נטרלו זאת אם אתם מעוניינים ב stylesheet מותאם שהוא רספונסיבי לחלוטין." + enable_mobile_theme: "מכשירים ניידים משתמשים בערכת עיצוב מותאמת לניידים לצד האפשרות לעבור לאתר המלא. ניתן להשבית זאת כדי להשתמש בערכת סגנון מסתגלת לחלוטין." dominating_topic_minimum_percent: "איזה אחוז מהפוסטים משתמש צריך לייצר בנושא לפני שיקבל תזכורת לגבי שתלטנות יתר על הנושא." disable_avatar_education_message: "ניטרול הודעה שמלמדת על שינוי דמות." suppress_uncategorized_badge: "אל תציגו את העיטור לנושאים נטולי קטגוריה ברשימת הנושאים." @@ -2044,17 +2046,17 @@ he: app_association_android: "תכני נקודת הקצה ‎.well-known/assetlinks.json שמשמשת לטובת ה־API של Google's Digital Asset Links." app_association_ios: "תכני נקודת הקצה apple-app-site-association שמשמשת ליצירת Universal Links (קישורים אוניברסליים) בין האתר הזה ויישומוני iOS." share_anonymized_statistics: "שיתוף סטטיסטיקת שימוש אלמונית." - auto_handle_queued_age: "לטפל אוטומטית ברשומות שממתינות לסקירה לאחר כמות כזו של ימים. ללא התחשבות בדגלים. פוסטים ומשתמשים שממתינים בתור יידחו. יש להגדיר ל־0 כדי לנטרל את התכונה הזו." + auto_handle_queued_age: "לטפל אוטומטית ברשומות שממתינות לסקירה לאחר כמות כזו של ימים. ללא התחשבות בדגלים. פוסטים ומשתמשים שממתינים בתור יידחו. יש להגדיר ל־0 כדי להשבית את התכונה הזו." penalty_step_hours: "עונשי ברירת מחדל להשתקה או השעייה של משתמשים בשעות. ברירת המחדל לעבירה הראשונה היא הערך הראשון, ברירת המחדל לעבירה השנייה היא הערך השני וכן הלאה וכן הלאה." svg_icon_subset: "הוספת סמלים נוספים מתוך FontAwesome 5 אותם ברצונך לכלול בין המשאבים שלך. יש להשתמש בקידומת ‚fa-‎’ לסמלים אחידים, ‚far-‎’ לסמלים רגילים וב־‚fab-‎’ לסמלים ממותגים." - max_prints_per_hour_per_user: "מספר מקסימלי של צפיות בדף /print (הדפסה) (קיבעו ל 0 כדי לנטרל)" + max_prints_per_hour_per_user: "מספר החשיפות המרבי לדף ‎/print (0 להשבתה)" full_name_required: "שם מלא הוא שדה נדרש לפרופיל משתמש/ת." enable_names: "הצגת השם המלא של המשתמש בפרופיל, כרטיס המשתמש והודעות הדוא״ל של המשתמש. ניתן להשבית כדי להסתיר את השם המלא בכל מקום." display_name_on_posts: "הצגת שמם המלא של משתמשים בפוסטים שלהם, בנוסף ל@שם_המשתמש שלהם." show_time_gap_days: "אם שני פוסטים נוצרים בהפרש כזה של ימים זה מזה, להציג את הפרש הזמן בנושא." short_progress_text_threshold: "לאחר שמספר הפוסטים בנושא עוברים את המספר הזה, מד ההתקדמות יציג רק את המספר של הפוסט הנוכחי. אם תשנו את רוחב מד ההתקדמות, ייתכן שתצטרכו לשנות ערך זה." default_code_lang: "הדגשת תחביר כבררת מחדל שתחול על מקטעי קוד מ־GitHub (auto,‏ nohighlight,‏ ruby,‏ python וכו׳)" - warn_reviving_old_topic_age: "כאשר מישהם מתחילים להגיב לנושא שבו התגובה האחרונה היא בת יותר מכמה ימים, אזהרה תוצג. נטרלו באמצעות הזנה של 0." + warn_reviving_old_topic_age: "כשמשתמש מתחיל להגיב לנושא בו התגובה האחרונה נכתבה לפני למעלה מכמות זו של ימים, תופיע אזהרה. 0 להשבתה." autohighlight_all_code: "לחייב שימוש בקוד הדגשה לכל קוד מעוצב מראש (preformatted code blocks) אפילו אם הם אינם מציינים את השפה." highlighted_languages: "כללי הדגשת תחביר להכללה. (אזהרה: הכללה של שפות רבות מדי פוגעת בביצועים) להדגמה: https://highlightjs.org/static/demo" show_copy_button_on_codeblocks: "הוספת כפתור למקטעי קוד כדי להעתיק את תוכני המקטע ללוח הגזירים של המשתמש." @@ -2072,12 +2074,12 @@ he: show_create_topics_notice: "אם לאתר פחות מ־5 נושאים פומביים, יש להציג מודעה המבקשת מהמנהלים ליצור נושאים נוספים." delete_drafts_older_than_n_days: "מחקו טיוטות בנות יותר מ (n) ימים." delete_merged_stub_topics_after_days: "מספר הימים להמתנה לפני מחיקה אוטומטית של נושאים מקוצרים שמוזגו במלואם. יש להגדיר ל־0 כדי לא למחוק נושאים מקוצרים לעולם." - bootstrap_mode_min_users: "מספר משתמשים מינימלי שנדרש כדי לנטרל מצב איתחול (קבעו ל 0 כדי לנטרל)" + bootstrap_mode_min_users: "מספר משתמשים מזערי שנדרש כדי להשבית מצב ראשוניות (0 להשבתה)" prevent_anons_from_downloading_files: "למנוע ממשתמשים אלמוניים להוריד קבצים מצורפים." secure_media: 'מגביל גישה לכל ההעלאות (תמונות, סרטונים, שמע, טקסט, קובצי PDF, ארכיוני zip ועוד). אם מופעלת האפשרות „דרישת כניסה”, רק משתמשים שנכנסו למערכת יכולים לגשת להעלאות. אחרת, הגישה תוגבל רק להעלאות מסוגי מדיה בהודעות פרטיות ובקטגוריות פרטיות. אזהרה: מדובר בהגדרה מסובכת שדורשת הבנה עמוקה בניהול המערכת. יש לעיין בנושא המדיה המאובטחת ב־Meta לקבלת פרטים נוספים.' secure_media_allow_embed_images_in_emails: "מאפשר להטמיע תמונות מאובטחות שבדרך כלל יידחסו אם הגודל שלהן קטן מההגדרה ‚secure media max email embed image size kb’ (גודל תמונה מרבי להטמעה כמדיה מאובטחת בקילובתים)." secure_media_max_email_embed_image_size_kb: "גודל החיתוך לתמונות מאובטחות שיוטמעו בהודעות דוא״ל אם ההגדרה ‚secure media allow embed in emails’ (לאפשר הטמעת מדיה מאובטחת בהודעות דוא״ל) פעילה. אם ההגדרה הזאת אינה פעולה להגדרה זו אין שום משמעות." - slug_generation_method: "נא לבחור שיטת יצירת כתובת מופשטת. ‚מוצפן’ ייצר מחרוזת עם קידוד באחוזים, ‚ללא’ ישבית את הכתובת המופשטת לחלוטין." + slug_generation_method: "נא לבחור שיטת יצירת כתובת מופשטות. ‚מוצפן’ ייצר מחרוזת עם קידוד באחוזים, ‚ללא’ ישבית את הכתובת המופשטת לחלוטין." enable_emoji: "הפעלת אמוג׳י" enable_emoji_shortcuts: "חייכנים נפוצים כגון ‎:) :p :(‎ יומרו לאמוג׳ים" emoji_set: "איך בא לך את האמוג׳י שלך?" @@ -2087,7 +2089,7 @@ he: approve_unless_trust_level: "פוסטים של משתמשים מתחת לדרגת אמון זו חייבים לעבור אישור" approve_new_topics_unless_trust_level: "נושאים חדשים של משתמשים מתחת לדרגת אמון זו חייבים לעבור אישור" approve_unless_staged: "יש לאשר נושאים ופוסטים חדשים עבור משתמשים מבוימים" - notify_about_queued_posts_after: "אם יש פוסטים שממתינים לסקירה מעבר לכמות כזו של שעות, יש לשלוח התראה לכל המפקחים. יש להגדיר ל־0 כדי לנטרל את ההתראות האלה." + notify_about_queued_posts_after: "אם יש פוסטים שממתינים לסקירה מעבר לכמות כזו של שעות, יש לשלוח התראה לכל המפקחים. 0 משבית את ההתראות האלה." auto_close_messages_post_count: "מספר פוסטים מקסימלי בהודעה לפני שהיא נסגרת אוטומטית (0 לניטרול)" auto_close_topics_post_count: "מספר מקסימלי של פוסטים בנושא לפני שהוא נסגר אוטומטית (0 להשבתה)" auto_close_topics_create_linked_topic: "ליצור נושא חדש מקושר כאשר נושא נסגר אוטומטית עקב ההגדרה ‚לסגור אוטומטית נושאים בהתאם לכמות פוסטים’" @@ -2179,6 +2181,7 @@ he: share_quote_visibility: "קביעה מתי להציג כפתורי שיתוף ציטוטים: אף פעם למשתמשים אלמוניים בלבד או לכל המשתמשים. " create_revision_on_bulk_topic_moves: "יצירת מהדורה לפוסטים הראשונים כאשר הנושאים מועברים לקטגוריה חדשה במרוכז." allow_changing_staged_user_tracking: "לאפשר שינוי העדפות של קטגוריית המשתמשים המבוימים ותגיות על ידי ההנהלה." + use_email_for_username_and_name_suggestions: "להשתמש בחלק הראשון של כתובת הדוא״ל כשם משתמש והצעה לשם. נא לשים לב שזה מקל על אנשים לנחש את כתובות הדוא״ל המלאות (כיוון שרוב האנשים חולקים שירותים נפוצים כגון `gmail.com`)." errors: invalid_css_color: "צבע שגוי. נא למלא את שם הצבע או ערך הקסדצימלי." invalid_email: "כתובת דוא״ל שגויה." @@ -2198,6 +2201,7 @@ he: invalid_json: "JSON פגום." invalid_reply_by_email_address: "הערך חייב להכיל '%{reply_key}' ולהיות שונה ממייל ההתראה." invalid_alternative_reply_by_email_addresses: "על כל הערכים לכלול ‚%{reply_key}’ ולהיות שונים מהדוא״ל לעדכונים." + invalid_domain_hostname: "אסור לכלול את התווים * או ?." pop3_polling_host_is_empty: "עליכם לקבוע 'שרת תשאול pop3' לפני שתאפשרו תשאול POP3." pop3_polling_username_is_empty: "עליכם לקבוע 'שם-משתמש לתשאול pop3' לפני שתאפשרו תשאול POP3." pop3_polling_password_is_empty: "עליכם לקבוע 'סיסמת תשאול pop3' לפני שתאפשרו תשאול POP3." @@ -2206,7 +2210,7 @@ he: email_polling_disabled: "עליכם לאפשר ידני או תשאול POP3 לפני שתאפשרו מענה באמצעות מייל." user_locale_not_enabled: "לפני שתוכלו להפעיל אפשרות זאת, יש לאפשר \"הגדרות מקומיות מותאמות משתמש/ת\"" invalid_regex: "ביטוי רגולרי לא תקין או לא מותר." - email_editable_enabled: "עליך לנטרל את ‚עריכת דוא״ל אפשרית’ בטרם הפעלת הגדרה זו." + email_editable_enabled: "עליך להשבית את ‚עריכת דוא״ל אפשרית’ בטרם הפעלת הגדרה זו." staged_users_disabled: "עליך לאפשר ‚משתמשים מבוימים’ בטרם הפעלת הגדרה זו." reply_by_email_disabled: "עליך להפעיל את ‚תגובה בדוא״ל’ בטרם הפעלת הגדרה זו." discourse_connect_url_is_empty: "עליך להגדיר ‚כתובת discourse connect’ בטרם הפעלת הגדרה זו." @@ -2227,6 +2231,8 @@ he: unicode_usernames_avatars: "התמונות הייצוגיות הפנימיות של המערכת אינן תומכות בשמות משתמשים עם יוניקוד." list_value_count: "הרשימה חייבת להכיל בדיוק %{count} ערכים." google_oauth2_hd_groups: "עליך להגדיר את ‚google oauth2 hd’ בטרם הפעלת ההגדרה הזאת." + search_tokenize_chinese_enabled: "עליך להשבית את ‚search_tokenize_chinese’ (חיפוש מפרק סינית) בטרם הפעלת הגדרה זו." + search_tokenize_japanese_enabled: "עליך להשבית את ‚search_tokenize_japanese’ (חיפוש מפרק יפנית) בטרם הפעלת הגדרה זו." placeholder: discourse_connect_provider_secrets: key: "www.example.com" @@ -3637,9 +3643,9 @@ he: title: "התראת דוא״ל ישן" subject_template: "[%{email_prefix}] כתובת הדוא״ל שלך הוחלפה" text_body_template: | - זוהי הודעה אוטומטית כדי ליידע אתכם שכתובת המייל שלכם עבור %{site_name} שונתה. אם זה נעשה בטעות, אנא צרו קשר עם מנהל האתר. + זוהי הודעה אוטומטית כדי ליידע אותך שכתובת הדוא״ל שלך עבור %{site_name} הוחלפה. אם זה נעשה בטעות, נא ליצור קשר עם הנהלת האתר. - כתובת המייל שלכם שונתה ל: + כתובת הדוא״ל שלך שונתה לכדי: %{new_email} notify_old_email_add: @@ -4439,7 +4445,7 @@ he: name: "המשתמש/ת החדש/ה של החודש" description: תרומות יוצאות מהכלל בחודש הראשון שלהם long_description: | - עיטור זה מוענק כדי לברך שני משתמשים חדשים בכל חודש בעבור תרומות מצטיינות שלהם, שנמדדות לפי תדירות הלייקים לפוסטים שלכם, וממי הם ניתנו. + עיטור זה מוענק כדי לברך שני משתמשים חדשים בכל חודש בעבור תרומות מצטיינות שלהם, שנמדדות לפי תדירות הלייקים לפוסטים שלהם, וממי הם ניתנו. enthusiast: name: נלהב description: ביקור במשך 10 ימים ברצף כל יום @@ -4515,8 +4521,8 @@ he: title: "כנסו למצב בטוח" description: "מצב בטוח מאפשר לכם לבחון את האתר שלכם מבלי לטעון תוספים או התאמות אתר." no_customizations: "ניטרול של תמה נוכחית" - only_official: "נטרלו תוספים לא רשמיים" - no_plugins: "נטרלו את כל התוספים" + only_official: "השבתת תוספים בלתי רשמיים" + no_plugins: "השבתת כל התוספים" enter: "כנסו למצב בטוח" must_select: "עליך לבחור באפשרות אחת לפחות כדי להיכנס למצב בטוח." wizard: @@ -4546,7 +4552,7 @@ he: fields: welcome: label: "נושא ברוכים-הבאים" - description: "

כיצד הייתם מתארים את הקהילה שלכם לאדם זר במעלית אם יש לכם רק דקה 1?

  • עבור מי נועדו דיונים אלו?
  • מה אוכל למצוא פה?
  • למה כדאי לי לבקר?

נושא הברוכים-הבאים שלכם הוא הדבר הראשון שמבקרים חדשים יקראו. חישבו עליו כפסקה אחת של ׳נאום המעלית׳ או ׳הצהרת הכוונות׳ שלכם.

" + description: "

איך לדעתך ראוי לתאר את הקהילה שלך לאנשים זרים שפגשת במעלית למשך בערך דקה?

  • למי מיועדים הדיונים?
  • מה אפשר למצוא כאן?
  • מדוע כדאי לי לבקר?

נושא קבלת הפנים שלך הוא הדבר הראשון שייקראו המתעניינים החדשים. כדאי להתייחס אליו בתור ‚נאום מעלית’ או ‚הצהרת כוונות’ של פסקה אחת.

" one_paragraph: "אנא הגבילו את הודעת הברוכים-הבאים שלכם לפסקה אחת." extra_description: "במקרה של ספק ניתן לדלג על השלב הזה ולערוך את קבלת הפנים ואת הנושא בהמשך." privacy: diff --git a/config/locales/server.hu.yml b/config/locales/server.hu.yml index 44accb85e0..3569072bc5 100644 --- a/config/locales/server.hu.yml +++ b/config/locales/server.hu.yml @@ -884,13 +884,15 @@ hu: site_settings: disabled: "kikapcsolva" max_emojis_in_title: "A témacímekben lévő emodzsik legnagyobb száma" + search_tokenize_chinese: "A keresés kényszerítése, hogy tokenizálja a kínait, még a nem kínai oldalakon is" + search_tokenize_japanese: "A keresés kényszerítése, hogy tokenizálja a japánt, még a nem japán oldalakon is" notify_users_after_responses_deleted_on_flagged_post: "Ha egy bejegyzést jelentenek, majd eltávolítanak, akkor minden olyan felhasználó értesítést kap, aki válaszolt a bejegyzésre, és ezért a válaszait eltávolították." post_excerpt_maxlength: "A bejegyzés kivonatának / összefoglalójának maximális hossza." topic_excerpt_maxlength: "A témakör kivonatának / összefoglalójának maximális hossza a téma első bejegyzéséből generálva." blocked_onebox_domains: "Azok a domainek, amelyek soha nem kerülnek dobozba, például wikipedia.org\n(A * ? helyettesítő karakterek nem támogatottak)" enforce_second_factor: "Kényszeríti a felhasználókat, hogy engedélyezzék a kétfaktoros hitelesítést. Válassza az 'all' lehetőséget, hogy érvényesítse az összes felhasználó számára. Válassza a „személyzet” lehetőséget, hogy csak a személyzet felhasználói számára érvényesítse." use_admin_ip_allowlist: "Az adminokk csak akkor tudnak bejelentkezni, ha a Screened IPs listában megadott IP-címmel vannak megadva (Admin > Naplók > Screened Ips)." - slow_down_crawler_user_agents: "A forgalmi korlátozás alá elő webes robotok felhasználói ügynökei, ahogy a „robotok sebességének lelassítása” beállításban meg van adva. Minden egyes értéknek legalább 3 karakteresnek kell lennie." + slow_down_crawler_user_agents: 'A forgalmi korlátozás alá elő webes robotok felhasználói ügynökei, ahogy a „robotok sebességének lelassítása” beállításban meg van adva. Minden egyes értéknek legalább 3 karakteresnek kell lennie.' enable_badges: "A jelvény rendszer engedélyezése" normalize_emails: "Ellenőrizze, hogy a normalizált e-mail egyedi-e. A normalizált e-mail eltávolítja az összes pontot a felhasználónévből, és mindent, ami a + és a @ szimbólumok között található." hide_email_address_taken: "Ne tájékoztassa a felhasználókat arról, hogy létezik fiók egy adott e-mail-címmel a regisztráció során vagy az elfelejtett jelszó folyamata során. Teljes e-mail-cím megkövetelése az „elfelejtett jelszó” kérésekhez." @@ -944,6 +946,8 @@ hu: min_username_length_range: "Nem lehet a legnagyobb értéknél nagyobb legkisebb értéket beállítani." max_username_length_range: "Nem lehet a legkisebb értéknél kisebb legnagyobb értéket beállítani." google_oauth2_hd_groups: "A beállítás engedélyezése előtt be kell ezt állítania: „google oauth2 hd”." + search_tokenize_chinese_enabled: "A beállítás engedélyezése előtt le kell tiltania a „search_tokenize_chinese” beállítást." + search_tokenize_japanese_enabled: "A beállítás engedélyezése előtt le kell tiltania a „search_tokenize_japanese” beállítást." search: within_post: "#%{post_number}, szerző: %{username}" types: diff --git a/config/locales/server.hy.yml b/config/locales/server.hy.yml index 7619578783..332fc5ae11 100644 --- a/config/locales/server.hy.yml +++ b/config/locales/server.hy.yml @@ -1069,7 +1069,6 @@ hy: min_personal_message_title_length: "Հաղորդագրության վերնագրի նվազագույն թույլատրելի երկարությունը սիվոլներով" max_emojis_in_title: "Թեմայի վերնագրում առավելագույն թույլատրելի էմոջիները" min_search_term_length: "Որոնման վավեր արտահայտության նվազագույն երկարությունը սիմվոլներով" - search_tokenize_chinese_japanese_korean: "Պարտադրված որոնում՝ կոդանշանավորելու չինարենը/ճապոներենը/կորեերենը նույնիսկ ոչ ՉՃԿ կայքերում" search_prefer_recent_posts: "Եթե Ձեր մեծ ֆորումում որոնելը դանդաղ է, այս տարբերակը սկզբում փորձում է փնտրել ավելի թարմ գրառումների աստիճանացանկում:" search_recent_posts_size: "Քանի վերջերս կատարված գրառում պահել ինդեքսում " log_search_queries: "Պահպահել օգտատերերի կողմից իրականացվող որոնման հարցումները" diff --git a/config/locales/server.it.yml b/config/locales/server.it.yml index 427475a61b..08debae36a 100644 --- a/config/locales/server.it.yml +++ b/config/locales/server.it.yml @@ -1396,7 +1396,8 @@ it: min_personal_message_title_length: "Numero minimo di caratteri per un messaggio" max_emojis_in_title: "Numero massimo di emoji permessi nel titolo di un Argomento" min_search_term_length: "Numero minimo di caratteri per le parole cercate" - search_tokenize_chinese_japanese_korean: "Attiva la tokenizzazione dei caratteri Cinesi/Giapponesi/Coreani nella ricerca anche sui siti non CJK" + search_tokenize_chinese: "Forza la ricerca per tokenizzare il cinese anche su siti non cinesi" + search_tokenize_japanese: "Forza la ricerca per tokenizzare il giapponese anche su siti non giapponesi" search_prefer_recent_posts: "Se il tuo forum è corposo e la ricerca è lenta, questa opzione tenta di indicizzare prima i messaggi più recenti" search_recent_posts_size: "Quanti messaggi recenti mantenere nell'indice" log_search_queries: "Log delle query di ricerca eseguite dagli utenti" @@ -1525,7 +1526,7 @@ it: allowed_iframes: "Un elenco di prefissi di dominio src iframe che discourse può consentire in modo sicuro nei messaggi" allowed_crawler_user_agents: "User Agent dei crawler Web che dovrebbero poter accedere al sito. ATTENZIONE! IMPOSTANDO TALE OPZIONE SARANNO BLOCCATI TUTTI I CRAWLER NON ELENCATI QUI!" blocked_crawler_user_agents: "Parola univoca, senza distinzione tra maiuscole e minuscole, nella stringa user agent che identifica i web crawler cui non si vuole consentire l'accesso al sito. L'impostazione non si applica se è stata definita una lista di elementi consentiti." - slow_down_crawler_user_agents: "Gli user agent dei web crawler a cui impostare limiti di velocità come configurato nell'impostazione \"rallenta la velocità dei crawler\". Ogni valore deve essere lungo almeno 3 caratteri." + slow_down_crawler_user_agents: 'Gli user agent dei web crawler a cui impostare limiti di velocità come configurato nell''impostazione "rallenta la velocità dei crawler". Ogni valore deve essere lungo almeno 3 caratteri.' slow_down_crawler_rate: "Se viene specificato slow_down_crawler_user_agents, tale frequenza verrà applicata a tutti i crawler (numero di secondi di ritardo tra le richieste)" content_security_policy: "Abilita Content-Security-Policy" content_security_policy_report_only: "Abilita Content-Security-Policy-Report-Only" @@ -2128,6 +2129,8 @@ it: leading_trailing_slash: "L'espressione regolare non può iniziare o terminare con una barra." unicode_usernames_avatars: "Gli avatar di sistema interni non supportano i nomi utente Unicode." list_value_count: "La lista deve contenere esattamente %{count} valori." + search_tokenize_chinese_enabled: "Devi disattivare \"search_tokenize_chinese\" prima di attivare questa impostazione." + search_tokenize_japanese_enabled: "Devi disattivare \"search_tokenize_japanese\" prima di attivare questa impostazione." placeholder: discourse_connect_provider_secrets: key: "www.example.com" diff --git a/config/locales/server.ja.yml b/config/locales/server.ja.yml index cfd2a53e6a..07b7898dd6 100644 --- a/config/locales/server.ja.yml +++ b/config/locales/server.ja.yml @@ -1322,7 +1322,6 @@ ja: min_personal_message_title_length: "メッセージのタイトルの最小文字数" max_emojis_in_title: "トピックタイトルに許可される最大絵文字数" min_search_term_length: "有効な検索語の最小文字数" - search_tokenize_chinese_japanese_korean: "CJK 以外のサイトでも強制検索で中国語/日本語/韓国語をトークン化する" search_prefer_recent_posts: "大規模なフォーラムの検索が遅い場合、このオプションは先により直近の投稿のインデックスを試す" search_recent_posts_size: "インデックスに保持する直近の投稿の数" log_search_queries: "ユーザーが実行した検索クエリをログに記録する" diff --git a/config/locales/server.ko.yml b/config/locales/server.ko.yml index bf399362c3..6450f5f73c 100644 --- a/config/locales/server.ko.yml +++ b/config/locales/server.ko.yml @@ -1338,7 +1338,6 @@ ko: min_personal_message_title_length: "메세지 제목의 최소 길이" max_emojis_in_title: "제목에 허용되는 최대 이모티콘" min_search_term_length: "검색을 하기 위한 최소 글자 수" - search_tokenize_chinese_japanese_korean: "CJK(한중일) 설정이 되어 있지 않은 사이트라도, 검색시 한중일 언어를 토크나이징하도록 강제합니다." search_prefer_recent_posts: "이 옵션을 켜면, 포럼이 너무 커서 검색이 느리게 작동할 때 최근의 포스트부터 먼저 검색합니다." search_recent_posts_size: "대문에 실을 최신 포스트 수" log_search_queries: "사용자에 의해 발생된 로그 탐색 쿼리" diff --git a/config/locales/server.nb_NO.yml b/config/locales/server.nb_NO.yml index e76484df67..c7af4cfd7a 100644 --- a/config/locales/server.nb_NO.yml +++ b/config/locales/server.nb_NO.yml @@ -946,7 +946,6 @@ nb_NO: min_personal_message_title_length: "Minste lengde i antall tegn for en meldingstittel" max_emojis_in_title: "Maksimalt antall emojier i en emnetittel" min_search_term_length: "Minimum lengde på søkeord i tegn" - search_tokenize_chinese_japanese_korean: "Tving søk til å tokenisere Kinesisk/Japansk/Koreansk selv på nettsteder uten KJK" search_prefer_recent_posts: "Hvis søking er tregt på et stort forum, vil dette valget forsøke å søke i en index av de nyeste innleggene først" search_recent_posts_size: "Hvor mange innlegg som beholdes i indeksen" log_search_queries: "Logg søkeord som benyttes av brukerne" diff --git a/config/locales/server.nl.yml b/config/locales/server.nl.yml index a60397b8b4..c0ac725ad4 100644 --- a/config/locales/server.nl.yml +++ b/config/locales/server.nl.yml @@ -1285,7 +1285,6 @@ nl: min_personal_message_title_length: "Minimaal toegestane titellengte voor een bericht in tekens" max_emojis_in_title: "Maximale aantal toegestane emoji in topictitel" min_search_term_length: "Minimaal geldige lengte van een zoekterm in tekens" - search_tokenize_chinese_japanese_korean: "Zoeken voor het tokeniseren van Chinees/Japans/Koreaans ook op niet-CJK-websites afdwingen" search_prefer_recent_posts: "Als doorzoeken van uw grote forum traag werkt, probeert deze optie eerst een index van recentere berichten" search_recent_posts_size: "Het aantal in de index te behouden recente berichten" log_search_queries: "Zoekopdrachten van gebruikers opslaan" diff --git a/config/locales/server.pl_PL.yml b/config/locales/server.pl_PL.yml index 4d8b20ae1c..16475c7945 100644 --- a/config/locales/server.pl_PL.yml +++ b/config/locales/server.pl_PL.yml @@ -1486,6 +1486,7 @@ pl_PL: unreachable_themes: "Nie byliśmy w stanie sprawdzić aktualizacji następujących tematów:" watched_word_regexp_error: "Wyrażenie regularne dla '%{action}' jest nieprawidłowe. Sprawdź ustawienia obserwowanych słów lub wyłącz ustawienie witryny „obserwowane słowa regularne”." site_settings: + allow_bulk_invite: "Zezwalaj na zaproszenia zbiorcze, przesyłając plik CSV" disabled: "wyłączone" display_local_time_in_user_card: "Wyświetl czas lokalny w oparciu o strefę czasową użytkownika po otwarciu karty użytkownika." censored_words: "Wskazane słowa będą automatycznie zamieniane na ■■■■" @@ -1506,7 +1507,6 @@ pl_PL: min_personal_message_title_length: "Minimalna liczba znaków w temacie wiadomości " max_emojis_in_title: "Maksymalna liczba emoji w tytule tematu" min_search_term_length: "Minimalna długość wyszukiwanego tekstu, w znakach" - search_tokenize_chinese_japanese_korean: "Wymuś wyszukiwanie żeby tokenizowało Chiński/Japoński/Koreański nawet na stronach nie-CJK" search_prefer_recent_posts: "Jeśli wyszukiwanie na twoim dużym forum jest wolne, ta opcja pozwala zindeskować najpierw ostanie wpisy." search_recent_posts_size: "Jak dużo ostanich wpisów trzymać w indeksie" log_search_queries: "Dzienniki wyszukiwanych przez użytkowników treści" @@ -1637,7 +1637,7 @@ pl_PL: allowed_iframes: "Lista prefiksów domeny src iframe, które dyskurs może bezpiecznie dopuścić w wpisach" allowed_crawler_user_agents: "Agenci użytkowników dla robotów indeksujących, które powinny mieć dostęp do strony. OSTRZEŻENIE! USTAWIENIE TEGO SPOWODUJE BLOKADE ROBOTÓW, KTÓRE NIE SĄ NA LIŚCIE!" blocked_crawler_user_agents: "Unikalne słowo bez rozróżniania wielkości liter w ciągu znaków, które identyfikują crawlery internetowe, które nie powinny mieć dostępu do witryny. Nie ma zastosowania, jeśli dozwolona lista jest zdefiniowana." - slow_down_crawler_user_agents: "User-Agent'y robotów indeksujących, którym należy ograniczyć prędkość, zgodnie z ustawieniami \"spowolnij szybkość indeksowania\". Każda wartość musi mieć co najmniej 3 znaki." + slow_down_crawler_user_agents: 'User-Agent''y robotów indeksujących, którym należy ograniczyć prędkość, zgodnie z ustawieniami "spowolnij szybkość indeksowania". Każda wartość musi mieć co najmniej 3 znaki.' slow_down_crawler_rate: "Jeśli określono parametr slow_down_crawler_user_agents, ta stawka będzie obowiązywać dla wszystkich robotów (liczba sekund opóźnienia między żądaniami)" content_security_policy: "Włącz politykę bezpieczeństwa treści" content_security_policy_report_only: "Włącz tylko treść-bezpieczeństwo-zasady-tylko raport" diff --git a/config/locales/server.pt.yml b/config/locales/server.pt.yml index 159cd23646..a7f59c92b5 100644 --- a/config/locales/server.pt.yml +++ b/config/locales/server.pt.yml @@ -977,7 +977,6 @@ pt: max_topic_title_length: "Tamanho máximo permitido por título de cada tópico, em caracteres" min_personal_message_title_length: "Tamanho mínimo permitido por título nas mensagens, em caracteres" min_search_term_length: "Tamanho mínimo válido para termos de pesquisa, em caracteres" - search_tokenize_chinese_japanese_korean: "Forçar pesquisa para atomizar Chinês/Japonês/Coreano mesmo em sites que não sejam CJC" search_prefer_recent_posts: "Se pesquisar no seu fórum vasto é lento, esta opção tenta usar um índex de publicações recentes primeiro" search_recent_posts_size: "Quantas publicações recentes a manter no índex" search_query_log_max_size: "O número máximo de consultas de pesquisa a serem mantidas" diff --git a/config/locales/server.pt_BR.yml b/config/locales/server.pt_BR.yml index c03e4664e5..7fd9ff968d 100644 --- a/config/locales/server.pt_BR.yml +++ b/config/locales/server.pt_BR.yml @@ -1399,7 +1399,6 @@ pt_BR: min_personal_message_title_length: "Tamanho mínimo permitido para o título de uma mensagem em caracteres" max_emojis_in_title: "Emojis permitidos máximos no título do tópico" min_search_term_length: "Tamanho mínimo válido para termo de pesquisa em caracteres" - search_tokenize_chinese_japanese_korean: "Forçar a pesquisa a transformar em token caracteres de mandarim/japonês/coreano até para sites que não estão nesses idiomas" search_prefer_recent_posts: "Se as pesquisas no seu fórum estiverem lentas, essa opção tenta indexar as postagens mais recentes primeiro" search_recent_posts_size: "Quantidade de postagens recentes para serem mantidas no índice" log_search_queries: "Registrar consultas de pesquisa realizadas pelos(as) usuários(as)" @@ -1530,7 +1529,7 @@ pt_BR: allowed_iframes: "Uma lista de prefixos de domínio iframe src que o Discourse pode permitir com segurança em postagens" allowed_crawler_user_agents: "Agentes de usuário(a) de rastreadores da web que devem ter permissão para acessar o site. AVISO! ESTA CONFIGURAÇÃO NEGARÁ ACESSO A TODOS OS RASTREADORES NÃO LISTADOS AQUI!" blocked_crawler_user_agents: "Palavra sem diferenciação de maiúsculas e minúsculas na linha do agente do(a) usuário(a) que identifica os rastreadores da web que não devem ter permissão para acessar o site. Não se aplica se a lista de permissões estiver definida." - slow_down_crawler_user_agents: "Agentes de usuário(a) de rastreadores da web que devem ter a taxa limitada conforme a configuração \"reduzir taxa de rastreador\". Cada valor dever ter pelo menos três caracteres." + slow_down_crawler_user_agents: 'Agentes de usuário(a) de rastreadores da web que devem ter a taxa limitada conforme a configuração "reduzir taxa de rastreador". Cada valor dever ter pelo menos três caracteres.' slow_down_crawler_rate: "Se slow_down_crawler_user_agents for especificado, essa taxa será aplicada a todos os rastreadores (quantidade de segundos de atraso entre os pedidos)" content_security_policy: "Ativar Content-Security-Policy" content_security_policy_report_only: "Ativar Content-Security-Policy-Report-Only" diff --git a/config/locales/server.ro.yml b/config/locales/server.ro.yml index dfba2c18a0..7c03bd170d 100644 --- a/config/locales/server.ro.yml +++ b/config/locales/server.ro.yml @@ -810,7 +810,6 @@ ro: max_topic_title_length: "Maximul de caractere permis în titlul unui subiect" min_personal_message_title_length: "Numărul minim de caractere permis în titlul unui mesaj" min_search_term_length: "Lungimea minimă a unui termen de căutare valid, în caractere." - search_tokenize_chinese_japanese_korean: "Forțează căutarea să utilizeze tokens chineză/japoneză/coreană chiar și pe site-uri care nu sunt CJK." search_prefer_recent_posts: "Dacă ai un forum mare și căutarea este prea lentă, această opțiune încearcă să indexeze mai multe postări recente întâi." search_recent_posts_size: "Câte postări recente să fie ținute în index" allow_uncategorized_topics: "Permite crearea de subiecte fără categorie. ATENȚIE: Dacă o să ai postări fără categorie, va trebui să le identifici înainte să poți dezactiva din nou această setare." diff --git a/config/locales/server.ru.yml b/config/locales/server.ru.yml index cbbf43de8d..0be9e49884 100644 --- a/config/locales/server.ru.yml +++ b/config/locales/server.ru.yml @@ -1508,7 +1508,8 @@ ru: min_personal_message_title_length: "Минимально допустимое количество символов в заголовке личного сообщения" max_emojis_in_title: "Максимальное количество эмодзи в названии темы" min_search_term_length: "Минимальное количество символов в поисковом запросе" - search_tokenize_chinese_japanese_korean: "Принудительный поиск для токенизации Китайского/Японского /Корейского языков даже на сайтах, не содержащих символы CJK" + search_tokenize_chinese: "Принудительный поиск для токенизации китайского языка даже на некитайских сайтах" + search_tokenize_japanese: "Принудительный поиск для токенизации японского языка даже на неяпонских сайтах" search_prefer_recent_posts: "Сначала индексировать последние сообщения. Актуально при медленном поиске на больших объёмах данных" search_recent_posts_size: "Хранить в индексе указанное здесь количество сообщений" log_search_queries: "Сохранять в журнале поисковые запросы пользователей" @@ -1640,7 +1641,7 @@ ru: allowed_iframes: "Список iframe src, которым Discourse может разрешить встраивание в сообщения." allowed_crawler_user_agents: "Перечень поисковых ботов, которым должен быть разрешён доступ к сайту. ПРЕДУПРЕЖДЕНИЕ! УСТАНОВКА ЭТОГО ПАРАМЕТРА ЗАПРЕТИТ ДОСТУП ВСЕМ ПОИСКОВЫМ БОТАМ, НЕ УКАЗАННЫМ В ПЕРЕЧНЕ!" blocked_crawler_user_agents: "Уникальное нечувствительное к регистру слово в строке User-Agent, идентифицирующее поисковых ботов, которым запрещён доступ к сайту. Не применяется, если определён белый список." - slow_down_crawler_user_agents: "User agents, скорость работы которых должна быть ограничена в соответствии с настройкой «slow down crawler rate». Каждое значение должно состоять не менее чем из 3 символов." + slow_down_crawler_user_agents: 'User agents, скорость работы которых должна быть ограничена в соответствии с настройкой «slow down crawler rate». Каждое значение должно состоять не менее чем из 3 символов.' slow_down_crawler_rate: "Если указано значение slow_down_crawler_user_agents (количество секунд между запросами), то это значение будет применяться ко всем веб-сканерам" content_security_policy: "Включить политику безопасности контента (CSP)" content_security_policy_report_only: "Включить только отчёт о политике безопасности контента (CSP)" @@ -2254,6 +2255,8 @@ ru: unicode_usernames_avatars: "Внутренние системные аватары не поддерживают псевдонимы в формате Unicode." list_value_count: "Список должен содержать именно %{count} значений." google_oauth2_hd_groups: "Перед включением этого параметра необходимо настроить параметр 'google oauth2 hd'." + search_tokenize_chinese_enabled: "Вы должны отключить «search_tokenize_chinese», прежде чем включить этот параметр." + search_tokenize_japanese_enabled: "Вы должны отключить «search_tokenize_japanese», прежде чем включить этот параметр." placeholder: discourse_connect_provider_secrets: key: "www.example.com" diff --git a/config/locales/server.sk.yml b/config/locales/server.sk.yml index 4b7e63dc47..9bb5ea21e3 100644 --- a/config/locales/server.sk.yml +++ b/config/locales/server.sk.yml @@ -788,7 +788,6 @@ sk: max_topic_title_length: "Maximálny povolený počet znakov v názve témy" min_personal_message_title_length: "Minimálny povolený počet znakov v správe" min_search_term_length: "Minimálny povolený počet znakov vo vyhľadávaní" - search_tokenize_chinese_japanese_korean: "Prinúť vyhľádávanie rozložiť Čínštinu/Japončinu/Kórejčinu dokonca i pre nie CJK stránky" allow_uncategorized_topics: "Pvoliť vytváranie tém bez kategórií. UPOZORNENIE: Pokiaľ existujú nekategorizované témy, musíte ich zaradiť do kategórii skôr než túto možnosť vypnete." allow_duplicate_topic_titles: "Povoliť témy s rovnakými, duplikovanými názvami" unique_posts_mins: "Koľko minút musí byť medzi dvomi rovnakými príspevkami od jedného používateľa." diff --git a/config/locales/server.sv.yml b/config/locales/server.sv.yml index 216f1b1d9a..f5c3c61b1d 100644 --- a/config/locales/server.sv.yml +++ b/config/locales/server.sv.yml @@ -1361,6 +1361,7 @@ sv: unreachable_themes: "Vi kunde inte kontrollera uppdateringar för följande teman:" watched_word_regexp_error: "Det reguljära uttrycket för '%{action}'-bevakade ord är ogiltigt. Kontrollera dina inställningar för bevakade ord eller inaktivera webbplatsinställningen 'Reguljära uttryck för bevakade ord'." site_settings: + allow_bulk_invite: "Tillåt massinbjudningar genom att ladda upp en CSV-fil" disabled: "inaktiverade" display_local_time_in_user_card: "Visa den lokala tiden baserat på en användares tidszon när deras användarkort öppnas." censored_words: "Ord som automatiskt ersätts med ■■■■" @@ -1381,7 +1382,8 @@ sv: min_personal_message_title_length: "Lägst tillåtna längd på rubrik för ett meddelande uttryckt i tecken" max_emojis_in_title: "Maximalt antal tillåtna emojier i ämnesrubriken" min_search_term_length: "Lägsta giltiga teckenlängd på sökterm" - search_tokenize_chinese_japanese_korean: "Framtvinga sökning för att koda kinesiska/japanska/koreanska även på webbplatser som inte är på dessa språk" + search_tokenize_chinese: "Tvinga sökning att tokenisera kinesiska även på icke-kinesiska webbplatser" + search_tokenize_japanese: "Tvinga sökning att tokenisera japanska även på icke-japanska webbplatser" search_prefer_recent_posts: "Om sökningar på ditt stora forum går långsamt, försök detta alternativ som är ett index av de senaste inläggen först." search_recent_posts_size: "Hur många nya inlägg som ska behållas i index" log_search_queries: "Logga sökfrågor utförda av användare" @@ -1425,6 +1427,7 @@ sv: show_pinned_excerpt_mobile: "Visa utdrag för fästa ämnen i mobilen." show_pinned_excerpt_desktop: "Visa utdrag för fästa ämnen på datorn." post_onebox_maxlength: "Maximal teckenlängd för ett Discourse-inlägg i onebox." + blocked_onebox_domains: "En lista över domäner som aldrig kommer att oneboxas t.ex. wikipedia.org\n(Jokertecken * ? stöds inte)" allowed_inline_onebox_domains: "En lista över domäner som placeras i onebox i miniatyrform om de länkas utan en rubrik" enable_inline_onebox_on_all_domains: "Ignorera webbplatsinställningen inline_onebox_domain_allowlist och tillåt infogad onebox på alla domäner." force_custom_user_agent_hosts: "Värdar för vilka anpassad användaragent för onebox ska användas vid alla förfrågningar. (särskilt användbart för värdar som begränsar åtkomst av användaragent)." @@ -1512,7 +1515,7 @@ sv: allowed_iframes: "En lista med iframekällors domänprefix som Discourse säkert kan tillåta i inlägg" allowed_crawler_user_agents: "Användaragenter för sökrobotar som ska få åtkomst till webbplatsen. VARNING! INSTÄLLNING AV DETTA FÖRBJUDER ALLA SÖKMOTORER SOM INTE LISTAS HÄR!" blocked_crawler_user_agents: "Unikt fall av känsligt ord i användaragent-strängen som identifierar webbsökare som inte bör få åtkomst till webbplatsen. Gäller inte om vitlista har definierats." - slow_down_crawler_user_agents: "Användaragenter för sökrobotar som ska vara hastighetsbegränsade vilket konfigurerats i inställningen \"sakta ned sökrobots hastighet\". Varje värde måste vara minst 3 tecken långt." + slow_down_crawler_user_agents: 'Användaragenter för sökrobotar som ska vara hastighetsbegränsade vilket konfigurerats i inställningen "sakta ned sökrobots hastighet". Varje värde måste vara minst 3 tecken långt.' slow_down_crawler_rate: "Om slow_down_crawler_user_agents anges kommer denna hastighet att gälla för alla sökrobotar (fördröjning mellan förfrågningarna uttryckt i sekunder)" content_security_policy: "Aktivera säkerhetspolicy för innehåll" content_security_policy_report_only: "Aktivera enbart säkerhetspolicy för innehåll" @@ -2096,6 +2099,7 @@ sv: invalid_json: "Ogiltig JSON." invalid_reply_by_email_address: "Värdet måste innehålla '%{reply_key}' och vara annorlunda från e-postaviseringen." invalid_alternative_reply_by_email_addresses: "Alla värden måste innehålla '%{reply_key}' och vara annorlunda från e-postaviseringen." + invalid_domain_hostname: "Får inte innehålla * eller ? tecken." pop3_polling_host_is_empty: "Du måste ställa in en 'pop3 polling host' innan du aktiverar POP3-polling." pop3_polling_username_is_empty: "Du måste ställa in ett 'pop3 polling username' innan du aktiverar POP3-polling." pop3_polling_password_is_empty: "Du måste ställa in ett 'pop3 polling password' innan du aktiverar POP3-polling." @@ -2125,6 +2129,8 @@ sv: unicode_usernames_avatars: "De interna systemavatarerna stöder inte Unicode-användarnamn." list_value_count: "Listan måste innehålla exakt %{count} värden." google_oauth2_hd_groups: "Du måste först ange 'google oauth2 hd' innan du aktiverar denna inställning." + search_tokenize_chinese_enabled: "Du måste inaktivera 'search_tokenize_chinese' innan du aktiverar den här inställningen." + search_tokenize_japanese_enabled: "Du måste inaktivera 'search_tokenize_japanese' innan du aktiverar den här inställningen." placeholder: discourse_connect_provider_secrets: key: "www.exempel.se" diff --git a/config/locales/server.tr_TR.yml b/config/locales/server.tr_TR.yml index bd5c566fe3..b2e98fe41e 100644 --- a/config/locales/server.tr_TR.yml +++ b/config/locales/server.tr_TR.yml @@ -1392,7 +1392,8 @@ tr_TR: min_personal_message_title_length: "İleti başlıkları için izin verilen en az karakter sayısı" max_emojis_in_title: "Konu başlığında izin verilen maksimum emoji" min_search_term_length: "Arama için girilecek sözcükte olması gereken en az karakter sayısı" - search_tokenize_chinese_japanese_korean: "CJK olmayan siteler dahil, -Çince/Japonca/Korece için aramayı bilgileri sıfırlamaya zorla" + search_tokenize_chinese: "Çince olmayan sitelerde bile aramayı Çince'ye dönüştürmeye zorla" + search_tokenize_japanese: "Japonca olmayan sitelerde bile aramayı Japonca'ya dönüştürmeye etmeye zorla" search_prefer_recent_posts: "Eğer büyük forumunuzda arama yavaş ise bu seçenek daha yeni gönderilerin dizine eklenmesini deneyecek" search_recent_posts_size: "Kaç tane son gönderi dizinde tutulacak" log_search_queries: "Kullanıcılar tarafından gerçekleştirilen günlük arama sorguları" @@ -1523,7 +1524,7 @@ tr_TR: allowed_iframes: "Gönderilerde güvenli bir şekilde izin verebilecek iframe src alan adı öneklerinin listesi" allowed_crawler_user_agents: "Siteye erişmesine izin verilmesi gereken ağ tarayıcılarının kullanıcı aracıları. UYARI! BU AYARLAR, BURADA LİSTEN OLMAYAN TÜM TARAYICILARI ÇIKARACAKTIR!" blocked_crawler_user_agents: "Siteye erişmesine izin verilmemesi gereken web tarayıcılarını tanımlayan kullanıcı aracısı dizesindeki benzersiz BÜYÜK/küçük harf duyarsız sözcük. İzin listesi tanımlanmışsa geçerli değildir." - slow_down_crawler_user_agents: "\"Tarayıcı hızını yavaşlat\" ayarında yapılandırıldığı gibi hızı sınırlandırılması gereken web tarayıcılarının kullanıcı aracıları. Her değer en az 3 karakter uzunluğunda olmalıdır." + slow_down_crawler_user_agents: '"Tarayıcı hızını yavaşlat" ayarında yapılandırıldığı gibi hızı sınırlandırılması gereken web tarayıcılarının kullanıcı aracıları. Her değer en az 3 karakter uzunluğunda olmalıdır.' slow_down_crawler_rate: "slow_down_crawler_user_agents belirtilirse bu oran tüm tarayıcılara uygulanır (istekler arasında saniye cinsinden gecikme sayısı)." content_security_policy: "İçerik-Güvenlik-Politikasını Etkinleştir" content_security_policy_report_only: "Yalnızca İçerik-Güvenlik-İlke-Raporunu Etkinleştir" @@ -2120,6 +2121,8 @@ tr_TR: unicode_usernames_avatars: "Dahili sistem avatarları Unicode kullanıcı adlarını desteklemez." list_value_count: "Liste tam olarak %{count} değerleri içermelidir." google_oauth2_hd_groups: "Bu ayarı etkinleştirmeden önce 'google oauth2 hd'yi ayarlamalısınız." + search_tokenize_chinese_enabled: "Bu ayarı etkinleştirmeden önce 'search_tokenize_chinese' özelliğini devre dışı bırakmalısınız." + search_tokenize_japanese_enabled: "Bu ayarı etkinleştirmeden önce 'search_tokenize_japanese' özelliğini devre dışı bırakmalısınız." placeholder: discourse_connect_provider_secrets: key: "www.örnek.com" diff --git a/config/locales/server.uk.yml b/config/locales/server.uk.yml index 3396bf8a56..d039add2eb 100644 --- a/config/locales/server.uk.yml +++ b/config/locales/server.uk.yml @@ -1501,7 +1501,6 @@ uk: min_personal_message_title_length: "Мінімально допустима кількість символів в заголовку повідомлення в бесіді." max_emojis_in_title: "Максимально допустимі смайлики в заголовку теми" min_search_term_length: "Мінімальна дозволена довжина пошукової фрази у символах" - search_tokenize_chinese_japanese_korean: "Примусовий пошук для токенізації Китайського / Японського / Корейського навіть на сайтах, відмінних від CJK" search_prefer_recent_posts: "Якщо пошук на великому форумі виконується повільно, цей параметр спочатку намагається більше індексувати останні повідомлення" search_recent_posts_size: "Скільки останніх постів зберегти в індексі" log_search_queries: "Журнал пошукових запитів, виконаних користувачами" @@ -1632,7 +1631,7 @@ uk: allowed_iframes: "Список префіксів домену iframe src, які discourse може безпечно дозволити в повідомленнях" allowed_crawler_user_agents: "Користувацькі агенти веб-сканерів, яким слід дозволити доступ до сайту. ПОПЕРЕДЖЕННЯ! ЦЕ ЗАБОРОНИТЬ ДОСТУП ВСІМ ВЕБ-СКАНЕРАМ, ЯКІ НЕ ВКАЗАНІ ТУТ!" blocked_crawler_user_agents: "Унікальне слово, не чутливе до регістру, у рядку агента користувача, що ідентифікує веб-сканери, яким не слід дозволяти доступ до сайту. Не застосовується, якщо визначено білий список." - slow_down_crawler_user_agents: "User agents, швидкість роботи яких повинна бути обмежена відповідно до налаштування \"slow down crawler rate\". Кожне значення має складатися не менше ніж з трьох символів." + slow_down_crawler_user_agents: 'User agents, швидкість роботи яких повинна бути обмежена відповідно до налаштування "slow down crawler rate". Кожне значення має складатися не менше ніж з трьох символів.' slow_down_crawler_rate: "Якщо вказано slow_down_crawler_user_agents, ця пауза застосовуватиметься до всіх сканерів (затримка між запитами кількість секунд)" content_security_policy: "Увімкнути політику безпеки вмісту" content_security_policy_report_only: "Увімкнути тільки звіт про політику безпеки вмісту" diff --git a/config/locales/server.ur.yml b/config/locales/server.ur.yml index d3b1bbab8b..3e7cbac370 100644 --- a/config/locales/server.ur.yml +++ b/config/locales/server.ur.yml @@ -1154,7 +1154,6 @@ ur: min_personal_message_title_length: "حروف میں ایک پیغام کیلئے عنوان کی کم از کم لمبائی" max_emojis_in_title: "ٹاپک عنوان میں اِیمَوجیوں کی زیادہ سے زیادہ تعداد" min_search_term_length: "حروف میں درست سرچ ٹَرم کی کم از کم لمبائی" - search_tokenize_chinese_japanese_korean: "CJK سائٹس کے علاوہ بھی سرچ کو چینی/ جاپانی/کورین کو ٹوکنائیز کرنے پر مجبور کریں" search_prefer_recent_posts: "اگر آپ کے بڑے فورم پر سرچ سست ہے، تو یہ آپشن پہلے حالیہ پوسٹس کے ایک اِنڈَیکس پر کوشش کرتا ہے" search_recent_posts_size: "اِنڈَیکس میں کتنی حالیہ پوسٹس رکھی جائیں" log_search_queries: "صارفین کی طرف سے سرچ قُوَیریز کو لاگ کریں" diff --git a/config/locales/server.vi.yml b/config/locales/server.vi.yml index cc441944c4..566b91ed13 100644 --- a/config/locales/server.vi.yml +++ b/config/locales/server.vi.yml @@ -887,7 +887,6 @@ vi: max_topic_title_length: "Số kí tự tối đa trong tiêu đề chủ đề." min_personal_message_title_length: "Chiều dài tối thiểu cho phép theo số kí tự của một thông điệp" min_search_term_length: "Số kí tự tối thiểu trong từ khóa tìm kiếm." - search_tokenize_chinese_japanese_korean: "Bắt buộc tìm kiếm tách từ Chinese/Japanese/Korean ngay cả trên các site không phải là CJK" search_recent_posts_size: "Có bao nhiêu bài đăng gần đây để giữ trong chỉ mục" log_search_queries: "Ghi nhật ký các truy vấn tìm kiếm do người dùng thực hiện" search_query_log_max_size: "Số lượng truy vấn tìm kiếm tối đa cần lưu giữ" diff --git a/config/locales/server.zh_CN.yml b/config/locales/server.zh_CN.yml index 5e90427a4c..27cd2d4b9e 100644 --- a/config/locales/server.zh_CN.yml +++ b/config/locales/server.zh_CN.yml @@ -1342,7 +1342,6 @@ zh_CN: min_personal_message_title_length: "消息允许的最小标题长度(以字符为单位)" max_emojis_in_title: "话题标题中允许的最大表情数量" min_search_term_length: "最小有效搜索词长度(以字符为单位)" - search_tokenize_chinese_japanese_korean: "即使在非 CJK 站点上也强制搜索将中文/日语/韩语词例化" search_prefer_recent_posts: "如果搜索大型论坛的速度很慢,此选项会首先尝试索引最近的帖子" search_recent_posts_size: "在索引中保留多少个最近的帖子" log_search_queries: "记录用户执行的搜索查询" diff --git a/config/locales/server.zh_TW.yml b/config/locales/server.zh_TW.yml index 93cb86b6c7..bc01e5068d 100644 --- a/config/locales/server.zh_TW.yml +++ b/config/locales/server.zh_TW.yml @@ -1090,7 +1090,6 @@ zh_TW: min_personal_message_title_length: "訊息標題的字元數下限" max_emojis_in_title: "話題標題可含有的表情符號上限" min_search_term_length: "搜尋條件允許的最小文字數" - search_tokenize_chinese_japanese_korean: "在非中/日/韓語站點強制切割中/日/韓語搜索分詞" search_prefer_recent_posts: "如果搜索大型論壇較慢,這個選項將優先嘗試最新的貼文" search_recent_posts_size: "索引多少最新的主題" log_search_queries: "登入使用者進行搜尋查詢" diff --git a/plugins/discourse-local-dates/config/locales/client.de.yml b/plugins/discourse-local-dates/config/locales/client.de.yml index 056ade23da..6d8741e350 100644 --- a/plugins/discourse-local-dates/config/locales/client.de.yml +++ b/plugins/discourse-local-dates/config/locales/client.de.yml @@ -31,6 +31,7 @@ de: format_title: Datumsformat timezone: Zeitzone until: Bis … + current_timezone: "Aktuelle Zeitzone:" recurring: every_day: "Jeden Tag" every_week: "Jede Woche" diff --git a/plugins/discourse-local-dates/config/locales/client.sv.yml b/plugins/discourse-local-dates/config/locales/client.sv.yml index 12de3f19c7..20f84a771b 100644 --- a/plugins/discourse-local-dates/config/locales/client.sv.yml +++ b/plugins/discourse-local-dates/config/locales/client.sv.yml @@ -31,6 +31,7 @@ sv: format_title: Datumformat timezone: Tidszon until: Tills... + current_timezone: "Aktuell tidszon:" recurring: every_day: "Varje dag" every_week: "Varje vecka" diff --git a/plugins/discourse-narrative-bot/config/locales/server.da.yml b/plugins/discourse-narrative-bot/config/locales/server.da.yml index 3354a3fa4b..6504bfd8e2 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.da.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.da.yml @@ -84,6 +84,15 @@ da: "10": quote: "Uanset hvad menneskets sind kan begribe og tro på, kan det opnå." author: "Napoleon Hill" + "11": + quote: "Fred derhjemme, fred i verden." + author: "Mustafa Kemal Atatürk" + "12": + quote: "Uddannelse er ikke en måde at slippe ud af fattigdom, det er en måde at bekæmpe den." + author: "Julius Nyerere" + "13": + quote: "En rejse på tusind km. skal begynde med et enkelt trin." + author: "Lao Tzu" results: |- > :left_speech_bubble: _%{quote}_ — %{author} magic_8_ball: diff --git a/plugins/discourse-narrative-bot/config/locales/server.de.yml b/plugins/discourse-narrative-bot/config/locales/server.de.yml index 22392e160f..ae0a667619 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.de.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.de.yml @@ -84,6 +84,15 @@ de: "10": quote: "Was der Verstand eines Menschen begreifen und glauben kann, kann er erreichen." author: "Napoleon Hill" + "11": + quote: "Frieden zu Hause, Frieden in der Welt." + author: "Mustafa Kemal Atatürk" + "12": + quote: "Bildung ist kein Weg, der Armut zu entkommen, sondern ein Weg, sie zu bekämpfen." + author: "Julius Nyerere" + "13": + quote: "Eine Reise von tausend Meilen muss mit einem einzigen Schritt beginnen." + author: "Lao Tzu" results: |- > :left_speech_bubble: _%{quote}_ — %{author} magic_8_ball: diff --git a/plugins/discourse-narrative-bot/config/locales/server.he.yml b/plugins/discourse-narrative-bot/config/locales/server.he.yml index 1984cb4543..034102b59f 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.he.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.he.yml @@ -86,6 +86,15 @@ he: "10": quote: "מה ששכל האדם מסוגל להגות ולהאמין, ניתן להשגה." author: "נפוליאון היל" + "11": + quote: "שלום בבית, שלום בעולם." + author: "מוסטפא כמאל אטאטורק" + "12": + quote: "חינוך זאת אינה הדרך להימלט מעוני, זו הדרך להילחם בו." + author: "ג׳וליוס נייררה" + "13": + quote: "מסע של אלף קילומטרים חייב להתחיל בצעד אחד." + author: "לאו דזה" results: |- > :left_speech_bubble: _%{quote}_ — %{author} magic_8_ball: diff --git a/plugins/discourse-narrative-bot/config/locales/server.hu.yml b/plugins/discourse-narrative-bot/config/locales/server.hu.yml index d8e5e1af84..d7ae2056a3 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.hu.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.hu.yml @@ -84,6 +84,15 @@ hu: "10": quote: "Amit az emberi elme el tud képzelni és hinni, elérheti." author: "Napoleon Hill" + "11": + quote: "Béke otthon, béke a világban." + author: "Mustafa Kemal Atatürk" + "12": + quote: "Az oktatás nem a szegénység előli menekülés, hanem az ellene folytatott küzdelem módja." + author: "Julius Nyerere" + "13": + quote: "Az ezer mérföldes utazásnak is egyetlen lépéssel kell kezdődnie." + author: "Lao-ce" results: |- > :left_speech_bubble: _%{quote}_ — %{author} magic_8_ball: diff --git a/plugins/discourse-narrative-bot/config/locales/server.it.yml b/plugins/discourse-narrative-bot/config/locales/server.it.yml index a2c2f76e3b..75d39d4083 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.it.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.it.yml @@ -84,6 +84,15 @@ it: "10": quote: "Tutto ciò che la mente umana può concepire e credere, può essere realizzato." author: "Napoleon Hill" + "11": + quote: "Pace in casa, pace nel mondo." + author: "Mustafa Kemal Atatürk" + "12": + quote: "L'istruzione non è un modo per sfuggire alla povertà, è un modo per combatterla." + author: "Julius Nyerere" + "13": + quote: "Un viaggio di mille miglia deve iniziare con un solo passo." + author: "Lao Tzu" results: |- > :left_speech_bubble: _%{quote}_ — %{author} magic_8_ball: diff --git a/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml b/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml index b4224af208..37a1448c3c 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.pl_PL.yml @@ -86,6 +86,12 @@ pl_PL: "10": quote: "Każda rzecz, którą umysł ludzki może pojąć i w nią uwierzyć, może on osiągnąć." author: "Napoleon Hill" + "11": + quote: "Pokój w domu, pokój na świecie." + "12": + quote: "Edukacja nie jest sposobem na wyrwanie się z ubóstwa, to jest sposób na walkę z nim." + "13": + quote: "Podróż o długości tysiąca mil musi rozpocząć się od jednego kroku." results: |- > :left_speech_bubble: _%{quote}_ — %{author} magic_8_ball: diff --git a/plugins/discourse-narrative-bot/config/locales/server.ru.yml b/plugins/discourse-narrative-bot/config/locales/server.ru.yml index 753932dc55..88724296ca 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.ru.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.ru.yml @@ -86,6 +86,15 @@ ru: "10": quote: "Что разум человека способен познать и вообразить, того он способен достичь." author: "Наполеон Хилл" + "11": + quote: "Мир в доме - мир на Земле." + author: "Мустафа Кемаль Ататюрк" + "12": + quote: "Образование – это не способ избежать бедности, это способ борьбы с ней." + author: "Джулиус Ньерере" + "13": + quote: "Путешествие в тысячу миль должно начинаться с одного шага." + author: "Лао-цзы" results: |- > :left_speech_bubble: _%{quote}_ — %{author} magic_8_ball: diff --git a/plugins/discourse-narrative-bot/config/locales/server.sv.yml b/plugins/discourse-narrative-bot/config/locales/server.sv.yml index 1e0e66dd53..50c1fe8695 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.sv.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.sv.yml @@ -84,6 +84,15 @@ sv: "10": quote: "Oavsett vad människans sinne kan tänka och tro, kan det uppnås." author: "Napoleon Hill" + "11": + quote: "Fred hemma, fred i världen." + author: "Mustafa Kemal Atatürk" + "12": + quote: "Utbildning är inte ett sätt att undkomma fattigdomen, det är ett sätt att bekämpa den." + author: "Julius Nyerere" + "13": + quote: "En resa på tusen mil måste börja med ett enda steg." + author: "Lao Tzu" results: |- > :left_speech_bubble: _%{quote}_ — %{author} magic_8_ball: diff --git a/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml b/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml index 11ecc65e57..7dfc10db63 100644 --- a/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml +++ b/plugins/discourse-narrative-bot/config/locales/server.tr_TR.yml @@ -84,6 +84,15 @@ tr_TR: "10": quote: "İnsan zihni ne olursa olsun düşünebilir ve inanabilir, başarabilir." author: "Napoleon Hill" + "11": + quote: "Yurtta sulh cihanda sulh." + author: "Mustafa Kemal Atatürk" + "12": + quote: "Eğitim, yoksulluktan kurtulmanın bir yolu değil, onunla savaşmanın bir yoludur." + author: "Julius Nyerere" + "13": + quote: "Bin millik bir yolculuk tek bir adımla başlar." + author: "Lao Tzu" results: |- > :left_speech_bubble: _%{quote}_ — %{author} magic_8_ball: From 5a93ce421da4e52b9d649cf609cd7d79d21a1683 Mon Sep 17 00:00:00 2001 From: janzenisaac <50783505+janzenisaac@users.noreply.github.com> Date: Tue, 8 Feb 2022 08:37:20 -0600 Subject: [PATCH 142/194] DEV: Prioritize full name when setting active (#15820) Prioritize full name in these places (when setting active): See: https://meta.discourse.org/t/display-full-name-not-username-when-attributing-quote-or-reply/203533/6 for context - Reply to post - Composer reply to post - Quoting --- .../discourse/app/components/quote-button.js | 3 + .../javascripts/discourse/app/lib/quote.js | 6 +- .../discourse/app/lib/transform-post.js | 2 + .../discourse/app/models/composer.js | 7 ++- .../javascripts/discourse/app/widgets/post.js | 9 ++- .../tests/acceptance/composer-actions-test.js | 63 ++++++++++++++++++- .../acceptance/topic-quote-button-test.js | 3 +- .../discourse/tests/acceptance/topic-test.js | 2 + app/serializers/post_serializer.rb | 1 + 9 files changed, 90 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/quote-button.js b/app/assets/javascripts/discourse/app/components/quote-button.js index a8a4de73de..0f739d3298 100644 --- a/app/assets/javascripts/discourse/app/components/quote-button.js +++ b/app/assets/javascripts/discourse/app/components/quote-button.js @@ -173,6 +173,9 @@ export default Component.extend(KeyEnterEscape, { selectedRange().startOffset > 0 ? false : _selectedText === toMarkdown(cooked.innerHTML), + displayName: + this.siteSettings.display_name_on_posts && + !this.siteSettings.prioritize_username_in_ux, }; for ( diff --git a/app/assets/javascripts/discourse/app/lib/quote.js b/app/assets/javascripts/discourse/app/lib/quote.js index d965833a6e..650223acbd 100644 --- a/app/assets/javascripts/discourse/app/lib/quote.js +++ b/app/assets/javascripts/discourse/app/lib/quote.js @@ -6,8 +6,12 @@ export function buildQuote(post, contents, opts = {}) { return ""; } + const name = opts.displayName + ? opts.name || post.name + : opts.username || post.username; + const params = [ - opts.username || post.username, + name, `post:${opts.post || post.post_number}`, `topic:${opts.topic || post.topic_id}`, ]; diff --git a/app/assets/javascripts/discourse/app/lib/transform-post.js b/app/assets/javascripts/discourse/app/lib/transform-post.js index 37a1e4940f..14244853de 100644 --- a/app/assets/javascripts/discourse/app/lib/transform-post.js +++ b/app/assets/javascripts/discourse/app/lib/transform-post.js @@ -74,6 +74,7 @@ export function transformBasicPost(post) { actionsSummary: null, read: post.read, replyToUsername: null, + replyToName: null, replyToAvatarTemplate: null, reply_to_post_number: post.reply_to_post_number, cooked_hidden: !!post.cooked_hidden, @@ -227,6 +228,7 @@ export default function transformPost( const replyToUser = post.get("reply_to_user"); if (replyToUser) { postAtts.replyToUsername = replyToUser.username; + postAtts.replyToName = replyToUser.name; postAtts.replyToAvatarTemplate = replyToUser.avatar_template; } diff --git a/app/assets/javascripts/discourse/app/models/composer.js b/app/assets/javascripts/discourse/app/models/composer.js index 4f9194b414..259149c11b 100644 --- a/app/assets/javascripts/discourse/app/models/composer.js +++ b/app/assets/javascripts/discourse/app/models/composer.js @@ -23,6 +23,7 @@ import deprecated from "discourse-common/lib/deprecated"; import { isEmpty } from "@ember/utils"; import { propertyNotEqual } from "discourse/lib/computed"; import { throwAjaxError } from "discourse/lib/ajax-error"; +import { prioritizeNameInUx } from "discourse/lib/settings"; let _customizations = []; export function registerCustomizationCallback(cb) { @@ -356,6 +357,10 @@ const Composer = RestModel.extend({ if (topic && post) { const postNumber = post.post_number; + const name = + this.siteSettings.display_name_on_posts && prioritizeNameInUx(post.name) + ? post.name + : post.username; options.postLink = { href: `${topic.url}/${postNumber}`, @@ -364,7 +369,7 @@ const Composer = RestModel.extend({ options.userLink = { href: `${topic.url}/${postNumber}`, - anchor: post.username, + anchor: name, }; } diff --git a/app/assets/javascripts/discourse/app/widgets/post.js b/app/assets/javascripts/discourse/app/widgets/post.js index ca41e8eabe..889e66dd90 100644 --- a/app/assets/javascripts/discourse/app/widgets/post.js +++ b/app/assets/javascripts/discourse/app/widgets/post.js @@ -134,16 +134,21 @@ createWidget("reply-to-tab", { html(attrs, state) { const icon = state.loading ? h("div.spinner.small") : iconNode("share"); + const name = + this.siteSettings.display_name_on_posts && + prioritizeNameInUx(attrs.replyToName) + ? attrs.replyToName + : attrs.replyToUsername; return [ icon, " ", avatarImg("small", { template: attrs.replyToAvatarTemplate, - username: attrs.replyToUsername, + username: name, }), " ", - h("span", formatUsername(attrs.replyToUsername)), + h("span", formatUsername(name)), ]; }, diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js index acc54f4a38..a289708080 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js @@ -4,6 +4,7 @@ import { exists, query, queryAll, + selectText, updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; @@ -18,7 +19,11 @@ import { toggleCheckDraftPopup } from "discourse/controllers/composer"; acceptance("Composer Actions", function (needs) { needs.user(); - needs.settings({ enable_whispers: true }); + needs.settings({ + prioritize_username_in_ux: true, + display_name_on_post: false, + enable_whispers: true, + }); needs.site({ can_tag_topics: true }); test("creating new topic and then reply_as_private_message keeps attributes", async function (assert) { @@ -551,3 +556,59 @@ acceptance("Composer Actions With New Topic Draft", function (needs) { sinon.restore(); }); }); + +acceptance("Prioritize Username", function (needs) { + needs.user(); + needs.settings({ + prioritize_username_in_ux: true, + display_name_on_post: false, + }); + + test("Reply to post use username", async function (assert) { + await visit("/t/internationalization-localization/280"); + await click("article#post_3 button.reply"); + + assert.strictEqual( + queryAll(".action-title .user-link").text().trim(), + "codinghorror" + ); + }); + + test("Quotes use username", async function (assert) { + await visit("/t/internationalization-localization/280"); + await selectText("#post_3 p"); + await click(".insert-quote"); + assert.strictEqual( + queryAll(".d-editor-input").val().trim(), + '[quote="codinghorror, post:3, topic:280"]\nYep, all strings are going through a lookup table.*\n[/quote]' + ); + }); +}); + +acceptance("Prioritize Full Name", function (needs) { + needs.user(); + needs.settings({ + prioritize_username_in_ux: false, + display_name_on_post: true, + }); + + test("Reply to post use full name", async function (assert) { + await visit("/t/internationalization-localization/280"); + await click("article#post_3 button.reply"); + + assert.strictEqual( + queryAll(".action-title .user-link").text().trim(), + "Jeff Atwood" + ); + }); + + test("Quotes use full name", async function (assert) { + await visit("/t/internationalization-localization/280"); + await selectText("#post_3 p"); + await click(".insert-quote"); + assert.strictEqual( + queryAll(".d-editor-input").val().trim(), + '[quote="Jeff Atwood, post:3, topic:280"]\nYep, all strings are going through a lookup table.*\n[/quote]' + ); + }); +}); diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js index 6c9c7bb9c2..c156488a3b 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js @@ -13,10 +13,11 @@ import { test } from "qunit"; acceptance("Topic - Quote button - logged in", function (needs) { needs.user(); needs.settings({ + display_name_on_posts: false, + prioritize_username_in_ux: true, share_quote_visibility: "anonymous", share_quote_buttons: "twitter|email", }); - chromeTest( "Does not show the quote share buttons by default", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-test.js index da2305ba7d..db7d8e6ed1 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-test.js @@ -241,6 +241,8 @@ acceptance("Topic", function (needs) { acceptance("Topic featured links", function (needs) { needs.user(); needs.settings({ + display_name_on_posts: false, + prioritize_username_in_ux: true, topic_featured_link_enabled: true, max_topic_title_length: 80, exclude_rel_nofollow_domains: "example.com", diff --git a/app/serializers/post_serializer.rb b/app/serializers/post_serializer.rb index 2a2eec117b..bbab210afd 100644 --- a/app/serializers/post_serializer.rb +++ b/app/serializers/post_serializer.rb @@ -256,6 +256,7 @@ class PostSerializer < BasicPostSerializer def reply_to_user { username: object.reply_to_user.username, + name: object.reply_to_user.name, avatar_template: object.reply_to_user.avatar_template } end From 8abc4a0fd60eae874cef121b549531e2e89a8542 Mon Sep 17 00:00:00 2001 From: janzenisaac <50783505+janzenisaac@users.noreply.github.com> Date: Tue, 8 Feb 2022 13:25:19 -0600 Subject: [PATCH 143/194] Revert "DEV: Prioritize full name when setting active (#15820)" (#15869) This reverts commit 5a93ce421da4e52b9d649cf609cd7d79d21a1683. --- .../discourse/app/components/quote-button.js | 3 - .../javascripts/discourse/app/lib/quote.js | 6 +- .../discourse/app/lib/transform-post.js | 2 - .../discourse/app/models/composer.js | 7 +-- .../javascripts/discourse/app/widgets/post.js | 9 +-- .../tests/acceptance/composer-actions-test.js | 63 +------------------ .../acceptance/topic-quote-button-test.js | 3 +- .../discourse/tests/acceptance/topic-test.js | 2 - app/serializers/post_serializer.rb | 1 - 9 files changed, 6 insertions(+), 90 deletions(-) diff --git a/app/assets/javascripts/discourse/app/components/quote-button.js b/app/assets/javascripts/discourse/app/components/quote-button.js index 0f739d3298..a8a4de73de 100644 --- a/app/assets/javascripts/discourse/app/components/quote-button.js +++ b/app/assets/javascripts/discourse/app/components/quote-button.js @@ -173,9 +173,6 @@ export default Component.extend(KeyEnterEscape, { selectedRange().startOffset > 0 ? false : _selectedText === toMarkdown(cooked.innerHTML), - displayName: - this.siteSettings.display_name_on_posts && - !this.siteSettings.prioritize_username_in_ux, }; for ( diff --git a/app/assets/javascripts/discourse/app/lib/quote.js b/app/assets/javascripts/discourse/app/lib/quote.js index 650223acbd..d965833a6e 100644 --- a/app/assets/javascripts/discourse/app/lib/quote.js +++ b/app/assets/javascripts/discourse/app/lib/quote.js @@ -6,12 +6,8 @@ export function buildQuote(post, contents, opts = {}) { return ""; } - const name = opts.displayName - ? opts.name || post.name - : opts.username || post.username; - const params = [ - name, + opts.username || post.username, `post:${opts.post || post.post_number}`, `topic:${opts.topic || post.topic_id}`, ]; diff --git a/app/assets/javascripts/discourse/app/lib/transform-post.js b/app/assets/javascripts/discourse/app/lib/transform-post.js index 14244853de..37a1e4940f 100644 --- a/app/assets/javascripts/discourse/app/lib/transform-post.js +++ b/app/assets/javascripts/discourse/app/lib/transform-post.js @@ -74,7 +74,6 @@ export function transformBasicPost(post) { actionsSummary: null, read: post.read, replyToUsername: null, - replyToName: null, replyToAvatarTemplate: null, reply_to_post_number: post.reply_to_post_number, cooked_hidden: !!post.cooked_hidden, @@ -228,7 +227,6 @@ export default function transformPost( const replyToUser = post.get("reply_to_user"); if (replyToUser) { postAtts.replyToUsername = replyToUser.username; - postAtts.replyToName = replyToUser.name; postAtts.replyToAvatarTemplate = replyToUser.avatar_template; } diff --git a/app/assets/javascripts/discourse/app/models/composer.js b/app/assets/javascripts/discourse/app/models/composer.js index 259149c11b..4f9194b414 100644 --- a/app/assets/javascripts/discourse/app/models/composer.js +++ b/app/assets/javascripts/discourse/app/models/composer.js @@ -23,7 +23,6 @@ import deprecated from "discourse-common/lib/deprecated"; import { isEmpty } from "@ember/utils"; import { propertyNotEqual } from "discourse/lib/computed"; import { throwAjaxError } from "discourse/lib/ajax-error"; -import { prioritizeNameInUx } from "discourse/lib/settings"; let _customizations = []; export function registerCustomizationCallback(cb) { @@ -357,10 +356,6 @@ const Composer = RestModel.extend({ if (topic && post) { const postNumber = post.post_number; - const name = - this.siteSettings.display_name_on_posts && prioritizeNameInUx(post.name) - ? post.name - : post.username; options.postLink = { href: `${topic.url}/${postNumber}`, @@ -369,7 +364,7 @@ const Composer = RestModel.extend({ options.userLink = { href: `${topic.url}/${postNumber}`, - anchor: name, + anchor: post.username, }; } diff --git a/app/assets/javascripts/discourse/app/widgets/post.js b/app/assets/javascripts/discourse/app/widgets/post.js index 889e66dd90..ca41e8eabe 100644 --- a/app/assets/javascripts/discourse/app/widgets/post.js +++ b/app/assets/javascripts/discourse/app/widgets/post.js @@ -134,21 +134,16 @@ createWidget("reply-to-tab", { html(attrs, state) { const icon = state.loading ? h("div.spinner.small") : iconNode("share"); - const name = - this.siteSettings.display_name_on_posts && - prioritizeNameInUx(attrs.replyToName) - ? attrs.replyToName - : attrs.replyToUsername; return [ icon, " ", avatarImg("small", { template: attrs.replyToAvatarTemplate, - username: name, + username: attrs.replyToUsername, }), " ", - h("span", formatUsername(name)), + h("span", formatUsername(attrs.replyToUsername)), ]; }, diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js index a289708080..acc54f4a38 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-actions-test.js @@ -4,7 +4,6 @@ import { exists, query, queryAll, - selectText, updateCurrentUser, } from "discourse/tests/helpers/qunit-helpers"; import { click, fillIn, visit } from "@ember/test-helpers"; @@ -19,11 +18,7 @@ import { toggleCheckDraftPopup } from "discourse/controllers/composer"; acceptance("Composer Actions", function (needs) { needs.user(); - needs.settings({ - prioritize_username_in_ux: true, - display_name_on_post: false, - enable_whispers: true, - }); + needs.settings({ enable_whispers: true }); needs.site({ can_tag_topics: true }); test("creating new topic and then reply_as_private_message keeps attributes", async function (assert) { @@ -556,59 +551,3 @@ acceptance("Composer Actions With New Topic Draft", function (needs) { sinon.restore(); }); }); - -acceptance("Prioritize Username", function (needs) { - needs.user(); - needs.settings({ - prioritize_username_in_ux: true, - display_name_on_post: false, - }); - - test("Reply to post use username", async function (assert) { - await visit("/t/internationalization-localization/280"); - await click("article#post_3 button.reply"); - - assert.strictEqual( - queryAll(".action-title .user-link").text().trim(), - "codinghorror" - ); - }); - - test("Quotes use username", async function (assert) { - await visit("/t/internationalization-localization/280"); - await selectText("#post_3 p"); - await click(".insert-quote"); - assert.strictEqual( - queryAll(".d-editor-input").val().trim(), - '[quote="codinghorror, post:3, topic:280"]\nYep, all strings are going through a lookup table.*\n[/quote]' - ); - }); -}); - -acceptance("Prioritize Full Name", function (needs) { - needs.user(); - needs.settings({ - prioritize_username_in_ux: false, - display_name_on_post: true, - }); - - test("Reply to post use full name", async function (assert) { - await visit("/t/internationalization-localization/280"); - await click("article#post_3 button.reply"); - - assert.strictEqual( - queryAll(".action-title .user-link").text().trim(), - "Jeff Atwood" - ); - }); - - test("Quotes use full name", async function (assert) { - await visit("/t/internationalization-localization/280"); - await selectText("#post_3 p"); - await click(".insert-quote"); - assert.strictEqual( - queryAll(".d-editor-input").val().trim(), - '[quote="Jeff Atwood, post:3, topic:280"]\nYep, all strings are going through a lookup table.*\n[/quote]' - ); - }); -}); diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js index c156488a3b..6c9c7bb9c2 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-quote-button-test.js @@ -13,11 +13,10 @@ import { test } from "qunit"; acceptance("Topic - Quote button - logged in", function (needs) { needs.user(); needs.settings({ - display_name_on_posts: false, - prioritize_username_in_ux: true, share_quote_visibility: "anonymous", share_quote_buttons: "twitter|email", }); + chromeTest( "Does not show the quote share buttons by default", async function (assert) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/topic-test.js b/app/assets/javascripts/discourse/tests/acceptance/topic-test.js index db7d8e6ed1..da2305ba7d 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/topic-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/topic-test.js @@ -241,8 +241,6 @@ acceptance("Topic", function (needs) { acceptance("Topic featured links", function (needs) { needs.user(); needs.settings({ - display_name_on_posts: false, - prioritize_username_in_ux: true, topic_featured_link_enabled: true, max_topic_title_length: 80, exclude_rel_nofollow_domains: "example.com", diff --git a/app/serializers/post_serializer.rb b/app/serializers/post_serializer.rb index bbab210afd..2a2eec117b 100644 --- a/app/serializers/post_serializer.rb +++ b/app/serializers/post_serializer.rb @@ -256,7 +256,6 @@ class PostSerializer < BasicPostSerializer def reply_to_user { username: object.reply_to_user.username, - name: object.reply_to_user.name, avatar_template: object.reply_to_user.avatar_template } end From 59343c305771663338c836a44d207e959a273c92 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Wed, 9 Feb 2022 12:47:47 +1000 Subject: [PATCH 144/194] DEV: Add Windows Hello webauthn authentication spec (#15871) Follow up to 6f7364e48bf3546e5a279fe483549d6e62cb3272 to add a spec that tests the full authentication of a Windows Hello algorithm (-257) webauthn verification. The test added in that commit only tested that we know about that algorithm, not whether it was actually usable. --- ...ecurity_key_authentication_service_spec.rb | 87 +++++++++++++++++-- 1 file changed, 78 insertions(+), 9 deletions(-) diff --git a/spec/lib/webauthn/security_key_authentication_service_spec.rb b/spec/lib/webauthn/security_key_authentication_service_spec.rb index ee83dde77e..fc319ccb84 100644 --- a/spec/lib/webauthn/security_key_authentication_service_spec.rb +++ b/spec/lib/webauthn/security_key_authentication_service_spec.rb @@ -3,18 +3,54 @@ require 'rails_helper' require 'webauthn' require 'webauthn/security_key_registration_service' +## +# These tests use the following parameters generated on a local discourse +# instance to test an actual authentication flow: +# +# - credential_id +# - public_key +# - challenge +# - signature +# - authenticator_data +# - client_data_origin +# - challenge_params_origin +# +# To create another test (e.g. for a different COSE algorithm) you need to: +# +# 1. Add a security key for a user on a local discourse instance. Go into +# the console and get the credential_id and public_key params from there. +# 2. Log out and try to log back in to that user to get the security +# key challenge +# 3. Touch the security key. Inside the authenticate_security_key method +# you need to add puts debugger statements (or use binding.pry) like so: +# +# puts client_data +# puts signature +# puts auth_data +# +# The auth_data will have the challenge param, but you must Base64.decode64 to +# use it in the let(:challenge) variable. The signature and auth_data params +# can be used as is. +# +# You also need to make sure that client_data_param has the exact same structure +# and order of keys as auth_data, otherwise even with everything else right the +# public key verification will fail. +# +# The origin params just need to be whatever your localhost URL for Discourse is. + describe Webauthn::SecurityKeyAuthenticationService do let(:security_key_user) { current_user } - let(:security_key) do + let!(:security_key) do Fabricate( :user_security_key, - credential_id: 'mJAJ4CznTO0SuLkJbYwpgK75ao4KMNIPlU5KWM92nq39kRbXzI9mSv6GxTcsMYoiPgaouNw7b7zBiS4vsQaO6A==', - public_key: 'pQECAyYgASFYIMNgw4GCpwBUlR2SznJ1yY7B9yFvsuxhfo+C9kcA4IitIlggRdofrCezymy2B/YarX+gfB6gZKg648/cHIMjf6wWmmU=', + credential_id: credential_id, + public_key: public_key, user: security_key_user, last_used: nil ) end - let(:credential_id) { security_key.credential_id } + let(:public_key) { 'pQECAyYgASFYIMNgw4GCpwBUlR2SznJ1yY7B9yFvsuxhfo+C9kcA4IitIlggRdofrCezymy2B/YarX+gfB6gZKg648/cHIMjf6wWmmU=' } + let(:credential_id) { 'mJAJ4CznTO0SuLkJbYwpgK75ao4KMNIPlU5KWM92nq39kRbXzI9mSv6GxTcsMYoiPgaouNw7b7zBiS4vsQaO6A==' } let(:challenge) { '81d4acfbd69eafa8f02bc2ecbec5267be8c9b28c1e0ba306d52b79f0f13d' } let(:client_data_challenge) { Base64.strict_encode64(challenge) } let(:client_data_webauthn_type) { 'webauthn.get' } @@ -33,7 +69,7 @@ describe Webauthn::SecurityKeyAuthenticationService do } ## # These are sourced from an actual login using the UserSecurityKey credential - # defined in this spec. + # defined in this spec, generated via a local discourse. let(:signature) { "MEUCIBppPyK8blxBDoktU54mI1vWEY96r1V5H1rEBtPDxwcGAiEAoi7LCmMoEAuWYu0krZpflZlULsbURCGcqOwP06amXYE=" } let(:authenticator_data) { "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MBAAAAVw==" } let(:params) do @@ -47,18 +83,19 @@ describe Webauthn::SecurityKeyAuthenticationService do ## # The original key was generated in localhost let(:rp_id) { 'localhost' } + let(:challenge_params_origin) { 'http://localhost:3000' } let(:challenge_params) do { challenge: challenge, rp_id: rp_id, - origin: 'http://localhost:3000' + origin: challenge_params_origin } end let(:current_user) { Fabricate(:user) } let(:subject) { described_class.new(current_user, params, challenge_params) } - it 'updates last_used when valid' do - subject.authenticate_security_key + it 'updates last_used when the security key and params are valid' do + expect(subject.authenticate_security_key).to eq(true) expect(security_key.reload.last_used).not_to eq(nil) end @@ -77,7 +114,9 @@ describe Webauthn::SecurityKeyAuthenticationService do end context 'when the credential ID does not match any user security key in the database' do - let(:credential_id) { 'badid' } + before do + security_key.destroy + end it 'raises a NotFoundError' do expect { subject.authenticate_security_key }.to raise_error( @@ -158,6 +197,36 @@ describe Webauthn::SecurityKeyAuthenticationService do end end + context 'for windows hello (alg -257)' do + ## + # These are sourced from an actual login using the UserSecurityKey credential + # defined in this spec, generated via a local discourse. + let(:challenge) { "fa7cb122f8713745dc08e16863e087ffa2d3bfda7f1b0386ea4b14635bb6" } + let(:signature) { "OKEP/8oiojjE+LBwg6F37yJzjOTT9mBPukrW1E8Sih5Vh/3p9WHrqZdylxr1x9z/c8GplC0ABayanpAqN/miQezt3wm97gIwoHq/6rrmHDZu6irQhpjeX9yHRlu0lQw+SUEZfoW3iB4oP/d2ryYlafFA9intm++lLlP/qI3mvpCQwkAeotaelx7fn0RwiY767dG+bGVPyYuUicGHcLLvCY2k0G8kRQ7I5SQqB+dIcOINWikC9I2xvUKu6Br7hZZIrDy+soFtdnnCnvi2q/3ocOPYL5jy58wdpCTsh1RRPIEF/fQFVDOXtdS7PVgaa0PMBcWMCe5TimwGlTlICnsm+g==" } + let(:authenticator_data) { "SZYN5YgOjGh0NBcPZHZgW4/krrmihjLHmVzzuoMdl2MFAAAABA==" } + let(:credential_id) { "8AddFow3jT87k1UPWvjn+rOetCEambpESGZ+z/63hOE=" } + let(:public_key) { "pAEDAzkBACBZAQCqsl50KrR5zVm/QT9vWkeGTGxby32m0QRtCRh2UWseqoG0ZmBhGeWEYvkdoYlB1jObQKEHsAeB+1NBf5q69/88AA5zv4fzrvCydCtL41EUsHYFEbaPGnB61zZmYVLTPI7BYa+fu4F4MzFa924s36tVlU/L7n04peviJVZW2C1YIQfwOGDZJSvUpqJoZMQtw1vGRfrb4cQKlHfrpDZUpa3QLE8phh4ce4nwtX1tUnUGgCy8sOaFVkDNufENGTNr8HdAIHcinUiax3yy/Q8LjSZb8UR2ha6oXSe1vRHhj001B/P/mr5AdVMxSrOT1sUNXWkHv8L8IzS/iTBQpsC8CADZIUMBAAE=" } + let(:challenge_params_origin) { 'http://localhost:4200' } + let(:client_data_origin) { 'http://localhost:4200' } + + # This has to be in the exact same order with the same data as it was originally + # generated. + let(:client_data_param) { + { + type: client_data_webauthn_type, + challenge: client_data_challenge, + origin: client_data_origin, + crossOrigin: false, + other_keys_can_be_added_here: "do not compare clientDataJSON against a template. See https://goo.gl/yabPex" + } + } + + it 'updates last_used when the security key and params are valid' do + expect(subject.authenticate_security_key).to eq(true) + expect(security_key.reload.last_used).not_to eq(nil) + end + end + it 'all supported algorithms are implemented' do Webauthn::SUPPORTED_ALGORITHMS.each do |alg| expect(COSE::Algorithm.find(alg)).not_to be_nil From 71f7f7ed49950ea09381e39d4b8faab69b1a06ba Mon Sep 17 00:00:00 2001 From: Blake Erickson Date: Tue, 8 Feb 2022 20:55:32 -0700 Subject: [PATCH 145/194] FEATURE: Add external_id to topics (#15825) * FEATURE: Add external_id to topics This commit allows for topics to be created and fetched by an external_id. These changes are API only for now as there aren't any front changes. * add annotations * add external_id to this spec * Several PR feedback changes - Add guardian to find topic - 403 is returned for not found as well now - add `include_external_id?` - external_id is now case insensitive - added test for posts_controller - added test for topic creator - created constant for max length - check that it redirects to the correct path - restrain external id in routes file * remove puts * fix tests * only check for external_id in webhook if exists * Update index to exclude external_id if null * annotate * Update app/controllers/topics_controller.rb We need to check whether the topic is present first before passing it to the guardian. Co-authored-by: Alan Guo Xiang Tan * Apply suggestions from code review Co-authored-by: Alan Guo Xiang Tan Co-authored-by: Alan Guo Xiang Tan --- app/controllers/posts_controller.rb | 2 + app/controllers/topics_controller.rb | 7 +++ app/models/topic.rb | 6 +++ app/serializers/topic_view_serializer.rb | 7 ++- config/routes.rb | 1 + ...0220202225716_add_external_id_to_topics.rb | 8 ++++ lib/topic_creator.rb | 1 + spec/components/topic_creator_spec.rb | 10 ++++ spec/models/topic_spec.rb | 46 +++++++++++++++++++ spec/requests/posts_controller_spec.rb | 15 ++++++ spec/requests/topics_controller_spec.rb | 28 +++++++++++ .../serializers/topic_view_serializer_spec.rb | 11 +++++ .../web_hook_topic_view_serializer_spec.rb | 4 ++ 13 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20220202225716_add_external_id_to_topics.rb diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index 7a0da6d043..bdc2823755 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -760,6 +760,8 @@ class PostsController < ApplicationController # We allow `created_at` via the API permitted << :created_at + # We allow `external_id` via the API + permitted << :external_id end result = params.permit(*permitted).tap do |allowed| diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index a7b758e20f..abb249c2e8 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -43,6 +43,13 @@ class TopicsController < ApplicationController render json: { slug: topic.slug, topic_id: topic.id, url: topic.url } end + def show_by_external_id + topic = Topic.find_by(external_id: params[:external_id]) + raise Discourse::NotFound unless topic + guardian.ensure_can_see!(topic) + redirect_to_correct_topic(topic, params[:post_number]) + end + def show if request.referer flash["referer"] ||= request.referer[0..255] diff --git a/app/models/topic.rb b/app/models/topic.rb index 1a6948c6cc..dbac653ba8 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -11,6 +11,8 @@ class Topic < ActiveRecord::Base include LimitedEdit extend Forwardable + EXTERNAL_ID_MAX_LENGTH = 50 + self.ignored_columns = [ "avg_time", # TODO(2021-01-04): remove "image_url" # TODO(2021-06-01): remove @@ -195,6 +197,8 @@ class Topic < ActiveRecord::Base end end + validates :external_id, allow_nil: true, uniqueness: { case_sensitive: false }, length: { maximum: EXTERNAL_ID_MAX_LENGTH }, format: { with: /\A[\w-]+\z/ } + before_validation do self.title = TextCleaner.clean_title(TextSentinel.title_sentinel(title).text) if errors[:title].empty? self.featured_link = self.featured_link.strip.presence if self.featured_link @@ -1902,6 +1906,7 @@ end # image_upload_id :bigint # slow_mode_seconds :integer default(0), not null # bannered_until :datetime +# external_id :string # # Indexes # @@ -1911,6 +1916,7 @@ end # index_topics_on_bannered_until (bannered_until) WHERE (bannered_until IS NOT NULL) # index_topics_on_bumped_at_public (bumped_at) WHERE ((deleted_at IS NULL) AND ((archetype)::text <> 'private_message'::text)) # index_topics_on_created_at_and_visible (created_at,visible) WHERE ((deleted_at IS NULL) AND ((archetype)::text <> 'private_message'::text)) +# index_topics_on_external_id (external_id) UNIQUE WHERE (external_id IS NOT NULL) # index_topics_on_id_and_deleted_at (id,deleted_at) # index_topics_on_id_filtered_banner (id) UNIQUE WHERE (((archetype)::text = 'banner'::text) AND (deleted_at IS NULL)) # index_topics_on_image_upload_id (image_upload_id) diff --git a/app/serializers/topic_view_serializer.rb b/app/serializers/topic_view_serializer.rb index 0d717fa2b5..268fbc7872 100644 --- a/app/serializers/topic_view_serializer.rb +++ b/app/serializers/topic_view_serializer.rb @@ -41,7 +41,8 @@ class TopicViewSerializer < ApplicationSerializer :pinned_at, :pinned_until, :image_url, - :slow_mode_seconds + :slow_mode_seconds, + :external_id ) attributes( @@ -104,6 +105,10 @@ class TopicViewSerializer < ApplicationSerializer is_warning end + def include_external_id? + external_id + end + def draft object.draft end diff --git a/config/routes.rb b/config/routes.rb index 32e5a05c1d..641a905765 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -809,6 +809,7 @@ Discourse::Application.routes.draw do # Topic routes get "t/id_for/:slug" => "topics#id_for_slug" + get "t/external_id/:external_id" => "topics#show_by_external_id", format: :json, constrains: { external_id: /\A[\w-]+\z/ } get "t/:slug/:topic_id/print" => "topics#show", format: :html, print: true, constraints: { topic_id: /\d+/ } get "t/:slug/:topic_id/wordpress" => "topics#wordpress", constraints: { topic_id: /\d+/ } get "t/:topic_id/wordpress" => "topics#wordpress", constraints: { topic_id: /\d+/ } diff --git a/db/migrate/20220202225716_add_external_id_to_topics.rb b/db/migrate/20220202225716_add_external_id_to_topics.rb new file mode 100644 index 0000000000..6ee7c3edb5 --- /dev/null +++ b/db/migrate/20220202225716_add_external_id_to_topics.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class AddExternalIdToTopics < ActiveRecord::Migration[6.1] + def change + add_column :topics, :external_id, :string, null: true + add_index :topics, :external_id, unique: true, where: 'external_id IS NOT NULL' + end +end diff --git a/lib/topic_creator.rb b/lib/topic_creator.rb index 1211c84fe7..4b79035b48 100644 --- a/lib/topic_creator.rb +++ b/lib/topic_creator.rb @@ -137,6 +137,7 @@ class TopicCreator topic_params[:created_at] = convert_time(@opts[:created_at]) if @opts[:created_at].present? topic_params[:pinned_at] = convert_time(@opts[:pinned_at]) if @opts[:pinned_at].present? topic_params[:pinned_globally] = @opts[:pinned_globally] if @opts[:pinned_globally].present? + topic_params[:external_id] = @opts[:external_id] if @opts[:external_id].present? topic_params[:featured_link] = @opts[:featured_link] topic_params diff --git a/spec/components/topic_creator_spec.rb b/spec/components/topic_creator_spec.rb index 433462a4c2..2e6ccc3968 100644 --- a/spec/components/topic_creator_spec.rb +++ b/spec/components/topic_creator_spec.rb @@ -286,5 +286,15 @@ describe TopicCreator do expect(topic.pinned_at).to eq_time(time2) end end + + context 'external_id' do + it 'adds external_id' do + topic = TopicCreator.create(user, Guardian.new(user), valid_attrs.merge( + external_id: 'external_id' + )) + + expect(topic.external_id).to eq('external_id') + end + end end end diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb index 6a848c009c..cd0f8e5a6c 100644 --- a/spec/models/topic_spec.rb +++ b/spec/models/topic_spec.rb @@ -34,6 +34,51 @@ describe Topic do end end + context "#external_id" do + describe 'when external_id is too long' do + it 'should not be valid' do + topic.external_id = 'a' * (Topic::EXTERNAL_ID_MAX_LENGTH + 1) + expect(topic).to_not be_valid + end + end + + describe 'when external_id has invalid characters' do + it 'should not be valid' do + topic.external_id = 'a*&^!@()#' + expect(topic).to_not be_valid + end + end + + describe 'when external_id is an empty string' do + it 'should not be valid' do + topic.external_id = '' + expect(topic).to_not be_valid + end + end + + describe 'when external_id has already been used' do + it 'should not be valid' do + topic2 = Fabricate(:topic, external_id: 'asdf') + topic.external_id = 'asdf' + expect(topic).to_not be_valid + end + end + + describe 'when external_id is nil' do + it 'should be valid' do + topic.external_id = nil + expect(topic).to be_valid + end + end + + describe 'when external_id is valid' do + it 'should be valid' do + topic.external_id = 'abc_123-ZXY' + expect(topic).to be_valid + end + end + end + context "#title" do it { is_expected.to validate_presence_of :title } @@ -116,6 +161,7 @@ describe Topic do end end end + end it { is_expected.to rate_limit } diff --git a/spec/requests/posts_controller_spec.rb b/spec/requests/posts_controller_spec.rb index 4a751c8e85..5ebc38d976 100644 --- a/spec/requests/posts_controller_spec.rb +++ b/spec/requests/posts_controller_spec.rb @@ -835,6 +835,21 @@ describe PostsController do expect(post_1.topic.user.notifications.count).to eq(1) end + it 'allows a topic to be created with an external_id' do + master_key = Fabricate(:api_key).key + post "/posts.json", params: { + raw: 'this is the test content', + title: "this is some post", + external_id: 'external_id' + }, headers: { HTTP_API_USERNAME: user.username, HTTP_API_KEY: master_key } + + expect(response.status).to eq(200) + + new_topic = Topic.last + + expect(new_topic.external_id).to eq('external_id') + end + it 'prevents whispers for regular users' do post_1 = Fabricate(:post) user_key = ApiKey.create!(user: user).key diff --git a/spec/requests/topics_controller_spec.rb b/spec/requests/topics_controller_spec.rb index 7328b2eb93..03c1526e27 100644 --- a/spec/requests/topics_controller_spec.rb +++ b/spec/requests/topics_controller_spec.rb @@ -1792,6 +1792,34 @@ RSpec.describe TopicsController do end end + describe '#show_by_external_id' do + fab!(:private_topic) { Fabricate(:private_message_topic, external_id: 'private') } + fab!(:topic) { Fabricate(:topic, external_id: 'asdf') } + + it 'returns 301 when found' do + get "/t/external_id/asdf.json" + expect(response.status).to eq(301) + expect(response).to redirect_to(topic.relative_url + ".json?page=") + end + + it 'returns right response when not found' do + get "/t/external_id/fdsa.json" + expect(response.status).to eq(404) + end + + describe 'when user does not have access to the topic' do + it 'should return the right response' do + sign_in(user) + + get "/t/external_id/private.json" + + expect(response.status).to eq(403) + expect(response.body).to include(I18n.t('invalid_access')) + end + end + + end + describe '#show' do use_redis_snapshotting diff --git a/spec/serializers/topic_view_serializer_spec.rb b/spec/serializers/topic_view_serializer_spec.rb index 5861d9b3e6..7432ae959a 100644 --- a/spec/serializers/topic_view_serializer_spec.rb +++ b/spec/serializers/topic_view_serializer_spec.rb @@ -45,6 +45,17 @@ describe TopicViewSerializer do end end + describe '#external_id' do + describe 'when a topic has an external_id' do + before { topic.update!(external_id: '42-asdf') } + + it 'should return the external_id' do + json = serialize_topic(topic, user) + expect(json[:external_id]).to eq('42-asdf') + end + end + end + describe '#image_url' do fab!(:image_upload) { Fabricate(:image_upload, width: 5000, height: 5000) } diff --git a/spec/serializers/web_hook_topic_view_serializer_spec.rb b/spec/serializers/web_hook_topic_view_serializer_spec.rb index c3e3451e69..47f0385ab8 100644 --- a/spec/serializers/web_hook_topic_view_serializer_spec.rb +++ b/spec/serializers/web_hook_topic_view_serializer_spec.rb @@ -57,5 +57,9 @@ RSpec.describe WebHookTopicViewSerializer do keys = serializer.as_json.keys expect(serializer.as_json.keys).to contain_exactly(*expected_keys) + + topic.external_id = 'external_id' + expected_keys << :external_id + expect(serializer.as_json.keys).to contain_exactly(*expected_keys) end end From ab5361d69ae4b55a7635676eef7d80dd96d8460c Mon Sep 17 00:00:00 2001 From: Alan Guo Xiang Tan Date: Wed, 9 Feb 2022 12:51:13 +0800 Subject: [PATCH 146/194] FIX: Avoid raising error when updating post and topic count user stats. (#15873) There are still spots in the code base which results in us trying to turn the post and topic count negative. However, we have a job that runs on a daily basis which will correct the count. Therefore, avoid raising an error for now and log the exception instead. --- app/services/user_stat_count_updater.rb | 12 ++++++++++ spec/services/user_stat_count_updater_spec.rb | 24 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 spec/services/user_stat_count_updater_spec.rb diff --git a/app/services/user_stat_count_updater.rb b/app/services/user_stat_count_updater.rb index af64041717..38810e5c68 100644 --- a/app/services/user_stat_count_updater.rb +++ b/app/services/user_stat_count_updater.rb @@ -22,6 +22,18 @@ class UserStatCountUpdater elsif post.post_type == Post.types[:regular] stat.public_send(action, :post_count) end + rescue ActiveRecord::StatementInvalid => e + if e.cause.is_a?(PG::CheckViolation) + # There are still spots in the code base which results in the counter cache going out of sync. However, + # we have a job that runs on a daily basis which will correct the count. Therefore, avoid raising an error for now + # and log the exception instead. + Discourse.warn_exception( + e, + message: "Attempted to insert negative count into UserStat#post_count or UserStat#topic_count" + ) + else + raise + end end end end diff --git a/spec/services/user_stat_count_updater_spec.rb b/spec/services/user_stat_count_updater_spec.rb new file mode 100644 index 0000000000..a765e97072 --- /dev/null +++ b/spec/services/user_stat_count_updater_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe UserStatCountUpdater do + fab!(:user) { Fabricate(:user) } + fab!(:user_stat) { user.user_stat } + fab!(:post) { Fabricate(:post) } + + before do + @orig_logger = Rails.logger + Rails.logger = @fake_logger = FakeLogger.new + end + + after do + Rails.logger = @orig_logger + end + + it 'should log the exception when a negative count is inserted' do + UserStatCountUpdater.decrement!(post, user_stat: user_stat) + + expect(@fake_logger.warnings.first).to include("PG::CheckViolation") + end +end From 7850ee318fc480d820d256ab01e39cfc046f2d5b Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Wed, 9 Feb 2022 15:25:03 +1000 Subject: [PATCH 147/194] DEV: Add focusComposer to composer controller (#15872) This commit adds a new helpful function to the composer controller which can be used to focus the composer and insert text, regardless of whether the consumer knows whether the composer is open or has a draft. This is good for cases where an action needs to copy text to the composer or open it with text after navigating to a URL. The inspiration for this addition is the discourse-chat plugin, which needs to be able to copy quoted markdown from the chat and insert it into the composer, and unlike in the topic controller we have no idea of the state of the composer from chat. --- .../discourse/app/controllers/composer.js | 51 ++++++++- .../discourse/app/lib/keyboard-shortcuts.js | 15 +-- .../discourse/app/models/composer.js | 4 + .../tests/acceptance/composer-test.js | 107 +++++++++++++++++- 4 files changed, 163 insertions(+), 14 deletions(-) diff --git a/app/assets/javascripts/discourse/app/controllers/composer.js b/app/assets/javascripts/discourse/app/controllers/composer.js index e7c5b6cec3..cd81ba155c 100644 --- a/app/assets/javascripts/discourse/app/controllers/composer.js +++ b/app/assets/javascripts/discourse/app/controllers/composer.js @@ -6,7 +6,7 @@ import { authorizesOneOrMoreExtensions, uploadIcon, } from "discourse/lib/uploads"; -import { cancel, run } from "@ember/runloop"; +import { cancel, run, scheduleOnce } from "@ember/runloop"; import { cannotPostAgain, durationTextFromSeconds, @@ -396,6 +396,52 @@ export default Controller.extend({ return uploadIcon(this.currentUser.staff, this.siteSettings); }, + // Use this to open the composer when you are not sure whether it is + // already open and whether it already has a draft being worked on. Supports + // options to append text once the composer is open if required. + // + // opts: + // + // - fallbackToNewTopic: if true, and there is no draft, the composer will + // be opened with the create_topic action and a new topic draft key + // - insertText: the text to append to the composer once it is opened + // - openOpts: this object will be passed to this.open if fallbackToNewTopic is + // true + @action + focusComposer(opts = {}) { + if (this.get("model.viewOpen")) { + this._focusAndInsertText(opts.insertText); + } else { + const opened = this.openIfDraft(); + if (!opened && opts.fallbackToNewTopic) { + this.open( + Object.assign( + { + action: Composer.CREATE_TOPIC, + draftKey: Composer.NEW_TOPIC_KEY, + }, + opts.openOpts || {} + ) + ).then(() => { + this._focusAndInsertText(opts.insertText); + }); + } else if (opened) { + this._focusAndInsertText(opts.insertText); + } + } + }, + + _focusAndInsertText(insertText) { + scheduleOnce("afterRender", () => { + const input = document.querySelector("textarea.d-editor-input"); + input && input.focus(); + + if (insertText) { + this.model.appendText(insertText, null, { new_line: true }); + } + }); + }, + @action openIfDraft(event) { if (this.get("model.viewDraft")) { @@ -407,7 +453,10 @@ export default Controller.extend({ } this.set("model.composeState", Composer.OPEN); + return true; } + + return false; }, actions: { diff --git a/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js b/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js index baa2cc69b8..a60af675ed 100644 --- a/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js +++ b/app/assets/javascripts/discourse/app/lib/keyboard-shortcuts.js @@ -1,7 +1,7 @@ import { bind } from "discourse-common/utils/decorators"; import discourseDebounce from "discourse-common/lib/debounce"; import { isAppWebview } from "discourse/lib/utilities"; -import { later, run, schedule, throttle } from "@ember/runloop"; +import { later, run, throttle } from "@ember/runloop"; import { nextTopicUrl, previousTopicUrl, @@ -413,16 +413,11 @@ export default { focusComposer(event) { const composer = this.container.lookup("controller:composer"); - if (composer.get("model.viewOpen")) { - preventKeyboardEvent(event); - - schedule("afterRender", () => { - const input = document.querySelector("textarea.d-editor-input"); - input && input.focus(); - }); - } else { - composer.openIfDraft(event); + if (event) { + event.preventDefault(); + event.stopPropagation(); } + composer.focusComposer(event); }, fullscreenComposer() { diff --git a/app/assets/javascripts/discourse/app/models/composer.js b/app/assets/javascripts/discourse/app/models/composer.js index 4f9194b414..98612deefe 100644 --- a/app/assets/javascripts/discourse/app/models/composer.js +++ b/app/assets/javascripts/discourse/app/models/composer.js @@ -660,6 +660,10 @@ const Composer = RestModel.extend({ } } + if (opts && opts.new_line) { + text = "\n\n" + text.trim(); + } + this.set("reply", before + text + after); return before.length + text.length; diff --git a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js index 36af0bda53..2006c85467 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/composer-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/composer-test.js @@ -1,9 +1,12 @@ import { run } from "@ember/runloop"; -import { click, currentURL, fillIn, visit } from "@ember/test-helpers"; +import { click, currentURL, fillIn, settled, visit } from "@ember/test-helpers"; import { toggleCheckDraftPopup } from "discourse/controllers/composer"; import LinkLookup from "discourse/lib/link-lookup"; import { withPluginApi } from "discourse/lib/plugin-api"; -import { CREATE_TOPIC, NEW_TOPIC_KEY } from "discourse/models/composer"; +import Composer, { + CREATE_TOPIC, + NEW_TOPIC_KEY, +} from "discourse/models/composer"; import Draft from "discourse/models/draft"; import { acceptance, @@ -17,7 +20,7 @@ import { } from "discourse/tests/helpers/qunit-helpers"; import selectKit from "discourse/tests/helpers/select-kit-helper"; import I18n from "I18n"; -import { test } from "qunit"; +import { skip, test } from "qunit"; import { Promise } from "rsvp"; import sinon from "sinon"; @@ -918,3 +921,101 @@ acceptance("Composer - Customizations", function (needs) { ); }); }); + +// all of these are broken on legacy ember qunit for...some reason. commenting +// until we are fully on ember cli. +acceptance("Composer - Focus Open and Closed", function (needs) { + needs.user(); + + skip("Focusing a composer which is not open with create topic", async function (assert) { + await visit("/t/internationalization-localization/280"); + + const composer = this.container.lookup("controller:composer"); + composer.focusComposer({ fallbackToNewTopic: true }); + + await settled(); + assert.strictEqual( + document.activeElement.classList.contains("d-editor-input"), + true, + "composer is opened and focused" + ); + assert.strictEqual(composer.model.action, Composer.CREATE_TOPIC); + }); + + skip("Focusing a composer which is not open with create topic and append text", async function (assert) { + await visit("/t/internationalization-localization/280"); + + const composer = this.container.lookup("controller:composer"); + composer.focusComposer({ + fallbackToNewTopic: true, + insertText: "this is appended", + }); + + await settled(); + assert.strictEqual( + document.activeElement.classList.contains("d-editor-input"), + true, + "composer is opened and focused" + ); + assert.strictEqual( + query("textarea.d-editor-input").value.trim(), + "this is appended" + ); + }); + + skip("Focusing a composer which is already open", async function (assert) { + await visit("/"); + await click("#create-topic"); + + const composer = this.container.lookup("controller:composer"); + composer.focusComposer(); + + await settled(); + assert.strictEqual( + document.activeElement.classList.contains("d-editor-input"), + true, + "composer is opened and focused" + ); + }); + + skip("Focusing a composer which is already open and append text", async function (assert) { + await visit("/"); + await click("#create-topic"); + + const composer = this.container.lookup("controller:composer"); + composer.focusComposer({ insertText: "this is some appended text" }); + + await settled(); + assert.strictEqual( + document.activeElement.classList.contains("d-editor-input"), + true, + "composer is opened and focused" + ); + assert.strictEqual( + query("textarea.d-editor-input").value.trim(), + "this is some appended text" + ); + }); + + skip("Focusing a composer which is not open that has a draft", async function (assert) { + await visit("/t/this-is-a-test-topic/9"); + + await click(".topic-post:nth-of-type(1) button.edit"); + await fillIn(".d-editor-input", "This is a dirty reply"); + await click(".toggle-minimize"); + + const composer = this.container.lookup("controller:composer"); + composer.focusComposer({ insertText: "this is some appended text" }); + + await settled(); + assert.strictEqual( + document.activeElement.classList.contains("d-editor-input"), + true, + "composer is opened and focused" + ); + assert.strictEqual( + query("textarea.d-editor-input").value.trim(), + "This is a dirty reply\n\nthis is some appended text" + ); + }); +}); From c1ad9c32768cead0ee81217c882b3ba097bac471 Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Wed, 9 Feb 2022 16:11:41 +1000 Subject: [PATCH 148/194] DEV: Make clipboardCopy util available for import (#15874) We need this in other places, this commit moves clipboardCopy to the utilities.js lib. Had to remove use of Promise as well because lib/utilities cannot import it, otherwise it will cause a mini racer error. --- .../addon/controllers/admin-permalinks.js | 8 +- .../app/initializers/copy-codeblocks.js | 98 ++++++------------- .../discourse/app/lib/utilities.js | 47 +++++++++ 3 files changed, 77 insertions(+), 76 deletions(-) diff --git a/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js b/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js index d4f354d321..9993a19fe5 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-permalinks.js @@ -5,6 +5,7 @@ import Permalink from "admin/models/permalink"; import bootbox from "bootbox"; import discourseDebounce from "discourse-common/lib/debounce"; import { observes } from "discourse-common/utils/decorators"; +import { clipboardCopy } from "discourse/lib/utilities"; export default Controller.extend({ loading: false, @@ -29,12 +30,7 @@ export default Controller.extend({ copyUrl(pl) { let linkElement = document.querySelector(`#admin-permalink-${pl.id}`); - let textArea = document.createElement("textarea"); - textArea.value = linkElement.textContent; - document.body.appendChild(textArea); - textArea.select(); - document.execCommand("Copy"); - textArea.remove(); + clipboardCopy(linkElement.textContent); }, destroy(record) { diff --git a/app/assets/javascripts/discourse/app/initializers/copy-codeblocks.js b/app/assets/javascripts/discourse/app/initializers/copy-codeblocks.js index b11925807c..efe8a4af21 100644 --- a/app/assets/javascripts/discourse/app/initializers/copy-codeblocks.js +++ b/app/assets/javascripts/discourse/app/initializers/copy-codeblocks.js @@ -1,61 +1,10 @@ import { cancel, later } from "@ember/runloop"; import I18n from "I18n"; -import { Promise } from "rsvp"; import { guidFor } from "@ember/object/internals"; +import { clipboardCopy } from "discourse/lib/utilities"; import { iconHTML } from "discourse-common/lib/icon-library"; import { withPluginApi } from "discourse/lib/plugin-api"; -// http://github.com/feross/clipboard-copy -function clipboardCopy(text) { - // Use the Async Clipboard API when available. - // Requires a secure browsing context (i.e. HTTPS) - if (navigator.clipboard) { - return navigator.clipboard.writeText(text).catch(function (err) { - throw err !== undefined - ? err - : new DOMException("The request is not allowed", "NotAllowedError"); - }); - } - - // ...Otherwise, use document.execCommand() fallback - - // Put the text to copy into a - const span = document.createElement("span"); - span.textContent = text; - - // Preserve consecutive spaces and newlines - span.style.whiteSpace = "pre"; - - // Add the to the page - document.body.appendChild(span); - - // Make a selection object representing the range of text selected by the user - const selection = window.getSelection(); - const range = window.document.createRange(); - selection.removeAllRanges(); - range.selectNode(span); - selection.addRange(range); - - // Copy text to the clipboard - let success = false; - try { - success = window.document.execCommand("copy"); - } catch (err) { - // eslint-disable-next-line no-console - console.log("error", err); - } - - // Cleanup - selection.removeAllRanges(); - window.document.body.removeChild(span); - - return success - ? Promise.resolve() - : Promise.reject( - new DOMException("The request is not allowed", "NotAllowedError") - ); -} - let _copyCodeblocksClickHandlers = {}; let _fadeCopyCodeblocksRunners = {}; @@ -79,6 +28,25 @@ export default { _fadeCopyCodeblocksRunners = {}; } + function _copyComplete(button) { + button.classList.add("copied"); + const state = button.innerHTML; + button.innerHTML = I18n.t("copy_codeblock.copied"); + + const commandId = guidFor(button); + + if (_fadeCopyCodeblocksRunners[commandId]) { + cancel(_fadeCopyCodeblocksRunners[commandId]); + delete _fadeCopyCodeblocksRunners[commandId]; + } + + _fadeCopyCodeblocksRunners[commandId] = later(() => { + button.classList.remove("copied"); + button.innerHTML = state; + delete _fadeCopyCodeblocksRunners[commandId]; + }, 3000); + } + function _handleClick(event) { if (!event.target.classList.contains("copy-cmd")) { return; @@ -96,24 +64,14 @@ export default { ) .trim(); - clipboardCopy(text).then(() => { - button.classList.add("copied"); - const state = button.innerHTML; - button.innerHTML = I18n.t("copy_codeblock.copied"); - - const commandId = guidFor(button); - - if (_fadeCopyCodeblocksRunners[commandId]) { - cancel(_fadeCopyCodeblocksRunners[commandId]); - delete _fadeCopyCodeblocksRunners[commandId]; - } - - _fadeCopyCodeblocksRunners[commandId] = later(() => { - button.classList.remove("copied"); - button.innerHTML = state; - delete _fadeCopyCodeblocksRunners[commandId]; - }, 3000); - }); + const result = clipboardCopy(text); + if (result.then) { + result.then(() => { + _copyComplete(button); + }); + } else if (result) { + _copyComplete(button); + } } } diff --git a/app/assets/javascripts/discourse/app/lib/utilities.js b/app/assets/javascripts/discourse/app/lib/utilities.js index ddb80fafb2..9005d55320 100644 --- a/app/assets/javascripts/discourse/app/lib/utilities.js +++ b/app/assets/javascripts/discourse/app/lib/utilities.js @@ -503,5 +503,52 @@ export function translateModKey(string) { return string; } + +// http://github.com/feross/clipboard-copy +export function clipboardCopy(text) { + // Use the Async Clipboard API when available. + // Requires a secure browsing context (i.e. HTTPS) + if (navigator.clipboard) { + return navigator.clipboard.writeText(text).catch(function (err) { + throw err !== undefined + ? err + : new DOMException("The request is not allowed", "NotAllowedError"); + }); + } + + // ...Otherwise, use document.execCommand() fallback + + // Put the text to copy into a + const span = document.createElement("span"); + span.textContent = text; + + // Preserve consecutive spaces and newlines + span.style.whiteSpace = "pre"; + + // Add the to the page + document.body.appendChild(span); + + // Make a selection object representing the range of text selected by the user + const selection = window.getSelection(); + const range = window.document.createRange(); + selection.removeAllRanges(); + range.selectNode(span); + selection.addRange(range); + + // Copy text to the clipboard + let success = false; + try { + success = window.document.execCommand("copy"); + } catch (err) { + // eslint-disable-next-line no-console + console.log("error", err); + } + + // Cleanup + selection.removeAllRanges(); + window.document.body.removeChild(span); + return success; +} + // This prevents a mini racer crash export default {}; From f704deca17f34272c4df7d5b50c75d82640e1ef3 Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Wed, 9 Feb 2022 10:37:38 +0200 Subject: [PATCH 149/194] FIX: Clear drafts only when post is created by real user (#15720) This commits adds a new advance_draft to PostCreator that controls if the draft sequence will be advanced or not. If the draft sequence is advanced then the old drafts will be cleared. This used to happen for posts created by plugins or through the API and cleared user drafts by mistake. --- app/controllers/posts_controller.rb | 1 + app/models/topic.rb | 3 ++- lib/post_creator.rb | 3 ++- lib/topic_creator.rb | 2 +- spec/components/post_creator_spec.rb | 18 ++++++++++++++++-- spec/models/draft_spec.rb | 6 +++--- spec/requests/posts_controller_spec.rb | 12 ++++++++++++ 7 files changed, 37 insertions(+), 8 deletions(-) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index bdc2823755..da7ecf92fd 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -182,6 +182,7 @@ class PostsController < ApplicationController def create @manager_params = create_params @manager_params[:first_post_checks] = !is_api? + @manager_params[:advance_draft] = !is_api? manager = NewPostManager.new(current_user, @manager_params) diff --git a/app/models/topic.rb b/app/models/topic.rb index dbac653ba8..d3dc304700 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -330,6 +330,7 @@ class Topic < ActiveRecord::Base attr_accessor :ignore_category_auto_close attr_accessor :skip_callbacks + attr_accessor :advance_draft before_create do initialize_default_values @@ -338,7 +339,7 @@ class Topic < ActiveRecord::Base after_create do unless skip_callbacks changed_to_category(category) - advance_draft_sequence + advance_draft_sequence if advance_draft end end diff --git a/lib/post_creator.rb b/lib/post_creator.rb index 8b7f186e27..2e56397c99 100644 --- a/lib/post_creator.rb +++ b/lib/post_creator.rb @@ -36,6 +36,7 @@ class PostCreator # hidden_reason_id - Reason for hiding the post (optional) # skip_validations - Do not validate any of the content in the post # draft_key - the key of the draft we are creating (will be deleted on success) + # advance_draft - Destroy draft after creating post or topic # silent - Do not update topic stats and fields like last_post_user_id # # When replying to a topic: @@ -218,7 +219,7 @@ class PostCreator delete_owned_bookmarks ensure_in_allowed_users if guardian.is_staff? unarchive_message if !@opts[:import_mode] - DraftSequence.next!(@user, draft_key) if !@opts[:import_mode] + DraftSequence.next!(@user, draft_key) if !@opts[:import_mode] && @opts[:advance_draft] @post.save_reply_relationships end end diff --git a/lib/topic_creator.rb b/lib/topic_creator.rb index 4b79035b48..9119ec9551 100644 --- a/lib/topic_creator.rb +++ b/lib/topic_creator.rb @@ -111,7 +111,7 @@ class TopicCreator visible: @opts[:visible] } - [:subtype, :archetype, :meta_data, :import_mode].each do |key| + [:subtype, :archetype, :meta_data, :import_mode, :advance_draft].each do |key| topic_params[key] = @opts[key] if @opts[key].present? end diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb index 484ff8140a..465d83300f 100644 --- a/spec/components/post_creator_spec.rb +++ b/spec/components/post_creator_spec.rb @@ -14,7 +14,7 @@ describe PostCreator do context "new topic" do fab!(:category) { Fabricate(:category, user: user) } - let(:basic_topic_params) { { title: "hello world topic", raw: "my name is fred", archetype_id: 1 } } + let(:basic_topic_params) { { title: "hello world topic", raw: "my name is fred", archetype_id: 1, advance_draft: true } } let(:image_sizes) { { 'http://an.image.host/image.jpg' => { "width" => 111, "height" => 222 } } } let(:creator) { PostCreator.new(user, basic_topic_params) } @@ -150,7 +150,7 @@ describe PostCreator do messages = MessageBus.track_publish do created_post = PostCreator.new(admin, basic_topic_params.merge(category: cat.id)).create - _reply = PostCreator.new(admin, raw: "this is my test reply 123 testing", topic_id: created_post.topic_id).create + _reply = PostCreator.new(admin, raw: "this is my test reply 123 testing", topic_id: created_post.topic_id, advance_draft: true).create end messages.filter! { |m| m.channel != "/distributed_hash" } @@ -303,6 +303,20 @@ describe PostCreator do end end + it 'clears the draft if advanced_draft is true' do + creator = PostCreator.new(user, basic_topic_params.merge(advance_draft: true)) + Draft.set(user, Draft::NEW_TOPIC, 0, 'test') + expect(Draft.where(user: user).size).to eq(1) + expect { creator.create }.to change { Draft.count }.by(-1) + end + + it 'does not clear the draft if advanced_draft is false' do + creator = PostCreator.new(user, basic_topic_params.merge(advance_draft: false)) + Draft.set(user, Draft::NEW_TOPIC, 0, 'test') + expect(Draft.where(user: user).size).to eq(1) + expect { creator.create }.to change { Draft.count }.by(0) + end + it "updates topic stats" do first_post = creator.create topic = first_post.topic.reload diff --git a/spec/models/draft_spec.rb b/spec/models/draft_spec.rb index 538e9c96c5..22052679df 100644 --- a/spec/models/draft_spec.rb +++ b/spec/models/draft_spec.rb @@ -227,7 +227,7 @@ describe Draft do context 'key expiry' do it 'nukes new topic draft after a topic is created' do Draft.set(user, Draft::NEW_TOPIC, 0, 'my draft') - _t = Fabricate(:topic, user: user) + _t = Fabricate(:topic, user: user, advance_draft: true) s = DraftSequence.current(user, Draft::NEW_TOPIC) expect(Draft.get(user, Draft::NEW_TOPIC, s)).to eq nil expect(Draft.count).to eq 0 @@ -235,7 +235,7 @@ describe Draft do it 'nukes new pm draft after a pm is created' do Draft.set(user, Draft::NEW_PRIVATE_MESSAGE, 0, 'my draft') - t = Fabricate(:topic, user: user, archetype: Archetype.private_message, category_id: nil) + t = Fabricate(:topic, user: user, archetype: Archetype.private_message, category_id: nil, advance_draft: true) s = DraftSequence.current(t.user, Draft::NEW_PRIVATE_MESSAGE) expect(Draft.get(user, Draft::NEW_PRIVATE_MESSAGE, s)).to eq nil end @@ -252,7 +252,7 @@ describe Draft do Draft.set(user, topic.draft_key, 0, 'hello') - p = PostCreator.new(user, raw: Fabricate.build(:post).raw, topic_id: topic.id).create + p = PostCreator.new(user, raw: Fabricate.build(:post).raw, topic_id: topic.id, advance_draft: true).create expect(Draft.get(p.user, p.topic.draft_key, DraftSequence.current(p.user, p.topic.draft_key))).to eq nil end diff --git a/spec/requests/posts_controller_spec.rb b/spec/requests/posts_controller_spec.rb index 5ebc38d976..1686be0af1 100644 --- a/spec/requests/posts_controller_spec.rb +++ b/spec/requests/posts_controller_spec.rb @@ -861,6 +861,18 @@ describe PostsController do expect(response.status).to eq(403) end + it 'does not advance draft' do + Draft.set(user, Draft::NEW_TOPIC, 0, "test") + user_key = ApiKey.create!(user: user).key + + post "/posts.json", + params: { title: 'this is a test topic', raw: 'this is test whisper' }, + headers: { HTTP_API_USERNAME: user.username, HTTP_API_KEY: user_key } + + expect(response.status).to eq(200) + expect(Draft.get(user, Draft::NEW_TOPIC, 0)).to eq("test") + end + it 'will raise an error if specified category cannot be found' do user = Fabricate(:admin) master_key = Fabricate(:api_key).key From c38114f0c63aaf798c314d94eab6c6c15e3990de Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Wed, 9 Feb 2022 11:43:58 +0200 Subject: [PATCH 150/194] FIX: Sort group owners and members together (#15708) Sorting group members worked always kept the group owners at the top of the list. This commit keeps the group owners at the top of the list only when no order exists. --- app/controllers/groups_controller.rb | 20 +++++++------------- spec/requests/groups_controller_spec.rb | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 4d1687fab0..153790cfbb 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -251,7 +251,7 @@ class GroupsController < ApplicationController Discourse.deprecate(":desc is deprecated please use :asc instead", output_in_test: true, drop_from: '2.9.0') dir = (params[:desc] && params[:desc].present?) ? 'DESC' : 'ASC' end - order = "" + order = "NOT group_users.owner" if params[:requesters] guardian.ensure_can_edit!(group) @@ -305,21 +305,15 @@ class GroupsController < ApplicationController end end - users = users.joins(:user_option).select('users.*, user_options.timezone, group_users.created_at as added_at') - - members = users - .order('NOT group_users.owner') + users = users + .includes(:primary_group) + .joins(:user_option) + .select('users.*, user_options.timezone, group_users.created_at as added_at') .order(order) .order(username_lower: dir) - .limit(limit) - .offset(offset) - .includes(:primary_group) - owners = users - .order(order) - .order(username_lower: dir) - .where('group_users.owner') - .includes(:primary_group) + members = users.limit(limit).offset(offset) + owners = users.where('group_users.owner') render json: { members: serialize_data(members, GroupUserSerializer), diff --git a/spec/requests/groups_controller_spec.rb b/spec/requests/groups_controller_spec.rb index a914684642..5d350a19c1 100644 --- a/spec/requests/groups_controller_spec.rb +++ b/spec/requests/groups_controller_spec.rb @@ -547,6 +547,23 @@ describe GroupsController do expect(members.last['added_at']).to eq(first_user.created_at.as_json) end + + it "can sort items" do + sign_in(user) + group.update!(visibility_level: Group.visibility_levels[:logged_on_users]) + other_user = Fabricate(:user) + group.add_owner(other_user) + + get "/groups/#{group.name}/members.json" + + expect(response.parsed_body["members"].map { |u| u["id"] }).to eq([other_user.id, user.id]) + expect(response.parsed_body["owners"].map { |u| u["id"] }).to eq([other_user.id]) + + get "/groups/#{group.name}/members.json?order=added_at&asc=1" + + expect(response.parsed_body["members"].map { |u| u["id"] }).to eq([user.id, other_user.id]) + expect(response.parsed_body["owners"].map { |u| u["id"] }).to eq([other_user.id]) + end end describe '#posts_feed' do From b3ecf00c98bfcc5727bad92050428cbdccdc62e3 Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Wed, 9 Feb 2022 11:23:44 +0100 Subject: [PATCH 151/194] DEV: adds initial support for custom blocks using code fencing (#15743) Allows to write custom code blocks: ``` ```mermaid height=200,foo=bar test ``` ``` Which will then get converted to: ```
  
    test
  
``` --- .../tests/unit/lib/allow-lister-test.js | 6 +- .../tests/unit/lib/pretty-text-test.js | 4 +- .../tests/unit/lib/sanitizer-test.js | 66 +++++++++++++- .../pretty-text/addon/sanitizer.js | 15 ++- .../engines/discourse-markdown/code.js | 91 ++++++++++++++----- config/locales/server.en.yml | 2 +- spec/components/pretty_text_spec.rb | 19 +++- spec/integrity/common_mark_spec.rb | 2 + 8 files changed, 173 insertions(+), 32 deletions(-) diff --git a/app/assets/javascripts/discourse/tests/unit/lib/allow-lister-test.js b/app/assets/javascripts/discourse/tests/unit/lib/allow-lister-test.js index 0a759c16bc..257af29f14 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/allow-lister-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/allow-lister-test.js @@ -21,6 +21,7 @@ module("Unit | Utility | allowLister", function () { "custom.foo", "custom.baz", "custom[data-*]", + "custom[data-custom-*=foo]", "custom[rel=nofollow]", ]); @@ -38,11 +39,12 @@ module("Unit | Utility | allowLister", function () { custom: { class: ["foo", "baz"], "data-*": ["*"], + "data-custom-*": ["foo"], rel: ["nofollow", "test"], }, }, }, - "Expecting a correct white list" + "Expecting a correct allow list" ); allowLister.disable("test"); @@ -53,7 +55,7 @@ module("Unit | Utility | allowLister", function () { tagList: {}, attrList: {}, }, - "Expecting an empty white list" + "Expecting an empty allow list" ); }); }); diff --git a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js index 8e4bda3cd5..e3166ee7e2 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js @@ -893,8 +893,8 @@ eviltrout

assert.cooked( "```eviltrout\nhello\n```", - '
hello\n
', - "it doesn't not allowlist all classes" + '
hello\n
', + "it converts to custom block unknown code names" ); assert.cooked( diff --git a/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js b/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js index 5dbca0b4f4..a1efa2b8bc 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/sanitizer-test.js @@ -1,6 +1,7 @@ import PrettyText, { buildOptions } from "pretty-text/pretty-text"; import { module, test } from "qunit"; -import { hrefAllowed } from "pretty-text/sanitizer"; +import { hrefAllowed, sanitize } from "pretty-text/sanitizer"; +import AllowLister from "pretty-text/allow-lister"; module("Unit | Utility | sanitizer", function () { test("sanitize", function (assert) { @@ -250,4 +251,67 @@ module("Unit | Utility | sanitizer", function () { "escape single quotes" ); }); + + test("correctly sanitizes complex data attributes rules", function (assert) { + const allowLister = new AllowLister(); + + allowLister.allowListFeature("test", [ + "pre[data-*]", + "code[data-custom-*=foo]", + "div[data-cat-*]", + ]); + allowLister.enable("test"); + + assert.strictEqual(sanitize("", allowLister), ""); + assert.strictEqual(sanitize("", allowLister), ""); + assert.strictEqual(sanitize("", allowLister), ""); + assert.strictEqual(sanitize("", allowLister), ""); + assert.strictEqual(sanitize("", allowLister), ""); + assert.strictEqual(sanitize("", allowLister), ""); + + assert.strictEqual( + sanitize("
", allowLister),
+      '
'
+    );
+
+    assert.strictEqual(
+      sanitize("
", allowLister),
+      '
'
+    );
+
+    assert.strictEqual(
+      sanitize("", allowLister),
+      ""
+    );
+
+    assert.strictEqual(
+      sanitize("", allowLister),
+      ""
+    );
+
+    assert.strictEqual(
+      sanitize("", allowLister),
+      ""
+    );
+
+    assert.strictEqual(
+      sanitize("", allowLister),
+      ''
+    );
+
+    assert.strictEqual(
+      sanitize("", allowLister),
+      ""
+    );
+
+    assert.strictEqual(
+      sanitize("
", allowLister), + '
' + ); + + assert.strictEqual( + sanitize("
", allowLister), + '
' + ); + }); }); diff --git a/app/assets/javascripts/pretty-text/addon/sanitizer.js b/app/assets/javascripts/pretty-text/addon/sanitizer.js index 1b61c6c243..19017184a9 100644 --- a/app/assets/javascripts/pretty-text/addon/sanitizer.js +++ b/app/assets/javascripts/pretty-text/addon/sanitizer.js @@ -41,6 +41,18 @@ export function hrefAllowed(href, extraHrefMatchers) { } } +function testDataAttribute(forTag, name, value) { + return Object.keys(forTag).find((k) => { + const nameWithMatcher = `^${k.replace(/\*$/, "\\w+?")}`; + const validValues = forTag[k]; + + return ( + new RegExp(nameWithMatcher).test(name) && + (validValues.includes("*") ? true : validValues.includes(value)) + ); + }); +} + export function sanitize(text, allowLister) { if (!text) { return ""; @@ -72,12 +84,13 @@ export function sanitize(text, allowLister) { const forTag = allowList.attrList[tag]; if (forTag) { const forAttr = forTag[name]; + if ( (forAttr && (forAttr.indexOf("*") !== -1 || forAttr.indexOf(value) !== -1)) || (name.indexOf("data-html-") === -1 && name.indexOf("data-") === 0 && - forTag["data-*"]) || + (forTag["data-*"] || testDataAttribute(forTag, name, value))) || (tag === "a" && name === "href" && hrefAllowed(value, extraHrefMatchers)) || diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/code.js b/app/assets/javascripts/pretty-text/engines/discourse-markdown/code.js index 1fdab1bf29..d73516677f 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/code.js +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/code.js @@ -1,35 +1,78 @@ // we need a custom renderer for code blocks cause we have a slightly non compliant // format with special handling for text and so on - const TEXT_CODE_CLASSES = ["text", "pre", "plain"]; +function extractTokenInfo(info, md) { + if (!info) { + return; + } + + info = info.trim(); + + const matches = info.match(/(^\s*\S*)\s*(.*)/i); + if (!matches) { + return; + } + + // ensure the token has only valid chars + // c++, strucuted-text and p91, are all valid + if (!/^[\w+-]*$/i.test(matches[1])) { + return; + } + + const ASCII_REGEX = /[^\x00-\x7F]/; + const tag = md.utils.unescapeAll(matches[1].replace(ASCII_REGEX, "")); + const extractedData = { tag, attributes: {} }; + + if (matches[2]?.length) { + md.utils + .unescapeAll(matches[2].replace(ASCII_REGEX, "")) + .split(",") + .forEach((potentialPair) => { + const [key, value] = potentialPair.trim().split(/\s+/g)[0].split("="); + + // invalid pairs would get caught here and not used, eg `foo=` + if (key && value) { + extractedData.attributes[key] = value; + } + }); + } + + return extractedData; +} + function render(tokens, idx, options, env, slf, md) { - let token = tokens[idx], - info = token.info ? md.utils.unescapeAll(token.info) : "", - langName = md.options.discourse.defaultCodeLang, - className, - escapedContent = md.utils.escapeHtml(token.content); + const token = tokens[idx]; + const escapedContent = md.utils.escapeHtml(token.content); + const tokenInfo = extractTokenInfo(token.info, md); + const tag = tokenInfo?.tag || md.options.discourse.defaultCodeLang; + const attributes = tokenInfo?.attributes || {}; - if (info) { - // strip off any additional languages - info = info.trim().split(/\s+/g)[0]; + let className; + + const acceptableCodeClasses = + md.options.discourse.acceptableCodeClasses || []; + + if (TEXT_CODE_CLASSES.indexOf(tag) > -1) { + className = "lang-nohighlight"; + } else if (acceptableCodeClasses.indexOf(tag) > -1) { + className = `lang-${tag}`; + } else { + className = "lang-nohighlight"; + attributes["wrap"] = tag; } - const acceptableCodeClasses = md.options.discourse.acceptableCodeClasses; - if ( - acceptableCodeClasses && - info && - acceptableCodeClasses.indexOf(info) !== -1 - ) { - langName = info; - } + const dataAttributes = Object.keys(attributes) + .map((key) => { + const value = md.utils.escapeHtml(attributes[key]); + key = md.utils.escapeHtml(key); + return `data-code-${key}="${value}"`; + }) + .join(" "); - className = - TEXT_CODE_CLASSES.indexOf(info) !== -1 - ? "lang-nohighlight" - : "lang-" + langName; - - return `
${escapedContent}
\n`; + return `${escapedContent}\n`; } export function setup(helper) { @@ -41,6 +84,8 @@ export function setup(helper) { .concat(["auto", "nohighlight"]); }); + helper.allowList(["pre[data-code-*]"]); + helper.allowList({ custom(tag, name, value) { if (tag === "code" && name === "class") { diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index cefe57911f..974ba8622a 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -2188,7 +2188,7 @@ en: display_name_on_posts: "Show a user's full name on their posts in addition to their @username." show_time_gap_days: "If two posts are made this many days apart, display the time gap in the topic." short_progress_text_threshold: "After the number of posts in a topic goes above this number, the progress bar will only show the current post number. If you change the progress bar's width, you may need to change this value." - default_code_lang: "Default programming language syntax highlighting applied to GitHub code blocks (auto, nohighlight, ruby, python etc.)" + default_code_lang: "Default programming language syntax highlighting applied to code blocks (auto, nohighlight, ruby, python etc.)" warn_reviving_old_topic_age: "When someone starts replying to a topic where the last reply is older than this many days, a warning will be displayed. Disable by setting to 0." autohighlight_all_code: "Force apply code highlighting to all preformatted code blocks even when they didn't explicitly specify the language." highlighted_languages: "Included syntax highlighting rules. (Warning: including too many languages may impact performance) see: https://highlightjs.org/static/demo for a demo" diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 7382700734..6db1a86e35 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -527,12 +527,27 @@ describe PrettyText do end it 'can include code class correctly' do + SiteSetting.highlighted_languages += '|c++|structured-text|p21' + # keep in mind spaces should be trimmed per spec expect(PrettyText.cook("``` ruby the mooby\n`````")).to eq('
') expect(PrettyText.cook("```cpp\ncpp\n```")).to match_html("
cpp\n
") expect(PrettyText.cook("```\ncpp\n```")).to match_html("
cpp\n
") expect(PrettyText.cook("```text\ncpp\n```")).to match_html("
cpp\n
") - + expect(PrettyText.cook("```custom\ncustom content\n```")).to match_html("
custom content\n
") + expect(PrettyText.cook("```custom foo=bar\ncustom content\n```")).to match_html("
custom content
") + expect(PrettyText.cook("```INVALID a=1\n```")).to match_html("
\n
") + expect(PrettyText.cook("```INVALID a=1, foo=bar , baz=2\n```")).to match_html("
\n
") + expect(PrettyText.cook("```text\n```")).to match_html("
\n
") + expect(PrettyText.cook("```auto\n```")).to match_html("
\n
") + expect(PrettyText.cook("```ruby startline=3 $%@#\n```")).to match_html("
\n
") + expect(PrettyText.cook("```mermaid a_-你=17\n```")).to match_html("
\n
") + expect(PrettyText.cook("```mermaid foo=\n```")).to match_html("
\n
") + expect(PrettyText.cook("```mermaid foo=‮ begin admin o\n```")).to match_html("
\n
") + expect(PrettyText.cook("```c++\nc++\n```")).to match_html("
c++\n
") + expect(PrettyText.cook("```structured-text\nstructured-text\n```")).to match_html("
structured-text\n
") + expect(PrettyText.cook("```p21\np21\n```")).to match_html("
p21\n
") + expect(PrettyText.cook("
")).to match_html("
")
     end
 
     it 'indents code correctly' do
@@ -553,7 +568,7 @@ describe PrettyText do
     it "strips out unicode bidirectional (bidi) override characters and replaces with a highlighted span" do
       code = <<~MD
          X
-         ```js
+         ```auto
          var isAdmin = false;
          /*‮ begin admin only */⁦ if (isAdmin) ⁩ ⁦ {
          console.log("You are an admin.");
diff --git a/spec/integrity/common_mark_spec.rb b/spec/integrity/common_mark_spec.rb
index 852e3ea050..fbf7a9ee16 100644
--- a/spec/integrity/common_mark_spec.rb
+++ b/spec/integrity/common_mark_spec.rb
@@ -34,6 +34,8 @@ describe "CommonMark" do
         cooked.gsub!(" class=\"lang-auto\"", '')
         cooked.gsub!(/(.*)<\/span>/, "\\1")
         cooked.gsub!(/<\/a>/, "")
+        # we support data-attributes which is not in the spec
+        cooked.gsub!("
", '
')
         # we don't care about this
         cooked.gsub!("
\n
", "
") html.gsub!("
\n
", "
") From 5ff3a9c4bbe23afe8d22baf7c41d0458798dd7af Mon Sep 17 00:00:00 2001 From: Ayke Halder Date: Wed, 9 Feb 2022 12:18:59 +0100 Subject: [PATCH 152/194] DEV: add native lazy loading for emojis (#15830) --- .../discourse/tests/acceptance/emoji-test.js | 4 +- .../acceptance/user-drafts-stream-test.js | 2 +- .../tests/unit/lib/pretty-text-test.js | 18 ++-- .../engines/discourse-markdown/emoji.js | 6 ++ .../engines/discourse-markdown/quotes.js | 1 + app/models/emoji.rb | 4 +- plugins/poll/spec/lib/pretty_text_spec.rb | 6 +- spec/components/cooked_post_processor_spec.rb | 14 +-- spec/components/pretty_text_spec.rb | 94 +++++++++---------- spec/fabricators/post_fabricator.rb | 2 +- .../helpers/user_notifications_helper_spec.rb | 2 +- spec/jobs/rebake_custom_emoji_posts_spec.rb | 2 +- spec/models/emoji_spec.rb | 4 +- spec/models/user_profile_spec.rb | 2 +- spec/services/search_indexer_spec.rb | 2 +- 15 files changed, 85 insertions(+), 78 deletions(-) diff --git a/app/assets/javascripts/discourse/tests/acceptance/emoji-test.js b/app/assets/javascripts/discourse/tests/acceptance/emoji-test.js index fed440044b..a520901015 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/emoji-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/emoji-test.js @@ -13,7 +13,7 @@ acceptance("Emoji", function (needs) { await fillIn(".d-editor-input", "this is an emoji :blonde_woman:"); assert.strictEqual( queryAll(".d-editor-preview:visible").html().trim(), - `

this is an emoji :blonde_woman:

` + `

this is an emoji :blonde_woman:

` ); }); @@ -24,7 +24,7 @@ acceptance("Emoji", function (needs) { await fillIn(".d-editor-input", "this is an emoji :blonde_woman:t5:"); assert.strictEqual( queryAll(".d-editor-preview:visible").html().trim(), - `

this is an emoji :blonde_woman:t5:

` + `

this is an emoji :blonde_woman:t5:

` ); }); }); diff --git a/app/assets/javascripts/discourse/tests/acceptance/user-drafts-stream-test.js b/app/assets/javascripts/discourse/tests/acceptance/user-drafts-stream-test.js index cbed14814f..ace7abce1d 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/user-drafts-stream-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/user-drafts-stream-test.js @@ -55,7 +55,7 @@ acceptance("User Drafts", function (needs) { ); assert.strictEqual( query(".user-stream-item:nth-child(3) .excerpt").innerHTML.trim(), - `here goes a reply to a PM :slight_smile:` + `here goes a reply to a PM :slight_smile:` ); }); }); diff --git a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js index e3166ee7e2..827b01f5de 100644 --- a/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js +++ b/app/assets/javascripts/discourse/tests/unit/lib/pretty-text-test.js @@ -1506,7 +1506,7 @@ var bar = 'bar'; assert.cookedOptions( ":grin: @sam", { featuresOverride: ["emoji"] }, - `

:grin: @sam

`, + `

:grin: @sam

`, "cooks emojis when only the emoji markdown engine is enabled" ); @@ -1521,15 +1521,15 @@ var bar = 'bar'; test("emoji", function (assert) { assert.cooked( ":smile:", - `

:smile:

` + `

:smile:

` ); assert.cooked( ":(", - `

:frowning:

` + `

:frowning:

` ); assert.cooked( "8-)", - `

:sunglasses:

` + `

:sunglasses:

` ); }); @@ -1543,7 +1543,7 @@ var bar = 'bar'; assert.cookedOptions( "test:smile:test", { siteSettings: { enable_inline_emoji_translation: true } }, - `

test:smile:test

` + `

test:smile:test

` ); }); @@ -1551,7 +1551,7 @@ var bar = 'bar'; assert.cookedOptions( ":smile:", { siteSettings: { emoji_set: "twitter" } }, - `

:smile:

` + `

:smile:

` ); }); @@ -1564,7 +1564,7 @@ var bar = 'bar'; external_emoji_url: "https://emoji.hosting.service", }, }, - `

:smile:

` + `

:smile:

` ); }); @@ -1574,7 +1574,7 @@ var bar = 'bar'; assert.cookedOptions( ":foo:", {}, - `

:foo:

` + `

:foo:

` ); registerEmoji("bar", "/images/avatar.png", "baz"); @@ -1582,7 +1582,7 @@ var bar = 'bar'; assert.cookedOptions( ":bar:", {}, - `

:bar:

` + `

:bar:

` ); }); diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/emoji.js b/app/assets/javascripts/pretty-text/engines/discourse-markdown/emoji.js index 0806a97b33..6a68b19d9f 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/emoji.js +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/emoji.js @@ -118,6 +118,9 @@ function getEmojiTokenByName(name, state) { ["title", info.title], ["class", info.classes], ["alt", info.title], + ["loading", "lazy"], + ["width", "20"], + ["height", "20"], ]; return token; @@ -345,5 +348,8 @@ export function setup(helper) { "img[class=emoji emoji-custom]", "img[class=emoji emoji-custom only-emoji]", "img[class=emoji only-emoji]", + "img[loading=lazy]", + "img[width=20]", + "img[height=20]", ]); } diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/quotes.js b/app/assets/javascripts/pretty-text/engines/discourse-markdown/quotes.js index 8eaf6dd406..3a12846ee2 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/quotes.js +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/quotes.js @@ -127,6 +127,7 @@ const rule = { emojiCDNUrl: options.emojiCDNUrl, enableEmojiShortcuts: options.enableEmojiShortcuts, inlineEmoji: options.inlineEmoji, + lazy: true, }); } diff --git a/app/models/emoji.rb b/app/models/emoji.rb index 8e7d8fd6be..36bdea93be 100644 --- a/app/models/emoji.rb +++ b/app/models/emoji.rb @@ -240,9 +240,9 @@ class Emoji if code && Emoji.custom?(code) emoji = Emoji[code] - "\"#{code}\"" + "\"#{code}\"" elsif code && Emoji.exists?(code) - "\"#{code}\"" + "\"#{code}\"" else name end diff --git a/plugins/poll/spec/lib/pretty_text_spec.rb b/plugins/poll/spec/lib/pretty_text_spec.rb index 5770f804f3..0f6f870fe7 100644 --- a/plugins/poll/spec/lib/pretty_text_spec.rb +++ b/plugins/poll/spec/lib/pretty_text_spec.rb @@ -100,7 +100,7 @@ describe PrettyText do
    -
  1. test 1 :slight_smile: test +
  2. test 1 :slight_smile: test
  3. test 2
@@ -165,7 +165,7 @@ describe PrettyText do MD expect(cooked).to include(<<~HTML) -
What’s your favorite berry? :wink: https://google.com/ +
What’s your favorite berry? :wink: https://google.com/
HTML end @@ -185,7 +185,7 @@ describe PrettyText do MD expect(cooked).to include(<<~HTML) -
What’s your favorite berry? :wink: https://google.com/ +
What’s your favorite berry? :wink: https://google.com/
HTML diff --git a/spec/components/cooked_post_processor_spec.rb b/spec/components/cooked_post_processor_spec.rb index 77f9cb4b3a..809b63555a 100644 --- a/spec/components/cooked_post_processor_spec.rb +++ b/spec/components/cooked_post_processor_spec.rb @@ -1246,7 +1246,7 @@ describe CookedPostProcessor do Google

text.txt (20 Bytes)
- :smile:

+ :smile:

HTML end @@ -1261,7 +1261,7 @@ describe CookedPostProcessor do Google

text.txt (20 Bytes)
- :smile:

+ :smile:

HTML end @@ -1274,7 +1274,7 @@ describe CookedPostProcessor do Google

text.txt (20 Bytes)
- :smile:

+ :smile:

HTML end @@ -1288,7 +1288,7 @@ describe CookedPostProcessor do Google

text.txt (20 Bytes)
- :smile:

+ :smile:

HTML end @@ -1302,7 +1302,7 @@ describe CookedPostProcessor do Google

text.txt (20 Bytes)
- :smile:

+ :smile:

HTML end @@ -1336,7 +1336,7 @@ describe CookedPostProcessor do cpp.optimize_urls expect(cpp.html).to match_html <<~HTML -

This post has a local emoji :+1: and an external upload

+

This post has a local emoji :+1: and an external upload

smallest.png

HTML end @@ -1354,7 +1354,7 @@ describe CookedPostProcessor do cpp.optimize_urls expect(cpp.html).to match_html <<~HTML -

This post has a local emoji :+1: and an external upload

+

This post has a local emoji :+1: and an external upload

smallest.png

HTML end diff --git a/spec/components/pretty_text_spec.rb b/spec/components/pretty_text_spec.rb index 6db1a86e35..76d522d60c 100644 --- a/spec/components/pretty_text_spec.rb +++ b/spec/components/pretty_text_spec.rb @@ -37,7 +37,7 @@ describe PrettyText do