├── .gitignore ├── CODEOWNERS ├── LICENSE ├── app ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── core ├── __init__.py ├── admin.py ├── apps.py ├── javascript │ ├── controllers │ │ ├── application_controller.js │ │ ├── book_search_controller.js │ │ ├── chat_controller.js │ │ └── example_controller.js │ └── example.js ├── migrations │ ├── 0001_initial.py │ └── __init__.py ├── models.py ├── reflexes │ ├── __init__.py │ ├── book_search_reflex.py │ ├── chat_reflex.py │ ├── example_reflex.py │ └── newsletter_signup_reflex.py ├── static │ └── css │ │ └── styles.css ├── templates │ ├── _add_sources.html │ ├── _book_search_demo.html │ ├── _chat_demo.html │ ├── _example_demo.html │ ├── _newsletter_signup.html │ ├── base.html │ ├── demo.html │ └── index.html ├── tests.py └── views │ ├── __init__.py │ ├── book_search.py │ ├── calendar.py │ ├── chat.py │ ├── example.py │ ├── mixins.py │ └── newsletter_signup.py ├── fabfile.py ├── manage.py ├── package.json ├── readme.md ├── requirements.in ├── requirements.txt ├── webpack.config.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.toptal.com/developers/gitignore/api/django 3 | # Edit at https://www.toptal.com/developers/gitignore?templates=django 4 | 5 | ### Django ### 6 | *.log 7 | *.pot 8 | *.pyc 9 | __pycache__/ 10 | local_settings.py 11 | db.sqlite3 12 | db.sqlite3-journal 13 | media 14 | 15 | # If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ 16 | # in your Git repository. Update and uncomment the following line accordingly. 17 | # /staticfiles/ 18 | 19 | ### Django.Python Stack ### 20 | # Byte-compiled / optimized / DLL files 21 | *.py[cod] 22 | *$py.class 23 | 24 | # C extensions 25 | *.so 26 | 27 | # Distribution / packaging 28 | .Python 29 | build/ 30 | develop-eggs/ 31 | dist/ 32 | downloads/ 33 | eggs/ 34 | .eggs/ 35 | lib/ 36 | lib64/ 37 | parts/ 38 | sdist/ 39 | var/ 40 | wheels/ 41 | pip-wheel-metadata/ 42 | share/python-wheels/ 43 | *.egg-info/ 44 | .installed.cfg 45 | *.egg 46 | MANIFEST 47 | 48 | # PyInstaller 49 | # Usually these files are written by a python script from a template 50 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 51 | *.manifest 52 | *.spec 53 | 54 | # Installer logs 55 | pip-log.txt 56 | pip-delete-this-directory.txt 57 | 58 | # Unit test / coverage reports 59 | htmlcov/ 60 | .tox/ 61 | .nox/ 62 | .coverage 63 | .coverage.* 64 | .cache 65 | nosetests.xml 66 | coverage.xml 67 | *.cover 68 | *.py,cover 69 | .hypothesis/ 70 | .pytest_cache/ 71 | pytestdebug.log 72 | 73 | # Translations 74 | *.mo 75 | 76 | # Django stuff: 77 | 78 | # Flask stuff: 79 | instance/ 80 | .webassets-cache 81 | 82 | # Scrapy stuff: 83 | .scrapy 84 | 85 | # Sphinx documentation 86 | docs/_build/ 87 | doc/_build/ 88 | 89 | # PyBuilder 90 | target/ 91 | 92 | # Jupyter Notebook 93 | .ipynb_checkpoints 94 | 95 | # IPython 96 | profile_default/ 97 | ipython_config.py 98 | 99 | # pyenv 100 | .python-version 101 | 102 | # pipenv 103 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 104 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 105 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 106 | # install all needed dependencies. 107 | #Pipfile.lock 108 | 109 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 110 | __pypackages__/ 111 | 112 | # Celery stuff 113 | celerybeat-schedule 114 | celerybeat.pid 115 | 116 | # SageMath parsed files 117 | *.sage.py 118 | 119 | # Environments 120 | .env 121 | .venv 122 | env/ 123 | venv/ 124 | ENV/ 125 | env.bak/ 126 | venv.bak/ 127 | pythonenv* 128 | 129 | # Spyder project settings 130 | .spyderproject 131 | .spyproject 132 | 133 | # Rope project settings 134 | .ropeproject 135 | 136 | # mkdocs documentation 137 | /site 138 | 139 | # mypy 140 | .mypy_cache/ 141 | .dmypy.json 142 | dmypy.json 143 | 144 | # Pyre type checker 145 | .pyre/ 146 | 147 | # pytype static type analyzer 148 | .pytype/ 149 | 150 | # profiling data 151 | .prof 152 | 153 | # End of https://www.toptal.com/developers/gitignore/api/django 154 | node_modules 155 | /static 156 | /core/static/dist 157 | django-sockpuppet 158 | .env/ 159 | webpack-stats.json 160 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | * zodman 2 | * jonathan-s 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Andres Vargas & Jonathan Sundqvist 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zodman/django-sockpuppet-expo/c66ee06a5feac2ce06d2d9e420c2c77b9a2c9b72/app/__init__.py -------------------------------------------------------------------------------- /app/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for app project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | import django 12 | from django.core.asgi import get_asgi_application 13 | from channels.routing import get_default_application 14 | 15 | 16 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings') 17 | django.setup() 18 | #application = get_asgi_application() 19 | application = get_default_application() 20 | -------------------------------------------------------------------------------- /app/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for app project. 3 | 4 | Generated by 'django-admin startproject' using Django 3.1.3. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.1/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/3.1/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | import os 15 | 16 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 17 | BASE_DIR = Path(__file__).resolve().parent.parent 18 | 19 | 20 | # Quick-start development settings - unsuitable for production 21 | # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ 22 | 23 | # SECURITY WARNING: keep the secret key used in production secret! 24 | SECRET_KEY = os.environ.get('SECRET_KEY', "a-not-so-secret-key") 25 | 26 | # SECURITY WARNING: don't run with debug turned on in production! 27 | DEBUG = os.environ.get('DEBUG', True) 28 | ALLOWED_HOSTS = ['*', ] 29 | 30 | # Application definition 31 | 32 | INSTALLED_APPS = [ 33 | 'django.contrib.admin', 34 | 'django.contrib.auth', 35 | 'django.contrib.contenttypes', 36 | 'django.contrib.sessions', 37 | 'django.contrib.messages', 38 | 'django.contrib.staticfiles', 39 | 'django.contrib.humanize', 40 | 'channels', 41 | 'sockpuppet', 42 | 'core', 43 | 'pygments_renderer', 44 | 'widget_tweaks', 45 | 'webpack_loader', 46 | ] 47 | 48 | MIDDLEWARE = [ 49 | 'django.middleware.security.SecurityMiddleware', 50 | 'whitenoise.middleware.WhiteNoiseMiddleware', 51 | 'django.contrib.sessions.middleware.SessionMiddleware', 52 | 'django.middleware.common.CommonMiddleware', 53 | 'django.middleware.csrf.CsrfViewMiddleware', 54 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 55 | 'django.contrib.messages.middleware.MessageMiddleware', 56 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 57 | ] 58 | 59 | ROOT_URLCONF = 'app.urls' 60 | 61 | TEMPLATES = [ 62 | { 63 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 64 | 'DIRS': [], 65 | 'APP_DIRS': True, 66 | 'OPTIONS': { 67 | 'context_processors': [ 68 | 'django.template.context_processors.debug', 69 | 'django.template.context_processors.request', 70 | 'django.contrib.auth.context_processors.auth', 71 | 'django.contrib.messages.context_processors.messages', 72 | ], 73 | }, 74 | }, 75 | ] 76 | 77 | # Database 78 | # https://docs.djangoproject.com/en/3.1/ref/settings/#databases 79 | 80 | DATABASES = { 81 | 'default': { 82 | 'ENGINE': 'django.db.backends.sqlite3', 83 | 'NAME': BASE_DIR / 'db.sqlite3', 84 | } 85 | } 86 | 87 | 88 | # Password validation 89 | # https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators 90 | 91 | AUTH_PASSWORD_VALIDATORS = [ 92 | { 93 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 94 | }, 95 | { 96 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 97 | }, 98 | { 99 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 100 | }, 101 | { 102 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 103 | }, 104 | ] 105 | 106 | 107 | # Internationalization 108 | # https://docs.djangoproject.com/en/3.1/topics/i18n/ 109 | 110 | LANGUAGE_CODE = 'en-us' 111 | 112 | TIME_ZONE = 'UTC' 113 | 114 | USE_I18N = True 115 | USE_L10N = True 116 | USE_TZ = True 117 | 118 | 119 | # Static files (CSS, JavaScript, Images) 120 | # https://docs.djangoproject.com/en/3.1/howto/static-files/ 121 | 122 | STATIC_URL = '/static/' 123 | STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage' 124 | STATIC_ROOT = BASE_DIR / "static" 125 | 126 | CHANNEL_LAYERS = { 127 | "default": { 128 | # IMPORTANT, do not ever use this in a production environment 129 | "BACKEND": "channels.layers.InMemoryChannelLayer" 130 | } 131 | } 132 | ASGI_APPLICATION = 'sockpuppet.routing.application' 133 | WSGI_APPLICATION = 'app.wsgi.application' 134 | 135 | logging_debug = 'DEBUG' if DEBUG else 'INFO' 136 | LOGGING = { 137 | 'version': 1, 138 | 'disable_existing_loggers': False, 139 | 'root': { 140 | 'handlers': ['console'], 141 | 'level': 'DEBUG' 142 | }, 143 | 'handlers': { 144 | 'console': { 145 | 'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'), 146 | 'class': 'logging.StreamHandler', 147 | 'formatter': 'simple' 148 | }, 149 | 'sockpuppet': { 150 | 'level': 'DEBUG', 151 | 'class': 'logging.StreamHandler', 152 | 'formatter': 'simple' 153 | } 154 | }, 155 | 'formatters': { 156 | 'verbose': { 157 | 'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s", 158 | 'datefmt': "%d/%b/%Y %H:%M:%S" 159 | }, 160 | 'simple': { 161 | 'format': '%(levelname)s %(message)s' 162 | }, 163 | }, 164 | 'loggers': { 165 | 'django.db.backends': { 166 | # uncomment to see all queries 167 | # 'level': 'DEBUG', 168 | 'handlers': ['console'], 169 | }, 170 | 'sockpuppet': { 171 | 'level': logging_debug, 172 | 'handlers': ['sockpuppet'] 173 | } 174 | } 175 | } 176 | 177 | WEBPACK_LOADER = { 178 | 'DEFAULT': { 179 | 'STATS_FILE': os.path.join(BASE_DIR, 'webpack-stats.json'), 180 | 'BUNDLE_DIR_NAME': 'dist/js/', 181 | 'CACHE': not DEBUG 182 | } 183 | } 184 | 185 | 186 | try: 187 | from .local_settings import * 188 | except ImportError: 189 | pass 190 | -------------------------------------------------------------------------------- /app/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path 3 | from django.contrib.staticfiles.urls import staticfiles_urlpatterns 4 | from django.views.generic import TemplateView 5 | 6 | import core.views.example 7 | import core.views.book_search 8 | import core.views.chat 9 | import core.views.calendar 10 | import core.views.newsletter_signup 11 | 12 | 13 | urlpatterns = [ 14 | path('admin/', admin.site.urls), 15 | path('', TemplateView.as_view(template_name='index.html'), name='index'), 16 | path('book-search/', core.views.book_search.book_search, 17 | name='book_search'), 18 | path('example/', core.views.example.example, name='example'), 19 | path('chat/', core.views.chat.chat, name='chat'), 20 | path('calendar/', core.views.calendar.calendar, name="calendar"), 21 | path('newsletter-signup', core.views.newsletter_signup.view, name='newsletter-signup') 22 | ] + staticfiles_urlpatterns() 23 | -------------------------------------------------------------------------------- /app/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for app project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zodman/django-sockpuppet-expo/c66ee06a5feac2ce06d2d9e420c2c77b9a2c9b72/core/__init__.py -------------------------------------------------------------------------------- /core/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /core/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CoreConfig(AppConfig): 5 | name = 'core' 6 | -------------------------------------------------------------------------------- /core/javascript/controllers/application_controller.js: -------------------------------------------------------------------------------- 1 | //import Turbolinks from 'turbolinks' 2 | import { Controller } from 'stimulus' 3 | import StimulusReflex from 'stimulus_reflex' 4 | 5 | export default class extends Controller { 6 | connect () { 7 | StimulusReflex.register(this) 8 | } 9 | 10 | beforeReflex (element, reflex) { 11 | console.log("beforeReflex") 12 | document 13 | .querySelectorAll('[data-activity-indicator]') 14 | .forEach(el => (el.hidden = false)) 15 | } 16 | 17 | reflexError (element, reflex, error) { 18 | alert(`Error invoking a Reflex! ${error}`) 19 | } 20 | 21 | reload () { 22 | // Turbolinks.visit(location.href) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /core/javascript/controllers/book_search_controller.js: -------------------------------------------------------------------------------- 1 | import ApplicationController from './application_controller' 2 | 3 | export default class extends ApplicationController { 4 | 5 | // static targets = 6 | static get targets () { 7 | return ['query', 'activity', 'count', 'list'] 8 | } 9 | 10 | beforePerform (element, reflex) { 11 | console.log("beforePerform") 12 | this.activityTarget.hidden = false 13 | this.countTarget.hidden = true 14 | } 15 | 16 | perform (event) { 17 | console.log("perfom") 18 | event.preventDefault() 19 | this.stimulate('BookSearchReflex#perform', this.queryTarget.value) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /core/javascript/controllers/chat_controller.js: -------------------------------------------------------------------------------- 1 | import Rails from '@rails/ujs' 2 | import { debounce } from 'lodash-es' 3 | import ApplicationController from './application_controller' 4 | 5 | let lastMessageId 6 | const reload = controller => { 7 | controller.stimulate('ChatReflex#reload') 8 | } 9 | const debouncedReload = debounce(reload, 100) 10 | 11 | export default class extends ApplicationController { 12 | static get targets () { 13 | return ['list', 'input'] 14 | } 15 | 16 | connect () { 17 | super.connect() 18 | this.scroll(100) 19 | } 20 | 21 | post (event) { 22 | console.log("post"); 23 | Rails.stopEverything(event) 24 | lastMessageId = Math.random() 25 | this.stimulate( 26 | 'ChatReflex#post', 27 | this.element.dataset.color, 28 | this.inputTarget.value, 29 | lastMessageId 30 | ) 31 | } 32 | 33 | afterPost () { 34 | this.inputTarget.value = '' 35 | this.inputTarget.focus() 36 | this.scroll(1) 37 | } 38 | 39 | scroll (delay = 10) { 40 | const lists = document.querySelectorAll('[data-target="chat.list"]') 41 | setTimeout(() => { 42 | lists.forEach(e => (e.scrollTop = e.scrollHeight)) 43 | }, delay) 44 | } 45 | 46 | reload (event) { 47 | if (!event.detail) return 48 | const { messageId } = event.detail 49 | if (messageId === lastMessageId) return 50 | debouncedReload(this) 51 | } 52 | } 53 | 54 | -------------------------------------------------------------------------------- /core/javascript/controllers/example_controller.js: -------------------------------------------------------------------------------- 1 | import { Controller } from 'stimulus'; 2 | import StimulusReflex from 'stimulus_reflex'; 3 | 4 | 5 | export default class extends Controller { 6 | connect() { 7 | StimulusReflex.register(this) 8 | } 9 | 10 | increment(event) { 11 | console.log('increment') 12 | event.preventDefault() 13 | this.stimulate('ExampleReflex#increment', 1) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /core/javascript/example.js: -------------------------------------------------------------------------------- 1 | import { Application } from 'stimulus' 2 | import StimulusReflex from 'stimulus_reflex' 3 | import WebsocketConsumer from 'sockpuppet-js' 4 | import CableReady from 'cable_ready' 5 | import debounced from 'debounced' 6 | import BookSearchController from './controllers/book_search_controller' 7 | import ExampleController from './controllers/example_controller' 8 | import ChatController from './controllers/chat_controller' 9 | 10 | debounced.initialize() 11 | import TurboLinks from 'turbolinks' 12 | 13 | TurboLinks.start() 14 | 15 | const application = Application.start() 16 | const ssl = location.protocol !== 'https:' ? '' : 's'; 17 | const consumer = new WebsocketConsumer(`ws${ssl}://${location.hostname}:${location.port}/ws/sockpuppet-sync`) 18 | 19 | consumer.subscriptions.create('ChatChannel', { 20 | received (data) { 21 | if (data.cableReady) CableReady.perform(data.operations) 22 | } 23 | }) 24 | 25 | 26 | application.register("example", ExampleController) 27 | application.register("book-search", BookSearchController) 28 | application.register("chat", ChatController) 29 | StimulusReflex.initialize(application, { consumer, debug: true }) 30 | -------------------------------------------------------------------------------- /core/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2 on 2021-04-25 17:06 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='NewsletterSubscription', 16 | fields=[ 17 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('email', models.EmailField(max_length=254)), 19 | ('name', models.CharField(max_length=256)), 20 | ], 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /core/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zodman/django-sockpuppet-expo/c66ee06a5feac2ce06d2d9e420c2c77b9a2c9b72/core/migrations/__init__.py -------------------------------------------------------------------------------- /core/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class NewsletterSubscription(models.Model): 5 | email = models.EmailField() 6 | name = models.CharField(max_length=256) 7 | -------------------------------------------------------------------------------- /core/reflexes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zodman/django-sockpuppet-expo/c66ee06a5feac2ce06d2d9e420c2c77b9a2c9b72/core/reflexes/__init__.py -------------------------------------------------------------------------------- /core/reflexes/book_search_reflex.py: -------------------------------------------------------------------------------- 1 | from sockpuppet.reflex import Reflex 2 | import requests 3 | 4 | 5 | class BookSearchReflex(Reflex): 6 | def perform(self, query=''): 7 | resp = requests.get('http://openlibrary.org/search.json', params={'q': query}) 8 | resp.raise_for_status() 9 | books = resp.json() 10 | self.books = books.get('docs', []) 11 | self.count = books['num_found'] 12 | -------------------------------------------------------------------------------- /core/reflexes/chat_reflex.py: -------------------------------------------------------------------------------- 1 | from sockpuppet.reflex import Reflex 2 | from sockpuppet.channel import Channel 3 | from django.core.cache import cache 4 | from django.utils import timezone 5 | 6 | 7 | class ChatReflex(Reflex): 8 | def post(self, color, message, message_id): 9 | chats = cache.get("chats", []) 10 | self.total = 100 11 | if len(chats) > self.total: 12 | chats = [] 13 | if message: 14 | chats.append({ 15 | 'message': message, 16 | 'messageId': message_id, 17 | 'created_at': timezone.now() 18 | }) 19 | cache.set("chats", chats) 20 | channel = Channel("ChatChannel") 21 | channel.dispatch_event({ 22 | 'name': 'chats:added', 23 | 'detail': {'messageId': message_id} 24 | }) 25 | channel.broadcast() 26 | -------------------------------------------------------------------------------- /core/reflexes/example_reflex.py: -------------------------------------------------------------------------------- 1 | from sockpuppet.reflex import Reflex 2 | 3 | 4 | class ExampleReflex(Reflex): 5 | def increment(self, step=1): 6 | self.count = int(self.element.dataset['count']) + step 7 | self.session['count']= self.count 8 | -------------------------------------------------------------------------------- /core/reflexes/newsletter_signup_reflex.py: -------------------------------------------------------------------------------- 1 | from sockpuppet.reflex import Reflex 2 | 3 | from core.models import NewsletterSubscription 4 | 5 | 6 | class SubscriptionReflex(Reflex): 7 | def add_person(self): 8 | o = NewsletterSubscription.objects.update_or_create( 9 | name=self.params['name'], 10 | email=self.params['email'] 11 | ) 12 | 13 | def remove_person(self): 14 | id = self.element.dataset['id'] 15 | NewsletterSubscription.objects.filter(id=id).delete() 16 | -------------------------------------------------------------------------------- /core/static/css/styles.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --justify-important: left; 3 | } 4 | 5 | header { 6 | padding-top: 0; 7 | margin-left: 0.5rem; 8 | } 9 | html { 10 | font-size: 10px; 11 | } 12 | body { 13 | font-size: 1.6rem; 14 | height: 100%; 15 | padding: 0; 16 | } 17 | aside { 18 | padding: 0.5rem; 19 | min-height: calc(100vh - 200px); 20 | } 21 | footer { 22 | position: fixed; 23 | right: 0; 24 | left: 0; 25 | } 26 | 27 | footer, 28 | header, 29 | main { 30 | padding: 0rem 2rem; 31 | } 32 | 33 | hr { margin-top: 0; margin-bottom: 0; } 34 | h1 { font-family: 'Open Sans', sans-serif; } 35 | nav ul li { display: block; } 36 | 37 | table { 38 | width: 100%; 39 | display: inline-table; 40 | } 41 | 42 | form { 43 | max-width: 100%; 44 | } 45 | 46 | .min-vh-100 { 47 | min-height: 100vh !important; 48 | } 49 | 50 | flex-container { display: flex; } 51 | .flex { display: flex; } 52 | .flex-grow { flex-grow: 1; } 53 | .self-center { align-self: center; } 54 | .leading-none { line-height: 1; } 55 | .m-0 { margin: 0; } 56 | .mt-0 { margin-top: 0; } 57 | .mt-1 { margin-top: 1rem; } 58 | .mb-0 { margin-bottom: 0; } 59 | .mb-1 { margin-bottom: 1rem; } 60 | .pl-1 { padding-left: 1rem; } 61 | .pr-2 { padding-right: 2rem; } 62 | .py--5 { padding-top: 0.5rem; padding-bottom: 0.5rem;} 63 | .py-1 { padding-top: 1rem; padding-bottom: 1rem;} 64 | 65 | .border-right { 66 | border-right: 1px #AAA solid; 67 | } 68 | 69 | /* 70 | * https://jsfiddle.net/vjs0cr9a/2 71 | * */ 72 | 73 | 74 | -------------------------------------------------------------------------------- /core/templates/_add_sources.html: -------------------------------------------------------------------------------- 1 | {% load pygmentize %} 2 | {% for filetype, filenames in files.items %} 3 |
4 | {{ filetype }} 5 | {% for file in filenames %} 6 |
7 | {{ file.filename }} (LOC {{ file.loc }}) 8 | {{ file.src|pygmentize:file.pygment_type }} 9 | {% endfor %} 10 |
11 | {% endfor %} 12 | -------------------------------------------------------------------------------- /core/templates/_book_search_demo.html: -------------------------------------------------------------------------------- 1 | {% load humanize %} 2 |
3 | 5 |
6 |
7 | 8 | 12 | 13 | {{count|default:0|intcomma}} books found 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | {% for book in books|slice:'0:5' %} 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | {% endfor %} 37 | 38 | 39 |
40 |
41 | -------------------------------------------------------------------------------- /core/templates/_chat_demo.html: -------------------------------------------------------------------------------- 1 | 2 |
7 | 8 | {% for chat in chats %} 9 | 14 | {% endfor %} 15 | 16 |
17 | 18 | 19 |
20 | Messages stored {{chats|length}} 21 |
22 |
23 |
24 | -------------------------------------------------------------------------------- /core/templates/_example_demo.html: -------------------------------------------------------------------------------- 1 |
2 | 8 | Increment {{ count }} 9 | 10 |
11 | -------------------------------------------------------------------------------- /core/templates/_newsletter_signup.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 |

