Compare commits
43 commits
activitypu
...
dependabot
Author | SHA1 | Date | |
---|---|---|---|
|
5b8592c2ac | ||
|
ac398426fc | ||
|
e02602e445 | ||
|
ac32e5ec1d | ||
|
8d3ceafe34 | ||
|
58d83a8cb1 | ||
|
240160f877 | ||
|
a622b0b947 | ||
|
f727ee6a45 | ||
|
25008e0555 | ||
|
995c69a45b | ||
|
291027c1c3 | ||
|
a84f182cf4 | ||
|
12abf5e142 | ||
|
638c1ed7d8 | ||
|
e90505cfdf | ||
|
d73bf5770d | ||
|
fd92599890 | ||
|
5560887862 | ||
|
426e096a9b | ||
|
9785c2849a | ||
|
57617faa27 | ||
|
d5408766cc | ||
|
7a30154bc5 | ||
|
f1ee1eadd9 | ||
|
e884c39a03 | ||
|
f643515fdd | ||
|
078688149a | ||
|
f94db7a54f | ||
|
cb83422a8a | ||
|
7a0e5c9900 | ||
|
14570da001 | ||
|
0a479aa734 | ||
|
b9df613b31 | ||
|
faf7925ce0 | ||
|
bfd9f4938d | ||
|
4a01c00ef2 | ||
|
12c4213ecf | ||
|
3f4a72e7f3 | ||
|
a414adc582 | ||
|
313af50864 | ||
|
3142c2b31a | ||
|
e35b438f06 |
47 changed files with 1255 additions and 203 deletions
2
Gemfile
2
Gemfile
|
@ -155,3 +155,5 @@ gem 'concurrent-ruby', require: false
|
|||
gem 'connection_pool', require: false
|
||||
gem 'xorcist', '~> 1.1'
|
||||
gem 'cocoon', '~> 1.2'
|
||||
|
||||
gem 'random_name_generator'
|
||||
|
|
|
@ -535,6 +535,7 @@ GEM
|
|||
thor (~> 1.0)
|
||||
rainbow (3.1.1)
|
||||
rake (13.0.6)
|
||||
random_name_generator (2.0.1)
|
||||
rdf (3.2.9)
|
||||
link_header (~> 0.0, >= 0.0.8)
|
||||
rdf-normalize (0.5.0)
|
||||
|
@ -820,6 +821,7 @@ DEPENDENCIES
|
|||
rails-controller-testing (~> 1.0)
|
||||
rails-i18n (~> 6.0)
|
||||
rails-settings-cached (~> 0.6)
|
||||
random_name_generator
|
||||
rdf-normalize (~> 0.5)
|
||||
redcarpet (~> 3.5)
|
||||
redis (~> 4.5)
|
||||
|
@ -855,3 +857,9 @@ DEPENDENCIES
|
|||
webpacker (~> 5.4)
|
||||
webpush!
|
||||
xorcist (~> 1.1)
|
||||
|
||||
RUBY VERSION
|
||||
ruby 3.0.4p208
|
||||
|
||||
BUNDLED WITH
|
||||
2.2.33
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
require 'redis'
|
||||
|
||||
class ActivityPub::InboxesController < ActivityPub::BaseController
|
||||
include SignatureVerification
|
||||
|
@ -9,6 +10,10 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
|
|||
before_action :require_actor_signature!
|
||||
skip_before_action :authenticate_user!
|
||||
|
||||
def initialize
|
||||
@activity_log_publisher = ActivityLogPublisher.new
|
||||
end
|
||||
|
||||
def create
|
||||
upgrade_account
|
||||
process_collection_synchronization
|
||||
|
@ -71,6 +76,10 @@ class ActivityPub::InboxesController < ActivityPub::BaseController
|
|||
end
|
||||
|
||||
def process_payload
|
||||
event = ActivityLogEvent.new('inbound', "https://#{Rails.configuration.x.web_domain}#{request.path}", Oj.load(body, mode: :strict))
|
||||
|
||||
@activity_log_publisher.publish(event)
|
||||
|
||||
ActivityPub::ProcessingWorker.perform_async(signed_request_actor.id, body, @account&.id, signed_request_actor.class.name)
|
||||
end
|
||||
end
|
||||
|
|
40
app/controllers/api/v1/activity_log_controller.rb
Normal file
40
app/controllers/api/v1/activity_log_controller.rb
Normal file
|
@ -0,0 +1,40 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Api::V1::ActivityLogController < Api::BaseController
|
||||
include ActionController::Live
|
||||
|
||||
# before_action -> { doorkeeper_authorize! :read }, only: [:show]
|
||||
before_action :require_user!
|
||||
|
||||
rescue_from ArgumentError do |e|
|
||||
render json: { error: e.to_s }, status: 422
|
||||
end
|
||||
|
||||
def index
|
||||
render :text => "hello world"
|
||||
end
|
||||
|
||||
def show
|
||||
response.headers['Content-Type'] = 'text/event-stream'
|
||||
# hack to avoid computing Etag, which delays sending of data
|
||||
response.headers['Last-Modified'] = Time.now.httpdate
|
||||
|
||||
sse = SSE.new(response.stream)
|
||||
|
||||
# id = current_account.local_username_and_domain
|
||||
id = current_account.username
|
||||
|
||||
begin
|
||||
ActivityLogger.register(id, sse)
|
||||
|
||||
while true
|
||||
event = ActivityLogEvent.new('keep-alive', nil, nil)
|
||||
ActivityLogger.log(id, event)
|
||||
sleep 10
|
||||
end
|
||||
ensure
|
||||
ActivityLogger.unregister(id, sse)
|
||||
sse.close
|
||||
end
|
||||
end
|
||||
end
|
|
@ -61,7 +61,7 @@ class ApplicationController < ActionController::Base
|
|||
end
|
||||
|
||||
def after_sign_out_path_for(_resource_or_scope)
|
||||
new_user_session_path
|
||||
"/auth/sign_up"
|
||||
end
|
||||
|
||||
protected
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'random_name_generator'
|
||||
require 'securerandom'
|
||||
|
||||
class Auth::RegistrationsController < Devise::RegistrationsController
|
||||
include RegistrationSpamConcern
|
||||
|
||||
|
@ -45,6 +48,21 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
|||
end
|
||||
|
||||
def build_resource(hash = nil)
|
||||
|
||||
# hack to always use auto-generated usernames and passwords
|
||||
if !hash.nil?
|
||||
username = generate_name
|
||||
password = SecureRandom.hex
|
||||
|
||||
hash["account_attributes"] = {
|
||||
"username": username.parameterize(separator: '_'),
|
||||
"display_name": username
|
||||
}
|
||||
hash["email"] = "#{hash["account_attributes"]["username"]}@#{Rails.configuration.x.web_domain}"
|
||||
hash["password"] = password
|
||||
hash["password_confirmation"] = password
|
||||
end
|
||||
|
||||
super(hash)
|
||||
|
||||
resource.locale = I18n.locale
|
||||
|
@ -62,7 +80,9 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
|||
end
|
||||
|
||||
def after_sign_up_path_for(_resource)
|
||||
auth_setup_path
|
||||
# Hack to automatically visit the confirmation link after successful sign-up.
|
||||
# This way we can use the default configuration but still get away without an email server.
|
||||
"/auth/confirmation?confirmation_token=#{@user.confirmation_token}"
|
||||
end
|
||||
|
||||
def after_sign_in_path_for(_resource)
|
||||
|
@ -156,4 +176,16 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
|||
def set_cache_headers
|
||||
response.headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
|
||||
end
|
||||
|
||||
@@first_name_generator = RandomNameGenerator.new(File.new("#{File.dirname(__FILE__)}/roman.txt"))
|
||||
@@last_name_generator = RandomNameGenerator.new(RandomNameGenerator::FANTASY)
|
||||
|
||||
def generate_name
|
||||
# When there is a name collision, the user will be shown
|
||||
# "Something isn't quite right yet! Please review 2 errors below"
|
||||
# When they sign up again, it will most probably succeed (since there is no collision anymore)
|
||||
# While this isn't the best UX, it's only a minor issue
|
||||
# (collisions happen after > 1k of users and there's an easy fix) # so not worth fixing for now
|
||||
"#{@@first_name_generator.compose(3)} #{@@last_name_generator.compose(3)}"
|
||||
end
|
||||
end
|
||||
|
|
44
app/controllers/auth/roman.txt
Normal file
44
app/controllers/auth/roman.txt
Normal file
|
@ -0,0 +1,44 @@
|
|||
-a
|
||||
-al
|
||||
-au +c
|
||||
-an
|
||||
-ba
|
||||
-be
|
||||
-bi
|
||||
-br +v
|
||||
-da
|
||||
-di
|
||||
-do
|
||||
-du
|
||||
-e
|
||||
-eu +c
|
||||
-fa
|
||||
bi
|
||||
be
|
||||
bo
|
||||
bu
|
||||
nul +v
|
||||
gu
|
||||
da
|
||||
au +c -c
|
||||
fri
|
||||
gus
|
||||
+tus
|
||||
+ta
|
||||
+lus
|
||||
+la
|
||||
+lius
|
||||
+lia
|
||||
+nus
|
||||
+na
|
||||
+es
|
||||
+ius -c
|
||||
+ia -c
|
||||
+cus
|
||||
+ca
|
||||
+tor
|
||||
+cio
|
||||
+cia
|
||||
+tin
|
||||
+tia
|
||||
+ssia -v
|
|
@ -6,7 +6,9 @@ class HomeController < ApplicationController
|
|||
before_action :set_instance_presenter
|
||||
|
||||
def index
|
||||
expires_in 0, public: true unless user_signed_in?
|
||||
if !user_signed_in?
|
||||
redirect_to "/auth/sign_up"
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
|
86
app/javascript/mastodon/features/activity_log/index.js
Normal file
86
app/javascript/mastodon/features/activity_log/index.js
Normal file
|
@ -0,0 +1,86 @@
|
|||
import React, { useEffect, useReducer, useRef } from 'react';
|
||||
import { FormattedMessage } from 'react-intl';
|
||||
import PropTypes from 'prop-types';
|
||||
import Column from 'mastodon/components/column';
|
||||
import ColumnHeader from 'mastodon/components/column_header';
|
||||
import { HotKeys } from 'react-hotkeys';
|
||||
import DismissableBanner from 'mastodon/components/dismissable_banner';
|
||||
|
||||
import ActivityPubVisualization from 'activitypub-visualization';
|
||||
|
||||
export default function ActivityLog({ multiColumn }) {
|
||||
|
||||
const [logs, dispatch] = useReducer((state, [type, data]) => {
|
||||
switch (type) {
|
||||
case 'add-log-event':
|
||||
return [...state, data];
|
||||
case 'reset-logs':
|
||||
return [];
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
}, []);
|
||||
|
||||
const columnElement = useRef(null);
|
||||
|
||||
useEffect(() => {
|
||||
const eventSource = new EventSource('/api/v1/activity_log');
|
||||
eventSource.onmessage = (event) => {
|
||||
const parsed = JSON.parse(event.data);
|
||||
if (parsed.type !== 'keep-alive') {
|
||||
dispatch(['add-log-event', parsed]);
|
||||
}
|
||||
};
|
||||
|
||||
return function() {
|
||||
eventSource.close();
|
||||
};
|
||||
}, []);
|
||||
|
||||
const darkMode = !(document.body && document.body.classList.contains('theme-mastodon-light'));
|
||||
|
||||
// hijack the toggleHidden shortcut to copy the logs to clipbaord
|
||||
const handlers = {
|
||||
toggleHidden: () => navigator.clipboard.writeText(JSON.stringify(logs, null, 2)),
|
||||
};
|
||||
|
||||
return (
|
||||
<Column bindToDocument={!multiColumn} ref={columnElement} label='Activity Log'>
|
||||
<ColumnHeader
|
||||
icon='comments'
|
||||
title='Activity Log'
|
||||
onClick={() => { columnElement.current.scrollTop() }}
|
||||
multiColumn={multiColumn}
|
||||
/>
|
||||
|
||||
<DismissableBanner id='activity_log'>
|
||||
<p>
|
||||
<FormattedMessage
|
||||
id='dismissable_banner.activity_log_information'
|
||||
defaultMessage='Open Mastodon in another tab and interact with another instance (for example, follow an account on another instance). The resulting Activities will be shown here. You can find more information on my {blog}.'
|
||||
values={{
|
||||
blog: <a href='//seb.jambor.dev/' style={{ color: darkMode ? '#8c8dff' : '#3a3bff', textDecoration: 'none' }}>blog</a>,
|
||||
}}
|
||||
/>
|
||||
</p>
|
||||
<p style={{ paddingTop: '5px' }}>
|
||||
<FormattedMessage
|
||||
id='dismissable_banner.activity_log_clear'
|
||||
defaultMessage='Note: Activities will only be logged while this view is open. When you navigate elsewhere, the log will be cleared.'
|
||||
/>
|
||||
</p>
|
||||
</DismissableBanner>
|
||||
|
||||
<HotKeys handlers={handlers}>
|
||||
<div className={`${darkMode ? 'dark' : ''}`}>
|
||||
<ActivityPubVisualization logs={logs} />
|
||||
</div>
|
||||
</HotKeys>
|
||||
|
||||
</Column>
|
||||
);
|
||||
}
|
||||
|
||||
ActivityLog.propTypes = {
|
||||
multiColumn: PropTypes.bool,
|
||||
};
|
|
@ -9,6 +9,7 @@ const messages = defineMessages({
|
|||
pins: { id: 'navigation_bar.pins', defaultMessage: 'Pinned posts' },
|
||||
preferences: { id: 'navigation_bar.preferences', defaultMessage: 'Preferences' },
|
||||
follow_requests: { id: 'navigation_bar.follow_requests', defaultMessage: 'Follow requests' },
|
||||
activity_log: { id: 'navigation_bar.activity_log', defaultMessage: 'Activity log' },
|
||||
favourites: { id: 'navigation_bar.favourites', defaultMessage: 'Favourites' },
|
||||
lists: { id: 'navigation_bar.lists', defaultMessage: 'Lists' },
|
||||
blocks: { id: 'navigation_bar.blocks', defaultMessage: 'Blocked users' },
|
||||
|
@ -45,6 +46,7 @@ class ActionBar extends React.PureComponent {
|
|||
menu.push({ text: intl.formatMessage(messages.favourites), to: '/favourites' });
|
||||
menu.push({ text: intl.formatMessage(messages.bookmarks), to: '/bookmarks' });
|
||||
menu.push({ text: intl.formatMessage(messages.lists), to: '/lists' });
|
||||
menu.push({ text: intl.formatMessage(messages.activity_log), to: '/activity_log' });
|
||||
menu.push(null);
|
||||
menu.push({ text: intl.formatMessage(messages.mutes), to: '/mutes' });
|
||||
menu.push({ text: intl.formatMessage(messages.blocks), to: '/blocks' });
|
||||
|
|
|
@ -158,6 +158,10 @@ class KeyboardShortcuts extends ImmutablePureComponent {
|
|||
<td><kbd>g</kbd>+<kbd>r</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.requests' defaultMessage='to open follow requests list' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><kbd>g</kbd>+<kbd>a</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.activity_log' defaultMessage='to open activity log' /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><kbd>?</kbd></td>
|
||||
<td><FormattedMessage id='keyboard_shortcuts.legend' defaultMessage='to display this legend' /></td>
|
||||
|
|
|
@ -86,6 +86,8 @@ class NavigationPanel extends React.Component {
|
|||
<ColumnLink transparent to='/bookmarks' icon='bookmark' text={intl.formatMessage(messages.bookmarks)} />
|
||||
<ColumnLink transparent to='/lists' icon='list-ul' text={intl.formatMessage(messages.lists)} />
|
||||
|
||||
<ColumnLink transparent to='/activity_log' icon='comments' text='Activity Log' />
|
||||
|
||||
<ListPanel />
|
||||
|
||||
<hr />
|
||||
|
|
|
@ -48,6 +48,7 @@ import {
|
|||
Mutes,
|
||||
PinnedStatuses,
|
||||
Lists,
|
||||
ActivityLog,
|
||||
Directory,
|
||||
Explore,
|
||||
FollowRecommendations,
|
||||
|
@ -105,6 +106,7 @@ const keyMap = {
|
|||
goToBlocked: 'g b',
|
||||
goToMuted: 'g m',
|
||||
goToRequests: 'g r',
|
||||
goToActivityLog: 'g a',
|
||||
toggleHidden: 'x',
|
||||
toggleSensitive: 'h',
|
||||
openMedia: 'e',
|
||||
|
@ -156,11 +158,7 @@ class SwitchingColumnsArea extends React.PureComponent {
|
|||
let redirect;
|
||||
|
||||
if (signedIn) {
|
||||
if (mobile) {
|
||||
redirect = <Redirect from='/' to='/home' exact />;
|
||||
} else {
|
||||
redirect = <Redirect from='/' to='/getting-started' exact />;
|
||||
}
|
||||
redirect = <Redirect from='/' to='/activity_log' exact />;
|
||||
} else if (singleUserMode && owner && initialState?.accounts[owner]) {
|
||||
redirect = <Redirect from='/' to={`/@${initialState.accounts[owner].username}`} exact />;
|
||||
} else if (showTrends) {
|
||||
|
@ -218,6 +216,7 @@ class SwitchingColumnsArea extends React.PureComponent {
|
|||
<WrappedRoute path='/domain_blocks' component={DomainBlocks} content={children} />
|
||||
<WrappedRoute path='/mutes' component={Mutes} content={children} />
|
||||
<WrappedRoute path='/lists' component={Lists} content={children} />
|
||||
<WrappedRoute path='/activity_log' component={ActivityLog} content={children} />
|
||||
|
||||
<Route component={BundleColumnError} />
|
||||
</WrappedSwitch>
|
||||
|
@ -387,12 +386,6 @@ class UI extends React.PureComponent {
|
|||
navigator.serviceWorker.addEventListener('message', this.handleServiceWorkerPostMessage);
|
||||
}
|
||||
|
||||
// On first launch, redirect to the follow recommendations page
|
||||
if (signedIn && this.props.firstLaunch) {
|
||||
this.context.router.history.replace('/start');
|
||||
this.props.dispatch(closeOnboarding());
|
||||
}
|
||||
|
||||
if (signedIn) {
|
||||
this.props.dispatch(fetchMarkers());
|
||||
this.props.dispatch(expandHomeTimeline());
|
||||
|
@ -495,6 +488,10 @@ class UI extends React.PureComponent {
|
|||
this.context.router.history.push('/home');
|
||||
}
|
||||
|
||||
handleHotkeyGoToActivityLog = () => {
|
||||
this.context.router.history.push('/activity_log');
|
||||
}
|
||||
|
||||
handleHotkeyGoToNotifications = () => {
|
||||
this.context.router.history.push('/notifications');
|
||||
}
|
||||
|
@ -552,6 +549,7 @@ class UI extends React.PureComponent {
|
|||
focusColumn: this.handleHotkeyFocusColumn,
|
||||
back: this.handleHotkeyBack,
|
||||
goToHome: this.handleHotkeyGoToHome,
|
||||
goToActivityLog: this.handleHotkeyGoToActivityLog,
|
||||
goToNotifications: this.handleHotkeyGoToNotifications,
|
||||
goToLocal: this.handleHotkeyGoToLocal,
|
||||
goToFederated: this.handleHotkeyGoToFederated,
|
||||
|
|
|
@ -38,6 +38,10 @@ export function Lists () {
|
|||
return import(/* webpackChunkName: "features/lists" */'../../lists');
|
||||
}
|
||||
|
||||
export function ActivityLog () {
|
||||
return import(/* webpackChunkName: "features/activity_log" */'../../activity_log');
|
||||
}
|
||||
|
||||
export function Status () {
|
||||
return import(/* webpackChunkName: "features/status" */'../../status');
|
||||
}
|
||||
|
|
|
@ -23,3 +23,5 @@
|
|||
@import 'mastodon/dashboard';
|
||||
@import 'mastodon/rtl';
|
||||
@import 'mastodon/accessibility';
|
||||
|
||||
@import 'activitypub-visualization';
|
||||
|
|
|
@ -8608,3 +8608,321 @@ noscript {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
$blueGray-50: #F8FAFC;
|
||||
$blueGray-100:#F1F5F9;
|
||||
$blueGray-200: #E2E8F0;
|
||||
$blueGray-300: #CBD5E1;
|
||||
$blueGray-400: #94A3B8;
|
||||
$blueGray-500: #64748B;
|
||||
$blueGray-600: #475569;
|
||||
$blueGray-700: #334155;
|
||||
$blueGray-800: #1E293B;
|
||||
$blueGray-900: #0F172A;
|
||||
|
||||
$coolGray-50: #F9FAFB;
|
||||
$coolGray-100:#F3F4F6;
|
||||
$coolGray-200: #E5E7EB;
|
||||
$coolGray-300: #D1D5DB;
|
||||
$coolGray-400: #9CA3AF;
|
||||
$coolGray-500: #6B7280;
|
||||
$coolGray-600: #4B5563;
|
||||
$coolGray-700: #374151;
|
||||
$coolGray-800: #1F2937;
|
||||
$coolGray-900: #111827;
|
||||
|
||||
$gray-50: #FAFAFA;
|
||||
$gray-100:#F4F4F5;
|
||||
$gray-200: #E4E4E7;
|
||||
$gray-300: #D4D4D8;
|
||||
$gray-400: #A1A1AA;
|
||||
$gray-500: #71717A;
|
||||
$gray-600: #52525B;
|
||||
$gray-700: #3F3F46;
|
||||
$gray-800: #27272A;
|
||||
$gray-900: #18181B;
|
||||
|
||||
$trueGray-50: #FAFAFA;
|
||||
$trueGray-100:#F5F5F5;
|
||||
$trueGray-200: #E5E5E5;
|
||||
$trueGray-300: #D4D4D4;
|
||||
$trueGray-400: #A3A3A3;
|
||||
$trueGray-500: #737373;
|
||||
$trueGray-600: #525252;
|
||||
$trueGray-700: #404040;
|
||||
$trueGray-800: #262626;
|
||||
$trueGray-900: #171717;
|
||||
|
||||
$warmGray-50: #FAFAF9;
|
||||
$warmGray-100:#F5F5F4;
|
||||
$warmGray-200: #E7E5E4;
|
||||
$warmGray-300: #D6D3D1;
|
||||
$warmGray-400: #A8A29E;
|
||||
$warmGray-500: #78716C;
|
||||
$warmGray-600: #57534E;
|
||||
$warmGray-700: #44403C;
|
||||
$warmGray-800: #292524;
|
||||
$warmGray-900: #1C1917;
|
||||
|
||||
$red-50: #FEF2F2;
|
||||
$red-100:#FEE2E2;
|
||||
$red-200: #FECACA;
|
||||
$red-300: #FCA5A5;
|
||||
$red-400: #F87171;
|
||||
$red-500: #EF4444;
|
||||
$red-600: #DC2626;
|
||||
$red-700: #B91C1C;
|
||||
$red-800: #991B1B;
|
||||
$red-900: #7F1D1D;
|
||||
|
||||
$orange-50: #FFF7ED;
|
||||
$orange-100:#FFEDD5;
|
||||
$orange-200: #FED7AA;
|
||||
$orange-300: #FDBA74;
|
||||
$orange-400: #FB923C;
|
||||
$orange-500: #F97316;
|
||||
$orange-600: #EA580C;
|
||||
$orange-700: #C2410C;
|
||||
$orange-800: #9A3412;
|
||||
$orange-900: #7C2D12;
|
||||
|
||||
$amber-50: #FFFBEB;
|
||||
$amber-100:#FEF3C7;
|
||||
$amber-200: #FDE68A;
|
||||
$amber-300: #FCD34D;
|
||||
$amber-400: #FBBF24;
|
||||
$amber-500: #F59E0B;
|
||||
$amber-600: #D97706;
|
||||
$amber-700: #B45309;
|
||||
$amber-800: #92400E;
|
||||
$amber-900: #78350F;
|
||||
|
||||
$yellow-50: #FEFCE8;
|
||||
$yellow-100:#FEF9C3;
|
||||
$yellow-200: #FEF08A;
|
||||
$yellow-300: #FDE047;
|
||||
$yellow-400: #FACC15;
|
||||
$yellow-500: #EAB308;
|
||||
$yellow-600: #CA8A04;
|
||||
$yellow-700: #A16207;
|
||||
$yellow-800: #854D0E;
|
||||
$yellow-900: #713F12;
|
||||
|
||||
$lime-50: #F7FEE7;
|
||||
$lime-100: #ECFCCB;
|
||||
$lime-200: #D9F99D;
|
||||
$lime-300: #BEF264;
|
||||
$lime-400: #A3E635;
|
||||
$lime-500: #84CC16;
|
||||
$lime-600: #65A30D;
|
||||
$lime-700: #4D7C0F;
|
||||
$lime-800: #3F6212;
|
||||
$lime-900: #365314;
|
||||
|
||||
$green-50: #F0FDF4;
|
||||
$green-100: #DCFCE7;
|
||||
$green-200: #BBF7D0;
|
||||
$green-300: #86EFAC;
|
||||
$green-400: #4ADE80;
|
||||
$green-500: #22C55E;
|
||||
$green-600: #16A34A;
|
||||
$green-700: #15803D;
|
||||
$green-800: #166534;
|
||||
$green-900: #14532D;
|
||||
|
||||
$emerald-50: #ECFDF5;
|
||||
$emerald-100: #D1FAE5;
|
||||
$emerald-200: #A7F3D0;
|
||||
$emerald-300: #6EE7B7;
|
||||
$emerald-400: #34D399;
|
||||
$emerald-500: #10B981;
|
||||
$emerald-600: #059669;
|
||||
$emerald-700: #047857;
|
||||
$emerald-800: #065F46;
|
||||
$emerald-900: #064E3B;
|
||||
|
||||
$teal-50: #F0FDFA;
|
||||
$teal-100: #CCFBF1;
|
||||
$teal-200: #99F6E4;
|
||||
$teal-300: #5EEAD4;
|
||||
$teal-400: #2DD4BF;
|
||||
$teal-500: #14B8A6;
|
||||
$teal-600: #0D9488;
|
||||
$teal-700: #0F766E;
|
||||
$teal-800: #115E59;
|
||||
$teal-900: #134E4A;
|
||||
|
||||
$cyan-50: #ECFEFF;
|
||||
$cyan-100: #CFFAFE;
|
||||
$cyan-200: #A5F3FC;
|
||||
$cyan-300: #67E8F9;
|
||||
$cyan-400: #22D3EE;
|
||||
$cyan-500: #06B6D4;
|
||||
$cyan-600: #0891B2;
|
||||
$cyan-700: #0E7490;
|
||||
$cyan-800: #155E75;
|
||||
$cyan-900: #164E63;
|
||||
|
||||
$lightBlue-50: #F0F9FF;
|
||||
$lightBlue-100: #E0F2FE;
|
||||
$lightBlue-200: #BAE6FD;
|
||||
$lightBlue-300: #7DD3FC;
|
||||
$lightBlue-400: #38BDF8;
|
||||
$lightBlue-500: #0EA5E9;
|
||||
$lightBlue-600: #0284C7;
|
||||
$lightBlue-700: #0369A1;
|
||||
$lightBlue-800: #075985;
|
||||
$lightBlue-900: #0C4A6E;
|
||||
|
||||
$blue-50: #EFF6FF;
|
||||
$blue-100: #DBEAFE;
|
||||
$blue-200: #BFDBFE;
|
||||
$blue-300: #93C5FD;
|
||||
$blue-400: #60A5FA;
|
||||
$blue-500: #3B82F6;
|
||||
$blue-600: #2563EB;
|
||||
$blue-700: #1D4ED8;
|
||||
$blue-800: #1E40AF;
|
||||
$blue-900: #1E3A8A;
|
||||
|
||||
$indigo-50: #EEF2FF;
|
||||
$indigo-100: #E0E7FF;
|
||||
$indigo-200: #C7D2FE;
|
||||
$indigo-300: #A5B4FC;
|
||||
$indigo-400: #818CF8;
|
||||
$indigo-500: #6366F1;
|
||||
$indigo-600: #4F46E5;
|
||||
$indigo-700: #4338CA;
|
||||
$indigo-800: #3730A3;
|
||||
$indigo-900: #312E81;
|
||||
|
||||
$violet-50: #F5F3FF;
|
||||
$violet-100: #EDE9FE;
|
||||
$violet-200: #DDD6FE;
|
||||
$violet-300: #C4B5FD;
|
||||
$violet-400: #A78BFA;
|
||||
$violet-500: #8B5CF6;
|
||||
$violet-600: #7C3AED;
|
||||
$violet-700: #6D28D9;
|
||||
$violet-800: #5B21B6;
|
||||
$violet-900: #4C1D95;
|
||||
|
||||
$purple-50: #FAF5FF;
|
||||
$purple-100: #F3E8FF;
|
||||
$purple-200: #E9D5FF;
|
||||
$purple-300: #D8B4FE;
|
||||
$purple-400: #C084FC;
|
||||
$purple-500: #A855F7;
|
||||
$purple-600: #9333EA;
|
||||
$purple-700: #7E22CE;
|
||||
$purple-800: #6B21A8;
|
||||
$purple-900: #581C87;
|
||||
|
||||
$fuchsia-50: #FDF4FF;
|
||||
$fuchsia-100: #FAE8FF;
|
||||
$fuchsia-200: #F5D0FE;
|
||||
$fuchsia-300: #F0ABFC;
|
||||
$fuchsia-400: #E879F9;
|
||||
$fuchsia-500: #D946EF;
|
||||
$fuchsia-600: #C026D3;
|
||||
$fuchsia-700: #A21CAF;
|
||||
$fuchsia-800: #86198F;
|
||||
$fuchsia-900: #701A75;
|
||||
|
||||
$pink-50: #FDF2F8;
|
||||
$pink-100: #FCE7F3;
|
||||
$pink-200: #FBCFE8;
|
||||
$pink-300: #F9A8D4;
|
||||
$pink-400: #F472B6;
|
||||
$pink-500: #EC4899;
|
||||
$pink-600: #DB2777;
|
||||
$pink-700: #BE185D;
|
||||
$pink-800: #9D174D;
|
||||
$pink-900: #831843;
|
||||
|
||||
$rose-50: #FFF1F2;
|
||||
$rose-100: #FFE4E6;
|
||||
$rose-200: #FECDD3;
|
||||
$rose-300: #FDA4AF;
|
||||
$rose-400: #FB7185;
|
||||
$rose-500: #F43F5E;
|
||||
$rose-600: #E11D48;
|
||||
$rose-700: #BE123C;
|
||||
$rose-800: #9F1239;
|
||||
$rose-900: #881337;
|
||||
|
||||
.activity-log {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.log-event {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
width: 80%;
|
||||
padding: 4px;
|
||||
margin: 4px;
|
||||
border-radius: 5px;
|
||||
border-top-left-radius: 0;
|
||||
color: black;
|
||||
|
||||
.activity {
|
||||
padding: 2px;
|
||||
border-radius: 2px;
|
||||
|
||||
.actor {
|
||||
font-style: italic;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.type {
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.object {
|
||||
}
|
||||
|
||||
.activity {
|
||||
border-left: 4px solid $blue-300;
|
||||
padding: 2px;
|
||||
border-radius: 4px;
|
||||
background-color: $gray-300;
|
||||
}
|
||||
}
|
||||
|
||||
.source {
|
||||
font-family: monospace;
|
||||
overflow: auto;
|
||||
background-color: $gray-200;
|
||||
}
|
||||
}
|
||||
|
||||
.metadata {
|
||||
margin-top: 8px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
.path {
|
||||
color: $gray-500;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
.source-button {
|
||||
border: 0;
|
||||
padding: 0;
|
||||
background-color: inherit;
|
||||
color: $blue-400;
|
||||
}
|
||||
}
|
||||
|
||||
.inbound {
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
.outbound {
|
||||
align-self: flex-end;
|
||||
background-color: #d9fdd3;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -919,6 +919,17 @@ code {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
a {
|
||||
color: $highlight-text-color;
|
||||
text-decoration: underline;
|
||||
|
||||
&:hover,
|
||||
&:active,
|
||||
&:focus {
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.action-pagination {
|
||||
|
|
58
app/lib/activity_log_audience_helper.rb
Normal file
58
app/lib/activity_log_audience_helper.rb
Normal file
|
@ -0,0 +1,58 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ActivityLogAudienceHelper
|
||||
|
||||
def self.audience(activity_log_event)
|
||||
domain = Rails.configuration.x.web_domain
|
||||
|
||||
if activity_log_event.type == 'outbound'
|
||||
actor = activity_log_event.data['actor']
|
||||
|
||||
if actor and match = actor.match(Regexp.new("https://#{domain}/users/([^/]*)"))
|
||||
[match.captures[0]]
|
||||
else
|
||||
[]
|
||||
end
|
||||
elsif activity_log_event.type == 'inbound'
|
||||
if match = activity_log_event.path.match(Regexp.new("https://#{domain}/users/([^/]*)/inbox"))
|
||||
[match.captures[0]]
|
||||
elsif activity_log_event.path == "https://#{domain}/inbox"
|
||||
['to', 'bto', 'cc', 'bcc']
|
||||
.map { |target| actors(activity_log_event.data[target]) }
|
||||
.flatten
|
||||
.uniq
|
||||
else
|
||||
[]
|
||||
end
|
||||
else
|
||||
[]
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def self.actors(string_or_array)
|
||||
domain = Rails.configuration.x.web_domain
|
||||
|
||||
if string_or_array.nil?
|
||||
[]
|
||||
elsif string_or_array.is_a?(String)
|
||||
self.actors([string_or_array])
|
||||
else
|
||||
string_or_array.map do |string|
|
||||
if match = string.match(Regexp.new("https://#{domain}/users/([^/]*)"))
|
||||
match.captures[0]
|
||||
elsif string.ends_with?("/followers")
|
||||
Account
|
||||
.joins(
|
||||
"JOIN follows ON follows.account_id = accounts.id
|
||||
JOIN accounts AS followed ON follows.target_account_id = followed.id
|
||||
WHERE followed.followers_url = '#{string}'")
|
||||
.map { |account| account.username }
|
||||
else
|
||||
nil
|
||||
end
|
||||
end.flatten.compact
|
||||
end
|
||||
end
|
||||
end
|
18
app/lib/activity_log_event.rb
Normal file
18
app/lib/activity_log_event.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ActivityLogEvent
|
||||
attr_accessor :type, :path, :data, :timestamp
|
||||
|
||||
def self.from_json_string(json_string)
|
||||
json = Oj.load(json_string, mode: :strict)
|
||||
ActivityLogEvent.new(json['type'], json['path'], json['data'])
|
||||
end
|
||||
|
||||
|
||||
def initialize(type, path, data, timestamp = Time.now.utc.iso8601)
|
||||
@type = type
|
||||
@path = path
|
||||
@data = data
|
||||
@timestamp = timestamp
|
||||
end
|
||||
end
|
10
app/lib/activity_log_publisher.rb
Normal file
10
app/lib/activity_log_publisher.rb
Normal file
|
@ -0,0 +1,10 @@
|
|||
class ActivityLogPublisher
|
||||
|
||||
def initialize
|
||||
@redis = RedisConfiguration.new.connection
|
||||
end
|
||||
|
||||
def publish(log_event)
|
||||
@redis.publish('activity_log', Oj.dump(log_event))
|
||||
end
|
||||
end
|
26
app/lib/activity_logger.rb
Normal file
26
app/lib/activity_logger.rb
Normal file
|
@ -0,0 +1,26 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ActivityLogger
|
||||
|
||||
@@loggers = Hash.new { |hash, key| hash[key] = [] }
|
||||
|
||||
def self.register(id, sse)
|
||||
@@loggers[id] << sse
|
||||
end
|
||||
|
||||
def self.unregister(id, sse)
|
||||
@@loggers[id].delete(sse)
|
||||
end
|
||||
|
||||
def self.log(id, event)
|
||||
@@loggers[id].each do |logger|
|
||||
logger.write event
|
||||
rescue
|
||||
puts 'rescued'
|
||||
end
|
||||
end
|
||||
|
||||
def self.reset
|
||||
@@loggers.clear
|
||||
end
|
||||
end
|
|
@ -34,14 +34,6 @@ class AccountMigration < ApplicationRecord
|
|||
attr_accessor :current_password, :current_username
|
||||
|
||||
def save_with_challenge(current_user)
|
||||
if current_user.encrypted_password.present?
|
||||
errors.add(:current_password, :invalid) unless current_user.valid_password?(current_password)
|
||||
else
|
||||
errors.add(:current_username, :invalid) unless account.username == current_username
|
||||
end
|
||||
|
||||
return false unless errors.empty?
|
||||
|
||||
with_lock("account_migration:#{account.id}") do
|
||||
save
|
||||
end
|
||||
|
|
|
@ -12,14 +12,6 @@ class Form::Redirect
|
|||
validate :validate_target_account
|
||||
|
||||
def valid_with_challenge?(current_user)
|
||||
if current_user.encrypted_password.present?
|
||||
errors.add(:current_password, :invalid) unless current_user.valid_password?(current_password)
|
||||
else
|
||||
errors.add(:current_username, :invalid) unless account.username == current_username
|
||||
end
|
||||
|
||||
return false unless errors.empty?
|
||||
|
||||
set_target_account
|
||||
valid?
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class RegistrationFormTimeValidator < ActiveModel::Validator
|
||||
REGISTRATION_FORM_MIN_TIME = 3.seconds.freeze
|
||||
REGISTRATION_FORM_MIN_TIME = 0.5.seconds.freeze
|
||||
|
||||
def validate(user)
|
||||
user.errors.add(:base, I18n.t('auth.too_fast')) if user.registration_form_time.present? && user.registration_form_time > REGISTRATION_FORM_MIN_TIME.ago
|
||||
|
|
|
@ -3,31 +3,6 @@
|
|||
|
||||
= render 'status'
|
||||
|
||||
%h3= t('auth.security')
|
||||
|
||||
= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put, class: 'auth_edit', novalidate: false }) do |f|
|
||||
= render 'shared/error_messages', object: resource
|
||||
|
||||
- if !use_seamless_external_login? || resource.encrypted_password.present?
|
||||
.fields-row
|
||||
.fields-row__column.fields-group.fields-row__column-6
|
||||
= f.input :email, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.email') }, required: true, disabled: current_account.suspended?
|
||||
.fields-row__column.fields-group.fields-row__column-6
|
||||
= f.input :current_password, wrapper: :with_label, input_html: { 'aria-label' => t('simple_form.labels.defaults.current_password'), :autocomplete => 'current-password' }, required: true, disabled: current_account.suspended?, hint: false
|
||||
|
||||
.fields-row
|
||||
.fields-row__column.fields-group.fields-row__column-6
|
||||
= f.input :password, wrapper: :with_label, label: t('simple_form.labels.defaults.new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.new_password'), :autocomplete => 'new-password', :minlength => User.password_length.first, :maxlength => User.password_length.last }, hint: t('simple_form.hints.defaults.password'), disabled: current_account.suspended?
|
||||
.fields-row__column.fields-group.fields-row__column-6
|
||||
= f.input :password_confirmation, wrapper: :with_label, label: t('simple_form.labels.defaults.confirm_new_password'), input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_new_password'), :autocomplete => 'new-password' }, disabled: current_account.suspended?
|
||||
|
||||
.actions
|
||||
= f.button :button, t('generic.save_changes'), type: :submit, class: 'button', disabled: current_account.suspended?
|
||||
- else
|
||||
%p.hint= t('users.seamless_external_login')
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
= render 'sessions'
|
||||
|
||||
- unless current_account.suspended?
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
= simple_form_for(resource, as: resource_name, url: registration_path(resource_name), html: { novalidate: false }) do |f|
|
||||
%h1.title= t('auth.sign_up.title', domain: site_hostname)
|
||||
%p.lead= t('auth.sign_up.preamble')
|
||||
%p.lead= t('auth.sign_up.activity_log_preamble_html')
|
||||
|
||||
= render 'shared/error_messages', object: resource
|
||||
|
||||
|
@ -16,12 +16,6 @@
|
|||
= render 'application/card', account: @invite.user.account
|
||||
|
||||
.fields-group
|
||||
= f.simple_fields_for :account do |ff|
|
||||
= ff.input :display_name, wrapper: :with_label, label: false, required: false, input_html: { 'aria-label' => t('simple_form.labels.defaults.display_name'), :autocomplete => 'off', placeholder: t('simple_form.labels.defaults.display_name') }
|
||||
= ff.input :username, wrapper: :with_label, label: false, required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.username'), :autocomplete => 'off', placeholder: t('simple_form.labels.defaults.username'), pattern: '[a-zA-Z0-9_]+', maxlength: 30 }, append: "@#{site_hostname}", hint: false
|
||||
= f.input :email, placeholder: t('simple_form.labels.defaults.email'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.email'), :autocomplete => 'username' }, hint: false
|
||||
= f.input :password, placeholder: t('simple_form.labels.defaults.password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.password'), :autocomplete => 'new-password', :minlength => User.password_length.first, :maxlength => User.password_length.last }, hint: false
|
||||
= f.input :password_confirmation, placeholder: t('simple_form.labels.defaults.confirm_password'), required: true, input_html: { 'aria-label' => t('simple_form.labels.defaults.confirm_password'), :autocomplete => 'new-password' }, hint: false
|
||||
= f.input :confirm_password, as: :string, placeholder: t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), required: false, input_html: { 'aria-label' => t('simple_form.labels.defaults.honeypot', label: t('simple_form.labels.defaults.password')), :autocomplete => 'off' }, hint: false
|
||||
= f.input :website, as: :url, wrapper: :with_label, label: t('simple_form.labels.defaults.honeypot', label: 'Website'), required: false, input_html: { 'aria-label' => t('simple_form.labels.defaults.honeypot', label: 'Website'), :autocomplete => 'off' }
|
||||
|
||||
|
@ -39,5 +33,3 @@
|
|||
|
||||
.actions
|
||||
= f.button :button, @invite.present? ? t('auth.register') : sign_up_message, type: :submit
|
||||
|
||||
.form-footer= render 'auth/shared/links'
|
||||
|
|
|
@ -17,11 +17,5 @@
|
|||
.fields-row__column.fields-group.fields-row__column-6
|
||||
= f.input :acct, wrapper: :with_block_label, input_html: { autocapitalize: 'none', autocorrect: 'off' }, label: t('simple_form.labels.account_migration.acct'), hint: t('simple_form.hints.account_migration.acct')
|
||||
|
||||
.fields-row__column.fields-group.fields-row__column-6
|
||||
- if current_user.encrypted_password.present?
|
||||
= f.input :current_password, wrapper: :with_block_label, input_html: { :autocomplete => 'current-password' }, required: true
|
||||
- else
|
||||
= f.input :current_username, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, required: true
|
||||
|
||||
.actions
|
||||
= f.button :button, t('migrations.set_redirect'), type: :submit, class: 'button button--destructive'
|
||||
|
|
|
@ -46,12 +46,6 @@
|
|||
.fields-row__column.fields-group.fields-row__column-6
|
||||
= f.input :acct, wrapper: :with_block_label, input_html: { autocapitalize: 'none', autocorrect: 'off' }, disabled: on_cooldown?
|
||||
|
||||
.fields-row__column.fields-group.fields-row__column-6
|
||||
- if current_user.encrypted_password.present?
|
||||
= f.input :current_password, wrapper: :with_block_label, input_html: { :autocomplete => 'current-password' }, required: true, disabled: on_cooldown?
|
||||
- else
|
||||
= f.input :current_username, wrapper: :with_block_label, input_html: { :autocomplete => 'off' }, required: true, disabled: on_cooldown?
|
||||
|
||||
.actions
|
||||
= f.button :button, t('migrations.proceed_with_move'), type: :submit, class: 'button button--destructive', disabled: on_cooldown?
|
||||
|
||||
|
|
|
@ -12,9 +12,17 @@ class ActivityPub::DeliveryWorker
|
|||
|
||||
HEADERS = { 'Content-Type' => 'application/activity+json' }.freeze
|
||||
|
||||
def initialize
|
||||
@activity_log_publisher = ActivityLogPublisher.new
|
||||
end
|
||||
|
||||
def perform(json, source_account_id, inbox_url, options = {})
|
||||
return unless DeliveryFailureTracker.available?(inbox_url)
|
||||
|
||||
event = ActivityLogEvent.new('outbound', inbox_url, Oj.load(json, mode: :strict))
|
||||
|
||||
@activity_log_publisher.publish(event)
|
||||
|
||||
@options = options.with_indifferent_access
|
||||
@json = json
|
||||
@source_account = Account.find(source_account_id)
|
||||
|
|
40
app/workers/scheduler/old_account_cleanup_scheduler.rb
Normal file
40
app/workers/scheduler/old_account_cleanup_scheduler.rb
Normal file
|
@ -0,0 +1,40 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Scheduler::OldAccountCleanupScheduler
|
||||
include Sidekiq::Worker
|
||||
|
||||
# Each processed deletion request may enqueue an enormous
|
||||
# amount of jobs in the `pull` queue, so only enqueue when
|
||||
# the queue is empty or close to being so.
|
||||
MAX_PULL_SIZE = 50
|
||||
|
||||
# Since account deletion is very expensive, we want to avoid
|
||||
# overloading the server by queing too much at once.
|
||||
MAX_DELETIONS_PER_JOB = 5
|
||||
|
||||
sidekiq_options retry: 0
|
||||
|
||||
def perform
|
||||
return if Sidekiq::Queue.new('pull').size > MAX_PULL_SIZE
|
||||
|
||||
clean_old_accounts!
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def clean_old_accounts!
|
||||
Account
|
||||
# only fetch local accounts
|
||||
.where("domain IS NULL")
|
||||
# id -99 is the instance actor
|
||||
.where("id <> -99")
|
||||
# don't delete admin
|
||||
.where("username <> 'admin'")
|
||||
.where("created_at < ?", 1.day.ago)
|
||||
.order(created_at: :asc)
|
||||
.limit(MAX_DELETIONS_PER_JOB)
|
||||
.each do |account|
|
||||
AccountDeletionWorker.perform_async(account.id, { :reserve_username => false })
|
||||
end
|
||||
end
|
||||
end
|
|
@ -74,7 +74,8 @@ Rails.application.configure do
|
|||
# If using a Heroku, Vagrant or generic remote development environment,
|
||||
# use letter_opener_web, accessible at /letter_opener.
|
||||
# Otherwise, use letter_opener, which launches a browser window to view sent mail.
|
||||
config.action_mailer.delivery_method = (ENV['HEROKU'] || ENV['VAGRANT'] || ENV['REMOTE_DEV']) ? :letter_opener_web : :letter_opener
|
||||
# config.action_mailer.delivery_method = (ENV['HEROKU'] || ENV['VAGRANT'] || ENV['REMOTE_DEV']) ? :letter_opener_web : :letter_opener
|
||||
config.action_mailer.delivery_method = :file
|
||||
|
||||
config.after_initialize do
|
||||
Bullet.enable = true
|
||||
|
|
|
@ -130,7 +130,7 @@ Rails.application.configure do
|
|||
:ssl => ENV['SMTP_SSL'].presence && ENV['SMTP_SSL'] == 'true',
|
||||
}
|
||||
|
||||
config.action_mailer.delivery_method = ENV.fetch('SMTP_DELIVERY_METHOD', 'smtp').to_sym
|
||||
config.action_mailer.delivery_method = :file
|
||||
|
||||
config.action_dispatch.default_headers = {
|
||||
'Server' => 'Mastodon',
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
en:
|
||||
devise:
|
||||
confirmations:
|
||||
confirmed: Your email address has been successfully confirmed.
|
||||
confirmed: Your account is fully functional.
|
||||
send_instructions: You will receive an email with instructions for how to confirm your email address in a few minutes. Please check your spam folder if you didn't receive this email.
|
||||
send_paranoid_instructions: If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes. Please check your spam folder if you didn't receive this email.
|
||||
failure:
|
||||
|
|
|
@ -953,6 +953,7 @@ en:
|
|||
title: Setup
|
||||
sign_up:
|
||||
preamble: With an account on this Mastodon server, you'll be able to follow any other person on the network, regardless of where their account is hosted.
|
||||
activity_log_preamble_html: This instance is intended to help you learn <a href="https://www.w3.org/TR/activitypub/">ActivityPub</a>, by showing Activities between different instances in real time. After signing up, you are given a fully functional Mastodon account. You can follow other accounts, create posts, repost, like, etc. These actions generate Activities following the ActivityPub spec, which will be shown to you in real time. You can learn more about this on my <a href="//seb.jambor.dev">blog</a>. Note that your account is only valid for 24 hours and will be deleted automatically afterwards.
|
||||
title: Let's get you set up on %{domain}.
|
||||
status:
|
||||
account_status: Account status
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
require_relative '../lib/activity_log_subscriber'
|
||||
|
||||
persistent_timeout ENV.fetch('PERSISTENT_TIMEOUT') { 20 }.to_i
|
||||
|
||||
threads_count = ENV.fetch('MAX_THREADS') { 5 }.to_i
|
||||
|
@ -18,6 +20,10 @@ on_worker_boot do
|
|||
ActiveSupport.on_load(:active_record) do
|
||||
ActiveRecord::Base.establish_connection
|
||||
end
|
||||
|
||||
Thread.new {
|
||||
ActivityLogSubscriber.new.start
|
||||
}
|
||||
end
|
||||
|
||||
plugin :tmp_restart
|
||||
|
|
|
@ -24,6 +24,7 @@ Rails.application.routes.draw do
|
|||
/search
|
||||
/publish
|
||||
/follow_requests
|
||||
/activity_log
|
||||
/blocks
|
||||
/domain_blocks
|
||||
/mutes
|
||||
|
@ -513,6 +514,8 @@ Rails.application.routes.draw do
|
|||
resources :confirmations, only: [:create]
|
||||
end
|
||||
|
||||
resource :activity_log, only: [:show], controller: 'activity_log'
|
||||
|
||||
resource :instance, only: [:show] do
|
||||
resources :peers, only: [:index], controller: 'instances/peers'
|
||||
resources :rules, only: [:index], controller: 'instances/rules'
|
||||
|
|
|
@ -58,3 +58,7 @@
|
|||
interval: 1 minute
|
||||
class: Scheduler::SuspendedUserCleanupScheduler
|
||||
queue: scheduler
|
||||
old_account_cleanup_scheduler:
|
||||
interval: 1 minute
|
||||
class: Scheduler::OldAccountCleanupScheduler
|
||||
queue: scheduler
|
||||
|
|
18
lib/activity_log_subscriber.rb
Normal file
18
lib/activity_log_subscriber.rb
Normal file
|
@ -0,0 +1,18 @@
|
|||
# frozen_string_literal: true
|
||||
require 'redis'
|
||||
|
||||
class ActivityLogSubscriber
|
||||
def start
|
||||
redis = RedisConfiguration.new.connection
|
||||
|
||||
redis.subscribe('activity_log') do |on|
|
||||
on.message do |channel, message|
|
||||
json = Oj.load(message, mode: :strict)
|
||||
event = ActivityLogEvent.new(json['type'], json['path'], json['data'])
|
||||
|
||||
ActivityLogAudienceHelper.audience(event)
|
||||
.each { |username| ActivityLogger.log(username, event) }
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -28,13 +28,14 @@
|
|||
"@babel/plugin-proposal-decorators": "^7.19.6",
|
||||
"@babel/plugin-transform-react-inline-elements": "^7.18.6",
|
||||
"@babel/plugin-transform-runtime": "^7.19.6",
|
||||
"@babel/preset-env": "^7.19.4",
|
||||
"@babel/preset-env": "^7.20.2",
|
||||
"@babel/preset-react": "^7.18.6",
|
||||
"@babel/runtime": "^7.19.4",
|
||||
"@gamestdio/websocket": "^0.3.2",
|
||||
"@github/webauthn-json": "^0.5.7",
|
||||
"@rails/ujs": "^6.1.7",
|
||||
"abortcontroller-polyfill": "^1.7.5",
|
||||
"activitypub-visualization": "^1.0.0",
|
||||
"array-includes": "^3.1.5",
|
||||
"arrow-key-navigation": "^1.2.0",
|
||||
"autoprefixer": "^9.8.8",
|
||||
|
|
12
spec/fixtures/activity_log_events/inbound-to-users-inbox.json
vendored
Normal file
12
spec/fixtures/activity_log_events/inbound-to-users-inbox.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"timestamp":"2022-12-08T17:12:38Z",
|
||||
"type": "inbound",
|
||||
"path": "https://example.com/users/bob/inbox",
|
||||
"data": {
|
||||
"@context": "https://www.w3.org/ns/activitystreams",
|
||||
"id": "https://other.org/a5f25e0a-98d6-4e5c-baad-65318cd4d67d",
|
||||
"type": "Follow",
|
||||
"actor": "https://other.org/users/alice",
|
||||
"object": "https://example.com/users/bob"
|
||||
}
|
||||
}
|
43
spec/fixtures/activity_log_events/inbound-with-duplicate-recipients.json
vendored
Normal file
43
spec/fixtures/activity_log_events/inbound-with-duplicate-recipients.json
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"timestamp":"2022-12-08T17:12:38Z",
|
||||
"type": "inbound",
|
||||
"path": "https://example.com/inbox",
|
||||
"data": {
|
||||
"@context": "https://www.w3.org/ns/activitystreams",
|
||||
"actor": "https://other.org/users/bob/",
|
||||
"id": "https://other.org/users/bob/statuses/109473290785654613/activity",
|
||||
"object": {
|
||||
"attributedTo": "https://other.org/users/bob/",
|
||||
"content": "A post to selected audiences",
|
||||
"id": "https://other.org/users/bob/statuses/109473290785654613",
|
||||
"to": [
|
||||
"https://www.w3.org/ns/activitystreams#Public",
|
||||
"https://example.com/users/first-to",
|
||||
"https://example.com/users/first-to",
|
||||
"https://example.com/users/second-to"
|
||||
],
|
||||
"bto": "https://example.com/users/first-to",
|
||||
"cc": [
|
||||
"https://example.com/users/second-to"
|
||||
],
|
||||
"bcc": [
|
||||
"https://example.com/users/first-to"
|
||||
],
|
||||
"type": "Note"
|
||||
},
|
||||
"to": [
|
||||
"https://www.w3.org/ns/activitystreams#Public",
|
||||
"https://example.com/users/first-to",
|
||||
"https://example.com/users/first-to",
|
||||
"https://example.com/users/second-to"
|
||||
],
|
||||
"bto": "https://example.com/users/first-to",
|
||||
"cc": [
|
||||
"https://example.com/users/second-to"
|
||||
],
|
||||
"bcc": [
|
||||
"https://example.com/users/first-to"
|
||||
],
|
||||
"type": "Create"
|
||||
}
|
||||
}
|
25
spec/fixtures/activity_log_events/inbound-with-follower-recipients.json
vendored
Normal file
25
spec/fixtures/activity_log_events/inbound-with-follower-recipients.json
vendored
Normal file
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"timestamp":"2022-12-08T17:12:38Z",
|
||||
"type": "inbound",
|
||||
"path": "https://example.com/inbox",
|
||||
"data": {
|
||||
"@context": "https://www.w3.org/ns/activitystreams",
|
||||
"actor": "https://other.org/users/bob/",
|
||||
"id": "https://other.org/users/bob/statuses/109473290785654613/activity",
|
||||
"object": {
|
||||
"attributedTo": "https://other.org/users/bob/",
|
||||
"content": "A post to selected audiences",
|
||||
"id": "https://other.org/users/bob/statuses/109473290785654613",
|
||||
"to": [
|
||||
"https://www.w3.org/ns/activitystreams#Public",
|
||||
"https://other.org/users/bob/followers"
|
||||
],
|
||||
"type": "Note"
|
||||
},
|
||||
"to": [
|
||||
"https://www.w3.org/ns/activitystreams#Public",
|
||||
"https://other.org/users/bob/followers"
|
||||
],
|
||||
"type": "Create"
|
||||
}
|
||||
}
|
43
spec/fixtures/activity_log_events/inbound-with-multiple-recipients.json
vendored
Normal file
43
spec/fixtures/activity_log_events/inbound-with-multiple-recipients.json
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
{
|
||||
"timestamp":"2022-12-08T17:12:38Z",
|
||||
"type": "inbound",
|
||||
"path": "https://example.com/inbox",
|
||||
"data": {
|
||||
"@context": "https://www.w3.org/ns/activitystreams",
|
||||
"actor": "https://other.org/users/bob/",
|
||||
"id": "https://other.org/users/bob/statuses/109473290785654613/activity",
|
||||
"object": {
|
||||
"attributedTo": "https://other.org/users/bob/",
|
||||
"content": "A post to selected audiences",
|
||||
"id": "https://other.org/users/bob/statuses/109473290785654613",
|
||||
"to": [
|
||||
"https://www.w3.org/ns/activitystreams#Public",
|
||||
"https://example.com/users/first-to",
|
||||
"https://example.com/users/second-to",
|
||||
"https://other.org/users/other-instance"
|
||||
],
|
||||
"bto": "https://example.com/users/single-bto",
|
||||
"cc": [
|
||||
"https://example.com/users/one-cc"
|
||||
],
|
||||
"bcc": [
|
||||
"https://example.com/users/one-bcc"
|
||||
],
|
||||
"type": "Note"
|
||||
},
|
||||
"to": [
|
||||
"https://www.w3.org/ns/activitystreams#Public",
|
||||
"https://example.com/users/first-to",
|
||||
"https://example.com/users/second-to",
|
||||
"https://other.org/users/other-instance"
|
||||
],
|
||||
"bto": "https://example.com/users/single-bto",
|
||||
"cc": [
|
||||
"https://example.com/users/one-cc"
|
||||
],
|
||||
"bcc": [
|
||||
"https://example.com/users/one-bcc"
|
||||
],
|
||||
"type": "Create"
|
||||
}
|
||||
}
|
12
spec/fixtures/activity_log_events/outbound.json
vendored
Normal file
12
spec/fixtures/activity_log_events/outbound.json
vendored
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"timestamp":"2022-12-08T17:12:38Z",
|
||||
"type": "outbound",
|
||||
"path": "https://other.org/users/bob/inbox",
|
||||
"data": {
|
||||
"@context": "https://www.w3.org/ns/activitystreams",
|
||||
"id": "https://example.com/a5f25e0a-98d6-4e5c-baad-65318cd4d67d",
|
||||
"type": "Follow",
|
||||
"actor": "https://example.com/users/alice",
|
||||
"object": "https://other.org/users/bob"
|
||||
}
|
||||
}
|
89
spec/lib/activity_log_audience_helper_spec.rb
Normal file
89
spec/lib/activity_log_audience_helper_spec.rb
Normal file
|
@ -0,0 +1,89 @@
|
|||
require 'json'
|
||||
require 'rails_helper'
|
||||
|
||||
def activity_log_event_fixture(name)
|
||||
json_string = File.read(Rails.root.join('spec', 'fixtures', 'activity_log_events', name))
|
||||
|
||||
ActivityLogEvent.from_json_string(json_string)
|
||||
end
|
||||
|
||||
RSpec.describe ActivityLogAudienceHelper do
|
||||
describe '#audience' do
|
||||
around do |example|
|
||||
before = Rails.configuration.x.web_domain
|
||||
example.run
|
||||
Rails.configuration.x.web_domain = before
|
||||
end
|
||||
|
||||
describe 'for inbound events' do
|
||||
it 'returns the author if the domain matches' do
|
||||
Rails.configuration.x.web_domain = 'example.com'
|
||||
outbound_event = activity_log_event_fixture('outbound.json')
|
||||
|
||||
expect(ActivityLogAudienceHelper.audience(outbound_event)).to eq ['alice']
|
||||
end
|
||||
|
||||
it 'returns nothing if the domain does not match' do
|
||||
Rails.configuration.x.web_domain = 'does-not-match.com'
|
||||
outbound_event = activity_log_event_fixture('outbound.json')
|
||||
|
||||
expect(ActivityLogAudienceHelper.audience(outbound_event)).to eq []
|
||||
end
|
||||
|
||||
it 'returns nothing if the activity does not have an actor' do
|
||||
Rails.configuration.x.web_domain = 'example.com'
|
||||
outbound_event = activity_log_event_fixture('outbound.json')
|
||||
outbound_event.data.delete('actor')
|
||||
|
||||
expect(ActivityLogAudienceHelper.audience(outbound_event)).to eq []
|
||||
end
|
||||
end
|
||||
|
||||
describe 'for outbound events' do
|
||||
it 'returns the inbox owner if it is sent to a personal inbox' do
|
||||
Rails.configuration.x.web_domain = 'example.com'
|
||||
inbound_event = activity_log_event_fixture('inbound-to-users-inbox.json')
|
||||
|
||||
expect(ActivityLogAudienceHelper.audience(inbound_event)).to eq ['bob']
|
||||
end
|
||||
|
||||
it 'returns direct audience from to, bto, cc, bcc if sent to public inbox' do
|
||||
Rails.configuration.x.web_domain = 'example.com'
|
||||
inbound_event = activity_log_event_fixture('inbound-with-multiple-recipients.json')
|
||||
|
||||
expect(ActivityLogAudienceHelper.audience(inbound_event)).to match_array([
|
||||
'first-to',
|
||||
'second-to',
|
||||
'single-bto',
|
||||
'one-cc',
|
||||
'one-bcc'
|
||||
])
|
||||
end
|
||||
|
||||
it 'returns followers from to, bto, cc, bcc if sent to public inbox' do
|
||||
Rails.configuration.x.web_domain = 'example.com'
|
||||
inbound_event = activity_log_event_fixture('inbound-with-follower-recipients.json')
|
||||
|
||||
bob = Fabricate(:account, username: 'bob', followers_url: 'https://other.org/users/bob/followers')
|
||||
Fabricate(:account, username: 'first_follower').follow!(bob)
|
||||
Fabricate(:account, username: 'second_follower').follow!(bob)
|
||||
|
||||
expect(ActivityLogAudienceHelper.audience(inbound_event)).to match_array([
|
||||
'first_follower',
|
||||
'second_follower',
|
||||
])
|
||||
end
|
||||
|
||||
it 'removes duplicates from audience' do
|
||||
Rails.configuration.x.web_domain = 'example.com'
|
||||
inbound_event = activity_log_event_fixture('inbound-with-duplicate-recipients.json')
|
||||
|
||||
expect(ActivityLogAudienceHelper.audience(inbound_event)).to match_array([
|
||||
'first-to',
|
||||
'second-to'
|
||||
])
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
end
|
73
spec/lib/activity_logger_spec.rb
Normal file
73
spec/lib/activity_logger_spec.rb
Normal file
|
@ -0,0 +1,73 @@
|
|||
require 'json'
|
||||
require 'rails_helper'
|
||||
|
||||
def activity_log_event_fixture(name)
|
||||
json_string = File.read(Rails.root.join('spec', 'fixtures', 'activity_log_events', name))
|
||||
|
||||
ActivityLogEvent.from_json_string(json_string)
|
||||
end
|
||||
|
||||
RSpec.describe ActivityLogger do
|
||||
|
||||
after(:each) do
|
||||
ActivityLogger.reset
|
||||
end
|
||||
|
||||
describe 'log' do
|
||||
|
||||
it 'sends events to all listeners of the same id' do
|
||||
sse1 = spy('sse1')
|
||||
sse2 = spy('sse2')
|
||||
event = double('event')
|
||||
|
||||
ActivityLogger.register('test_id', sse1)
|
||||
ActivityLogger.register('test_id', sse2)
|
||||
|
||||
ActivityLogger.log('test_id', event)
|
||||
|
||||
expect(sse1).to have_received(:write).with(event)
|
||||
expect(sse2).to have_received(:write).with(event)
|
||||
end
|
||||
|
||||
it 'sends events to all listeners even if some fail' do
|
||||
sse1 = spy('sse1')
|
||||
sse2 = spy('sse2')
|
||||
event = double('event')
|
||||
|
||||
allow(sse1).to receive(:write).and_throw(:error)
|
||||
|
||||
ActivityLogger.register('test_id', sse1)
|
||||
ActivityLogger.register('test_id', sse2)
|
||||
|
||||
ActivityLogger.log('test_id', event)
|
||||
|
||||
expect(sse2).to have_received(:write).with(event)
|
||||
end
|
||||
|
||||
it 'does not send events to listeners of a different id' do
|
||||
sse = spy('sse')
|
||||
event = double('event')
|
||||
|
||||
ActivityLogger.register('test_id', sse)
|
||||
|
||||
ActivityLogger.log('other_id', event)
|
||||
|
||||
expect(sse).to_not have_received(:write).with(event)
|
||||
end
|
||||
|
||||
it 'does not send events to listeners after unregistering' do
|
||||
sse1 = spy('sse1')
|
||||
sse2 = spy('sse2')
|
||||
event = double('event')
|
||||
|
||||
ActivityLogger.register('test_id', sse1)
|
||||
ActivityLogger.register('test_id', sse2)
|
||||
ActivityLogger.unregister('test_id', sse1)
|
||||
|
||||
ActivityLogger.log('test_id', event)
|
||||
|
||||
expect(sse1).to_not have_received(:write).with(event)
|
||||
expect(sse2).to have_received(:write).with(event)
|
||||
end
|
||||
end
|
||||
end
|
302
yarn.lock
302
yarn.lock
|
@ -37,10 +37,10 @@
|
|||
dependencies:
|
||||
"@babel/highlight" "^7.18.6"
|
||||
|
||||
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.19.3", "@babel/compat-data@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747"
|
||||
integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==
|
||||
"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.1", "@babel/compat-data@^7.20.5":
|
||||
version "7.20.10"
|
||||
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec"
|
||||
integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==
|
||||
|
||||
"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.19.6", "@babel/core@^7.7.2":
|
||||
version "7.19.6"
|
||||
|
@ -81,6 +81,15 @@
|
|||
"@jridgewell/gen-mapping" "^0.3.2"
|
||||
jsesc "^2.5.1"
|
||||
|
||||
"@babel/generator@^7.20.7":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a"
|
||||
integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==
|
||||
dependencies:
|
||||
"@babel/types" "^7.20.7"
|
||||
"@jridgewell/gen-mapping" "^0.3.2"
|
||||
jsesc "^2.5.1"
|
||||
|
||||
"@babel/helper-annotate-as-pure@^7.18.6":
|
||||
version "7.18.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
|
||||
|
@ -104,14 +113,15 @@
|
|||
"@babel/helper-annotate-as-pure" "^7.18.6"
|
||||
"@babel/types" "^7.18.6"
|
||||
|
||||
"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.3":
|
||||
version "7.19.3"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca"
|
||||
integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==
|
||||
"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.3", "@babel/helper-compilation-targets@^7.20.0", "@babel/helper-compilation-targets@^7.20.7":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb"
|
||||
integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==
|
||||
dependencies:
|
||||
"@babel/compat-data" "^7.19.3"
|
||||
"@babel/compat-data" "^7.20.5"
|
||||
"@babel/helper-validator-option" "^7.18.6"
|
||||
browserslist "^4.21.3"
|
||||
lru-cache "^5.1.1"
|
||||
semver "^6.3.0"
|
||||
|
||||
"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0":
|
||||
|
@ -210,6 +220,13 @@
|
|||
dependencies:
|
||||
"@babel/types" "^7.18.9"
|
||||
|
||||
"@babel/helper-member-expression-to-functions@^7.20.7":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz#a6f26e919582275a93c3aa6594756d71b0bb7f05"
|
||||
integrity sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==
|
||||
dependencies:
|
||||
"@babel/types" "^7.20.7"
|
||||
|
||||
"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.18.6":
|
||||
version "7.18.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
|
||||
|
@ -217,7 +234,7 @@
|
|||
dependencies:
|
||||
"@babel/types" "^7.18.6"
|
||||
|
||||
"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0", "@babel/helper-module-transforms@^7.19.6":
|
||||
"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6":
|
||||
version "7.19.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz#6c52cc3ac63b70952d33ee987cbee1c9368b533f"
|
||||
integrity sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==
|
||||
|
@ -231,6 +248,20 @@
|
|||
"@babel/traverse" "^7.19.6"
|
||||
"@babel/types" "^7.19.4"
|
||||
|
||||
"@babel/helper-module-transforms@^7.20.11":
|
||||
version "7.20.11"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0"
|
||||
integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==
|
||||
dependencies:
|
||||
"@babel/helper-environment-visitor" "^7.18.9"
|
||||
"@babel/helper-module-imports" "^7.18.6"
|
||||
"@babel/helper-simple-access" "^7.20.2"
|
||||
"@babel/helper-split-export-declaration" "^7.18.6"
|
||||
"@babel/helper-validator-identifier" "^7.19.1"
|
||||
"@babel/template" "^7.20.7"
|
||||
"@babel/traverse" "^7.20.10"
|
||||
"@babel/types" "^7.20.7"
|
||||
|
||||
"@babel/helper-optimise-call-expression@^7.18.6":
|
||||
version "7.18.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe"
|
||||
|
@ -238,10 +269,10 @@
|
|||
dependencies:
|
||||
"@babel/types" "^7.18.6"
|
||||
|
||||
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
|
||||
version "7.19.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf"
|
||||
integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==
|
||||
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
|
||||
version "7.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629"
|
||||
integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==
|
||||
|
||||
"@babel/helper-remap-async-to-generator@^7.18.6":
|
||||
version "7.18.6"
|
||||
|
@ -274,12 +305,17 @@
|
|||
"@babel/traverse" "^7.19.1"
|
||||
"@babel/types" "^7.19.0"
|
||||
|
||||
"@babel/helper-simple-access@^7.18.6":
|
||||
version "7.18.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea"
|
||||
integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==
|
||||
"@babel/helper-replace-supers@^7.20.7":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331"
|
||||
integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==
|
||||
dependencies:
|
||||
"@babel/types" "^7.18.6"
|
||||
"@babel/helper-environment-visitor" "^7.18.9"
|
||||
"@babel/helper-member-expression-to-functions" "^7.20.7"
|
||||
"@babel/helper-optimise-call-expression" "^7.18.6"
|
||||
"@babel/template" "^7.20.7"
|
||||
"@babel/traverse" "^7.20.7"
|
||||
"@babel/types" "^7.20.7"
|
||||
|
||||
"@babel/helper-simple-access@^7.19.4":
|
||||
version "7.19.4"
|
||||
|
@ -288,6 +324,13 @@
|
|||
dependencies:
|
||||
"@babel/types" "^7.19.4"
|
||||
|
||||
"@babel/helper-simple-access@^7.20.2":
|
||||
version "7.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9"
|
||||
integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==
|
||||
dependencies:
|
||||
"@babel/types" "^7.20.2"
|
||||
|
||||
"@babel/helper-skip-transparent-expression-wrappers@^7.18.9":
|
||||
version "7.18.9"
|
||||
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818"
|
||||
|
@ -379,6 +422,11 @@
|
|||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8"
|
||||
integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==
|
||||
|
||||
"@babel/parser@^7.20.7":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b"
|
||||
integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==
|
||||
|
||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
|
||||
version "7.18.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
|
||||
|
@ -395,13 +443,13 @@
|
|||
"@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
|
||||
"@babel/plugin-proposal-optional-chaining" "^7.18.9"
|
||||
|
||||
"@babel/plugin-proposal-async-generator-functions@^7.19.1":
|
||||
version "7.19.1"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz#34f6f5174b688529342288cd264f80c9ea9fb4a7"
|
||||
integrity sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==
|
||||
"@babel/plugin-proposal-async-generator-functions@^7.20.1":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
|
||||
integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==
|
||||
dependencies:
|
||||
"@babel/helper-environment-visitor" "^7.18.9"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
"@babel/helper-remap-async-to-generator" "^7.18.9"
|
||||
"@babel/plugin-syntax-async-generators" "^7.8.4"
|
||||
|
||||
|
@ -481,16 +529,16 @@
|
|||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
|
||||
|
||||
"@babel/plugin-proposal-object-rest-spread@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz#a8fc86e8180ff57290c91a75d83fe658189b642d"
|
||||
integrity sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==
|
||||
"@babel/plugin-proposal-object-rest-spread@^7.20.2":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a"
|
||||
integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==
|
||||
dependencies:
|
||||
"@babel/compat-data" "^7.19.4"
|
||||
"@babel/helper-compilation-targets" "^7.19.3"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
"@babel/compat-data" "^7.20.5"
|
||||
"@babel/helper-compilation-targets" "^7.20.7"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
|
||||
"@babel/plugin-transform-parameters" "^7.18.8"
|
||||
"@babel/plugin-transform-parameters" "^7.20.7"
|
||||
|
||||
"@babel/plugin-proposal-optional-catch-binding@^7.18.6":
|
||||
version "7.18.6"
|
||||
|
@ -584,12 +632,12 @@
|
|||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.8.3"
|
||||
|
||||
"@babel/plugin-syntax-import-assertions@^7.18.6":
|
||||
version "7.18.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4"
|
||||
integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==
|
||||
"@babel/plugin-syntax-import-assertions@^7.20.0":
|
||||
version "7.20.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4"
|
||||
integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
|
||||
"@babel/plugin-syntax-import-meta@^7.8.3":
|
||||
version "7.10.4"
|
||||
|
@ -705,25 +753,25 @@
|
|||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
|
||||
"@babel/plugin-transform-block-scoping@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.19.4.tgz#315d70f68ce64426db379a3d830e7ac30be02e9b"
|
||||
integrity sha512-934S2VLLlt2hRJwPf4MczaOr4hYF0z+VKPwqTNxyKX7NthTiPfhuKFWQZHXRM0vh/wo/VyXB3s4bZUNA08l+tQ==
|
||||
"@babel/plugin-transform-block-scoping@^7.20.2":
|
||||
version "7.20.11"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.11.tgz#9f5a3424bd112a3f32fe0cf9364fbb155cff262a"
|
||||
integrity sha512-tA4N427a7fjf1P0/2I4ScsHGc5jcHPbb30xMbaTke2gxDuWpUfXDuX1FEymJwKk4tuGUvGcejAR6HdZVqmmPyw==
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
|
||||
"@babel/plugin-transform-classes@^7.19.0":
|
||||
version "7.19.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz#0e61ec257fba409c41372175e7c1e606dc79bb20"
|
||||
integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==
|
||||
"@babel/plugin-transform-classes@^7.20.2":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz#f438216f094f6bb31dc266ebfab8ff05aecad073"
|
||||
integrity sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==
|
||||
dependencies:
|
||||
"@babel/helper-annotate-as-pure" "^7.18.6"
|
||||
"@babel/helper-compilation-targets" "^7.19.0"
|
||||
"@babel/helper-compilation-targets" "^7.20.7"
|
||||
"@babel/helper-environment-visitor" "^7.18.9"
|
||||
"@babel/helper-function-name" "^7.19.0"
|
||||
"@babel/helper-optimise-call-expression" "^7.18.6"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
"@babel/helper-replace-supers" "^7.18.9"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
"@babel/helper-replace-supers" "^7.20.7"
|
||||
"@babel/helper-split-export-declaration" "^7.18.6"
|
||||
globals "^11.1.0"
|
||||
|
||||
|
@ -734,12 +782,12 @@
|
|||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.18.9"
|
||||
|
||||
"@babel/plugin-transform-destructuring@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.19.4.tgz#46890722687b9b89e1369ad0bd8dc6c5a3b4319d"
|
||||
integrity sha512-t0j0Hgidqf0aM86dF8U+vXYReUgJnlv4bZLsyoPnwZNrGY+7/38o8YjaELrvHeVfTZao15kjR0PVv0nju2iduA==
|
||||
"@babel/plugin-transform-destructuring@^7.20.2":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz#8bda578f71620c7de7c93af590154ba331415454"
|
||||
integrity sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
|
||||
"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4":
|
||||
version "7.18.6"
|
||||
|
@ -794,35 +842,32 @@
|
|||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
|
||||
"@babel/plugin-transform-modules-amd@^7.18.6":
|
||||
version "7.18.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21"
|
||||
integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==
|
||||
"@babel/plugin-transform-modules-amd@^7.19.6":
|
||||
version "7.20.11"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a"
|
||||
integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==
|
||||
dependencies:
|
||||
"@babel/helper-module-transforms" "^7.18.6"
|
||||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
babel-plugin-dynamic-import-node "^2.3.3"
|
||||
"@babel/helper-module-transforms" "^7.20.11"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
|
||||
"@babel/plugin-transform-modules-commonjs@^7.18.6":
|
||||
version "7.18.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883"
|
||||
integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==
|
||||
"@babel/plugin-transform-modules-commonjs@^7.19.6":
|
||||
version "7.20.11"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz#8cb23010869bf7669fd4b3098598b6b2be6dc607"
|
||||
integrity sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==
|
||||
dependencies:
|
||||
"@babel/helper-module-transforms" "^7.18.6"
|
||||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
"@babel/helper-simple-access" "^7.18.6"
|
||||
babel-plugin-dynamic-import-node "^2.3.3"
|
||||
"@babel/helper-module-transforms" "^7.20.11"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
"@babel/helper-simple-access" "^7.20.2"
|
||||
|
||||
"@babel/plugin-transform-modules-systemjs@^7.19.0":
|
||||
version "7.19.0"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz#5f20b471284430f02d9c5059d9b9a16d4b085a1f"
|
||||
integrity sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==
|
||||
"@babel/plugin-transform-modules-systemjs@^7.19.6":
|
||||
version "7.20.11"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e"
|
||||
integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==
|
||||
dependencies:
|
||||
"@babel/helper-hoist-variables" "^7.18.6"
|
||||
"@babel/helper-module-transforms" "^7.19.0"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
"@babel/helper-validator-identifier" "^7.18.6"
|
||||
babel-plugin-dynamic-import-node "^2.3.3"
|
||||
"@babel/helper-module-transforms" "^7.20.11"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
"@babel/helper-validator-identifier" "^7.19.1"
|
||||
|
||||
"@babel/plugin-transform-modules-umd@^7.18.6":
|
||||
version "7.18.6"
|
||||
|
@ -855,12 +900,12 @@
|
|||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
"@babel/helper-replace-supers" "^7.18.6"
|
||||
|
||||
"@babel/plugin-transform-parameters@^7.18.8":
|
||||
version "7.18.8"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a"
|
||||
integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==
|
||||
"@babel/plugin-transform-parameters@^7.20.1", "@babel/plugin-transform-parameters@^7.20.7":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz#0ee349e9d1bc96e78e3b37a7af423a4078a7083f"
|
||||
integrity sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==
|
||||
dependencies:
|
||||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
|
||||
"@babel/plugin-transform-property-literals@^7.18.6":
|
||||
version "7.18.6"
|
||||
|
@ -988,18 +1033,18 @@
|
|||
"@babel/helper-create-regexp-features-plugin" "^7.18.6"
|
||||
"@babel/helper-plugin-utils" "^7.18.6"
|
||||
|
||||
"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.19.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.4.tgz#4c91ce2e1f994f717efb4237891c3ad2d808c94b"
|
||||
integrity sha512-5QVOTXUdqTCjQuh2GGtdd7YEhoRXBMVGROAtsBeLGIbIz3obCBIfRMT1I3ZKkMgNzwkyCkftDXSSkHxnfVf4qg==
|
||||
"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.20.2":
|
||||
version "7.20.2"
|
||||
resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506"
|
||||
integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==
|
||||
dependencies:
|
||||
"@babel/compat-data" "^7.19.4"
|
||||
"@babel/helper-compilation-targets" "^7.19.3"
|
||||
"@babel/helper-plugin-utils" "^7.19.0"
|
||||
"@babel/compat-data" "^7.20.1"
|
||||
"@babel/helper-compilation-targets" "^7.20.0"
|
||||
"@babel/helper-plugin-utils" "^7.20.2"
|
||||
"@babel/helper-validator-option" "^7.18.6"
|
||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6"
|
||||
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9"
|
||||
"@babel/plugin-proposal-async-generator-functions" "^7.19.1"
|
||||
"@babel/plugin-proposal-async-generator-functions" "^7.20.1"
|
||||
"@babel/plugin-proposal-class-properties" "^7.18.6"
|
||||
"@babel/plugin-proposal-class-static-block" "^7.18.6"
|
||||
"@babel/plugin-proposal-dynamic-import" "^7.18.6"
|
||||
|
@ -1008,7 +1053,7 @@
|
|||
"@babel/plugin-proposal-logical-assignment-operators" "^7.18.9"
|
||||
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
|
||||
"@babel/plugin-proposal-numeric-separator" "^7.18.6"
|
||||
"@babel/plugin-proposal-object-rest-spread" "^7.19.4"
|
||||
"@babel/plugin-proposal-object-rest-spread" "^7.20.2"
|
||||
"@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
|
||||
"@babel/plugin-proposal-optional-chaining" "^7.18.9"
|
||||
"@babel/plugin-proposal-private-methods" "^7.18.6"
|
||||
|
@ -1019,7 +1064,7 @@
|
|||
"@babel/plugin-syntax-class-static-block" "^7.14.5"
|
||||
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
|
||||
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
|
||||
"@babel/plugin-syntax-import-assertions" "^7.18.6"
|
||||
"@babel/plugin-syntax-import-assertions" "^7.20.0"
|
||||
"@babel/plugin-syntax-json-strings" "^7.8.3"
|
||||
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
|
||||
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
|
||||
|
@ -1032,10 +1077,10 @@
|
|||
"@babel/plugin-transform-arrow-functions" "^7.18.6"
|
||||
"@babel/plugin-transform-async-to-generator" "^7.18.6"
|
||||
"@babel/plugin-transform-block-scoped-functions" "^7.18.6"
|
||||
"@babel/plugin-transform-block-scoping" "^7.19.4"
|
||||
"@babel/plugin-transform-classes" "^7.19.0"
|
||||
"@babel/plugin-transform-block-scoping" "^7.20.2"
|
||||
"@babel/plugin-transform-classes" "^7.20.2"
|
||||
"@babel/plugin-transform-computed-properties" "^7.18.9"
|
||||
"@babel/plugin-transform-destructuring" "^7.19.4"
|
||||
"@babel/plugin-transform-destructuring" "^7.20.2"
|
||||
"@babel/plugin-transform-dotall-regex" "^7.18.6"
|
||||
"@babel/plugin-transform-duplicate-keys" "^7.18.9"
|
||||
"@babel/plugin-transform-exponentiation-operator" "^7.18.6"
|
||||
|
@ -1043,14 +1088,14 @@
|
|||
"@babel/plugin-transform-function-name" "^7.18.9"
|
||||
"@babel/plugin-transform-literals" "^7.18.9"
|
||||
"@babel/plugin-transform-member-expression-literals" "^7.18.6"
|
||||
"@babel/plugin-transform-modules-amd" "^7.18.6"
|
||||
"@babel/plugin-transform-modules-commonjs" "^7.18.6"
|
||||
"@babel/plugin-transform-modules-systemjs" "^7.19.0"
|
||||
"@babel/plugin-transform-modules-amd" "^7.19.6"
|
||||
"@babel/plugin-transform-modules-commonjs" "^7.19.6"
|
||||
"@babel/plugin-transform-modules-systemjs" "^7.19.6"
|
||||
"@babel/plugin-transform-modules-umd" "^7.18.6"
|
||||
"@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1"
|
||||
"@babel/plugin-transform-new-target" "^7.18.6"
|
||||
"@babel/plugin-transform-object-super" "^7.18.6"
|
||||
"@babel/plugin-transform-parameters" "^7.18.8"
|
||||
"@babel/plugin-transform-parameters" "^7.20.1"
|
||||
"@babel/plugin-transform-property-literals" "^7.18.6"
|
||||
"@babel/plugin-transform-regenerator" "^7.18.6"
|
||||
"@babel/plugin-transform-reserved-words" "^7.18.6"
|
||||
|
@ -1062,7 +1107,7 @@
|
|||
"@babel/plugin-transform-unicode-escapes" "^7.18.10"
|
||||
"@babel/plugin-transform-unicode-regex" "^7.18.6"
|
||||
"@babel/preset-modules" "^0.1.5"
|
||||
"@babel/types" "^7.19.4"
|
||||
"@babel/types" "^7.20.2"
|
||||
babel-plugin-polyfill-corejs2 "^0.3.3"
|
||||
babel-plugin-polyfill-corejs3 "^0.6.0"
|
||||
babel-plugin-polyfill-regenerator "^0.4.1"
|
||||
|
@ -1123,6 +1168,15 @@
|
|||
"@babel/parser" "^7.18.10"
|
||||
"@babel/types" "^7.18.10"
|
||||
|
||||
"@babel/template@^7.20.7":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
|
||||
integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.18.6"
|
||||
"@babel/parser" "^7.20.7"
|
||||
"@babel/types" "^7.20.7"
|
||||
|
||||
"@babel/traverse@^7.18.10", "@babel/traverse@^7.18.6", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.4", "@babel/traverse@^7.19.6", "@babel/traverse@^7.7.2":
|
||||
version "7.19.6"
|
||||
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.6.tgz#7b4c865611df6d99cb131eec2e8ac71656a490dc"
|
||||
|
@ -1139,10 +1193,26 @@
|
|||
debug "^4.1.0"
|
||||
globals "^11.1.0"
|
||||
|
||||
"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.4", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
|
||||
version "7.19.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7"
|
||||
integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==
|
||||
"@babel/traverse@^7.20.10", "@babel/traverse@^7.20.7":
|
||||
version "7.20.12"
|
||||
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5"
|
||||
integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.18.6"
|
||||
"@babel/generator" "^7.20.7"
|
||||
"@babel/helper-environment-visitor" "^7.18.9"
|
||||
"@babel/helper-function-name" "^7.19.0"
|
||||
"@babel/helper-hoist-variables" "^7.18.6"
|
||||
"@babel/helper-split-export-declaration" "^7.18.6"
|
||||
"@babel/parser" "^7.20.7"
|
||||
"@babel/types" "^7.20.7"
|
||||
debug "^4.1.0"
|
||||
globals "^11.1.0"
|
||||
|
||||
"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.4", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
|
||||
version "7.20.7"
|
||||
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f"
|
||||
integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==
|
||||
dependencies:
|
||||
"@babel/helper-string-parser" "^7.19.4"
|
||||
"@babel/helper-validator-identifier" "^7.19.1"
|
||||
|
@ -2322,6 +2392,11 @@ acorn@^8.0.4, acorn@^8.1.0, acorn@^8.5.0, acorn@^8.8.0:
|
|||
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
|
||||
integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
|
||||
|
||||
activitypub-visualization@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/activitypub-visualization/-/activitypub-visualization-1.0.0.tgz#728ce9a20336bf927980748c37c8b5206cafecac"
|
||||
integrity sha512-azxnf4POMTsI8J0PiOXeD70wZvxAd6KdcD2YIE+AqkW00Fgg39Jxi+OcImc8GoAiUh7dpFp6nLA+WVH4uVnIEw==
|
||||
|
||||
agent-base@6:
|
||||
version "6.0.2"
|
||||
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
|
||||
|
@ -2733,13 +2808,6 @@ babel-loader@^8.2.5:
|
|||
make-dir "^3.1.0"
|
||||
schema-utils "^2.6.5"
|
||||
|
||||
babel-plugin-dynamic-import-node@^2.3.3:
|
||||
version "2.3.3"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
|
||||
integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
|
||||
dependencies:
|
||||
object.assign "^4.1.0"
|
||||
|
||||
babel-plugin-istanbul@^6.1.1:
|
||||
version "6.1.1"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
|
||||
|
@ -4542,7 +4610,7 @@ error-stack-parser@^2.0.6:
|
|||
dependencies:
|
||||
stackframe "^1.1.1"
|
||||
|
||||
es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.5:
|
||||
es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.5:
|
||||
version "1.20.0"
|
||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.0.tgz#b2d526489cceca004588296334726329e0a6bfb6"
|
||||
integrity sha512-URbD8tgRthKD3YcC39vbvSDrX23upXnPcnGAjQfgxXF5ID75YcENawc9ZX/9iTP9ptUyfCLIxTTuMYoRfiOVKA==
|
||||
|
@ -8075,16 +8143,6 @@ object-visit@^1.0.0:
|
|||
dependencies:
|
||||
isobject "^3.0.0"
|
||||
|
||||
object.assign@^4.1.0:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd"
|
||||
integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==
|
||||
dependencies:
|
||||
define-properties "^1.1.3"
|
||||
es-abstract "^1.18.0-next.0"
|
||||
has-symbols "^1.0.1"
|
||||
object-keys "^1.1.1"
|
||||
|
||||
object.assign@^4.1.2:
|
||||
version "4.1.2"
|
||||
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
|
||||
|
|
Loading…
Add table
Reference in a new issue