diff --git a/app/soapbox/utils/features.ts b/app/soapbox/utils/features.ts index 49e9f7a2e..947dc4d12 100644 --- a/app/soapbox/utils/features.ts +++ b/app/soapbox/utils/features.ts @@ -1,3 +1,4 @@ +/* eslint sort-keys: "error" */ import { List as ImmutableList, Map as ImmutableMap } from 'immutable'; import { createSelector } from 'reselect'; import gte from 'semver/functions/gte'; @@ -51,122 +52,117 @@ const getInstanceFeatures = (instance: Instance) => { return { /** - * Can upload media attachments to statuses. - * @see POST /api/v1/media - * @see POST /api/v1/statuses + * Can view and manage ActivityPub aliases through the API. + * @see GET /api/pleroma/aliases + * @see PATCH /api/v1/accounts/update_credentials */ - media: true, + accountAliasesAPI: v.software === PLEROMA, /** - * Can set privacy scopes on statuses. - * @see POST /api/v1/statuses + * The accounts API allows an acct instead of an ID. + * @see GET /api/v1/accounts/:acct_or_id */ - privacyScopes: v.software !== TRUTHSOCIAL, + accountByUsername: v.software === PLEROMA, /** - * Can set content warnings on statuses. - * @see POST /api/v1/statuses + * Ability to pin other accounts on one's profile. + * @see POST /api/v1/accounts/:id/pin + * @see POST /api/v1/accounts/:id/unpin + * @see GET /api/v1/pleroma/accounts/:id/endorsements */ - spoilers: v.software !== TRUTHSOCIAL, + accountEndorsements: v.software === PLEROMA && gte(v.version, '2.4.50'), /** - * Can edit and manage timeline filters (aka "muted words"). - * @see {@link https://docs.joinmastodon.org/methods/accounts/filters/} + * Ability to set one's location on their profile. + * @see PATCH /api/v1/accounts/update_credentials */ - filters: v.software !== TRUTHSOCIAL, + accountLocation: v.software === TRUTHSOCIAL, /** - * Can add polls to statuses. - * @see POST /api/v1/statuses + * Look up an account by the acct. + * @see GET /api/v1/accounts/lookup */ - polls: any([ - v.software === MASTODON && gte(v.version, '2.8.0'), - v.software === PLEROMA, + accountLookup: any([ + v.software === MASTODON && gte(v.compatVersion, '3.4.0'), + v.software === PLEROMA && gte(v.version, '2.4.50'), ]), /** - * Can schedule statuses to be posted at a later time. - * @see POST /api/v1/statuses - * @see {@link https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/} + * Move followers to a different ActivityPub account. + * @see POST /api/pleroma/move_account */ - scheduledStatuses: any([ - v.software === MASTODON && gte(v.version, '2.7.0'), - v.software === PLEROMA, - ]), + accountMoving: v.software === PLEROMA && gte(v.version, '2.4.50'), /** - * Can bookmark statuses. - * @see POST /api/v1/statuses/:id/bookmark - * @see GET /api/v1/bookmarks + * Ability to subscribe to notifications every time an account posts. + * @see POST /api/v1/accounts/:id/follow */ - bookmarks: any([ - v.software === MASTODON && gte(v.compatVersion, '3.1.0'), - v.software === PLEROMA && gte(v.version, '0.9.9'), - v.software === PIXELFED, + accountNotifies: any([ + v.software === MASTODON && gte(v.compatVersion, '3.3.0'), + v.software === PLEROMA && gte(v.version, '2.4.50'), ]), /** - * Can create, view, and manage lists. - * @see {@link https://docs.joinmastodon.org/methods/timelines/lists/} - * @see GET /api/v1/timelines/list/:list_id + * Ability to subscribe to notifications every time an account posts. + * @see POST /api/v1/pleroma/accounts/:id/subscribe + * @see POST /api/v1/pleroma/accounts/:id/unsubscribe */ - lists: any([ - v.software === MASTODON && gte(v.compatVersion, '2.1.0'), - v.software === PLEROMA && gte(v.version, '0.9.9'), - ]), + accountSubscriptions: v.software === PLEROMA && gte(v.version, '1.0.0'), /** - * Can display suggested accounts. - * @see {@link https://docs.joinmastodon.org/methods/accounts/suggestions/} + * Ability to set one's website on their profile. + * @see PATCH /api/v1/accounts/update_credentials */ - suggestions: any([ - v.software === MASTODON && gte(v.compatVersion, '2.4.3'), - v.software === TRUTHSOCIAL, - features.includes('v2_suggestions'), - ]), + accountWebsite: v.software === TRUTHSOCIAL, /** - * Supports V2 suggested accounts. - * @see GET /api/v2/suggestions + * Set your birthday and view upcoming birthdays. + * @see GET /api/v1/pleroma/birthdays + * @see POST /api/v1/accounts + * @see PATCH /api/v1/accounts/update_credentials */ - suggestionsV2: any([ - v.software === MASTODON && gte(v.compatVersion, '3.4.0'), - v.software === TRUTHSOCIAL, - features.includes('v2_suggestions'), - ]), + birthdays: v.software === PLEROMA && gte(v.version, '2.4.50'), /** Whether people who blocked you are visible through the API. */ blockersVisible: features.includes('blockers_visible'), /** - * Can display trending hashtags. - * @see GET /api/v1/trends + * Can bookmark statuses. + * @see POST /api/v1/statuses/:id/bookmark + * @see GET /api/v1/bookmarks */ - trends: any([ - v.software === MASTODON && gte(v.compatVersion, '3.0.0'), - v.software === TRUTHSOCIAL, + bookmarks: any([ + v.software === MASTODON && gte(v.compatVersion, '3.1.0'), + v.software === PLEROMA && gte(v.version, '0.9.9'), + v.software === PIXELFED, ]), /** - * Supports V2 media uploads. - * @see POST /api/v2/media + * Pleroma chats API. + * @see {@link https://docs.pleroma.social/backend/development/API/chats/} */ - mediaV2: any([ - v.software === MASTODON && gte(v.compatVersion, '3.1.3'), - // Even though Pleroma supports these endpoints, it has disadvantages - // v.software === PLEROMA && gte(v.version, '2.1.0'), - ]), + chats: v.software === PLEROMA && gte(v.version, '2.1.0'), /** - * Can display a timeline of all known public statuses. - * Local and Fediverse timelines both use this feature. - * @see GET /api/v1/timelines/public + * Paginated chats API. + * @see GET /api/v2/chats */ - publicTimeline: any([ - v.software === MASTODON, - v.software === PLEROMA, + chatsV2: v.software === PLEROMA && gte(v.version, '2.3.0'), + + /** + * Mastodon's newer solution for direct messaging. + * @see {@link https://docs.joinmastodon.org/methods/timelines/conversations/} + */ + conversations: any([ + v.software === MASTODON && gte(v.compatVersion, '2.6.0'), + v.software === PLEROMA && gte(v.version, '0.9.9'), + v.software === PIXELFED, ]), + // FIXME: long-term this shouldn't be a feature, + // but for now we want it to be overrideable in the build + darkMode: true, + /** * Legacy DMs timeline where messages are displayed chronologically without groupings. * @see GET /api/v1/timelines/direct @@ -177,14 +173,14 @@ const getInstanceFeatures = (instance: Instance) => { ]), /** - * Mastodon's newer solution for direct messaging. - * @see {@link https://docs.joinmastodon.org/methods/timelines/conversations/} + * Soapbox email list. + * @see POST /api/v1/accounts + * @see PATCH /api/v1/accounts/update_credentials + * @see GET /api/v1/pleroma/admin/email_list/subscribers.csv + * @see GET /api/v1/pleroma/admin/email_list/unsubscribers.csv + * @see GET /api/v1/pleroma/admin/email_list/combined.csv */ - conversations: any([ - v.software === MASTODON && gte(v.compatVersion, '2.6.0'), - v.software === PLEROMA && gte(v.version, '0.9.9'), - v.software === PIXELFED, - ]), + emailList: features.includes('email_list'), /** * Ability to add emoji reactions to a status. @@ -201,126 +197,112 @@ const getInstanceFeatures = (instance: Instance) => { emojiReactsRGI: v.software === PLEROMA && gte(v.version, '2.2.49'), /** - * Allows setting the focal point of a media attachment. - * @see {@link https://docs.joinmastodon.org/methods/statuses/media/} + * Sign in with an Ethereum wallet. + * @see POST /oauth/token */ - focalPoint: v.software === MASTODON && gte(v.compatVersion, '2.3.0'), + ethereumLogin: v.software === MITRA, /** - * Pleroma import API. - * @see POST /api/pleroma/follow_import - * @see POST /api/pleroma/blocks_import - * @see POST /api/pleroma/mutes_import + * Ability to address recipients of a status explicitly (with `to`). + * @see POST /api/v1/statuses */ - importAPI: v.software === PLEROMA, + explicitAddressing: any([ + v.software === PLEROMA && gte(v.version, '1.0.0'), + v.software === TRUTHSOCIAL, + ]), - /** - * Pleroma import mutes API. - * @see POST /api/pleroma/mutes_import - */ - importMutes: v.software === PLEROMA && gte(v.version, '2.2.0'), + /** Whether the accounts who favourited or emoji-reacted to a status can be viewed through the API. */ + exposableReactions: features.includes('exposable_reactions'), - /** - * Soapbox email list. - * @see POST /api/v1/accounts - * @see PATCH /api/v1/accounts/update_credentials - * @see GET /api/v1/pleroma/admin/email_list/subscribers.csv - * @see GET /api/v1/pleroma/admin/email_list/unsubscribers.csv - * @see GET /api/v1/pleroma/admin/email_list/combined.csv - */ - emailList: features.includes('email_list'), + /** Whether the instance federates. */ + federating: federation.get('enabled', true) === true, // Assume true unless explicitly false /** - * Pleroma chats API. - * @see {@link https://docs.pleroma.social/backend/development/API/chats/} + * Can edit and manage timeline filters (aka "muted words"). + * @see {@link https://docs.joinmastodon.org/methods/accounts/filters/} */ - chats: v.software === PLEROMA && gte(v.version, '2.1.0'), + filters: v.software !== TRUTHSOCIAL, /** - * Paginated chats API. - * @see GET /api/v2/chats + * Allows setting the focal point of a media attachment. + * @see {@link https://docs.joinmastodon.org/methods/statuses/media/} */ - chatsV2: v.software === PLEROMA && gte(v.version, '2.3.0'), + focalPoint: v.software === MASTODON && gte(v.compatVersion, '2.3.0'), /** - * List of OAuth scopes supported by both Soapbox and the backend. - * @see POST /api/v1/apps - * @see POST /oauth/token + * Whether client settings can be retrieved from the API. + * @see GET /api/pleroma/frontend_configurations */ - scopes: v.software === PLEROMA ? 'read write follow push admin' : 'read write follow push', - - /** Whether the instance federates. */ - federating: federation.get('enabled', true) === true, // Assume true unless explicitly false + frontendConfigurations: v.software === PLEROMA, /** - * Ability to post statuses in Markdown, BBCode, and HTML. - * @see POST /api/v1/statuses + * Pleroma import API. + * @see POST /api/pleroma/follow_import + * @see POST /api/pleroma/blocks_import + * @see POST /api/pleroma/mutes_import */ - richText: v.software === PLEROMA, + importAPI: v.software === PLEROMA, /** - * Ability to manage account security settings. - * @see POST /api/pleroma/change_password - * @see POST /api/pleroma/change_email - * @see POST /api/pleroma/delete_account + * Pleroma import mutes API. + * @see POST /api/pleroma/mutes_import */ - securityAPI: any([ - v.software === PLEROMA, - v.software === TRUTHSOCIAL, - ]), + importMutes: v.software === PLEROMA && gte(v.version, '2.2.0'), /** - * Can store client settings in the database. - * @see PATCH /api/v1/accounts/update_credentials + * Can create, view, and manage lists. + * @see {@link https://docs.joinmastodon.org/methods/timelines/lists/} + * @see GET /api/v1/timelines/list/:list_id */ - settingsStore: any([ - v.software === PLEROMA, - v.software === TRUTHSOCIAL, + lists: any([ + v.software === MASTODON && gte(v.compatVersion, '2.1.0'), + v.software === PLEROMA && gte(v.version, '0.9.9'), ]), /** - * Can view and manage ActivityPub aliases through the API. - * @see GET /api/pleroma/aliases - * @see PATCH /api/v1/accounts/update_credentials - */ - accountAliasesAPI: v.software === PLEROMA, - - /** - * Can request a password reset email through the API. - * @see POST /auth/password + * Can upload media attachments to statuses. + * @see POST /api/v1/media + * @see POST /api/v1/statuses */ - resetPasswordAPI: v.software === PLEROMA, - - /** Whether the accounts who favourited or emoji-reacted to a status can be viewed through the API. */ - exposableReactions: features.includes('exposable_reactions'), + media: true, /** - * Ability to subscribe to notifications every time an account posts. - * @see POST /api/v1/pleroma/accounts/:id/subscribe - * @see POST /api/v1/pleroma/accounts/:id/unsubscribe + * Supports V2 media uploads. + * @see POST /api/v2/media */ - accountSubscriptions: v.software === PLEROMA && gte(v.version, '1.0.0'), + mediaV2: any([ + v.software === MASTODON && gte(v.compatVersion, '3.1.3'), + // Even though Pleroma supports these endpoints, it has disadvantages + // v.software === PLEROMA && gte(v.version, '2.1.0'), + ]), /** - * Ability to subscribe to notifications every time an account posts. - * @see POST /api/v1/accounts/:id/follow + * Add private notes to accounts. + * @see POST /api/v1/accounts/:id/note + * @see GET /api/v1/accounts/relationships */ - accountNotifies: any([ - v.software === MASTODON && gte(v.compatVersion, '3.3.0'), + notes: any([ + v.software === MASTODON && gte(v.compatVersion, '3.2.0'), v.software === PLEROMA && gte(v.version, '2.4.50'), ]), + /** Truth Social account registration API. */ + pepe: v.software === TRUTHSOCIAL, + /** - * Whether the backend allows adding users you don't follow to lists. - * @see POST /api/v1/lists/:id/accounts + * Can add polls to statuses. + * @see POST /api/v1/statuses */ - unrestrictedLists: v.software === PLEROMA, + polls: any([ + v.software === MASTODON && gte(v.version, '2.8.0'), + v.software === PLEROMA, + ]), /** - * The accounts API allows an acct instead of an ID. - * @see GET /api/v1/accounts/:acct_or_id + * Can set privacy scopes on statuses. + * @see POST /api/v1/statuses */ - accountByUsername: v.software === PLEROMA, + privacyScopes: v.software !== TRUTHSOCIAL, /** * A directory of discoverable profiles from the instance. @@ -332,12 +314,22 @@ const getInstanceFeatures = (instance: Instance) => { ]), /** - * Look up an account by the acct. - * @see GET /api/v1/accounts/lookup + * Can display a timeline of all known public statuses. + * Local and Fediverse timelines both use this feature. + * @see GET /api/v1/timelines/public */ - accountLookup: any([ - v.software === MASTODON && gte(v.compatVersion, '3.4.0'), + publicTimeline: any([ + v.software === MASTODON, + v.software === PLEROMA, + ]), + + /** + * Ability to quote posts in statuses. + * @see POST /api/v1/statuses + */ + quotePosts: any([ v.software === PLEROMA && gte(v.version, '2.4.50'), + instance.feature_quote === true, ]), /** @@ -347,66 +339,79 @@ const getInstanceFeatures = (instance: Instance) => { remoteInteractionsAPI: v.software === PLEROMA && gte(v.version, '2.4.50'), /** - * Ability to address recipients of a status explicitly (with `to`). - * @see POST /api/v1/statuses + * Can request a password reset email through the API. + * @see POST /auth/password */ - explicitAddressing: any([ - v.software === PLEROMA && gte(v.version, '1.0.0'), - v.software === TRUTHSOCIAL, - ]), + resetPasswordAPI: v.software === PLEROMA, /** - * Ability to pin other accounts on one's profile. - * @see POST /api/v1/accounts/:id/pin - * @see POST /api/v1/accounts/:id/unpin - * @see GET /api/v1/pleroma/accounts/:id/endorsements + * Ability to post statuses in Markdown, BBCode, and HTML. + * @see POST /api/v1/statuses */ - accountEndorsements: v.software === PLEROMA && gte(v.version, '2.4.50'), + richText: v.software === PLEROMA, /** - * Ability to quote posts in statuses. + * Can schedule statuses to be posted at a later time. * @see POST /api/v1/statuses + * @see {@link https://docs.joinmastodon.org/methods/statuses/scheduled_statuses/} */ - quotePosts: any([ - v.software === PLEROMA && gte(v.version, '2.4.50'), - instance.feature_quote === true, + scheduledStatuses: any([ + v.software === MASTODON && gte(v.version, '2.7.0'), + v.software === PLEROMA, ]), /** - * Set your birthday and view upcoming birthdays. - * @see GET /api/v1/pleroma/birthdays - * @see POST /api/v1/accounts - * @see PATCH /api/v1/accounts/update_credentials + * List of OAuth scopes supported by both Soapbox and the backend. + * @see POST /api/v1/apps + * @see POST /oauth/token */ - birthdays: v.software === PLEROMA && gte(v.version, '2.4.50'), + scopes: v.software === PLEROMA ? 'read write follow push admin' : 'read write follow push', /** - * Sign in with an Ethereum wallet. - * @see POST /oauth/token + * Ability to manage account security settings. + * @see POST /api/pleroma/change_password + * @see POST /api/pleroma/change_email + * @see POST /api/pleroma/delete_account */ - ethereumLogin: v.software === MITRA, + securityAPI: any([ + v.software === PLEROMA, + v.software === TRUTHSOCIAL, + ]), /** - * Move followers to a different ActivityPub account. - * @see POST /api/pleroma/move_account + * Can store client settings in the database. + * @see PATCH /api/v1/accounts/update_credentials */ - accountMoving: v.software === PLEROMA && gte(v.version, '2.4.50'), + settingsStore: any([ + v.software === PLEROMA, + v.software === TRUTHSOCIAL, + ]), /** - * Add private notes to accounts. - * @see POST /api/v1/accounts/:id/note - * @see GET /api/v1/accounts/relationships + * Can set content warnings on statuses. + * @see POST /api/v1/statuses */ - notes: any([ - v.software === MASTODON && gte(v.compatVersion, '3.2.0'), - v.software === PLEROMA && gte(v.version, '2.4.50'), + spoilers: v.software !== TRUTHSOCIAL, + + /** + * Can display suggested accounts. + * @see {@link https://docs.joinmastodon.org/methods/accounts/suggestions/} + */ + suggestions: any([ + v.software === MASTODON && gte(v.compatVersion, '2.4.3'), + v.software === TRUTHSOCIAL, + features.includes('v2_suggestions'), ]), /** - * Truth Social trending statuses API. - * @see GET /api/v1/truth/trending/truths + * Supports V2 suggested accounts. + * @see GET /api/v2/suggestions */ - trendingTruths: v.software === TRUTHSOCIAL, + suggestionsV2: any([ + v.software === MASTODON && gte(v.compatVersion, '3.4.0'), + v.software === TRUTHSOCIAL, + features.includes('v2_suggestions'), + ]), /** * Trending statuses. @@ -414,30 +419,26 @@ const getInstanceFeatures = (instance: Instance) => { */ trendingStatuses: v.software === MASTODON && gte(v.compatVersion, '3.5.0'), - /** Truth Social account registration API. */ - pepe: v.software === TRUTHSOCIAL, - /** - * Ability to set one's location on their profile. - * @see PATCH /api/v1/accounts/update_credentials + * Truth Social trending statuses API. + * @see GET /api/v1/truth/trending/truths */ - accountLocation: v.software === TRUTHSOCIAL, + trendingTruths: v.software === TRUTHSOCIAL, /** - * Ability to set one's website on their profile. - * @see PATCH /api/v1/accounts/update_credentials + * Can display trending hashtags. + * @see GET /api/v1/trends */ - accountWebsite: v.software === TRUTHSOCIAL, + trends: any([ + v.software === MASTODON && gte(v.compatVersion, '3.0.0'), + v.software === TRUTHSOCIAL, + ]), /** - * Whether client settings can be retrieved from the API. - * @see GET /api/pleroma/frontend_configurations + * Whether the backend allows adding users you don't follow to lists. + * @see POST /api/v1/lists/:id/accounts */ - frontendConfigurations: v.software === PLEROMA, - - // FIXME: long-term this shouldn't be a feature, - // but for now we want it to be overrideable in the build - darkMode: true, + unrestrictedLists: v.software === PLEROMA, }; }; @@ -469,17 +470,17 @@ export const parseVersion = (version: string): Backend => { if (match) { return { + compatVersion: match[1], software: match[2] || MASTODON, version: match[3] || match[1], - compatVersion: match[1], }; } else { // If we can't parse the version, this is a new and exotic backend. // Fall back to minimal featureset. return { + compatVersion: '0.0.0', software: null, version: '0.0.0', - compatVersion: '0.0.0', }; } };