Sign up for newsletter!

5 |
6 | {{ form }} 7 | 8 |
9 |

Signed:

10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | {% for p in people %} 20 | 21 | 22 | 23 | 25 | 26 | {% endfor %} 27 | 28 |
NameEmailRemove
{{ p.name }} {{ p.email }}Remove
29 |
30 |
31 | -------------------------------------------------------------------------------- /core/templates/base.html: -------------------------------------------------------------------------------- 1 | {% load static pygmentize webpack_loader %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Expo 17 | {% render_bundle 'example' %} 18 | 19 | 20 | 21 | 22 |
23 | 26 |

27 | Sockpuppet Expo 28 |

29 |
30 |
31 | 32 | 42 |
43 |

{% block subtitle %}Django Sockpuppet{% endblock subtitle %}

44 | {% block main %} 45 | {% endblock %} 46 |
47 |
48 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /core/templates/demo.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load humanize %} 3 | {% block subtitle %}{{ subtitle }}{% endblock subtitle %} 4 | {% block main %} 5 |
6 | {% include demo_template %} 7 | {% include "_add_sources.html" %} 8 |
9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /core/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block main %} 4 |

5 | It is an exciting new way to build reactive, modern real-time apps. 6 | It eliminates the hassle of maintaining state on the client. 7 | It's a new way of thinking... and it works with technologies that Django developers already use, like server rendered HTML, Russian Doll caching, Stimulus and Turbolinks. 8 |
9 | The demos on this site are an attempt to teach others how to build reactive applications with django-sockpuppet. 10 |

