mirror of
https://github.com/glitch-soc/mastodon.git
synced 2026-03-29 03:00:33 +02:00
Merge pull request #3320 from ClearlyClaire/glitch-soc/merge-upstream
Merge upstream changes up to 0231b6d350
This commit is contained in:
35
app/javascript/mastodon/components/status_quoted.stories.tsx
Normal file
35
app/javascript/mastodon/components/status_quoted.stories.tsx
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import type { Meta, StoryObj } from '@storybook/react-vite';
|
||||||
|
|
||||||
|
import { accountFactoryState, statusFactoryState } from '@/testing/factories';
|
||||||
|
|
||||||
|
import type { StatusQuoteManagerProps } from './status_quoted';
|
||||||
|
import { StatusQuoteManager } from './status_quoted';
|
||||||
|
|
||||||
|
const meta = {
|
||||||
|
title: 'Components/Status/StatusQuoteManager',
|
||||||
|
render(args) {
|
||||||
|
return <StatusQuoteManager {...args} />;
|
||||||
|
},
|
||||||
|
args: {
|
||||||
|
id: '1',
|
||||||
|
},
|
||||||
|
parameters: {
|
||||||
|
state: {
|
||||||
|
accounts: {
|
||||||
|
'1': accountFactoryState({ id: '1', acct: 'hashtaguser' }),
|
||||||
|
},
|
||||||
|
statuses: {
|
||||||
|
'1': statusFactoryState({
|
||||||
|
id: '1',
|
||||||
|
text: 'Hello world!',
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} satisfies Meta<StatusQuoteManagerProps>;
|
||||||
|
|
||||||
|
export default meta;
|
||||||
|
|
||||||
|
type Story = StoryObj<typeof meta>;
|
||||||
|
|
||||||
|
export const Default: Story = {};
|
||||||
@@ -4,20 +4,19 @@ import { FormattedMessage } from 'react-intl';
|
|||||||
|
|
||||||
import type { Map as ImmutableMap } from 'immutable';
|
import type { Map as ImmutableMap } from 'immutable';
|
||||||
|
|
||||||
|
import { fetchRelationships } from 'mastodon/actions/accounts';
|
||||||
|
import { revealAccount } from 'mastodon/actions/accounts_typed';
|
||||||
|
import { fetchStatus } from 'mastodon/actions/statuses';
|
||||||
import { LearnMoreLink } from 'mastodon/components/learn_more_link';
|
import { LearnMoreLink } from 'mastodon/components/learn_more_link';
|
||||||
import StatusContainer from 'mastodon/containers/status_container';
|
import StatusContainer from 'mastodon/containers/status_container';
|
||||||
import { domain } from 'mastodon/initial_state';
|
import { domain } from 'mastodon/initial_state';
|
||||||
import type { Account } from 'mastodon/models/account';
|
import type { Account } from 'mastodon/models/account';
|
||||||
import type { Status } from 'mastodon/models/status';
|
import type { Status } from 'mastodon/models/status';
|
||||||
|
import { makeGetStatusWithExtraInfo } from 'mastodon/selectors';
|
||||||
|
import { getAccountHidden } from 'mastodon/selectors/accounts';
|
||||||
import type { RootState } from 'mastodon/store';
|
import type { RootState } from 'mastodon/store';
|
||||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
import { useAppDispatch, useAppSelector } from 'mastodon/store';
|
||||||
|
|
||||||
import { fetchRelationships } from '../actions/accounts';
|
|
||||||
import { revealAccount } from '../actions/accounts_typed';
|
|
||||||
import { fetchStatus } from '../actions/statuses';
|
|
||||||
import { makeGetStatusWithExtraInfo } from '../selectors';
|
|
||||||
import { getAccountHidden } from '../selectors/accounts';
|
|
||||||
|
|
||||||
import { Button } from './button';
|
import { Button } from './button';
|
||||||
|
|
||||||
const MAX_QUOTE_POSTS_NESTING_LEVEL = 1;
|
const MAX_QUOTE_POSTS_NESTING_LEVEL = 1;
|
||||||
@@ -333,7 +332,7 @@ export const QuotedStatus: React.FC<QuotedStatusProps> = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
interface StatusQuoteManagerProps {
|
export interface StatusQuoteManagerProps {
|
||||||
id: string;
|
id: string;
|
||||||
contextType?: string;
|
contextType?: string;
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ describe('emojiToUnicodeHex', () => {
|
|||||||
['⚫', '26AB'],
|
['⚫', '26AB'],
|
||||||
['🖤', '1F5A4'],
|
['🖤', '1F5A4'],
|
||||||
['💀', '1F480'],
|
['💀', '1F480'],
|
||||||
|
['❤️', '2764'], // Checks for trailing variation selector removal.
|
||||||
['💂♂️', '1F482-200D-2642-FE0F'],
|
['💂♂️', '1F482-200D-2642-FE0F'],
|
||||||
] as const)(
|
] as const)(
|
||||||
'emojiToUnicodeHex converts %s to %s',
|
'emojiToUnicodeHex converts %s to %s',
|
||||||
|
|||||||
@@ -32,6 +32,12 @@ export function emojiToUnicodeHex(emoji: string): string {
|
|||||||
codes.push(code);
|
codes.push(code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handles how Emojibase removes the variation selector for single code emojis.
|
||||||
|
// See: https://emojibase.dev/docs/spec/#merged-variation-selectors
|
||||||
|
if (codes.at(1) === VARIATION_SELECTOR_CODE && codes.length === 2) {
|
||||||
|
codes.pop();
|
||||||
|
}
|
||||||
return hexNumbersToString(codes);
|
return hexNumbersToString(codes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -114,9 +114,36 @@
|
|||||||
"alt_text_modal.done": "Valmis",
|
"alt_text_modal.done": "Valmis",
|
||||||
"announcement.announcement": "Teadaanne",
|
"announcement.announcement": "Teadaanne",
|
||||||
"annual_report.announcement.action_build": "Koosta kokkuvõte minu tegevusest Mastodonis",
|
"annual_report.announcement.action_build": "Koosta kokkuvõte minu tegevusest Mastodonis",
|
||||||
|
"annual_report.announcement.action_dismiss": "Tänan, ei",
|
||||||
"annual_report.announcement.action_view": "Vaata kokkuvõtet minu tegevusest Mastodonis",
|
"annual_report.announcement.action_view": "Vaata kokkuvõtet minu tegevusest Mastodonis",
|
||||||
"annual_report.announcement.description": "Vaata teavet oma suhestumise kohta Mastodonis eelmisel aastal.",
|
"annual_report.announcement.description": "Vaata teavet oma suhestumise kohta Mastodonis eelmisel aastal.",
|
||||||
"annual_report.announcement.title": "{year}. aasta Mastodoni kokkuvõte on valmis",
|
"annual_report.announcement.title": "{year}. aasta Mastodoni kokkuvõte on valmis",
|
||||||
|
"annual_report.nav_item.badge": "Uus",
|
||||||
|
"annual_report.shared_page.donate": "Anneta",
|
||||||
|
"annual_report.shared_page.footer": "Loodud {heart} Mastodoni meeskonna poolt",
|
||||||
|
"annual_report.shared_page.footer_server_info": "{username} kasutab {domain}-i, üht paljudest kogukondadest, mis toimivad Mastodonil.",
|
||||||
|
"annual_report.summary.archetype.booster.desc_public": "{name} jätkas postituste otsimist, et neid edendada, tugevdades teisi loojaid täiusliku täpsusega.",
|
||||||
|
"annual_report.summary.archetype.booster.desc_self": "Sa jätkasid postituste otsimist, et neid edendada, tugevdades teisi loojaid täiusliku täpsusega.",
|
||||||
|
"annual_report.summary.archetype.booster.name": "Vibukütt",
|
||||||
|
"annual_report.summary.archetype.die_drei_fragezeichen": "???",
|
||||||
|
"annual_report.summary.archetype.lurker.desc_public": "Me teame, et {name} oli kusagil seal väljas ja nautis Mastodoni oma vaiksel moel.",
|
||||||
|
"annual_report.summary.archetype.lurker.desc_self": "Me teame, et sa olid kusagil seal väljas ja nautisid Mastodoni oma vaiksel moel.",
|
||||||
|
"annual_report.summary.archetype.lurker.name": "Stoiline",
|
||||||
|
"annual_report.summary.archetype.oracle.desc_public": "{name} lõi rohkem uusi postitusi kui vastuseid, hoides Mastodoni värskena ja tulevikku suunatuna.",
|
||||||
|
"annual_report.summary.archetype.oracle.desc_self": "Sa lõid rohkem uusi postitusi kui vastuseid, hoides Mastodoni värskena ja tulevikku suunatuna.",
|
||||||
|
"annual_report.summary.archetype.oracle.name": "Oraakel",
|
||||||
|
"annual_report.summary.archetype.pollster.desc_public": "{name} lõi rohkem küsitlusi kui teisi postituse tüüpe, äratades Mastodonis uudishimu.",
|
||||||
|
"annual_report.summary.archetype.pollster.desc_self": "Sa lõid rohkem küsitlusi kui teisi postituse tüüpe, äratades Mastodonis uudishimu.",
|
||||||
|
"annual_report.summary.archetype.pollster.name": "Uudishimulik",
|
||||||
|
"annual_report.summary.archetype.replier.desc_public": "{name} vastas sageli teiste inimeste postitustele, pakkudes Mastodonile uusi aruteluteemasid.",
|
||||||
|
"annual_report.summary.archetype.replier.desc_self": "Sa vastasid sageli teiste inimeste postitustele, pakkudes Mastodonile uusi aruteluteemasid.",
|
||||||
|
"annual_report.summary.archetype.replier.name": "Liblikas",
|
||||||
|
"annual_report.summary.archetype.reveal": "Näita mu põhitüüpi",
|
||||||
|
"annual_report.summary.archetype.reveal_description": "Täname, et oled Mastodoni liige! Aeg on välja selgitada, millist põhitüüpi sa {year}. kehastasid.",
|
||||||
|
"annual_report.summary.archetype.title_public": "Kasutaja {name} põhitüüp",
|
||||||
|
"annual_report.summary.archetype.title_self": "Sinu põhitüüp",
|
||||||
|
"annual_report.summary.close": "Sule",
|
||||||
|
"annual_report.summary.copy_link": "Kopeeri link",
|
||||||
"annual_report.summary.highlighted_post.title": "Kõige populaarsemad postitused",
|
"annual_report.summary.highlighted_post.title": "Kõige populaarsemad postitused",
|
||||||
"annual_report.summary.most_used_app.most_used_app": "enim kasutatud äpp",
|
"annual_report.summary.most_used_app.most_used_app": "enim kasutatud äpp",
|
||||||
"annual_report.summary.most_used_hashtag.most_used_hashtag": "enim kasutatud teemaviide",
|
"annual_report.summary.most_used_hashtag.most_used_hashtag": "enim kasutatud teemaviide",
|
||||||
|
|||||||
@@ -121,6 +121,7 @@
|
|||||||
"annual_report.nav_item.badge": "חדש",
|
"annual_report.nav_item.badge": "חדש",
|
||||||
"annual_report.shared_page.donate": "לתרומה",
|
"annual_report.shared_page.donate": "לתרומה",
|
||||||
"annual_report.shared_page.footer": "נוצר עם כל ה-{heart} על ידי צוות מסטודון",
|
"annual_report.shared_page.footer": "נוצר עם כל ה-{heart} על ידי צוות מסטודון",
|
||||||
|
"annual_report.shared_page.footer_server_info": "{username} משתמש.ת ב־{domain}, שרת אחד מבין קהילות רבות שבנויות על מסטודון.",
|
||||||
"annual_report.summary.archetype.booster.desc_public": "{name} צדו הודעות מעניינות להדהד, והגבירו קולותיהם של יוצרים אחרים בדיוק של חתול המזנק על הטרף.",
|
"annual_report.summary.archetype.booster.desc_public": "{name} צדו הודעות מעניינות להדהד, והגבירו קולותיהם של יוצרים אחרים בדיוק של חתול המזנק על הטרף.",
|
||||||
"annual_report.summary.archetype.booster.desc_self": "צדת הודעות מעניינות להדהד, והגברת קולותיהם של יוצרים אחרים בדיוק של חתול המזנק על הטרף.",
|
"annual_report.summary.archetype.booster.desc_self": "צדת הודעות מעניינות להדהד, והגברת קולותיהם של יוצרים אחרים בדיוק של חתול המזנק על הטרף.",
|
||||||
"annual_report.summary.archetype.booster.name": "החתול הצייד",
|
"annual_report.summary.archetype.booster.name": "החתול הצייד",
|
||||||
@@ -440,6 +441,8 @@
|
|||||||
"follow_suggestions.who_to_follow": "אחרי מי לעקוב",
|
"follow_suggestions.who_to_follow": "אחרי מי לעקוב",
|
||||||
"followed_tags": "התגיות שהחשבון שלך עוקב אחריהן",
|
"followed_tags": "התגיות שהחשבון שלך עוקב אחריהן",
|
||||||
"footer.about": "אודות",
|
"footer.about": "אודות",
|
||||||
|
"footer.about_mastodon": "אודות מסטודון",
|
||||||
|
"footer.about_server": "אודות {domain}",
|
||||||
"footer.about_this_server": "אודות",
|
"footer.about_this_server": "אודות",
|
||||||
"footer.directory": "ספריית פרופילים",
|
"footer.directory": "ספריית פרופילים",
|
||||||
"footer.get_app": "להתקנת היישומון",
|
"footer.get_app": "להתקנת היישומון",
|
||||||
|
|||||||
@@ -121,6 +121,7 @@
|
|||||||
"annual_report.nav_item.badge": "新",
|
"annual_report.nav_item.badge": "新",
|
||||||
"annual_report.shared_page.donate": "捐助",
|
"annual_report.shared_page.donate": "捐助",
|
||||||
"annual_report.shared_page.footer": "由 Mastodon 团队用 {heart} 生成",
|
"annual_report.shared_page.footer": "由 Mastodon 团队用 {heart} 生成",
|
||||||
|
"annual_report.shared_page.footer_server_info": "{username} 使用 {domain},运行 Mastodon 的众多社区之一。",
|
||||||
"annual_report.summary.archetype.booster.desc_public": "{name}持续寻找值得转嘟的嘟文,以精准眼光放大其他创作者的影响力。",
|
"annual_report.summary.archetype.booster.desc_public": "{name}持续寻找值得转嘟的嘟文,以精准眼光放大其他创作者的影响力。",
|
||||||
"annual_report.summary.archetype.booster.desc_self": "你持续寻找值得转嘟的嘟文,以精准眼光放大其他创作者的影响力。",
|
"annual_report.summary.archetype.booster.desc_self": "你持续寻找值得转嘟的嘟文,以精准眼光放大其他创作者的影响力。",
|
||||||
"annual_report.summary.archetype.booster.name": "转发游侠",
|
"annual_report.summary.archetype.booster.name": "转发游侠",
|
||||||
@@ -440,6 +441,8 @@
|
|||||||
"follow_suggestions.who_to_follow": "推荐关注",
|
"follow_suggestions.who_to_follow": "推荐关注",
|
||||||
"followed_tags": "已关注话题",
|
"followed_tags": "已关注话题",
|
||||||
"footer.about": "关于",
|
"footer.about": "关于",
|
||||||
|
"footer.about_mastodon": "关于 Mastodon",
|
||||||
|
"footer.about_server": "关于 {domain}",
|
||||||
"footer.about_this_server": "关于本站",
|
"footer.about_this_server": "关于本站",
|
||||||
"footer.directory": "用户列表",
|
"footer.directory": "用户列表",
|
||||||
"footer.get_app": "获取应用",
|
"footer.get_app": "获取应用",
|
||||||
|
|||||||
@@ -164,6 +164,7 @@ $content-width: 840px;
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: $content-width;
|
max-width: $content-width;
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
|
isolation: isolate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: ($content-width + $sidebar-width)) {
|
@media screen and (max-width: ($content-width + $sidebar-width)) {
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ export const statusFactory: FactoryFunction<ApiStatusJSON> = ({
|
|||||||
mentions: [],
|
mentions: [],
|
||||||
tags: [],
|
tags: [],
|
||||||
emojis: [],
|
emojis: [],
|
||||||
contentHtml: '<p>This is a test status.</p>',
|
contentHtml: data.text ?? '<p>This is a test status.</p>',
|
||||||
...data,
|
...data,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
41
app/lib/activitypub/parser/interaction_policy_parser.rb
Normal file
41
app/lib/activitypub/parser/interaction_policy_parser.rb
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class ActivityPub::Parser::InteractionPolicyParser
|
||||||
|
def initialize(json, account)
|
||||||
|
@json = json
|
||||||
|
@account = account
|
||||||
|
end
|
||||||
|
|
||||||
|
def bitmap
|
||||||
|
flags = 0
|
||||||
|
return flags if @json.blank?
|
||||||
|
|
||||||
|
flags |= subpolicy(@json['automaticApproval'])
|
||||||
|
flags <<= 16
|
||||||
|
flags |= subpolicy(@json['manualApproval'])
|
||||||
|
|
||||||
|
flags
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def subpolicy(partial_json)
|
||||||
|
flags = 0
|
||||||
|
|
||||||
|
allowed_actors = Array(partial_json).dup
|
||||||
|
allowed_actors.uniq!
|
||||||
|
|
||||||
|
flags |= InteractionPolicy::POLICY_FLAGS[:public] if allowed_actors.delete('as:Public') || allowed_actors.delete('Public') || allowed_actors.delete('https://www.w3.org/ns/activitystreams#Public')
|
||||||
|
flags |= InteractionPolicy::POLICY_FLAGS[:followers] if allowed_actors.delete(@account.followers_url)
|
||||||
|
flags |= InteractionPolicy::POLICY_FLAGS[:following] if allowed_actors.delete(@account.following_url)
|
||||||
|
|
||||||
|
includes_target_actor = allowed_actors.delete(ActivityPub::TagManager.instance.uri_for(@account)).present?
|
||||||
|
|
||||||
|
# Any unrecognized actor is marked as unsupported
|
||||||
|
flags |= InteractionPolicy::POLICY_FLAGS[:unsupported_policy] unless allowed_actors.empty?
|
||||||
|
|
||||||
|
flags |= InteractionPolicy::POLICY_FLAGS[:disabled] if flags.zero? && includes_target_actor
|
||||||
|
|
||||||
|
flags
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -5,54 +5,55 @@
|
|||||||
# Table name: accounts
|
# Table name: accounts
|
||||||
#
|
#
|
||||||
# id :bigint(8) not null, primary key
|
# id :bigint(8) not null, primary key
|
||||||
# username :string default(""), not null
|
# actor_type :string
|
||||||
# domain :string
|
# also_known_as :string is an Array
|
||||||
# private_key :text
|
# attribution_domains :string default([]), is an Array
|
||||||
# public_key :text default(""), not null
|
|
||||||
# created_at :datetime not null
|
|
||||||
# updated_at :datetime not null
|
|
||||||
# note :text default(""), not null
|
|
||||||
# display_name :string default(""), not null
|
|
||||||
# uri :string default(""), not null
|
|
||||||
# url :string
|
|
||||||
# avatar_file_name :string
|
|
||||||
# avatar_content_type :string
|
# avatar_content_type :string
|
||||||
|
# avatar_file_name :string
|
||||||
# avatar_file_size :integer
|
# avatar_file_size :integer
|
||||||
# avatar_updated_at :datetime
|
|
||||||
# header_file_name :string
|
|
||||||
# header_content_type :string
|
|
||||||
# header_file_size :integer
|
|
||||||
# header_updated_at :datetime
|
|
||||||
# avatar_remote_url :string
|
# avatar_remote_url :string
|
||||||
# locked :boolean default(FALSE), not null
|
# avatar_storage_schema_version :integer
|
||||||
# header_remote_url :string default(""), not null
|
# avatar_updated_at :datetime
|
||||||
# last_webfingered_at :datetime
|
# discoverable :boolean
|
||||||
# inbox_url :string default(""), not null
|
# display_name :string default(""), not null
|
||||||
# outbox_url :string default(""), not null
|
# domain :string
|
||||||
# shared_inbox_url :string default(""), not null
|
# feature_approval_policy :integer default(0), not null
|
||||||
# followers_url :string default(""), not null
|
|
||||||
# following_url :string default(""), not null
|
|
||||||
# protocol :integer default("ostatus"), not null
|
|
||||||
# memorial :boolean default(FALSE), not null
|
|
||||||
# moved_to_account_id :bigint(8)
|
|
||||||
# featured_collection_url :string
|
# featured_collection_url :string
|
||||||
# fields :jsonb
|
# fields :jsonb
|
||||||
# actor_type :string
|
# followers_url :string default(""), not null
|
||||||
# discoverable :boolean
|
# following_url :string default(""), not null
|
||||||
# also_known_as :string is an Array
|
# header_content_type :string
|
||||||
|
# header_file_name :string
|
||||||
|
# header_file_size :integer
|
||||||
|
# header_remote_url :string default(""), not null
|
||||||
|
# header_storage_schema_version :integer
|
||||||
|
# header_updated_at :datetime
|
||||||
|
# hide_collections :boolean
|
||||||
|
# id_scheme :integer default("numeric_ap_id")
|
||||||
|
# inbox_url :string default(""), not null
|
||||||
|
# indexable :boolean default(FALSE), not null
|
||||||
|
# last_webfingered_at :datetime
|
||||||
|
# locked :boolean default(FALSE), not null
|
||||||
|
# memorial :boolean default(FALSE), not null
|
||||||
|
# note :text default(""), not null
|
||||||
|
# outbox_url :string default(""), not null
|
||||||
|
# private_key :text
|
||||||
|
# protocol :integer default("ostatus"), not null
|
||||||
|
# public_key :text default(""), not null
|
||||||
|
# requested_review_at :datetime
|
||||||
|
# reviewed_at :datetime
|
||||||
|
# sensitized_at :datetime
|
||||||
|
# shared_inbox_url :string default(""), not null
|
||||||
# silenced_at :datetime
|
# silenced_at :datetime
|
||||||
# suspended_at :datetime
|
# suspended_at :datetime
|
||||||
# hide_collections :boolean
|
|
||||||
# avatar_storage_schema_version :integer
|
|
||||||
# header_storage_schema_version :integer
|
|
||||||
# suspension_origin :integer
|
# suspension_origin :integer
|
||||||
# sensitized_at :datetime
|
|
||||||
# trendable :boolean
|
# trendable :boolean
|
||||||
# reviewed_at :datetime
|
# uri :string default(""), not null
|
||||||
# requested_review_at :datetime
|
# url :string
|
||||||
# indexable :boolean default(FALSE), not null
|
# username :string default(""), not null
|
||||||
# attribution_domains :string default([]), is an Array
|
# created_at :datetime not null
|
||||||
# id_scheme :integer default("numeric_ap_id")
|
# updated_at :datetime not null
|
||||||
|
# moved_to_account_id :bigint(8)
|
||||||
#
|
#
|
||||||
|
|
||||||
class Account < ApplicationRecord
|
class Account < ApplicationRecord
|
||||||
@@ -90,6 +91,7 @@ class Account < ApplicationRecord
|
|||||||
include Account::FaspConcern
|
include Account::FaspConcern
|
||||||
include Account::FinderConcern
|
include Account::FinderConcern
|
||||||
include Account::Header
|
include Account::Header
|
||||||
|
include Account::InteractionPolicyConcern
|
||||||
include Account::Interactions
|
include Account::Interactions
|
||||||
include Account::Mappings
|
include Account::Mappings
|
||||||
include Account::Merging
|
include Account::Merging
|
||||||
|
|||||||
69
app/models/concerns/account/interaction_policy_concern.rb
Normal file
69
app/models/concerns/account/interaction_policy_concern.rb
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Account::InteractionPolicyConcern
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
composed_of :feature_interaction_policy, class_name: 'InteractionPolicy', mapping: { feature_approval_policy: :bitmap }
|
||||||
|
end
|
||||||
|
|
||||||
|
def feature_policy_as_keys(kind)
|
||||||
|
raise ArgumentError unless kind.in?(%i(automatic manual))
|
||||||
|
return local_feature_policy(kind) if local?
|
||||||
|
|
||||||
|
sub_policy = feature_interaction_policy.send(kind)
|
||||||
|
sub_policy.as_keys
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns `:automatic`, `:manual`, `:unknown`, ':missing` or `:denied`
|
||||||
|
def feature_policy_for_account(other_account)
|
||||||
|
return :denied if other_account.nil? || (local? && !discoverable?)
|
||||||
|
return :automatic if local?
|
||||||
|
# Post author is always allowed to feature themselves
|
||||||
|
return :automatic if self == other_account
|
||||||
|
return :missing if feature_approval_policy.zero?
|
||||||
|
|
||||||
|
automatic_policy = feature_interaction_policy.automatic
|
||||||
|
following_self = nil
|
||||||
|
followed_by_self = nil
|
||||||
|
|
||||||
|
return :automatic if automatic_policy.public?
|
||||||
|
|
||||||
|
if automatic_policy.followers?
|
||||||
|
following_self = followed_by?(other_account)
|
||||||
|
return :automatic if following_self
|
||||||
|
end
|
||||||
|
|
||||||
|
if automatic_policy.following?
|
||||||
|
followed_by_self = following?(other_account)
|
||||||
|
return :automatic if followed_by_self
|
||||||
|
end
|
||||||
|
|
||||||
|
# We don't know we are allowed by the automatic policy, considering the manual one
|
||||||
|
manual_policy = feature_interaction_policy.manual
|
||||||
|
|
||||||
|
return :manual if manual_policy.public?
|
||||||
|
|
||||||
|
if manual_policy.followers?
|
||||||
|
following_self = followed_by?(other_account) if following_self.nil?
|
||||||
|
return :manual if following_self
|
||||||
|
end
|
||||||
|
|
||||||
|
if manual_policy.following?
|
||||||
|
followed_by_self = following?(other_account) if followed_by_self.nil?
|
||||||
|
return :manual if followed_by_self
|
||||||
|
end
|
||||||
|
|
||||||
|
return :unknown if [automatic_policy, manual_policy].any?(&:unsupported_policy?)
|
||||||
|
|
||||||
|
:denied
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def local_feature_policy(kind)
|
||||||
|
return [] if kind == :manual || !discoverable?
|
||||||
|
|
||||||
|
[:public]
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -10,12 +10,16 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
|
|||||||
:moved_to, :property_value, :discoverable, :suspended,
|
:moved_to, :property_value, :discoverable, :suspended,
|
||||||
:memorial, :indexable, :attribution_domains
|
:memorial, :indexable, :attribution_domains
|
||||||
|
|
||||||
|
context_extensions :interaction_policies if Mastodon::Feature.collections_enabled?
|
||||||
|
|
||||||
attributes :id, :type, :following, :followers,
|
attributes :id, :type, :following, :followers,
|
||||||
:inbox, :outbox, :featured, :featured_tags,
|
:inbox, :outbox, :featured, :featured_tags,
|
||||||
:preferred_username, :name, :summary,
|
:preferred_username, :name, :summary,
|
||||||
:url, :manually_approves_followers,
|
:url, :manually_approves_followers,
|
||||||
:discoverable, :indexable, :published, :memorial
|
:discoverable, :indexable, :published, :memorial
|
||||||
|
|
||||||
|
attribute :interaction_policy, if: -> { Mastodon::Feature.collections_enabled? }
|
||||||
|
|
||||||
has_one :public_key, serializer: ActivityPub::PublicKeySerializer
|
has_one :public_key, serializer: ActivityPub::PublicKeySerializer
|
||||||
|
|
||||||
has_many :virtual_tags, key: :tag
|
has_many :virtual_tags, key: :tag
|
||||||
@@ -163,6 +167,16 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
|
|||||||
object.created_at.midnight.iso8601
|
object.created_at.midnight.iso8601
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def interaction_policy
|
||||||
|
uri = object.discoverable? ? ActivityPub::TagManager::COLLECTIONS[:public] : ActivityPub::TagManager.instance.uri_for(object)
|
||||||
|
|
||||||
|
{
|
||||||
|
canFeature: {
|
||||||
|
automaticApproval: [uri],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
class CustomEmojiSerializer < ActivityPub::EmojiSerializer
|
class CustomEmojiSerializer < ActivityPub::EmojiSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ class REST::AccountSerializer < ActiveModel::Serializer
|
|||||||
|
|
||||||
attribute :memorial, if: :memorial?
|
attribute :memorial, if: :memorial?
|
||||||
|
|
||||||
|
attribute :feature_approval, if: -> { Mastodon::Feature.collections_enabled? }
|
||||||
|
|
||||||
class AccountDecorator < SimpleDelegator
|
class AccountDecorator < SimpleDelegator
|
||||||
def self.model_name
|
def self.model_name
|
||||||
Account.model_name
|
Account.model_name
|
||||||
@@ -161,4 +163,12 @@ class REST::AccountSerializer < ActiveModel::Serializer
|
|||||||
def moved_and_not_nested?
|
def moved_and_not_nested?
|
||||||
object.moved?
|
object.moved?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def feature_approval
|
||||||
|
{
|
||||||
|
automatic: object.feature_policy_as_keys(:automatic),
|
||||||
|
manual: object.feature_policy_as_keys(:manual),
|
||||||
|
current_user: object.feature_policy_for_account(current_user&.account),
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ class ActivityPub::ProcessAccountService < BaseService
|
|||||||
@account.uri = @uri
|
@account.uri = @uri
|
||||||
@account.actor_type = actor_type
|
@account.actor_type = actor_type
|
||||||
@account.created_at = @json['published'] if @json['published'].present?
|
@account.created_at = @json['published'] if @json['published'].present?
|
||||||
|
@account.feature_approval_policy = feature_approval_policy if Mastodon::Feature.collections_enabled?
|
||||||
end
|
end
|
||||||
|
|
||||||
def valid_collection_uri(uri)
|
def valid_collection_uri(uri)
|
||||||
@@ -360,4 +361,8 @@ class ActivityPub::ProcessAccountService < BaseService
|
|||||||
emoji.image_remote_url = image_url
|
emoji.image_remote_url = image_url
|
||||||
emoji.save
|
emoji.save
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def feature_approval_policy
|
||||||
|
ActivityPub::Parser::InteractionPolicyParser.new(@json.dig('interactionPolicy', 'canFeature'), @account).bitmap
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -876,6 +876,7 @@ he:
|
|||||||
publish_statistics: פרסום הסטטיסטיקות בפומבי
|
publish_statistics: פרסום הסטטיסטיקות בפומבי
|
||||||
title: תגליות
|
title: תגליות
|
||||||
trends: נושאים חמים
|
trends: נושאים חמים
|
||||||
|
wrapstodon: סיכומודון
|
||||||
domain_blocks:
|
domain_blocks:
|
||||||
all: לכולם
|
all: לכולם
|
||||||
disabled: לאף אחד
|
disabled: לאף אחד
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ he:
|
|||||||
thumbnail: תמונה ביחס 2:1 בערך שתוצג ליד המידע על השרת שלך.
|
thumbnail: תמונה ביחס 2:1 בערך שתוצג ליד המידע על השרת שלך.
|
||||||
trendable_by_default: לדלג על בדיקה ידנית של התכנים החמים. פריטים ספציפיים עדיין ניתנים להסרה לאחר מעשה.
|
trendable_by_default: לדלג על בדיקה ידנית של התכנים החמים. פריטים ספציפיים עדיין ניתנים להסרה לאחר מעשה.
|
||||||
trends: נושאים חמים יציגו אילו הודעות, תגיות וידיעות חדשות צוברות חשיפה על השרת שלך.
|
trends: נושאים חמים יציגו אילו הודעות, תגיות וידיעות חדשות צוברות חשיפה על השרת שלך.
|
||||||
|
wrapstodon: אפשר למשתמשיך המקומיים.ות ליצור סיכום חביב של פעילותם במסטודון בשנה האחרונה. התכונה מאופשרת בין 10 ועד 31 בדצמבר כל שנה, ומצעת למשתמשים שיצרו לפחות הודעה ציבורית אחת והשתמשו לפחות בתגית אחת במשך השנה.
|
||||||
form_challenge:
|
form_challenge:
|
||||||
current_password: את.ה נכנס. ת לאזור מאובטח
|
current_password: את.ה נכנס. ת לאזור מאובטח
|
||||||
imports:
|
imports:
|
||||||
@@ -314,6 +315,7 @@ he:
|
|||||||
thumbnail: תמונה ממוזערת מהשרת
|
thumbnail: תמונה ממוזערת מהשרת
|
||||||
trendable_by_default: הרשאה לפריטים להופיע בנושאים החמים ללא אישור מוקדם
|
trendable_by_default: הרשאה לפריטים להופיע בנושאים החמים ללא אישור מוקדם
|
||||||
trends: אפשר פריטים חמים (טרנדים)
|
trends: אפשר פריטים חמים (טרנדים)
|
||||||
|
wrapstodon: הפעלת סיכומודון
|
||||||
interactions:
|
interactions:
|
||||||
must_be_follower: חסימת התראות משאינם עוקבים
|
must_be_follower: חסימת התראות משאינם עוקבים
|
||||||
must_be_following: חסימת התראות משאינם נעקבים
|
must_be_following: חסימת התראות משאינם נעקבים
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ tr:
|
|||||||
thumbnail: Sunucu bilginizin yanında gösterilen yaklaşık 2:1'lik görüntü.
|
thumbnail: Sunucu bilginizin yanında gösterilen yaklaşık 2:1'lik görüntü.
|
||||||
trendable_by_default: Öne çıkan içeriğin elle incelenmesini atla. Tekil öğeler sonrada öne çıkanlardan kaldırılabilir.
|
trendable_by_default: Öne çıkan içeriğin elle incelenmesini atla. Tekil öğeler sonrada öne çıkanlardan kaldırılabilir.
|
||||||
trends: Öne çıkanlar, sunucunuzda ilgi toplayan gönderileri, etiketleri ve haber yazılarını gösterir.
|
trends: Öne çıkanlar, sunucunuzda ilgi toplayan gönderileri, etiketleri ve haber yazılarını gösterir.
|
||||||
|
wrapstodon: Yerel kullanıcılara, yıl boyunca Mastodon kullanımlarının eğlenceli bir özetini oluşturma imkanı sunun. Bu özellik, her yıl 10 Aralık ile 31 Aralık tarihleri arasında kullanılabilir ve yıl içinde en az bir adet Halka Açık veya Sessiz Halka Açık gönderi paylaşan ve en az bir hashtag kullanan kullanıcılara sunulur.
|
||||||
form_challenge:
|
form_challenge:
|
||||||
current_password: Güvenli bir bölgeye giriyorsunuz
|
current_password: Güvenli bir bölgeye giriyorsunuz
|
||||||
imports:
|
imports:
|
||||||
@@ -312,6 +313,7 @@ tr:
|
|||||||
thumbnail: Sunucu küçük resmi
|
thumbnail: Sunucu küçük resmi
|
||||||
trendable_by_default: Ön incelemesiz öne çıkanlara izin ver
|
trendable_by_default: Ön incelemesiz öne çıkanlara izin ver
|
||||||
trends: Öne çıkanları etkinleştir
|
trends: Öne çıkanları etkinleştir
|
||||||
|
wrapstodon: Wrapstodonu Etkinleştir
|
||||||
interactions:
|
interactions:
|
||||||
must_be_follower: Takipçim olmayan kişilerden gelen bildirimleri engelle
|
must_be_follower: Takipçim olmayan kişilerden gelen bildirimleri engelle
|
||||||
must_be_following: Takip etmediğim kişilerden gelen bildirimleri engelle
|
must_be_following: Takip etmediğim kişilerden gelen bildirimleri engelle
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ zh-CN:
|
|||||||
thumbnail: 与服务器信息一并展示的约 2:1 比例的图像。
|
thumbnail: 与服务器信息一并展示的约 2:1 比例的图像。
|
||||||
trendable_by_default: 跳过对热门内容的手工审核。个别项目仍可在之后从趋势中删除。
|
trendable_by_default: 跳过对热门内容的手工审核。个别项目仍可在之后从趋势中删除。
|
||||||
trends: 热门页中会显示正在你服务器上受到关注的嘟文、标签和新闻故事。
|
trends: 热门页中会显示正在你服务器上受到关注的嘟文、标签和新闻故事。
|
||||||
|
wrapstodon: 为本站用户提供生成他们过去一年使用 Mastodon 情况的趣味总结的功能。此功能在每年12月10日至12月31日提供给这一年发布过至少1条公开嘟文(无论是否设置为在时间线上显示)及至少使用过1个话题标签的用户。
|
||||||
form_challenge:
|
form_challenge:
|
||||||
current_password: 你正在进入安全区域
|
current_password: 你正在进入安全区域
|
||||||
imports:
|
imports:
|
||||||
@@ -311,6 +312,7 @@ zh-CN:
|
|||||||
thumbnail: 本站缩略图
|
thumbnail: 本站缩略图
|
||||||
trendable_by_default: 允许在未审核的情况下将话题置为热门
|
trendable_by_default: 允许在未审核的情况下将话题置为热门
|
||||||
trends: 启用热门
|
trends: 启用热门
|
||||||
|
wrapstodon: 启用 Wrapstodon 年度回顾
|
||||||
interactions:
|
interactions:
|
||||||
must_be_follower: 屏蔽来自未关注我的用户的通知
|
must_be_follower: 屏蔽来自未关注我的用户的通知
|
||||||
must_be_following: 屏蔽来自我未关注的用户的通知
|
must_be_following: 屏蔽来自我未关注的用户的通知
|
||||||
|
|||||||
@@ -848,6 +848,7 @@ tr:
|
|||||||
publish_statistics: İstatistikleri yayınla
|
publish_statistics: İstatistikleri yayınla
|
||||||
title: Keşfet
|
title: Keşfet
|
||||||
trends: Öne çıkanlar
|
trends: Öne çıkanlar
|
||||||
|
wrapstodon: Wrapstodon
|
||||||
domain_blocks:
|
domain_blocks:
|
||||||
all: Herkes için
|
all: Herkes için
|
||||||
disabled: Hiç kimseye
|
disabled: Hiç kimseye
|
||||||
|
|||||||
@@ -834,6 +834,7 @@ zh-CN:
|
|||||||
publish_statistics: 发布统计数据
|
publish_statistics: 发布统计数据
|
||||||
title: 发现
|
title: 发现
|
||||||
trends: 热门
|
trends: 热门
|
||||||
|
wrapstodon: Wrapstodon 年度回顾
|
||||||
domain_blocks:
|
domain_blocks:
|
||||||
all: 对每个人
|
all: 对每个人
|
||||||
disabled: 不对任何人
|
disabled: 不对任何人
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AddFeatureApprovalPolicyToAccounts < ActiveRecord::Migration[8.0]
|
||||||
|
def change
|
||||||
|
add_column :accounts, :feature_approval_policy, :integer, null: false, default: 0
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[8.0].define(version: 2025_12_09_093813) do
|
ActiveRecord::Schema[8.0].define(version: 2025_12_17_091936) do
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "pg_catalog.plpgsql"
|
enable_extension "pg_catalog.plpgsql"
|
||||||
|
|
||||||
@@ -200,6 +200,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_12_09_093813) do
|
|||||||
t.string "attribution_domains", default: [], array: true
|
t.string "attribution_domains", default: [], array: true
|
||||||
t.string "following_url", default: "", null: false
|
t.string "following_url", default: "", null: false
|
||||||
t.integer "id_scheme", default: 1
|
t.integer "id_scheme", default: 1
|
||||||
|
t.integer "feature_approval_policy", default: 0, null: false
|
||||||
t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
|
t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
|
||||||
t.index "lower((username)::text), COALESCE(lower((domain)::text), ''::text)", name: "index_accounts_on_username_and_domain_lower", unique: true
|
t.index "lower((username)::text), COALESCE(lower((domain)::text), ''::text)", name: "index_accounts_on_username_and_domain_lower", unique: true
|
||||||
t.index ["domain", "id"], name: "index_accounts_on_domain_and_id"
|
t.index ["domain", "id"], name: "index_accounts_on_domain_and_id"
|
||||||
|
|||||||
102
spec/lib/activitypub/parser/interaction_policy_parser_spec.rb
Normal file
102
spec/lib/activitypub/parser/interaction_policy_parser_spec.rb
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe ActivityPub::Parser::InteractionPolicyParser do
|
||||||
|
subject { described_class.new(json_policy, account) }
|
||||||
|
|
||||||
|
let(:account) do
|
||||||
|
Fabricate(:account,
|
||||||
|
uri: 'https://foo.test',
|
||||||
|
domain: 'foo.test',
|
||||||
|
followers_url: 'https://foo.test/followers',
|
||||||
|
following_url: 'https://foo.test/following')
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#bitmap' do
|
||||||
|
context 'when no policy is given' do
|
||||||
|
let(:json_policy) { nil }
|
||||||
|
|
||||||
|
it 'returns zero' do
|
||||||
|
expect(subject.bitmap).to be_zero
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with special public URI' do
|
||||||
|
let(:json_policy) do
|
||||||
|
{
|
||||||
|
'manualApproval' => [public_uri],
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
shared_examples 'setting the public bit' do
|
||||||
|
it 'sets the public bit' do
|
||||||
|
expect(subject.bitmap).to eq 0b10
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when public URI is given in full' do
|
||||||
|
let(:public_uri) { 'https://www.w3.org/ns/activitystreams#Public' }
|
||||||
|
|
||||||
|
it_behaves_like 'setting the public bit'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when public URI is abbreviated using namespace' do
|
||||||
|
let(:public_uri) { 'as:Public' }
|
||||||
|
|
||||||
|
it_behaves_like 'setting the public bit'
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when public URI is abbreviated without namespace' do
|
||||||
|
let(:public_uri) { 'Public' }
|
||||||
|
|
||||||
|
it_behaves_like 'setting the public bit'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when mixing array and scalar values' do
|
||||||
|
let(:json_policy) do
|
||||||
|
{
|
||||||
|
'automaticApproval' => 'https://foo.test',
|
||||||
|
'manualApproval' => [
|
||||||
|
'https://foo.test/followers',
|
||||||
|
'https://foo.test/following',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets the correct flags' do
|
||||||
|
expect(subject.bitmap).to eq 0b100000000000000001100
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when including individual actor URIs' do
|
||||||
|
let(:json_policy) do
|
||||||
|
{
|
||||||
|
'automaticApproval' => ['https://example.com/actor', 'https://masto.example.com/@user'],
|
||||||
|
'manualApproval' => ['https://masto.example.com/@other'],
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sets the unsupported bit' do
|
||||||
|
expect(subject.bitmap).to eq 0b10000000000000001
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when giving the affected actor's URI in addition to other supported URIs" do
|
||||||
|
let(:json_policy) do
|
||||||
|
{
|
||||||
|
'manualApproval' => [
|
||||||
|
'https://foo.test/followers',
|
||||||
|
'https://foo.test/following',
|
||||||
|
'https://foo.test',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'is being ignored' do
|
||||||
|
expect(subject.bitmap).to eq 0b1100
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe Account::InteractionPolicyConcern do
|
||||||
|
describe '#feature_policy_as_keys' do
|
||||||
|
context 'when account is local' do
|
||||||
|
context 'when account is discoverable' do
|
||||||
|
let(:account) { Fabricate(:account) }
|
||||||
|
|
||||||
|
it 'returns public for automtatic and nothing for manual' do
|
||||||
|
expect(account.feature_policy_as_keys(:automatic)).to eq [:public]
|
||||||
|
expect(account.feature_policy_as_keys(:manual)).to eq []
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when account is not discoverable' do
|
||||||
|
let(:account) { Fabricate(:account, discoverable: false) }
|
||||||
|
|
||||||
|
it 'returns empty arrays for both inputs' do
|
||||||
|
expect(account.feature_policy_as_keys(:automatic)).to eq []
|
||||||
|
expect(account.feature_policy_as_keys(:manual)).to eq []
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when account is remote' do
|
||||||
|
let(:account) { Fabricate(:account, domain: 'example.com', feature_approval_policy: (0b0101 << 16) | 0b0010) }
|
||||||
|
|
||||||
|
it 'returns the expected values' do
|
||||||
|
expect(account.feature_policy_as_keys(:automatic)).to eq ['unsupported_policy', 'followers']
|
||||||
|
expect(account.feature_policy_as_keys(:manual)).to eq ['public']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#feature_policy_for_account' do
|
||||||
|
context 'when account is remote' do
|
||||||
|
let(:account) { Fabricate(:account, domain: 'example.com', feature_approval_policy:) }
|
||||||
|
let(:feature_approval_policy) { (0b0101 << 16) | 0b0010 }
|
||||||
|
let(:other_account) { Fabricate(:account) }
|
||||||
|
|
||||||
|
context 'when no policy is available' do
|
||||||
|
let(:feature_approval_policy) { 0 }
|
||||||
|
|
||||||
|
context 'when both accounts are the same' do
|
||||||
|
it 'returns :automatic' do
|
||||||
|
expect(account.feature_policy_for_account(account)).to eq :automatic
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with two different accounts' do
|
||||||
|
it 'returns :missing' do
|
||||||
|
expect(account.feature_policy_for_account(other_account)).to eq :missing
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the other account is not following the account' do
|
||||||
|
it 'returns :manual because of the public entry in the manual policy' do
|
||||||
|
expect(account.feature_policy_for_account(other_account)).to eq :manual
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the other account is following the account' do
|
||||||
|
before do
|
||||||
|
other_account.follow!(account)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns :automatic because of the followers entry in the automatic policy' do
|
||||||
|
expect(account.feature_policy_for_account(other_account)).to eq :automatic
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when the account falls into the unknown bucket' do
|
||||||
|
let(:feature_approval_policy) { (0b0001 << 16) | 0b0100 }
|
||||||
|
|
||||||
|
it 'returns :automatic because of the followers entry in the automatic policy' do
|
||||||
|
expect(account.feature_policy_for_account(other_account)).to eq :unknown
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe ActivityPub::ActorSerializer do
|
RSpec.describe ActivityPub::ActorSerializer do
|
||||||
subject { serialized_record_json(record, described_class) }
|
subject { serialized_record_json(record, described_class, adapter: ActivityPub::Adapter) }
|
||||||
|
|
||||||
describe '#type' do
|
describe '#type' do
|
||||||
context 'with the instance actor' do
|
context 'with the instance actor' do
|
||||||
@@ -36,4 +36,39 @@ RSpec.describe ActivityPub::ActorSerializer do
|
|||||||
it { is_expected.to include('type' => 'Person') }
|
it { is_expected.to include('type' => 'Person') }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#interactionPolicy' do
|
||||||
|
let(:record) { Fabricate(:account) }
|
||||||
|
|
||||||
|
# TODO: Remove when feature flag is removed
|
||||||
|
context 'when collections feature is disabled?' do
|
||||||
|
it 'is not present' do
|
||||||
|
expect(subject).to_not have_key('interactionPolicy')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when collections feature is enabled', feature: :collections do
|
||||||
|
context 'when actor is discoverable' do
|
||||||
|
it 'includes an automatic policy allowing everyone' do
|
||||||
|
expect(subject).to include('interactionPolicy' => {
|
||||||
|
'canFeature' => {
|
||||||
|
'automaticApproval' => ['https://www.w3.org/ns/activitystreams#Public'],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when actor is not discoverable' do
|
||||||
|
let(:record) { Fabricate(:account, discoverable: false) }
|
||||||
|
|
||||||
|
it 'includes an automatic policy limited to the actor itself' do
|
||||||
|
expect(subject).to include('interactionPolicy' => {
|
||||||
|
'canFeature' => {
|
||||||
|
'automaticApproval' => [ActivityPub::TagManager.instance.uri_for(record)],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -3,12 +3,18 @@
|
|||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe REST::AccountSerializer do
|
RSpec.describe REST::AccountSerializer do
|
||||||
subject { serialized_record_json(account, described_class) }
|
subject do
|
||||||
|
serialized_record_json(account, described_class, options: {
|
||||||
|
scope: current_user,
|
||||||
|
scope_name: :current_user,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
let(:default_datetime) { DateTime.new(2024, 11, 28, 16, 20, 0) }
|
let(:default_datetime) { DateTime.new(2024, 11, 28, 16, 20, 0) }
|
||||||
let(:role) { Fabricate(:user_role, name: 'Role', highlighted: true) }
|
let(:role) { Fabricate(:user_role, name: 'Role', highlighted: true) }
|
||||||
let(:user) { Fabricate(:user, role: role) }
|
let(:user) { Fabricate(:user, role: role) }
|
||||||
let(:account) { user.account }
|
let(:account) { user.account }
|
||||||
|
let(:current_user) { Fabricate(:user) }
|
||||||
|
|
||||||
context 'when the account is suspended' do
|
context 'when the account is suspended' do
|
||||||
before do
|
before do
|
||||||
@@ -68,4 +74,51 @@ RSpec.describe REST::AccountSerializer do
|
|||||||
expect(subject['last_status_at']).to eq('2024-11-28')
|
expect(subject['last_status_at']).to eq('2024-11-28')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#feature_approval' do
|
||||||
|
# TODO: Remove when feature flag is removed
|
||||||
|
context 'when collections feature is disabled' do
|
||||||
|
it 'does not include the approval policy' do
|
||||||
|
expect(subject).to_not have_key('feature_approval')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when collections feature is enabled', feature: :collections do
|
||||||
|
context 'when account is local' do
|
||||||
|
context 'when account is discoverable' do
|
||||||
|
it 'includes a policy that allows featuring' do
|
||||||
|
expect(subject['feature_approval']).to include({
|
||||||
|
'automatic' => ['public'],
|
||||||
|
'manual' => [],
|
||||||
|
'current_user' => 'automatic',
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when account is not discoverable' do
|
||||||
|
let(:account) { Fabricate(:account, discoverable: false) }
|
||||||
|
|
||||||
|
it 'includes a policy that disallows featuring' do
|
||||||
|
expect(subject['feature_approval']).to include({
|
||||||
|
'automatic' => [],
|
||||||
|
'manual' => [],
|
||||||
|
'current_user' => 'denied',
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when account is remote' do
|
||||||
|
let(:account) { Fabricate(:account, domain: 'example.com', feature_approval_policy: 0b11000000000000000010) }
|
||||||
|
|
||||||
|
it 'includes the matching policy' do
|
||||||
|
expect(subject['feature_approval']).to include({
|
||||||
|
'automatic' => ['followers', 'following'],
|
||||||
|
'manual' => ['public'],
|
||||||
|
'current_user' => 'manual',
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -272,6 +272,49 @@ RSpec.describe ActivityPub::ProcessAccountService do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with interaction policy' do
|
||||||
|
let(:payload) do
|
||||||
|
{
|
||||||
|
id: 'https://foo.test',
|
||||||
|
type: 'Actor',
|
||||||
|
inbox: 'https://foo.test/inbox',
|
||||||
|
followers: 'https://foo.test/followers',
|
||||||
|
following: 'https://foo.test/following',
|
||||||
|
interactionPolicy: {
|
||||||
|
canFeature: {
|
||||||
|
automaticApproval: 'https://foo.test',
|
||||||
|
manualApproval: [
|
||||||
|
'https://foo.test/followers',
|
||||||
|
'https://foo.test/following',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}.with_indifferent_access
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
stub_request(:get, %r{^https://foo\.test/follow})
|
||||||
|
.to_return(status: 200, body: '', headers: {})
|
||||||
|
end
|
||||||
|
|
||||||
|
# TODO: Remove when feature flag is removed
|
||||||
|
context 'when collections feature is disabled' do
|
||||||
|
it 'does not set the interaction policy' do
|
||||||
|
account = subject.call('user1', 'foo.test', payload)
|
||||||
|
|
||||||
|
expect(account.feature_approval_policy).to be_zero
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when collections feature is enabled', feature: :collections do
|
||||||
|
it 'sets the interaction policy to the correct value' do
|
||||||
|
account = subject.call('user1', 'foo.test', payload)
|
||||||
|
|
||||||
|
expect(account.feature_approval_policy).to eq 0b100000000000000001100
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def create_some_remote_accounts
|
def create_some_remote_accounts
|
||||||
|
|||||||
425
yarn.lock
425
yarn.lock
@@ -2079,6 +2079,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/aix-ppc64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/aix-ppc64@npm:0.27.2"
|
||||||
|
conditions: os=aix & cpu=ppc64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/android-arm64@npm:0.25.5":
|
"@esbuild/android-arm64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/android-arm64@npm:0.25.5"
|
resolution: "@esbuild/android-arm64@npm:0.25.5"
|
||||||
@@ -2086,6 +2093,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/android-arm64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/android-arm64@npm:0.27.2"
|
||||||
|
conditions: os=android & cpu=arm64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/android-arm@npm:0.25.5":
|
"@esbuild/android-arm@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/android-arm@npm:0.25.5"
|
resolution: "@esbuild/android-arm@npm:0.25.5"
|
||||||
@@ -2093,6 +2107,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/android-arm@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/android-arm@npm:0.27.2"
|
||||||
|
conditions: os=android & cpu=arm
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/android-x64@npm:0.25.5":
|
"@esbuild/android-x64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/android-x64@npm:0.25.5"
|
resolution: "@esbuild/android-x64@npm:0.25.5"
|
||||||
@@ -2100,6 +2121,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/android-x64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/android-x64@npm:0.27.2"
|
||||||
|
conditions: os=android & cpu=x64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/darwin-arm64@npm:0.25.5":
|
"@esbuild/darwin-arm64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/darwin-arm64@npm:0.25.5"
|
resolution: "@esbuild/darwin-arm64@npm:0.25.5"
|
||||||
@@ -2107,6 +2135,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/darwin-arm64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/darwin-arm64@npm:0.27.2"
|
||||||
|
conditions: os=darwin & cpu=arm64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/darwin-x64@npm:0.25.5":
|
"@esbuild/darwin-x64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/darwin-x64@npm:0.25.5"
|
resolution: "@esbuild/darwin-x64@npm:0.25.5"
|
||||||
@@ -2114,6 +2149,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/darwin-x64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/darwin-x64@npm:0.27.2"
|
||||||
|
conditions: os=darwin & cpu=x64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/freebsd-arm64@npm:0.25.5":
|
"@esbuild/freebsd-arm64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/freebsd-arm64@npm:0.25.5"
|
resolution: "@esbuild/freebsd-arm64@npm:0.25.5"
|
||||||
@@ -2121,6 +2163,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/freebsd-arm64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/freebsd-arm64@npm:0.27.2"
|
||||||
|
conditions: os=freebsd & cpu=arm64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/freebsd-x64@npm:0.25.5":
|
"@esbuild/freebsd-x64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/freebsd-x64@npm:0.25.5"
|
resolution: "@esbuild/freebsd-x64@npm:0.25.5"
|
||||||
@@ -2128,6 +2177,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/freebsd-x64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/freebsd-x64@npm:0.27.2"
|
||||||
|
conditions: os=freebsd & cpu=x64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/linux-arm64@npm:0.25.5":
|
"@esbuild/linux-arm64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/linux-arm64@npm:0.25.5"
|
resolution: "@esbuild/linux-arm64@npm:0.25.5"
|
||||||
@@ -2135,6 +2191,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/linux-arm64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/linux-arm64@npm:0.27.2"
|
||||||
|
conditions: os=linux & cpu=arm64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/linux-arm@npm:0.25.5":
|
"@esbuild/linux-arm@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/linux-arm@npm:0.25.5"
|
resolution: "@esbuild/linux-arm@npm:0.25.5"
|
||||||
@@ -2142,6 +2205,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/linux-arm@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/linux-arm@npm:0.27.2"
|
||||||
|
conditions: os=linux & cpu=arm
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/linux-ia32@npm:0.25.5":
|
"@esbuild/linux-ia32@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/linux-ia32@npm:0.25.5"
|
resolution: "@esbuild/linux-ia32@npm:0.25.5"
|
||||||
@@ -2149,6 +2219,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/linux-ia32@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/linux-ia32@npm:0.27.2"
|
||||||
|
conditions: os=linux & cpu=ia32
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/linux-loong64@npm:0.25.5":
|
"@esbuild/linux-loong64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/linux-loong64@npm:0.25.5"
|
resolution: "@esbuild/linux-loong64@npm:0.25.5"
|
||||||
@@ -2156,6 +2233,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/linux-loong64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/linux-loong64@npm:0.27.2"
|
||||||
|
conditions: os=linux & cpu=loong64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/linux-mips64el@npm:0.25.5":
|
"@esbuild/linux-mips64el@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/linux-mips64el@npm:0.25.5"
|
resolution: "@esbuild/linux-mips64el@npm:0.25.5"
|
||||||
@@ -2163,6 +2247,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/linux-mips64el@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/linux-mips64el@npm:0.27.2"
|
||||||
|
conditions: os=linux & cpu=mips64el
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/linux-ppc64@npm:0.25.5":
|
"@esbuild/linux-ppc64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/linux-ppc64@npm:0.25.5"
|
resolution: "@esbuild/linux-ppc64@npm:0.25.5"
|
||||||
@@ -2170,6 +2261,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/linux-ppc64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/linux-ppc64@npm:0.27.2"
|
||||||
|
conditions: os=linux & cpu=ppc64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/linux-riscv64@npm:0.25.5":
|
"@esbuild/linux-riscv64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/linux-riscv64@npm:0.25.5"
|
resolution: "@esbuild/linux-riscv64@npm:0.25.5"
|
||||||
@@ -2177,6 +2275,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/linux-riscv64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/linux-riscv64@npm:0.27.2"
|
||||||
|
conditions: os=linux & cpu=riscv64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/linux-s390x@npm:0.25.5":
|
"@esbuild/linux-s390x@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/linux-s390x@npm:0.25.5"
|
resolution: "@esbuild/linux-s390x@npm:0.25.5"
|
||||||
@@ -2184,6 +2289,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/linux-s390x@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/linux-s390x@npm:0.27.2"
|
||||||
|
conditions: os=linux & cpu=s390x
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/linux-x64@npm:0.25.5":
|
"@esbuild/linux-x64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/linux-x64@npm:0.25.5"
|
resolution: "@esbuild/linux-x64@npm:0.25.5"
|
||||||
@@ -2191,6 +2303,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/linux-x64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/linux-x64@npm:0.27.2"
|
||||||
|
conditions: os=linux & cpu=x64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/netbsd-arm64@npm:0.25.5":
|
"@esbuild/netbsd-arm64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/netbsd-arm64@npm:0.25.5"
|
resolution: "@esbuild/netbsd-arm64@npm:0.25.5"
|
||||||
@@ -2198,6 +2317,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/netbsd-arm64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/netbsd-arm64@npm:0.27.2"
|
||||||
|
conditions: os=netbsd & cpu=arm64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/netbsd-x64@npm:0.25.5":
|
"@esbuild/netbsd-x64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/netbsd-x64@npm:0.25.5"
|
resolution: "@esbuild/netbsd-x64@npm:0.25.5"
|
||||||
@@ -2205,6 +2331,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/netbsd-x64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/netbsd-x64@npm:0.27.2"
|
||||||
|
conditions: os=netbsd & cpu=x64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/openbsd-arm64@npm:0.25.5":
|
"@esbuild/openbsd-arm64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/openbsd-arm64@npm:0.25.5"
|
resolution: "@esbuild/openbsd-arm64@npm:0.25.5"
|
||||||
@@ -2212,6 +2345,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/openbsd-arm64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/openbsd-arm64@npm:0.27.2"
|
||||||
|
conditions: os=openbsd & cpu=arm64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/openbsd-x64@npm:0.25.5":
|
"@esbuild/openbsd-x64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/openbsd-x64@npm:0.25.5"
|
resolution: "@esbuild/openbsd-x64@npm:0.25.5"
|
||||||
@@ -2219,6 +2359,20 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/openbsd-x64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/openbsd-x64@npm:0.27.2"
|
||||||
|
conditions: os=openbsd & cpu=x64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/openharmony-arm64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/openharmony-arm64@npm:0.27.2"
|
||||||
|
conditions: os=openharmony & cpu=arm64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/sunos-x64@npm:0.25.5":
|
"@esbuild/sunos-x64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/sunos-x64@npm:0.25.5"
|
resolution: "@esbuild/sunos-x64@npm:0.25.5"
|
||||||
@@ -2226,6 +2380,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/sunos-x64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/sunos-x64@npm:0.27.2"
|
||||||
|
conditions: os=sunos & cpu=x64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/win32-arm64@npm:0.25.5":
|
"@esbuild/win32-arm64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/win32-arm64@npm:0.25.5"
|
resolution: "@esbuild/win32-arm64@npm:0.25.5"
|
||||||
@@ -2233,6 +2394,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/win32-arm64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/win32-arm64@npm:0.27.2"
|
||||||
|
conditions: os=win32 & cpu=arm64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/win32-ia32@npm:0.25.5":
|
"@esbuild/win32-ia32@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/win32-ia32@npm:0.25.5"
|
resolution: "@esbuild/win32-ia32@npm:0.25.5"
|
||||||
@@ -2240,6 +2408,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/win32-ia32@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/win32-ia32@npm:0.27.2"
|
||||||
|
conditions: os=win32 & cpu=ia32
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@esbuild/win32-x64@npm:0.25.5":
|
"@esbuild/win32-x64@npm:0.25.5":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "@esbuild/win32-x64@npm:0.25.5"
|
resolution: "@esbuild/win32-x64@npm:0.25.5"
|
||||||
@@ -2247,6 +2422,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@esbuild/win32-x64@npm:0.27.2":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "@esbuild/win32-x64@npm:0.27.2"
|
||||||
|
conditions: os=win32 & cpu=x64
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0, @eslint-community/eslint-utils@npm:^4.8.0":
|
"@eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.7.0, @eslint-community/eslint-utils@npm:^4.8.0":
|
||||||
version: 4.9.0
|
version: 4.9.0
|
||||||
resolution: "@eslint-community/eslint-utils@npm:4.9.0"
|
resolution: "@eslint-community/eslint-utils@npm:4.9.0"
|
||||||
@@ -3725,6 +3907,16 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"@storybook/icons@npm:^2.0.0":
|
||||||
|
version: 2.0.1
|
||||||
|
resolution: "@storybook/icons@npm:2.0.1"
|
||||||
|
peerDependencies:
|
||||||
|
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
|
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
|
checksum: 10c0/df2bbf1a5b50f12ab1bf78cae6de4dbf7c49df0e3a5f845553b51b20adbe8386a09fd172ea60342379f9284bb528cba2d0e2659cae6eb8d015cf92c8b32f1222
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"@storybook/react-dom-shim@npm:10.0.6":
|
"@storybook/react-dom-shim@npm:10.0.6":
|
||||||
version: 10.0.6
|
version: 10.0.6
|
||||||
resolution: "@storybook/react-dom-shim@npm:10.0.6"
|
resolution: "@storybook/react-dom-shim@npm:10.0.6"
|
||||||
@@ -4939,25 +5131,6 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"@vitest/mocker@npm:3.2.4":
|
|
||||||
version: 3.2.4
|
|
||||||
resolution: "@vitest/mocker@npm:3.2.4"
|
|
||||||
dependencies:
|
|
||||||
"@vitest/spy": "npm:3.2.4"
|
|
||||||
estree-walker: "npm:^3.0.3"
|
|
||||||
magic-string: "npm:^0.30.17"
|
|
||||||
peerDependencies:
|
|
||||||
msw: ^2.4.9
|
|
||||||
vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
|
|
||||||
peerDependenciesMeta:
|
|
||||||
msw:
|
|
||||||
optional: true
|
|
||||||
vite:
|
|
||||||
optional: true
|
|
||||||
checksum: 10c0/f7a4aea19bbbf8f15905847ee9143b6298b2c110f8b64789224cb0ffdc2e96f9802876aa2ca83f1ec1b6e1ff45e822abb34f0054c24d57b29ab18add06536ccd
|
|
||||||
languageName: node
|
|
||||||
linkType: hard
|
|
||||||
|
|
||||||
"@vitest/mocker@npm:4.0.15":
|
"@vitest/mocker@npm:4.0.15":
|
||||||
version: 4.0.15
|
version: 4.0.15
|
||||||
resolution: "@vitest/mocker@npm:4.0.15"
|
resolution: "@vitest/mocker@npm:4.0.15"
|
||||||
@@ -5695,6 +5868,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"bundle-name@npm:^4.1.0":
|
||||||
|
version: 4.1.0
|
||||||
|
resolution: "bundle-name@npm:4.1.0"
|
||||||
|
dependencies:
|
||||||
|
run-applescript: "npm:^7.0.0"
|
||||||
|
checksum: 10c0/8e575981e79c2bcf14d8b1c027a3775c095d362d1382312f444a7c861b0e21513c0bd8db5bd2b16e50ba0709fa622d4eab6b53192d222120305e68359daece29
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"bytes@npm:^3.1.2, bytes@npm:~3.1.2":
|
"bytes@npm:^3.1.2, bytes@npm:~3.1.2":
|
||||||
version: 3.1.2
|
version: 3.1.2
|
||||||
resolution: "bytes@npm:3.1.2"
|
resolution: "bytes@npm:3.1.2"
|
||||||
@@ -6384,6 +6566,23 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"default-browser-id@npm:^5.0.0":
|
||||||
|
version: 5.0.1
|
||||||
|
resolution: "default-browser-id@npm:5.0.1"
|
||||||
|
checksum: 10c0/5288b3094c740ef3a86df9b999b04ff5ba4dee6b64e7b355c0fff5217752c8c86908d67f32f6cba9bb4f9b7b61a1b640c0a4f9e34c57e0ff3493559a625245ee
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"default-browser@npm:^5.2.1":
|
||||||
|
version: 5.4.0
|
||||||
|
resolution: "default-browser@npm:5.4.0"
|
||||||
|
dependencies:
|
||||||
|
bundle-name: "npm:^4.1.0"
|
||||||
|
default-browser-id: "npm:^5.0.0"
|
||||||
|
checksum: 10c0/a49ddd0c7b1a319163f64a5fc68ebb45a98548ea23a3155e04518f026173d85cfa2f451b646366c36c8f70b01e4cb773e23d1d22d2c61d8b84e5fbf151b4b609
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4":
|
"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4":
|
||||||
version: 1.1.4
|
version: 1.1.4
|
||||||
resolution: "define-data-property@npm:1.1.4"
|
resolution: "define-data-property@npm:1.1.4"
|
||||||
@@ -6402,6 +6601,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"define-lazy-prop@npm:^3.0.0":
|
||||||
|
version: 3.0.0
|
||||||
|
resolution: "define-lazy-prop@npm:3.0.0"
|
||||||
|
checksum: 10c0/5ab0b2bf3fa58b3a443140bbd4cd3db1f91b985cc8a246d330b9ac3fc0b6a325a6d82bddc0b055123d745b3f9931afeea74a5ec545439a1630b9c8512b0eeb49
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1":
|
"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1":
|
||||||
version: 1.2.1
|
version: 1.2.1
|
||||||
resolution: "define-properties@npm:1.2.1"
|
resolution: "define-properties@npm:1.2.1"
|
||||||
@@ -6887,7 +7093,96 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0, esbuild@npm:^0.25.0":
|
"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0":
|
||||||
|
version: 0.27.2
|
||||||
|
resolution: "esbuild@npm:0.27.2"
|
||||||
|
dependencies:
|
||||||
|
"@esbuild/aix-ppc64": "npm:0.27.2"
|
||||||
|
"@esbuild/android-arm": "npm:0.27.2"
|
||||||
|
"@esbuild/android-arm64": "npm:0.27.2"
|
||||||
|
"@esbuild/android-x64": "npm:0.27.2"
|
||||||
|
"@esbuild/darwin-arm64": "npm:0.27.2"
|
||||||
|
"@esbuild/darwin-x64": "npm:0.27.2"
|
||||||
|
"@esbuild/freebsd-arm64": "npm:0.27.2"
|
||||||
|
"@esbuild/freebsd-x64": "npm:0.27.2"
|
||||||
|
"@esbuild/linux-arm": "npm:0.27.2"
|
||||||
|
"@esbuild/linux-arm64": "npm:0.27.2"
|
||||||
|
"@esbuild/linux-ia32": "npm:0.27.2"
|
||||||
|
"@esbuild/linux-loong64": "npm:0.27.2"
|
||||||
|
"@esbuild/linux-mips64el": "npm:0.27.2"
|
||||||
|
"@esbuild/linux-ppc64": "npm:0.27.2"
|
||||||
|
"@esbuild/linux-riscv64": "npm:0.27.2"
|
||||||
|
"@esbuild/linux-s390x": "npm:0.27.2"
|
||||||
|
"@esbuild/linux-x64": "npm:0.27.2"
|
||||||
|
"@esbuild/netbsd-arm64": "npm:0.27.2"
|
||||||
|
"@esbuild/netbsd-x64": "npm:0.27.2"
|
||||||
|
"@esbuild/openbsd-arm64": "npm:0.27.2"
|
||||||
|
"@esbuild/openbsd-x64": "npm:0.27.2"
|
||||||
|
"@esbuild/openharmony-arm64": "npm:0.27.2"
|
||||||
|
"@esbuild/sunos-x64": "npm:0.27.2"
|
||||||
|
"@esbuild/win32-arm64": "npm:0.27.2"
|
||||||
|
"@esbuild/win32-ia32": "npm:0.27.2"
|
||||||
|
"@esbuild/win32-x64": "npm:0.27.2"
|
||||||
|
dependenciesMeta:
|
||||||
|
"@esbuild/aix-ppc64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/android-arm":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/android-arm64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/android-x64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/darwin-arm64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/darwin-x64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/freebsd-arm64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/freebsd-x64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/linux-arm":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/linux-arm64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/linux-ia32":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/linux-loong64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/linux-mips64el":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/linux-ppc64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/linux-riscv64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/linux-s390x":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/linux-x64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/netbsd-arm64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/netbsd-x64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/openbsd-arm64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/openbsd-x64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/openharmony-arm64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/sunos-x64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/win32-arm64":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/win32-ia32":
|
||||||
|
optional: true
|
||||||
|
"@esbuild/win32-x64":
|
||||||
|
optional: true
|
||||||
|
bin:
|
||||||
|
esbuild: bin/esbuild
|
||||||
|
checksum: 10c0/cf83f626f55500f521d5fe7f4bc5871bec240d3deb2a01fbd379edc43b3664d1167428738a5aad8794b35d1cca985c44c375b1cd38a2ca613c77ced2c83aafcd
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
|
"esbuild@npm:^0.25.0":
|
||||||
version: 0.25.5
|
version: 0.25.5
|
||||||
resolution: "esbuild@npm:0.25.5"
|
resolution: "esbuild@npm:0.25.5"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -8565,6 +8860,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"is-docker@npm:^3.0.0":
|
||||||
|
version: 3.0.0
|
||||||
|
resolution: "is-docker@npm:3.0.0"
|
||||||
|
bin:
|
||||||
|
is-docker: cli.js
|
||||||
|
checksum: 10c0/d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"is-extglob@npm:^2.1.1":
|
"is-extglob@npm:^2.1.1":
|
||||||
version: 2.1.1
|
version: 2.1.1
|
||||||
resolution: "is-extglob@npm:2.1.1"
|
resolution: "is-extglob@npm:2.1.1"
|
||||||
@@ -8615,6 +8919,17 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"is-inside-container@npm:^1.0.0":
|
||||||
|
version: 1.0.0
|
||||||
|
resolution: "is-inside-container@npm:1.0.0"
|
||||||
|
dependencies:
|
||||||
|
is-docker: "npm:^3.0.0"
|
||||||
|
bin:
|
||||||
|
is-inside-container: cli.js
|
||||||
|
checksum: 10c0/a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"is-map@npm:^2.0.3":
|
"is-map@npm:^2.0.3":
|
||||||
version: 2.0.3
|
version: 2.0.3
|
||||||
resolution: "is-map@npm:2.0.3"
|
resolution: "is-map@npm:2.0.3"
|
||||||
@@ -8809,6 +9124,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"is-wsl@npm:^3.1.0":
|
||||||
|
version: 3.1.0
|
||||||
|
resolution: "is-wsl@npm:3.1.0"
|
||||||
|
dependencies:
|
||||||
|
is-inside-container: "npm:^1.0.0"
|
||||||
|
checksum: 10c0/d3317c11995690a32c362100225e22ba793678fe8732660c6de511ae71a0ff05b06980cf21f98a6bf40d7be0e9e9506f859abe00a1118287d63e53d0a3d06947
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"isarray@npm:0.0.1":
|
"isarray@npm:0.0.1":
|
||||||
version: 0.0.1
|
version: 0.0.1
|
||||||
resolution: "isarray@npm:0.0.1"
|
resolution: "isarray@npm:0.0.1"
|
||||||
@@ -10098,6 +10422,18 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"open@npm:^10.2.0":
|
||||||
|
version: 10.2.0
|
||||||
|
resolution: "open@npm:10.2.0"
|
||||||
|
dependencies:
|
||||||
|
default-browser: "npm:^5.2.1"
|
||||||
|
define-lazy-prop: "npm:^3.0.0"
|
||||||
|
is-inside-container: "npm:^1.0.0"
|
||||||
|
wsl-utils: "npm:^0.1.0"
|
||||||
|
checksum: 10c0/5a36d0c1fd2f74ce553beb427ca8b8494b623fc22c6132d0c1688f246a375e24584ea0b44c67133d9ab774fa69be8e12fbe1ff12504b1142bd960fb09671948f
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"open@npm:^8.0.0":
|
"open@npm:^8.0.0":
|
||||||
version: 8.4.2
|
version: 8.4.2
|
||||||
resolution: "open@npm:8.4.2"
|
resolution: "open@npm:8.4.2"
|
||||||
@@ -12144,6 +12480,13 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"run-applescript@npm:^7.0.0":
|
||||||
|
version: 7.1.0
|
||||||
|
resolution: "run-applescript@npm:7.1.0"
|
||||||
|
checksum: 10c0/ab826c57c20f244b2ee807704b1ef4ba7f566aa766481ae5922aac785e2570809e297c69afcccc3593095b538a8a77d26f2b2e9a1d9dffee24e0e039502d1a03
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"run-parallel@npm:^1.1.9":
|
"run-parallel@npm:^1.1.9":
|
||||||
version: 1.2.0
|
version: 1.2.0
|
||||||
resolution: "run-parallel@npm:1.2.0"
|
resolution: "run-parallel@npm:1.2.0"
|
||||||
@@ -12209,8 +12552,8 @@ __metadata:
|
|||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"sass@npm:^1.62.1, sass@npm:^1.70.0":
|
"sass@npm:^1.62.1, sass@npm:^1.70.0":
|
||||||
version: 1.96.0
|
version: 1.97.0
|
||||||
resolution: "sass@npm:1.96.0"
|
resolution: "sass@npm:1.97.0"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@parcel/watcher": "npm:^2.4.1"
|
"@parcel/watcher": "npm:^2.4.1"
|
||||||
chokidar: "npm:^4.0.0"
|
chokidar: "npm:^4.0.0"
|
||||||
@@ -12221,7 +12564,7 @@ __metadata:
|
|||||||
optional: true
|
optional: true
|
||||||
bin:
|
bin:
|
||||||
sass: sass.js
|
sass: sass.js
|
||||||
checksum: 10c0/a932054bcee6935757417af6072d31b65ce3557798a53351b3e1369d7f06e24b0ec211e1617bdaaee998b429a44bf0f52acd240fd47f88422d5bc241eeb71672
|
checksum: 10c0/4c0e2596131054089beeeb6e98f7318beb909c4775187690656cbb85a45153d04eecd970e6a4431fe47dc94f9749cf8d58c9c5e59055d2cae39f4887a4bb6104
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -12762,19 +13105,20 @@ __metadata:
|
|||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"storybook@npm:^10.0.5":
|
"storybook@npm:^10.0.5":
|
||||||
version: 10.0.5
|
version: 10.1.10
|
||||||
resolution: "storybook@npm:10.0.5"
|
resolution: "storybook@npm:10.1.10"
|
||||||
dependencies:
|
dependencies:
|
||||||
"@storybook/global": "npm:^5.0.0"
|
"@storybook/global": "npm:^5.0.0"
|
||||||
"@storybook/icons": "npm:^1.6.0"
|
"@storybook/icons": "npm:^2.0.0"
|
||||||
"@testing-library/jest-dom": "npm:^6.6.3"
|
"@testing-library/jest-dom": "npm:^6.6.3"
|
||||||
"@testing-library/user-event": "npm:^14.6.1"
|
"@testing-library/user-event": "npm:^14.6.1"
|
||||||
"@vitest/expect": "npm:3.2.4"
|
"@vitest/expect": "npm:3.2.4"
|
||||||
"@vitest/mocker": "npm:3.2.4"
|
|
||||||
"@vitest/spy": "npm:3.2.4"
|
"@vitest/spy": "npm:3.2.4"
|
||||||
esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0"
|
esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0"
|
||||||
|
open: "npm:^10.2.0"
|
||||||
recast: "npm:^0.23.5"
|
recast: "npm:^0.23.5"
|
||||||
semver: "npm:^7.6.2"
|
semver: "npm:^7.6.2"
|
||||||
|
use-sync-external-store: "npm:^1.5.0"
|
||||||
ws: "npm:^8.18.0"
|
ws: "npm:^8.18.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
prettier: ^2 || ^3
|
prettier: ^2 || ^3
|
||||||
@@ -12783,7 +13127,7 @@ __metadata:
|
|||||||
optional: true
|
optional: true
|
||||||
bin:
|
bin:
|
||||||
storybook: ./dist/bin/dispatcher.js
|
storybook: ./dist/bin/dispatcher.js
|
||||||
checksum: 10c0/ea4bcdbc8d793f53970fe2e72de805bfd5b0872d3640f7526bdf42fbe0114f225c09f3683ab011ac08b5240450fd7726f17c5210d929c6f261dadc851ee09eec
|
checksum: 10c0/beff5472ee86a995cbde2789b2aabd941f823e31ca6957bb4434cb8ee3d3703cf1248e44f4b4d402416a52bfee94677e74f233cc906487901e831e8ab610defa
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -13994,12 +14338,12 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"use-sync-external-store@npm:^1.4.0":
|
"use-sync-external-store@npm:^1.4.0, use-sync-external-store@npm:^1.5.0":
|
||||||
version: 1.4.0
|
version: 1.6.0
|
||||||
resolution: "use-sync-external-store@npm:1.4.0"
|
resolution: "use-sync-external-store@npm:1.6.0"
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
|
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
|
||||||
checksum: 10c0/ec011a5055962c0f6b509d6e78c0b143f8cd069890ae370528753053c55e3b360d3648e76cfaa854faa7a59eb08d6c5fb1015e60ffde9046d32f5b2a295acea5
|
checksum: 10c0/35e1179f872a53227bdf8a827f7911da4c37c0f4091c29b76b1e32473d1670ebe7bcd880b808b7549ba9a5605c233350f800ffab963ee4a4ee346ee983b6019b
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -14085,8 +14429,8 @@ __metadata:
|
|||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
"vite-tsconfig-paths@npm:^6.0.0":
|
"vite-tsconfig-paths@npm:^6.0.0":
|
||||||
version: 6.0.2
|
version: 6.0.3
|
||||||
resolution: "vite-tsconfig-paths@npm:6.0.2"
|
resolution: "vite-tsconfig-paths@npm:6.0.3"
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: "npm:^4.1.1"
|
debug: "npm:^4.1.1"
|
||||||
globrex: "npm:^0.1.2"
|
globrex: "npm:^0.1.2"
|
||||||
@@ -14096,7 +14440,7 @@ __metadata:
|
|||||||
peerDependenciesMeta:
|
peerDependenciesMeta:
|
||||||
vite:
|
vite:
|
||||||
optional: true
|
optional: true
|
||||||
checksum: 10c0/878189e38a253b699998f94706b15718a03d59467b091e064f33090240f9ccfa4bf273c3b30b5f9711822c56a58b786c3e6c6cebb8859e56ec5ab49e360ff8c0
|
checksum: 10c0/75cfe470f1ec0e776b2aec1d2e71316d5e1214f485fce7daaed4e4789d6f667881fb85d98129b6463a5b70c7524ef258b401c4871ed8b6318ac45cc892ee778a
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
@@ -14693,6 +15037,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"wsl-utils@npm:^0.1.0":
|
||||||
|
version: 0.1.0
|
||||||
|
resolution: "wsl-utils@npm:0.1.0"
|
||||||
|
dependencies:
|
||||||
|
is-wsl: "npm:^3.1.0"
|
||||||
|
checksum: 10c0/44318f3585eb97be994fc21a20ddab2649feaf1fbe893f1f866d936eea3d5f8c743bec6dc02e49fbdd3c0e69e9b36f449d90a0b165a4f47dd089747af4cf2377
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"xml-name-validator@npm:^5.0.0":
|
"xml-name-validator@npm:^5.0.0":
|
||||||
version: 5.0.0
|
version: 5.0.0
|
||||||
resolution: "xml-name-validator@npm:5.0.0"
|
resolution: "xml-name-validator@npm:5.0.0"
|
||||||
|
|||||||
Reference in New Issue
Block a user