Commit graph

815 commits

Author SHA1 Message Date
PalmDevs
ffce0e2cf2
feat(lib/plugins): add sourceURL to external plugin scripts 2026-07-31 17:46:42 +07:00
PalmDevs
1497e8ef8d
feat: app freeze detection and recovery mode
This requires loader support and can only be triggered from a native dialog.
Recovery mode toggle won't be a functionality for now. If there's a use, such as binary searching problematic plugins, then it'll be added (similar to VSCode extension bisect).
2026-07-31 17:46:08 +07:00
PalmDevs
457df3ebb5
fix(plugins/settings.plugins): change button text in plugin failed alert to be more clear 2026-07-31 14:51:20 +07:00
PalmDevs
261a493f4b
fix(plugins/settings.plugins): allow resolving internal plugins when planning installs 2026-07-31 14:51:19 +07:00
PalmDevs
c49f3eb471
fix(lib/discord/common)!: split to own submodules + don't restrict everything to init+ 2026-07-31 14:51:15 +07:00
PalmDevs
217617a663
fix(plugin/settings): remount instead of recomputing SettingHookHarness memos
Recomputing causes a React crash because the harness calls additional hooks for every setting.
When we add/remove setting items, hooks are not called the same amount.

React expects the same amount of hooks to be called after each render, so this breaks adding settings items while in Settings.
We can remount it instead to avoid this crash.
2026-07-31 03:26:04 +07:00
PalmDevs
b258ac70d6
fix(plugins): remove developer-kit
This plugin has been moved to an external repository.
The goal of bundling internal plugins are including what's needed by _the user_ by default.

Developer Kit is not needed by most users, nor is it a "safe" plugin (it exposes a few attack surfaces, even if unlikely to be used).
2026-07-31 02:50:59 +07:00
PalmDevs
0f75551c36
fix(plugins/developer-kit): migrate to FlashList v2 2026-07-31 02:38:46 +07:00
PalmDevs
1c58b7a5a1
chore: use AnyFunction from lib everywhere 2026-07-31 02:38:45 +07:00
PalmDevs
10371ff000
fix: settings UI refreshing 2026-07-31 02:38:41 +07:00
PalmDevs
8040d3be07
fix(lib/externals/react-native-safe-area-context): update filters for 341202+ 2026-07-29 23:42:44 +07:00
PalmDevs
bb0919ef0a
fix(lib/discord): bring back support for <341202 2026-07-29 23:18:11 +07:00
PalmDevs
16ef99dcd8
chore: update dependencies 2026-07-29 22:18:02 +07:00
PalmDevs
6bdff25482
feat: better types + typegen output
- Add dependencies to types package.json
- Make temp file names deterministic
2026-07-29 22:15:23 +07:00
PalmDevs
2e944b0f25
fix: support 341202+
First Android Static Hermes version incoming, with Metro issues.

