BREAKING CHANGES:
- New versioning system: Allowing any amount of number segments, with prerelease support.
- Any number of segments is supported: 1, 1.0, 1.0.0, 1.0.0.0, ...
- Prerelease labels are compared "digit-run", similar to Debian.
- Plugins must specify a version.
- User-facing plugins should use CalVer. API plugins should use SemVer.
Revenge APIs use SemVer while the new `discord` dependency parses the Discord version string directly.
- Dependency is now a Map, with support for version ranges and optional. Suggested URL is removed. (See new repo system)
- Plugins will now have to declare a dependency on `revenge.api` (Revenge API version) and `discord` (Discord version).
- Manifest now requires a format version (currently `1`)
New APIs:
- lib/plugins/utils: Utilities to format versioning
Features:
- New repo system: Repository design is inspired by Linux package repositories.
- Repos host manifest, versions, channels, download URL/size, and hash for multiple plugins.
- New dependency system: Plugins are versioned, and shouldn't break when updates come.
Plugins can now declare dependency on supported Discord/Revenge API versions, so they won't break with auto-updates.
Dependencies can be optional, but dependency on `revenge.api` and `discord` must be required.
Dependents are soft-disabled when dependencies don't satisfy. Once satisfied, the plugin can start again.
- All updates for running plugins REQUIRE a reload to prevent stale linking issues. Both native and JS-side.
- Update checking is handled entirely by JS. But the native-side still handles installation, indexing, and verification.
- Local indexes are updated against remote indexes. Dependency checking always uses local indexes.
- Users can add custom repositories and custom their priority order. URL is the identity.
- Plugins can now have custom data URI icons instead of being restricted to React Native app assets.
- External plugin installs require UI confirmation before installing.
- Pending Update and Pending Reload filters in Plugins page.
- Ability to browse external plugins in repositories. Official repository will be added soon.
Fixes/Refactor:
- Refactored Plugin-related settings to a separate "Plugin Settings" plugin.
- Masonry layout fixes in landscape.
- Updated plugins now show "reload to apply" toast instead.
- Removed dead code.
72 lines
2.4 KiB
TypeScript
72 lines
2.4 KiB
TypeScript
import { waitForModules } from '@revenge-mod/modules/finders'
|
|
import { withName } from '@revenge-mod/modules/finders/filters'
|
|
import { instead } from '@revenge-mod/patcher'
|
|
import {
|
|
InternalPluginFlags,
|
|
PluginFlags,
|
|
registerInternalPlugin,
|
|
} from '@revenge-mod/plugins/_'
|
|
import ErrorBoundaryScreen from './components/ErrorBoundaryScreen'
|
|
import type { Component, ReactNode } from 'react'
|
|
|
|
registerInternalPlugin(
|
|
{
|
|
id: 'revenge.error-boundary',
|
|
name: 'Error Boundary',
|
|
description: 'Shows debug information on rendering crashes.',
|
|
author: 'Revenge',
|
|
icon: 'ScreenXIcon',
|
|
},
|
|
{
|
|
start({ cleanup }) {
|
|
const unsubEB = waitForModules(
|
|
withName<typeof DiscordErrorBoundary>('ErrorBoundary'),
|
|
exports => {
|
|
unsubEB()
|
|
|
|
instead(
|
|
exports.prototype,
|
|
'render',
|
|
function (this: DiscordErrorBoundary) {
|
|
if (this.state.error)
|
|
return (
|
|
<ErrorBoundaryScreen
|
|
error={this.state.error}
|
|
reload={this.handleReload.bind(this)}
|
|
rerender={() => {
|
|
this.setState({
|
|
error: null,
|
|
info: null,
|
|
})
|
|
}}
|
|
/>
|
|
)
|
|
|
|
return this.props.children
|
|
},
|
|
)
|
|
},
|
|
{
|
|
cached: true,
|
|
},
|
|
)
|
|
|
|
cleanup(unsubEB)
|
|
},
|
|
},
|
|
PluginFlags.Enabled,
|
|
InternalPluginFlags.Internal | InternalPluginFlags.Essential,
|
|
)
|
|
|
|
declare class DiscordErrorBoundary extends Component<
|
|
{ children: ReactNode },
|
|
{
|
|
error: (Error & { componentStack?: string }) | unknown | null
|
|
info: { componentStack?: string } | null
|
|
}
|
|
> {
|
|
// render() is always called with `this` as the instance of DiscordErrorBoundary
|
|
render(this: DiscordErrorBoundary): ReactNode
|
|
discordErrorsSet: boolean
|
|
handleReload(): void
|
|
}
|