11 | {% endblock main %} 12 | -------------------------------------------------------------------------------- /core/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /core/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zodman/django-sockpuppet-expo/c66ee06a5feac2ce06d2d9e420c2c77b9a2c9b72/core/views/__init__.py -------------------------------------------------------------------------------- /core/views/book_search.py: -------------------------------------------------------------------------------- 1 | from django.views.generic.base import TemplateView 2 | from .mixins import BookSearchMixin 3 | 4 | 5 | class BookSearch(BookSearchMixin, TemplateView): 6 | demo_template = "_book_search_demo.html" 7 | subtitle = 'Search Book' 8 | 9 | book_search = BookSearch.as_view() 10 | -------------------------------------------------------------------------------- /core/views/calendar.py: -------------------------------------------------------------------------------- 1 | from django.views.generic.base import TemplateView 2 | from django.template.loader import render_to_string 3 | import calendar as calendarmod 4 | from datetime import date 5 | import datetime 6 | from .mixins import CalendarMixin 7 | 8 | 9 | 10 | class CustomCalendar(calendarmod.HTMLCalendar): 11 | def formatmonth(self, year, month, withyear=True, events=[]): 12 | self.year = year 13 | self.month = month 14 | self.events = events 15 | return super().formatmonth(year, month, withyear) 16 | 17 | def formatday(self, day, weekday): 18 | context = { 19 | 'day': day, 20 | 'date': date(self.year, self.month, day) if day > 0 else None, 21 | 'css_class': self.cssclass_noday if day == 0 else self.cssclasses[weekday], 22 | 'calendar_events': self.events, 23 | 'now': date.today() 24 | } 25 | return render_to_string('_td_calendar.html', context) 26 | 27 | 28 | class CalendarView(CalendarMixin, TemplateView): 29 | demo_template = '_calendar.html' 30 | subtitle = 'Calendar' 31 | 32 | def get_context_data(self,**kwargs): 33 | context = super().get_context_data(**kwargs) 34 | date_str = self.request.GET.get("date", "") 35 | if date_str: 36 | today = datetime.datetime.fromisoformat(date_str).date() 37 | else: 38 | today = date.today() 39 | events = [ 40 | {'date': today, 'description': 'lorem ipsum'}, 41 | {'date': date(2020,12,9), 'description': 'lorem ipsum'}, 42 | {'date': date(2020,12,9), 'description': 'lorem ipsum'}, 43 | {'date': date(2020,12,13), 'description': 'lorem ipsum'}, 44 | {'date': date(2020,12,15), 'description': 'lorem ipsum'}, 45 | {'date': date(2020,12,15), 'description': 'lorem ipsum'}, 46 | {'date': date(2020,12,15), 'description': 'lorem ipsum'} 47 | ] 48 | context["calendar"] = CustomCalendar().formatmonth(today.year,today.month, events=events) 49 | context["next_month_date"] = today + datetime.timedelta(days=30) 50 | context["prev_month_date"] = today + datetime.timedelta(days=-30) 51 | return context 52 | 53 | calendar = CalendarView.as_view() 54 | 55 | -------------------------------------------------------------------------------- /core/views/chat.py: -------------------------------------------------------------------------------- 1 | from django.views.generic.base import TemplateView 2 | from django.core.cache import cache 3 | from .mixins import ChatMixin 4 | 5 | class ChatView(ChatMixin, TemplateView): 6 | demo_template = '_chat_demo.html' 7 | subtitle = 'Chat' 8 | 9 | def get_context_data(self, *args, **kwargs): 10 | context = super().get_context_data(*args, **kwargs) 11 | context['chats'] = cache.get("chats", []) 12 | return context 13 | 14 | chat = ChatView.as_view() 15 | 16 | 17 | -------------------------------------------------------------------------------- /core/views/example.py: -------------------------------------------------------------------------------- 1 | from django.views.generic.base import TemplateView 2 | from .mixins import ExampleMixin 3 | 4 | class ExampleView(ExampleMixin, TemplateView): 5 | demo_template = '_example_demo.html' 6 | subtitle = 'Increment' 7 | 8 | def get_context_data(self, *args, **kwargs): 9 | context = super().get_context_data(*args, **kwargs) 10 | context['count'] = self.request.session.get("count", 0) 11 | return context 12 | 13 | example = ExampleView.as_view() 14 | 15 | 16 | -------------------------------------------------------------------------------- /core/views/mixins.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | from django.conf import settings 3 | import os 4 | 5 | BASE_PATH = settings.BASE_DIR 6 | 7 | 8 | class MixinBase: 9 | template_name = "demo.html" 10 | demo_template = None 11 | subtitle = None 12 | 13 | def get_files(self): 14 | files = defaultdict(list) 15 | path_ = lambda x: open(os.path.join(BASE_PATH, x)).read() 16 | for filename, filetype, pygment_type in self.files: 17 | filesrc = path_(filename) 18 | files[filetype].append( 19 | { 20 | "src": filesrc, 21 | "pygment_type": pygment_type, 22 | "filename": filename, 23 | "loc": len(filesrc.split("\n")), 24 | } 25 | ) 26 | return dict(files) 27 | 28 | def get_context_data(self, **kwargs): 29 | context = super().get_context_data(**kwargs) 30 | context["files"] = self.get_files() 31 | context["demo_template"] = self.demo_template 32 | context["subtitle"] = self.subtitle 33 | return context 34 | 35 | 36 | class BookSearchMixin(MixinBase): 37 | files = ( 38 | ("core/reflexes/book_search_reflex.py", "python", "python3"), 39 | ("core/views/book_search.py", "python", "python3"), 40 | ("core/javascript/controllers/book_search_controller.js", "javascript", 41 | "javascript",), 42 | ("core/templates/_book_search_demo.html", "html", "htmldjango"), 43 | ) 44 | 45 | 46 | class ExampleMixin(MixinBase): 47 | files = ( 48 | ('core/views/example.py', 'python', 'python3'), 49 | ('core/reflexes/example_reflex.py', 'python', 'python3'), 50 | ('core/javascript/controllers/example_controller.js', 'javascript', 'javascript'), 51 | ('core/templates/_example_demo.html', 'html', 'htmldjango'), 52 | ) 53 | 54 | 55 | class ChatMixin(MixinBase): 56 | files = ( 57 | ('core/views/chat.py', 'python', 'python3'), 58 | ('core/reflexes/chat_reflex.py', 'python', 'python3'), 59 | ('core/javascript/controllers/chat_controller.js', 'javascript', 'javascript'), 60 | ('core/templates/_chat_demo.html', 'html', 'htmldjango'), 61 | ) 62 | 63 | 64 | class CalendarMixin(MixinBase): 65 | files = ( 66 | ('core/views/calendar.py', 'python', 'python3'), 67 | ('core/templates/_calendar.html', 'html', 'htmldjango'), 68 | ('core/templates/_td_calendar.html', 'html', 'htmldjango'), 69 | 70 | ) 71 | 72 | 73 | class NewsletterSignupMixin(MixinBase): 74 | files = ( 75 | ('core/views/newsletter_signup.py', 'python', 'python3'), 76 | ('core/reflexes/newsletter_signup_reflex.py', 'python', 'python3'), 77 | ('core/templates/_newsletter_signup.html', 'html', 'htmldjango') 78 | ) 79 | -------------------------------------------------------------------------------- /core/views/newsletter_signup.py: -------------------------------------------------------------------------------- 1 | from django.forms import ModelForm 2 | from django.views.generic.edit import FormView 3 | 4 | from core.models import NewsletterSubscription 5 | from core.views.mixins import NewsletterSignupMixin 6 | 7 | 8 | class NewsletterSubscriptionForm(ModelForm): 9 | class Meta: 10 | model = NewsletterSubscription 11 | fields = ['name', 'email'] 12 | 13 | 14 | class NewsletterSignupView(NewsletterSignupMixin, FormView): 15 | demo_template = '_newsletter_signup.html' 16 | form_class = NewsletterSubscriptionForm 17 | subtitle = 'Newsletter Signup' 18 | 19 | def get_context_data(self, *args, **kwargs): 20 | context = super().get_context_data(*args, **kwargs) 21 | context['people'] = NewsletterSubscription.objects.all() 22 | return context 23 | 24 | 25 | view = NewsletterSignupView.as_view() 26 | -------------------------------------------------------------------------------- /fabfile.py: -------------------------------------------------------------------------------- 1 | from fabric import task 2 | from invoke import run as local 3 | from patchwork.transfers import rsync 4 | 5 | 6 | exclude_dirs = [".git", "node_modules", ".cache", ".github", "db.sqlite3"] 7 | 8 | 9 | @task 10 | def deploy(ctx): 11 | local("yarn build", echo=True) 12 | local("python manage.py collectstatic --noinput --clear", echo=True) 13 | rsync(ctx, "static/", "apps/django-sockpuppet-expo/static/", 14 | exclude=exclude_dirs) 15 | rsync(ctx, "webpack-stats.json", "apps/django-sockpuppet-expo/") 16 | with ctx.cd("~/apps/django-sockpuppet-expo"): 17 | ctx.run('git pull') 18 | with ctx.prefix("source .env/bin/activate"): 19 | ctx.run('python -m pip install --upgrade -r requirements.in') 20 | ctx.run('python manage.py migrate') 21 | ctx.run("sudo supervisorctl restart expo:*") 22 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "socketpuppet-expo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "webpack.config.js", 6 | "scripts": { 7 | "build": "webpack --mode production", 8 | "watch": "webpack --watch " 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "debounced": "0.0.5", 14 | "fs": "0.0.1-security", 15 | "glob": "^7.1.6", 16 | "path": "^0.12.7", 17 | "sockpuppet-js": "^0.3.4", 18 | "stimulus": "^1.1.1", 19 | "stimulus_reflex": "^3.4.0-pre5", 20 | "webpack": "^5.6.0", 21 | "webpack-cli": "^4.2.0" 22 | }, 23 | "dependencies": { 24 | "@rails/ujs": "^6.0.3-4", 25 | "lodash-es": "^4.17.15", 26 | "turbolinks": "^5.2.0", 27 | "webpack-bundle-tracker": "^1.0.0-alpha.1" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Django sockpuppet expo 2 | 3 | ## [django-sockpuppet-expo](https://django-sockpuppet-expo.python3.ninja) 4 | 5 | ## Running locally 6 | 7 | ``` 8 | pip install -r requirements.in 9 | yarn install 10 | yarn run watch 11 | 12 | python manage.py migrate 13 | python manage.py runserver 14 | ``` 15 | 16 | 17 | -------------------------------------------------------------------------------- /requirements.in: -------------------------------------------------------------------------------- 1 | django 2 | django-sockpuppet 3 | requests 4 | django-pygments-renderer 5 | django-widget-tweaks 6 | django-redis 7 | 8 | django-webpack-loader 9 | 10 | # deployment 11 | fabric 12 | patchwork 13 | gunicorn 14 | whitenoise 15 | 16 | # test 17 | django-seed 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # 2 | # This file is autogenerated by pip-compile 3 | # To update, run: 4 | # 5 | # pip-compile --output-file=requirements.txt requirements.in 6 | # 7 | aioredis==1.3.1 # via channels-redis 8 | asgiref==3.3.4 # via channels, channels-redis, daphne, django 9 | async-timeout==3.0.1 # via aioredis 10 | attrs==21.2.0 # via automat, service-identity, twisted 11 | autobahn==21.3.1 # via daphne 12 | automat==20.2.0 # via twisted 13 | bcrypt==3.2.0 # via paramiko 14 | beautifulsoup4==4.9.3 # via bs4 15 | bs4==0.0.1 # via django-sockpuppet 16 | certifi==2020.12.5 # via requests 17 | cffi==1.14.5 # via bcrypt, cryptography, pynacl 18 | channels-redis==3.2.0 # via django-sockpuppet 19 | channels==3.0.3 # via channels-redis, django-sockpuppet 20 | chardet==4.0.0 # via requests 21 | constantly==15.1.0 # via twisted 22 | cryptography==3.4.7 # via autobahn, paramiko, pyopenssl, service-identity 23 | daphne==3.0.2 # via channels 24 | django-pygments-renderer==0.0.1 # via -r requirements.in 25 | django-redis==4.12.1 # via -r requirements.in 26 | django-seed==0.2.2 # via -r requirements.in 27 | django-sockpuppet==0.6.0 # via -r requirements.in 28 | django-webpack-loader==0.7.0 # via -r requirements.in 29 | django-widget-tweaks==1.4.8 # via -r requirements.in 30 | django==3.2.2 # via -r requirements.in, channels, django-pygments-renderer, django-redis, django-seed 31 | fabric==2.6.0 # via -r requirements.in, patchwork 32 | faker==8.1.2 # via django-seed 33 | gunicorn==20.1.0 # via -r requirements.in 34 | hiredis==2.0.0 # via aioredis 35 | hyperlink==21.0.0 # via autobahn, twisted 36 | idna==2.10 # via hyperlink, requests, twisted 37 | incremental==21.3.0 # via twisted 38 | invoke==1.5.0 # via fabric 39 | msgpack==1.0.2 # via channels-redis 40 | paramiko==2.7.2 # via fabric 41 | patchwork==1.0.1 # via -r requirements.in 42 | pathlib2==2.3.5 # via fabric 43 | pyasn1-modules==0.2.8 # via service-identity 44 | pyasn1==0.4.8 # via pyasn1-modules, service-identity 45 | pycparser==2.20 # via cffi 46 | pygments==2.9.0 # via django-pygments-renderer 47 | pynacl==1.4.0 # via paramiko 48 | pyopenssl==20.0.1 # via twisted 49 | python-dateutil==2.8.1 # via faker 50 | pytz==2021.1 # via django 51 | redis==3.5.3 # via django-redis 52 | requests==2.25.1 # via -r requirements.in 53 | service-identity==21.1.0 # via twisted 54 | six==1.16.0 # via automat, bcrypt, pathlib2, pynacl, pyopenssl, python-dateutil, service-identity 55 | soupsieve==2.2.1 # via beautifulsoup4 56 | sqlparse==0.4.1 # via django 57 | text-unidecode==1.3 # via faker 58 | twisted[tls]==21.2.0 # via daphne 59 | txaio==21.2.1 # via autobahn 60 | urllib3==1.26.4 # via requests 61 | whitenoise==5.2.0 # via -r requirements.in 62 | zope.interface==5.4.0 # via twisted 63 | 64 | # The following packages are considered to be unsafe in a requirements file: 65 | # setuptools 66 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require("webpack"); 2 | const glob = require("glob"); 3 | var BundleTracker = require('webpack-bundle-tracker') 4 | 5 | let globOptions = { 6 | ignore: ["node_modules/**", "venv/**"] 7 | }; 8 | 9 | let entryFiles = glob.sync("**/javascript/*.js", globOptions); 10 | let entryObj = {}; 11 | entryFiles.forEach(function(file) { 12 | if (file.includes(".")) { 13 | let parts = file.split("/"); 14 | let path = parts.pop(); 15 | let fileName = path.split(".")[0]; 16 | entryObj[fileName] = `./${file}`; 17 | } 18 | }); 19 | const config = { 20 | mode: process.env.NODE_ENV, 21 | entry: entryObj, 22 | output: { 23 | path: __dirname + "/core/static/dist/js", 24 | filename: "[name].[fullhash].js" 25 | }, 26 | optimization: { 27 | minimize: true 28 | }, 29 | plugins: [ 30 | new BundleTracker({ 31 | path: __dirname, 32 | filename: "./webpack-stats.json" 33 | }) 34 | ] 35 | }; 36 | //console.log(config); 37 | module.exports = config; 38 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@discoveryjs/json-ext@^0.5.0": 6 | version "0.5.2" 7 | resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" 8 | integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== 9 | 10 | "@rails/actioncable@>= 6.0": 11 | version "6.1.3" 12 | resolved "https://registry.yarnpkg.com/@rails/actioncable/-/actioncable-6.1.3.tgz#c8a67ec4d22ecd6931f7ebd98143fddbc815419a" 13 | integrity sha512-m02524MR9cTnUNfGz39Lkx9jVvuL0tle4O7YgvouJ7H83FILxzG1nQ5jw8pAjLAr9XQGu+P1sY4SKE3zyhCNjw== 14 | 15 | "@rails/ujs@^6.0.3-4": 16 | version "6.0.3-7" 17 | resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.0.3-7.tgz#8be007e500baafed256895830ae446178511773b" 18 | integrity sha512-J7dvCTkZ/zaQLge1mttypoE/1j5YDcSAuu4fun8CoTqVGkcbwZu4f4jy+HKxdomtrZzXWSHlSeIe9vOtLnhmeA== 19 | 20 | "@stimulus/core@^1.1.1": 21 | version "1.1.1" 22 | resolved "https://registry.yarnpkg.com/@stimulus/core/-/core-1.1.1.tgz#42b0cfe5b73ca492f41de64b77a03980bae92c82" 23 | integrity sha512-PVJv7IpuQx0MVPCBblXc6O2zbCmU8dlxXNH4bC9KK6LsvGaE+PCXXrXQfXUwAsse1/CmRu/iQG7Ov58himjiGg== 24 | dependencies: 25 | "@stimulus/mutation-observers" "^1.1.1" 26 | 27 | "@stimulus/multimap@^1.1.1": 28 | version "1.1.1" 29 | resolved "https://registry.yarnpkg.com/@stimulus/multimap/-/multimap-1.1.1.tgz#b95e3fd607345ab36e5d5b55486ee1a12d56b331" 30 | integrity sha512-26R1fI3a8uUj0WlMmta4qcfIQGlagegdP4PTz6lz852q/dXlG6r+uPS/bx+H8GtfyS+OOXVr3SkZ0Zg0iRqRfQ== 31 | 32 | "@stimulus/mutation-observers@^1.1.1": 33 | version "1.1.1" 34 | resolved "https://registry.yarnpkg.com/@stimulus/mutation-observers/-/mutation-observers-1.1.1.tgz#0f6c6f081308427fed2a26360dda0c173b79cfc0" 35 | integrity sha512-/zCnnw1KJlWO2mrx0yxYaRFZWMGnDMdOgSnI4hxDLxdWVuL2HMROU8FpHWVBLjKY3T9A+lGkcrmPGDHF3pfS9w== 36 | dependencies: 37 | "@stimulus/multimap" "^1.1.1" 38 | 39 | "@stimulus/webpack-helpers@^1.1.1": 40 | version "1.1.1" 41 | resolved "https://registry.yarnpkg.com/@stimulus/webpack-helpers/-/webpack-helpers-1.1.1.tgz#eff60cd4e58b921d1a2764dc5215f5141510f2c2" 42 | integrity sha512-XOkqSw53N9072FLHvpLM25PIwy+ndkSSbnTtjKuyzsv8K5yfkFB2rv68jU1pzqYa9FZLcvZWP4yazC0V38dx9A== 43 | 44 | "@types/eslint-scope@^3.7.0": 45 | version "3.7.0" 46 | resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" 47 | integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== 48 | dependencies: 49 | "@types/eslint" "*" 50 | "@types/estree" "*" 51 | 52 | "@types/eslint@*": 53 | version "7.2.10" 54 | resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.10.tgz#4b7a9368d46c0f8cd5408c23288a59aa2394d917" 55 | integrity sha512-kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ== 56 | dependencies: 57 | "@types/estree" "*" 58 | "@types/json-schema" "*" 59 | 60 | "@types/estree@*", "@types/estree@^0.0.47": 61 | version "0.0.47" 62 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" 63 | integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== 64 | 65 | "@types/json-schema@*", "@types/json-schema@^7.0.6": 66 | version "7.0.7" 67 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" 68 | integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== 69 | 70 | "@types/lodash.foreach@^4.4.6": 71 | version "4.5.6" 72 | resolved "https://registry.yarnpkg.com/@types/lodash.foreach/-/lodash.foreach-4.5.6.tgz#24735299139a739e436ab4fb8a6a31ca3d54bbb3" 73 | integrity sha512-A8+157A+27zwJSstmW/eWPc9lHLJNEer4jiMlsyxWieBxEx0arwB9vgQm+iai6DEDYYQuufHrzVhQOiapCalQQ== 74 | dependencies: 75 | "@types/lodash" "*" 76 | 77 | "@types/lodash.get@^4.4.6": 78 | version "4.4.6" 79 | resolved "https://registry.yarnpkg.com/@types/lodash.get/-/lodash.get-4.4.6.tgz#0c7ac56243dae0f9f09ab6f75b29471e2e777240" 80 | integrity sha512-E6zzjR3GtNig8UJG/yodBeJeIOtgPkMgsLjDU3CbgCAPC++vJ0eCMnJhVpRZb/ENqEFlov1+3K9TKtY4UdWKtQ== 81 | dependencies: 82 | "@types/lodash" "*" 83 | 84 | "@types/lodash@*": 85 | version "4.14.168" 86 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" 87 | integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== 88 | 89 | "@types/node@*": 90 | version "15.0.2" 91 | resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.2.tgz#51e9c0920d1b45936ea04341aa3e2e58d339fb67" 92 | integrity sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA== 93 | 94 | "@webassemblyjs/ast@1.11.0": 95 | version "1.11.0" 96 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f" 97 | integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg== 98 | dependencies: 99 | "@webassemblyjs/helper-numbers" "1.11.0" 100 | "@webassemblyjs/helper-wasm-bytecode" "1.11.0" 101 | 102 | "@webassemblyjs/floating-point-hex-parser@1.11.0": 103 | version "1.11.0" 104 | resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c" 105 | integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA== 106 | 107 | "@webassemblyjs/helper-api-error@1.11.0": 108 | version "1.11.0" 109 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4" 110 | integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w== 111 | 112 | "@webassemblyjs/helper-buffer@1.11.0": 113 | version "1.11.0" 114 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642" 115 | integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA== 116 | 117 | "@webassemblyjs/helper-numbers@1.11.0": 118 | version "1.11.0" 119 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9" 120 | integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ== 121 | dependencies: 122 | "@webassemblyjs/floating-point-hex-parser" "1.11.0" 123 | "@webassemblyjs/helper-api-error" "1.11.0" 124 | "@xtuc/long" "4.2.2" 125 | 126 | "@webassemblyjs/helper-wasm-bytecode@1.11.0": 127 | version "1.11.0" 128 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1" 129 | integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA== 130 | 131 | "@webassemblyjs/helper-wasm-section@1.11.0": 132 | version "1.11.0" 133 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b" 134 | integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew== 135 | dependencies: 136 | "@webassemblyjs/ast" "1.11.0" 137 | "@webassemblyjs/helper-buffer" "1.11.0" 138 | "@webassemblyjs/helper-wasm-bytecode" "1.11.0" 139 | "@webassemblyjs/wasm-gen" "1.11.0" 140 | 141 | "@webassemblyjs/ieee754@1.11.0": 142 | version "1.11.0" 143 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf" 144 | integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA== 145 | dependencies: 146 | "@xtuc/ieee754" "^1.2.0" 147 | 148 | "@webassemblyjs/leb128@1.11.0": 149 | version "1.11.0" 150 | resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b" 151 | integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g== 152 | dependencies: 153 | "@xtuc/long" "4.2.2" 154 | 155 | "@webassemblyjs/utf8@1.11.0": 156 | version "1.11.0" 157 | resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf" 158 | integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw== 159 | 160 | "@webassemblyjs/wasm-edit@1.11.0": 161 | version "1.11.0" 162 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78" 163 | integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ== 164 | dependencies: 165 | "@webassemblyjs/ast" "1.11.0" 166 | "@webassemblyjs/helper-buffer" "1.11.0" 167 | "@webassemblyjs/helper-wasm-bytecode" "1.11.0" 168 | "@webassemblyjs/helper-wasm-section" "1.11.0" 169 | "@webassemblyjs/wasm-gen" "1.11.0" 170 | "@webassemblyjs/wasm-opt" "1.11.0" 171 | "@webassemblyjs/wasm-parser" "1.11.0" 172 | "@webassemblyjs/wast-printer" "1.11.0" 173 | 174 | "@webassemblyjs/wasm-gen@1.11.0": 175 | version "1.11.0" 176 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe" 177 | integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ== 178 | dependencies: 179 | "@webassemblyjs/ast" "1.11.0" 180 | "@webassemblyjs/helper-wasm-bytecode" "1.11.0" 181 | "@webassemblyjs/ieee754" "1.11.0" 182 | "@webassemblyjs/leb128" "1.11.0" 183 | "@webassemblyjs/utf8" "1.11.0" 184 | 185 | "@webassemblyjs/wasm-opt@1.11.0": 186 | version "1.11.0" 187 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978" 188 | integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg== 189 | dependencies: 190 | "@webassemblyjs/ast" "1.11.0" 191 | "@webassemblyjs/helper-buffer" "1.11.0" 192 | "@webassemblyjs/wasm-gen" "1.11.0" 193 | "@webassemblyjs/wasm-parser" "1.11.0" 194 | 195 | "@webassemblyjs/wasm-parser@1.11.0": 196 | version "1.11.0" 197 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754" 198 | integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw== 199 | dependencies: 200 | "@webassemblyjs/ast" "1.11.0" 201 | "@webassemblyjs/helper-api-error" "1.11.0" 202 | "@webassemblyjs/helper-wasm-bytecode" "1.11.0" 203 | "@webassemblyjs/ieee754" "1.11.0" 204 | "@webassemblyjs/leb128" "1.11.0" 205 | "@webassemblyjs/utf8" "1.11.0" 206 | 207 | "@webassemblyjs/wast-printer@1.11.0": 208 | version "1.11.0" 209 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e" 210 | integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ== 211 | dependencies: 212 | "@webassemblyjs/ast" "1.11.0" 213 | "@xtuc/long" "4.2.2" 214 | 215 | "@webpack-cli/configtest@^1.0.3": 216 | version "1.0.3" 217 | resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.3.tgz#204bcff87cda3ea4810881f7ea96e5f5321b87b9" 218 | integrity sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw== 219 | 220 | "@webpack-cli/info@^1.2.4": 221 | version "1.2.4" 222 | resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.4.tgz#7381fd41c9577b2d8f6c2594fad397ef49ad5573" 223 | integrity sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g== 224 | dependencies: 225 | envinfo "^7.7.3" 226 | 227 | "@webpack-cli/serve@^1.4.0": 228 | version "1.4.0" 229 | resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.4.0.tgz#f84fd07bcacefe56ce762925798871092f0f228e" 230 | integrity sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg== 231 | 232 | "@xtuc/ieee754@^1.2.0": 233 | version "1.2.0" 234 | resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 235 | integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== 236 | 237 | "@xtuc/long@4.2.2": 238 | version "4.2.2" 239 | resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 240 | integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== 241 | 242 | acorn@^8.2.1: 243 | version "8.2.4" 244 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0" 245 | integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg== 246 | 247 | ajv-keywords@^3.5.2: 248 | version "3.5.2" 249 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 250 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== 251 | 252 | ajv@^6.12.5: 253 | version "6.12.6" 254 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 255 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 256 | dependencies: 257 | fast-deep-equal "^3.1.1" 258 | fast-json-stable-stringify "^2.0.0" 259 | json-schema-traverse "^0.4.1" 260 | uri-js "^4.2.2" 261 | 262 | ansi-regex@^5.0.0: 263 | version "5.0.0" 264 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 265 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 266 | 267 | balanced-match@^1.0.0: 268 | version "1.0.2" 269 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 270 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 271 | 272 | brace-expansion@^1.1.7: 273 | version "1.1.11" 274 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 275 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 276 | dependencies: 277 | balanced-match "^1.0.0" 278 | concat-map "0.0.1" 279 | 280 | browserslist@^4.14.5: 281 | version "4.16.6" 282 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" 283 | integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== 284 | dependencies: 285 | caniuse-lite "^1.0.30001219" 286 | colorette "^1.2.2" 287 | electron-to-chromium "^1.3.723" 288 | escalade "^3.1.1" 289 | node-releases "^1.1.71" 290 | 291 | buffer-from@^1.0.0: 292 | version "1.1.1" 293 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 294 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 295 | 296 | "cable_ready@>= 4.5.0": 297 | version "4.5.0" 298 | resolved "https://registry.yarnpkg.com/cable_ready/-/cable_ready-4.5.0.tgz#1207218dd16934d12addfbd34c26ead853570672" 299 | integrity sha512-9bom1DuYe1teBdRckgKWjg+rWRLWrkOvkhzlXkhb33X+Pfu/QK9e4vGk6hGK9PVKVr0SYZC41dByFGknW4spLg== 300 | dependencies: 301 | morphdom "^2.6.1" 302 | 303 | caniuse-lite@^1.0.30001219: 304 | version "1.0.30001228" 305 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" 306 | integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== 307 | 308 | chrome-trace-event@^1.0.2: 309 | version "1.0.3" 310 | resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" 311 | integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== 312 | 313 | clone-deep@^4.0.1: 314 | version "4.0.1" 315 | resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" 316 | integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== 317 | dependencies: 318 | is-plain-object "^2.0.4" 319 | kind-of "^6.0.2" 320 | shallow-clone "^3.0.0" 321 | 322 | colorette@^1.2.1, colorette@^1.2.2: 323 | version "1.2.2" 324 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" 325 | integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== 326 | 327 | commander@^2.20.0: 328 | version "2.20.3" 329 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 330 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 331 | 332 | commander@^7.0.0: 333 | version "7.2.0" 334 | resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" 335 | integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== 336 | 337 | concat-map@0.0.1: 338 | version "0.0.1" 339 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 340 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 341 | 342 | cross-spawn@^7.0.3: 343 | version "7.0.3" 344 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 345 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 346 | dependencies: 347 | path-key "^3.1.0" 348 | shebang-command "^2.0.0" 349 | which "^2.0.1" 350 | 351 | debounced@0.0.5: 352 | version "0.0.5" 353 | resolved "https://registry.yarnpkg.com/debounced/-/debounced-0.0.5.tgz#e540b6eebfe703d93462711b4f3562ffd101b87f" 354 | integrity sha512-8Bgheu1YxQB7ocqYmK2enbLGVoo4nCtu/V6UD/SMDOeV3g2LocG2CrA5oxudlyl79Ja07UiqGdp9pWZoJn52EQ== 355 | 356 | electron-to-chromium@^1.3.723: 357 | version "1.3.727" 358 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" 359 | integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== 360 | 361 | enhanced-resolve@^5.8.0: 362 | version "5.8.2" 363 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" 364 | integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== 365 | dependencies: 366 | graceful-fs "^4.2.4" 367 | tapable "^2.2.0" 368 | 369 | envinfo@^7.7.3: 370 | version "7.8.1" 371 | resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" 372 | integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== 373 | 374 | es-module-lexer@^0.4.0: 375 | version "0.4.1" 376 | resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.1.tgz#dda8c6a14d8f340a24e34331e0fab0cb50438e0e" 377 | integrity sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA== 378 | 379 | escalade@^3.1.1: 380 | version "3.1.1" 381 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 382 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 383 | 384 | eslint-scope@^5.1.1: 385 | version "5.1.1" 386 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 387 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 388 | dependencies: 389 | esrecurse "^4.3.0" 390 | estraverse "^4.1.1" 391 | 392 | esrecurse@^4.3.0: 393 | version "4.3.0" 394 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 395 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 396 | dependencies: 397 | estraverse "^5.2.0" 398 | 399 | estraverse@^4.1.1: 400 | version "4.3.0" 401 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 402 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 403 | 404 | estraverse@^5.2.0: 405 | version "5.2.0" 406 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 407 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 408 | 409 | events@^3.2.0: 410 | version "3.3.0" 411 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 412 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 413 | 414 | execa@^5.0.0: 415 | version "5.0.0" 416 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" 417 | integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== 418 | dependencies: 419 | cross-spawn "^7.0.3" 420 | get-stream "^6.0.0" 421 | human-signals "^2.1.0" 422 | is-stream "^2.0.0" 423 | merge-stream "^2.0.0" 424 | npm-run-path "^4.0.1" 425 | onetime "^5.1.2" 426 | signal-exit "^3.0.3" 427 | strip-final-newline "^2.0.0" 428 | 429 | fast-deep-equal@^3.1.1: 430 | version "3.1.3" 431 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 432 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 433 | 434 | fast-json-stable-stringify@^2.0.0: 435 | version "2.1.0" 436 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 437 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 438 | 439 | fastest-levenshtein@^1.0.12: 440 | version "1.0.12" 441 | resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" 442 | integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== 443 | 444 | find-up@^4.0.0: 445 | version "4.1.0" 446 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 447 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 448 | dependencies: 449 | locate-path "^5.0.0" 450 | path-exists "^4.0.0" 451 | 452 | fs.realpath@^1.0.0: 453 | version "1.0.0" 454 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 455 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 456 | 457 | fs@0.0.1-security: 458 | version "0.0.1-security" 459 | resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4" 460 | integrity sha1-invTcYa23d84E/I4WLV+yq9eQdQ= 461 | 462 | function-bind@^1.1.1: 463 | version "1.1.1" 464 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 465 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 466 | 467 | get-stream@^6.0.0: 468 | version "6.0.1" 469 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 470 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 471 | 472 | glob-to-regexp@^0.4.1: 473 | version "0.4.1" 474 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 475 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 476 | 477 | glob@^7.1.6: 478 | version "7.1.7" 479 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 480 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 481 | dependencies: 482 | fs.realpath "^1.0.0" 483 | inflight "^1.0.4" 484 | inherits "2" 485 | minimatch "^3.0.4" 486 | once "^1.3.0" 487 | path-is-absolute "^1.0.0" 488 | 489 | graceful-fs@^4.1.2, graceful-fs@^4.2.4: 490 | version "4.2.6" 491 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" 492 | integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== 493 | 494 | has-flag@^4.0.0: 495 | version "4.0.0" 496 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 497 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 498 | 499 | has@^1.0.3: 500 | version "1.0.3" 501 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 502 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 503 | dependencies: 504 | function-bind "^1.1.1" 505 | 506 | human-signals@^2.1.0: 507 | version "2.1.0" 508 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 509 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 510 | 511 | import-local@^3.0.2: 512 | version "3.0.2" 513 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" 514 | integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== 515 | dependencies: 516 | pkg-dir "^4.2.0" 517 | resolve-cwd "^3.0.0" 518 | 519 | inflight@^1.0.4: 520 | version "1.0.6" 521 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 522 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 523 | dependencies: 524 | once "^1.3.0" 525 | wrappy "1" 526 | 527 | inherits@2: 528 | version "2.0.4" 529 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 530 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 531 | 532 | inherits@2.0.3: 533 | version "2.0.3" 534 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 535 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 536 | 537 | interpret@^2.2.0: 538 | version "2.2.0" 539 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" 540 | integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== 541 | 542 | is-core-module@^2.2.0: 543 | version "2.4.0" 544 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" 545 | integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== 546 | dependencies: 547 | has "^1.0.3" 548 | 549 | is-plain-object@^2.0.4: 550 | version "2.0.4" 551 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 552 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 553 | dependencies: 554 | isobject "^3.0.1" 555 | 556 | is-stream@^2.0.0: 557 | version "2.0.0" 558 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 559 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== 560 | 561 | isexe@^2.0.0: 562 | version "2.0.0" 563 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 564 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 565 | 566 | isobject@^3.0.1: 567 | version "3.0.1" 568 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 569 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 570 | 571 | jest-worker@^26.6.2: 572 | version "26.6.2" 573 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" 574 | integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== 575 | dependencies: 576 | "@types/node" "*" 577 | merge-stream "^2.0.0" 578 | supports-color "^7.0.0" 579 | 580 | json-parse-better-errors@^1.0.2: 581 | version "1.0.2" 582 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 583 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 584 | 585 | json-schema-traverse@^0.4.1: 586 | version "0.4.1" 587 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 588 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 589 | 590 | kind-of@^6.0.2: 591 | version "6.0.3" 592 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 593 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 594 | 595 | loader-runner@^4.2.0: 596 | version "4.2.0" 597 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" 598 | integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== 599 | 600 | locate-path@^5.0.0: 601 | version "5.0.0" 602 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 603 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 604 | dependencies: 605 | p-locate "^4.1.0" 606 | 607 | lodash-es@^4.17.15: 608 | version "4.17.21" 609 | resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" 610 | integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== 611 | 612 | lodash.assign@^4.2.0: 613 | version "4.2.0" 614 | resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" 615 | integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= 616 | 617 | lodash.defaults@^4.2.0: 618 | version "4.2.0" 619 | resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" 620 | integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= 621 | 622 | lodash.foreach@^4.2.0: 623 | version "4.5.0" 624 | resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" 625 | integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= 626 | 627 | lodash.get@^4.4.2: 628 | version "4.4.2" 629 | resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 630 | integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= 631 | 632 | merge-stream@^2.0.0: 633 | version "2.0.0" 634 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 635 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 636 | 637 | mime-db@1.47.0: 638 | version "1.47.0" 639 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" 640 | integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== 641 | 642 | mime-types@^2.1.27: 643 | version "2.1.30" 644 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" 645 | integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== 646 | dependencies: 647 | mime-db "1.47.0" 648 | 649 | mimic-fn@^2.1.0: 650 | version "2.1.0" 651 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 652 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 653 | 654 | minimatch@^3.0.4: 655 | version "3.0.4" 656 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 657 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 658 | dependencies: 659 | brace-expansion "^1.1.7" 660 | 661 | morphdom@^2.6.1: 662 | version "2.6.1" 663 | resolved "https://registry.yarnpkg.com/morphdom/-/morphdom-2.6.1.tgz#e868e24f989fa3183004b159aed643e628b4306e" 664 | integrity sha512-Y8YRbAEP3eKykroIBWrjcfMw7mmwJfjhqdpSvoqinu8Y702nAwikpXcNFDiIkyvfCLxLM9Wu95RZqo4a9jFBaA== 665 | 666 | neo-async@^2.6.2: 667 | version "2.6.2" 668 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 669 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== 670 | 671 | node-releases@^1.1.71: 672 | version "1.1.71" 673 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" 674 | integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== 675 | 676 | npm-run-path@^4.0.1: 677 | version "4.0.1" 678 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 679 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 680 | dependencies: 681 | path-key "^3.0.0" 682 | 683 | once@^1.3.0: 684 | version "1.4.0" 685 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 686 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 687 | dependencies: 688 | wrappy "1" 689 | 690 | onetime@^5.1.2: 691 | version "5.1.2" 692 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 693 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 694 | dependencies: 695 | mimic-fn "^2.1.0" 696 | 697 | p-limit@^2.2.0: 698 | version "2.3.0" 699 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 700 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 701 | dependencies: 702 | p-try "^2.0.0" 703 | 704 | p-limit@^3.1.0: 705 | version "3.1.0" 706 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 707 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 708 | dependencies: 709 | yocto-queue "^0.1.0" 710 | 711 | p-locate@^4.1.0: 712 | version "4.1.0" 713 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 714 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 715 | dependencies: 716 | p-limit "^2.2.0" 717 | 718 | p-try@^2.0.0: 719 | version "2.2.0" 720 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 721 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 722 | 723 | path-exists@^4.0.0: 724 | version "4.0.0" 725 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 726 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 727 | 728 | path-is-absolute@^1.0.0: 729 | version "1.0.1" 730 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 731 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 732 | 733 | path-key@^3.0.0, path-key@^3.1.0: 734 | version "3.1.1" 735 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 736 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 737 | 738 | path-parse@^1.0.6: 739 | version "1.0.6" 740 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 741 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 742 | 743 | path@^0.12.7: 744 | version "0.12.7" 745 | resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" 746 | integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= 747 | dependencies: 748 | process "^0.11.1" 749 | util "^0.10.3" 750 | 751 | pkg-dir@^4.2.0: 752 | version "4.2.0" 753 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 754 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 755 | dependencies: 756 | find-up "^4.0.0" 757 | 758 | process@^0.11.1: 759 | version "0.11.10" 760 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 761 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 762 | 763 | punycode@^2.1.0: 764 | version "2.1.1" 765 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 766 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 767 | 768 | randombytes@^2.1.0: 769 | version "2.1.0" 770 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 771 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 772 | dependencies: 773 | safe-buffer "^5.1.0" 774 | 775 | rechoir@^0.7.0: 776 | version "0.7.0" 777 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" 778 | integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== 779 | dependencies: 780 | resolve "^1.9.0" 781 | 782 | reconnecting-websocket@^4.4.0: 783 | version "4.4.0" 784 | resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783" 785 | integrity sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng== 786 | 787 | resolve-cwd@^3.0.0: 788 | version "3.0.0" 789 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 790 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== 791 | dependencies: 792 | resolve-from "^5.0.0" 793 | 794 | resolve-from@^5.0.0: 795 | version "5.0.0" 796 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 797 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 798 | 799 | resolve@^1.9.0: 800 | version "1.20.0" 801 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 802 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 803 | dependencies: 804 | is-core-module "^2.2.0" 805 | path-parse "^1.0.6" 806 | 807 | safe-buffer@^5.1.0: 808 | version "5.2.1" 809 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 810 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 811 | 812 | schema-utils@^3.0.0: 813 | version "3.0.0" 814 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" 815 | integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== 816 | dependencies: 817 | "@types/json-schema" "^7.0.6" 818 | ajv "^6.12.5" 819 | ajv-keywords "^3.5.2" 820 | 821 | serialize-javascript@^5.0.1: 822 | version "5.0.1" 823 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" 824 | integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== 825 | dependencies: 826 | randombytes "^2.1.0" 827 | 828 | shallow-clone@^3.0.0: 829 | version "3.0.1" 830 | resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" 831 | integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== 832 | dependencies: 833 | kind-of "^6.0.2" 834 | 835 | shebang-command@^2.0.0: 836 | version "2.0.0" 837 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 838 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 839 | dependencies: 840 | shebang-regex "^3.0.0" 841 | 842 | shebang-regex@^3.0.0: 843 | version "3.0.0" 844 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 845 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 846 | 847 | signal-exit@^3.0.3: 848 | version "3.0.3" 849 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 850 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 851 | 852 | sockpuppet-js@^0.3.4: 853 | version "0.3.8" 854 | resolved "https://registry.yarnpkg.com/sockpuppet-js/-/sockpuppet-js-0.3.8.tgz#68285ed07a4f2df06f07242e3b5cd4b309de5e63" 855 | integrity sha512-00ZE6e7fanTwiQYSjJs0k31K1ebqSVqSsGqeubMaDj2s2Jq/vWIzg9u6g3/Ov7RATUQea/32LhSJtu7xcuLLDQ== 856 | dependencies: 857 | reconnecting-websocket "^4.4.0" 858 | 859 | source-list-map@^2.0.1: 860 | version "2.0.1" 861 | resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" 862 | integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== 863 | 864 | source-map-support@~0.5.19: 865 | version "0.5.19" 866 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 867 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 868 | dependencies: 869 | buffer-from "^1.0.0" 870 | source-map "^0.6.0" 871 | 872 | source-map@^0.6.0, source-map@^0.6.1: 873 | version "0.6.1" 874 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 875 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 876 | 877 | source-map@~0.7.2: 878 | version "0.7.3" 879 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 880 | integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 881 | 882 | stimulus@^1.1.1: 883 | version "1.1.1" 884 | resolved "https://registry.yarnpkg.com/stimulus/-/stimulus-1.1.1.tgz#53c2fded6849e7b85eed3ed8dd76e33abd74bec5" 885 | integrity sha512-R0mBqKp48YnRDZOxZ8hiOH4Ilph3Yj78CIFTBkCwyHs4iGCpe7xlEdQ7cjIxb+7qVCSxFKgxO+mAQbsNgt/5XQ== 886 | dependencies: 887 | "@stimulus/core" "^1.1.1" 888 | "@stimulus/webpack-helpers" "^1.1.1" 889 | 890 | stimulus_reflex@^3.4.0-pre5: 891 | version "3.4.1" 892 | resolved "https://registry.yarnpkg.com/stimulus_reflex/-/stimulus_reflex-3.4.1.tgz#2606aee3b2911b5939d68f65a75262fe3c626204" 893 | integrity sha512-YbFcuE4HndNe9RBQvF/Vu+7GDt0zLGdhQTXuGfLDVti1qggPG3kPgV1YBZ9volzBTGUmLp2PQbxG9j5AIyYp5A== 894 | dependencies: 895 | "@rails/actioncable" ">= 6.0" 896 | cable_ready ">= 4.5.0" 897 | 898 | strip-ansi@^6.0.0: 899 | version "6.0.0" 900 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 901 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 902 | dependencies: 903 | ansi-regex "^5.0.0" 904 | 905 | strip-final-newline@^2.0.0: 906 | version "2.0.0" 907 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 908 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 909 | 910 | supports-color@^7.0.0: 911 | version "7.2.0" 912 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 913 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 914 | dependencies: 915 | has-flag "^4.0.0" 916 | 917 | tapable@^2.1.1, tapable@^2.2.0: 918 | version "2.2.0" 919 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" 920 | integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== 921 | 922 | terser-webpack-plugin@^5.1.1: 923 | version "5.1.1" 924 | resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673" 925 | integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q== 926 | dependencies: 927 | jest-worker "^26.6.2" 928 | p-limit "^3.1.0" 929 | schema-utils "^3.0.0" 930 | serialize-javascript "^5.0.1" 931 | source-map "^0.6.1" 932 | terser "^5.5.1" 933 | 934 | terser@^5.5.1: 935 | version "5.7.0" 936 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" 937 | integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== 938 | dependencies: 939 | commander "^2.20.0" 940 | source-map "~0.7.2" 941 | source-map-support "~0.5.19" 942 | 943 | turbolinks@^5.2.0: 944 | version "5.2.0" 945 | resolved "https://registry.yarnpkg.com/turbolinks/-/turbolinks-5.2.0.tgz#e6877a55ea5c1cb3bb225f0a4ae303d6d32ff77c" 946 | integrity sha512-pMiez3tyBo6uRHFNNZoYMmrES/IaGgMhQQM+VFF36keryjb5ms0XkVpmKHkfW/4Vy96qiGW3K9bz0tF5sK9bBw== 947 | 948 | uri-js@^4.2.2: 949 | version "4.4.1" 950 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 951 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 952 | dependencies: 953 | punycode "^2.1.0" 954 | 955 | util@^0.10.3: 956 | version "0.10.4" 957 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" 958 | integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== 959 | dependencies: 960 | inherits "2.0.3" 961 | 962 | v8-compile-cache@^2.2.0: 963 | version "2.3.0" 964 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" 965 | integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 966 | 967 | watchpack@^2.0.0: 968 | version "2.1.1" 969 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" 970 | integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== 971 | dependencies: 972 | glob-to-regexp "^0.4.1" 973 | graceful-fs "^4.1.2" 974 | 975 | webpack-bundle-tracker@^1.0.0-alpha.1: 976 | version "1.0.0-alpha.1" 977 | resolved "https://registry.yarnpkg.com/webpack-bundle-tracker/-/webpack-bundle-tracker-1.0.0-alpha.1.tgz#17b4f41df147d53989f3542b035bcde8c7c2dc00" 978 | integrity sha512-kyLrwD0ZeINe76pevIsAQY49lRrSfw01iCM6kbMi/Fb9m2LYJBv3up3ALcqf3ugiydy4vbaZ8NYTi4F2MxojVw== 979 | dependencies: 980 | "@types/lodash.foreach" "^4.4.6" 981 | "@types/lodash.get" "^4.4.6" 982 | lodash.assign "^4.2.0" 983 | lodash.defaults "^4.2.0" 984 | lodash.foreach "^4.2.0" 985 | lodash.get "^4.4.2" 986 | strip-ansi "^6.0.0" 987 | 988 | webpack-cli@^4.2.0: 989 | version "4.7.0" 990 | resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.0.tgz#3195a777f1f802ecda732f6c95d24c0004bc5a35" 991 | integrity sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g== 992 | dependencies: 993 | "@discoveryjs/json-ext" "^0.5.0" 994 | "@webpack-cli/configtest" "^1.0.3" 995 | "@webpack-cli/info" "^1.2.4" 996 | "@webpack-cli/serve" "^1.4.0" 997 | colorette "^1.2.1" 998 | commander "^7.0.0" 999 | execa "^5.0.0" 1000 | fastest-levenshtein "^1.0.12" 1001 | import-local "^3.0.2" 1002 | interpret "^2.2.0" 1003 | rechoir "^0.7.0" 1004 | v8-compile-cache "^2.2.0" 1005 | webpack-merge "^5.7.3" 1006 | 1007 | webpack-merge@^5.7.3: 1008 | version "5.7.3" 1009 | resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" 1010 | integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== 1011 | dependencies: 1012 | clone-deep "^4.0.1" 1013 | wildcard "^2.0.0" 1014 | 1015 | webpack-sources@^2.1.1: 1016 | version "2.2.0" 1017 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" 1018 | integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w== 1019 | dependencies: 1020 | source-list-map "^2.0.1" 1021 | source-map "^0.6.1" 1022 | 1023 | webpack@^5.6.0: 1024 | version "5.37.0" 1025 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.37.0.tgz#2ab00f613faf494504eb2beef278dab7493cc39d" 1026 | integrity sha512-yvdhgcI6QkQkDe1hINBAJ1UNevqNGTVaCkD2SSJcB8rcrNNl922RI8i2DXUAuNfANoxwsiXXEA4ZPZI9q2oGLA== 1027 | dependencies: 1028 | "@types/eslint-scope" "^3.7.0" 1029 | "@types/estree" "^0.0.47" 1030 | "@webassemblyjs/ast" "1.11.0" 1031 | "@webassemblyjs/wasm-edit" "1.11.0" 1032 | "@webassemblyjs/wasm-parser" "1.11.0" 1033 | acorn "^8.2.1" 1034 | browserslist "^4.14.5" 1035 | chrome-trace-event "^1.0.2" 1036 | enhanced-resolve "^5.8.0" 1037 | es-module-lexer "^0.4.0" 1038 | eslint-scope "^5.1.1" 1039 | events "^3.2.0" 1040 | glob-to-regexp "^0.4.1" 1041 | graceful-fs "^4.2.4" 1042 | json-parse-better-errors "^1.0.2" 1043 | loader-runner "^4.2.0" 1044 | mime-types "^2.1.27" 1045 | neo-async "^2.6.2" 1046 | schema-utils "^3.0.0" 1047 | tapable "^2.1.1" 1048 | terser-webpack-plugin "^5.1.1" 1049 | watchpack "^2.0.0" 1050 | webpack-sources "^2.1.1" 1051 | 1052 | which@^2.0.1: 1053 | version "2.0.2" 1054 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1055 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1056 | dependencies: 1057 | isexe "^2.0.0" 1058 | 1059 | wildcard@^2.0.0: 1060 | version "2.0.0" 1061 | resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" 1062 | integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== 1063 | 1064 | wrappy@1: 1065 | version "1.0.2" 1066 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1067 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1068 | 1069 | yocto-queue@^0.1.0: 1070 | version "0.1.0" 1071 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1072 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1073 | --------------------------------------------------------------------------------