- scripts/plugins/hermesc: use hermes-compiler
- plugins/settings: get React Native version correctly
- lib/modules/finders/filters: support null ID in DependencyMap for `withDependencies`
- lib/discord: update filters for 341202+
2026-07-29 21:48:18 +07:00
PalmDevs
89ae4d910c
feat(plugins/settings.plugins): show repo description + add Copy URL option 2026-07-29 21:48:17 +07:00
PalmDevs
0c9cd9f8e3
fix(plugins/settings.plugins): don't restore default repo multiple times 2026-07-29 21:48:16 +07:00
PalmDevs
49c1b1e68d
fix(lib/utils/object): lazy properties shouldn't delete itself when loader errors 2026-07-29 21:48:15 +07:00
PalmDevs
c7b5ae8ee6
fix(lib/plugins): external JS plugins not loading 2026-07-29 21:48:10 +07:00
PalmDevs
e73bbc03ba
fix(lib/json-storage): clarify how JsonStorage.get() and JsonStorageUpdateMode.Load works 2026-07-28 12:44:31 +07:00
PalmDevs
9e2ac7185d
feat(plugins/settings.plugins): restore default plugin repo when needed 2026-07-28 12:43:55 +07:00
PalmDevs
da08b94f76
fix(lib/assets): skip useless comparison during pre-init 2026-07-28 12:12:22 +07:00
PalmDevs
9781ed5ee3
feat(scripts/types): make dist/types directly publishable 2026-07-28 12:11:38 +07:00
PalmDevs
0fdc1f1cff
fix: plugin API types + JS options validation 2026-07-28 12:07:28 +07:00
PalmDevs
a629b2ad44
fix(lib/discord/types): export API types to expose plugin API decoration 2026-07-26 16:13:13 +07:00
PalmDevs
b250450367
feat(lib/plugins): reexpose EnabledLate flags property as startedLate 2026-07-26 16:01:09 +07:00
PalmDevs
f67c8db768
fix(scripts): make compatible with all Node runtimes 2026-07-26 15:45:08 +07:00
PalmDevs
ee8d5620a0
fix(scripts/types): types generation 2026-07-26 15:24:35 +07:00
PalmDevs
f6d119a210
fix(lib/externals/shopify): update filters for 340206+ 2026-07-26 13:47:31 +07:00
PalmDevs
793574d185
fix: lockfile 2026-07-26 03:09:27 +07:00
Palm
f6a796f02f
chore: merge feat/external-and-native-plugins to main (#10)
This PR introduces native and external plugins support. The list of changes here are NOT comprehensive and only mentions the most important changes. Check commits from `00047da` to `d2c7f47` (and diff) for full list of changes.

BREAKING CHANGES:

- lib/modules!: Renamed `callBridgeMethod*` to `callNativeMethod*` and interface `Methods` to `NativeMethods`. This is to achieve naming consistency with the native API and be more clear.
- lib/storage!: Renamed to `@revenge-mod/json-storage`. A storage can be in any arbitrary format. While there's little potential for non-JSON storage formats, but the naming should allow for it regardless. This is not a drop-in replacements. There are breaking changes in export names and new APIs.
- plugins/revenge.api.storage!: Renamed to `revenge.api.jsonStorage`. Plugin options are renamed and its structure has changed as well.
- Native now holds the path for official storage APIs. This update uses new paths without any migration!
- lib/plugins!: `Plugin.errors` is now read-only. Use `Plugin.reportError(e)` instead.
- lib/plugins!: `Plugin.flags` has been completely removed in favor of these methods: `Plugin.requireReload()`, `Plugin.disable()`.
- 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
- lib/discord/design: `FloatingActionButton` types

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:

- lib/modules/native/fs: `rmSync` not actually deleting anything.
- Refactored Plugin-related settings to a separate "Plugin Settings" plugin.
- Masonry layout fixes in landscape.
- Removed dead code.
- Fixed sorting for 'Enabled first'.
- Updated native method names to be more consistent.
- Make methods more 'safe' by removing non-null assertion casts.
2026-07-25 23:48:15 +04:00
PalmDevs
d2c7f47fe7
fix(plugins/settings.plugins): match the version, channel, and repo exactly from the card when installing plugins from the Browse screen 2026-07-26 02:01:58 +07:00
PalmDevs
5432276ab0
fix(plugins/settings.plugins): small errors & inconsistencies
- Soft errors now nudge UI to rerender.
- `runPluginLate` will throw anyway, so early return is cleaner.
- `confirmInstall` returns a `Promise` which the AlertModal should await before closing.
2026-07-26 02:01:57 +07:00
PalmDevs
ff263a2282
chore: remove dead code and correct comments 2026-07-26 02:01:56 +07:00
PalmDevs
da1e34dc62
fix(plugins/settings.plugins): last updated date logic
Only update when repos are actually refreshed, and when no errors occurred.
2026-07-26 02:01:37 +07:00
PalmDevs
a5290d314f
fix(lib/plugins): forget initial persisted states when un/reinstalling a plugin 2026-07-26 01:21:02 +07:00
PalmDevs
2b665164e9
fix(plugin/api.json-storage): handle when plugin hasn't been initialized when clearing storage 2026-07-26 00:54:20 +07:00
PalmDevs
7aa8582efc
chore: update dependencies 2026-07-26 00:26:13 +07:00
PalmDevs
61dad36056
fix(plugins/settings.plugins): cache repo listings when building an alert to confirm an install plan 2026-07-26 00:12:55 +07:00
PalmDevs
41e9186966
fix(plugins/settings.plugins): show toast for errors during missing dependencies installation when enabling plugins 2026-07-26 00:10:03 +07:00
PalmDevs
a06bf73d06
fix(lib/modules/native/fs): rmSync not actually deleting anything 2026-07-25 23:59:06 +07:00
PalmDevs
6e4d128951
fix(plugins/settings.plugins): pending reload uninstall alert text 2026-07-25 23:58:36 +07:00
PalmDevs
eed74947c3
chore: format and fix potential type errors 2026-07-25 23:58:01 +07:00
PalmDevs
9b412a9404
feat!: new repo system + versioning system support + bug fixes
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.
2026-07-25 23:43:44 +07:00
PalmDevs
fb35d7af95
fix(plugins/api.json-storage): remove entire dir when clearing and only update storage when needed 2026-07-19 20:19:19 +07:00
PalmDevs
f97c273bef
feat(lib/discord/modules/settings): allow adding setting items to sections with index and by lambda 2026-07-19 15:36:22 +07:00
PalmDevs
eb3f03fb60
feat(lib/discord): add types for FloatingActionButton 2026-07-17 21:10:29 +07:00
PalmDevs
3f60b4dfb7
feat!: more plugin system improvements + API changes + other fixes
BREAKING CHANGES:

- lib/modules!: Renamed `callBridgeMethod*` to `callNativeMethod*` and interface `Methods` to `NativeMethods`. This is to achieve naming consistency with the native API and be more clear.
- lib/storage!: Renamed to `@revenge-mod/json-storage`. A storage can be in any arbitrary format. While there's little potential for non-JSON storage formats, but the naming should allow for it regardless. This is not a drop-in replacements. There are breaking changes in export names and new APIs.
- plugins/revenge.api.storage!: Renamed to `revenge.api.jsonStorage`. Plugin options are renamed and its structure has changed as well.
- Native now holds the path for official storage APIs. This update uses new paths without any migration!
- lib/plugins!: `Plugin.errors` is now read-only. Use `Plugin.reportError(e)` instead.
- lib/plugins!: `Plugin.flags` has been completely removed in favor of these methods: `Plugin.requireReload()`, `Plugin.disable()`.

OTHER CHANGES:

- Fixed sorting for 'Enabled first'
- Updated native method names to be more consistent
- Cleand up dead code
- Make methods more 'safe' by removing non-null assertion casts
2026-07-09 23:47:53 +07:00
PalmDevs
fb3692bc2d
feat: plugin system improvement
- Stop plugins prior to an update
- Native calls are now awaited in relevant places
- External plugin install feedback
- Plugins that are pending reloads now can't be started after an update
2026-07-07 23:19:58 +07:00
PalmDevs
fb1a31640f
fix(plugins/settings): use new imported path for settings navigator patch 2026-07-07 23:06:54 +07:00