Compare commits

..

22 Commits

Author SHA1 Message Date
semantic-release-bot
a1fdae9cd2 chore(release): 1.6.0 [CI SKIP] 2022-08-13 01:25:46 +00:00
AAGaming
7cf45cf371 feat(Utilities): add wrapReactType utility 2022-08-12 21:24:56 -04:00
semantic-release-bot
df1c8dbb8b chore(release): 1.5.1 [CI SKIP] 2022-08-10 22:46:24 +00:00
TrainDoctor
1de979f713 fix(security): update for minimist pollution exploit 2022-08-10 15:44:37 -07:00
TrainDoctor
f23070a82a Merge pull request #10 from SteamDeckHomebrew/dependabot/npm_and_yarn/semantic-release-19.0.3
chore(deps-dev): bump semantic-release from 19.0.2 to 19.0.3
2022-08-10 15:39:43 -07:00
dependabot[bot]
b87e7c2f40 chore(deps-dev): bump semantic-release from 19.0.2 to 19.0.3
Bumps [semantic-release](https://github.com/semantic-release/semantic-release) from 19.0.2 to 19.0.3.
- [Release notes](https://github.com/semantic-release/semantic-release/releases)
- [Commits](https://github.com/semantic-release/semantic-release/compare/v19.0.2...v19.0.3)

---
updated-dependencies:
- dependency-name: semantic-release
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-10 22:39:05 +00:00
semantic-release-bot
6db29a9a6e chore(release): 1.5.0 [CI SKIP] 2022-08-10 01:37:31 +00:00
AAGaming
e2126afd06 feat(ServerAPI): add Toaster to serverAPI 2022-08-09 21:36:32 -04:00
semantic-release-bot
cea587958e chore(release): 1.4.0 [CI SKIP] 2022-08-08 23:31:05 +00:00
AAGaming
b21dfcdb66 feat(utils): add findInTree and findInReactTree 2022-08-08 19:30:08 -04:00
semantic-release-bot
d46251bb91 chore(release): 1.3.0 [CI SKIP] 2022-08-02 22:55:55 +00:00
AAGaming
5b29447cfa feat(plugin): api for patching existing routes 2022-08-02 18:50:39 -04:00
TrainDoctor
e993d06963 Update README.md 2022-07-28 15:28:50 -07:00
semantic-release-bot
a3c136a07e chore(release): 1.2.4 [CI SKIP] 2022-07-25 19:44:53 +00:00
AAGaming
994b9e2cc6 fix(Modal): add closeModal 2022-07-25 15:44:06 -04:00
semantic-release-bot
801d70f300 chore(release): 1.2.3 [CI SKIP] 2022-07-25 19:34:45 +00:00
AAGaming
2fdfcdd478 fix(Modal): add another prop 2022-07-25 15:33:35 -04:00
semantic-release-bot
9a728611f4 chore(release): 1.2.2 [CI SKIP] 2022-07-25 19:30:30 +00:00
AAGaming
97997adfaf fix(Modal): add more props to typings 2022-07-25 15:29:38 -04:00
semantic-release-bot
279069ee34 chore(release): 1.2.1 [CI SKIP] 2022-07-13 01:07:46 +00:00
AAGaming
944a9024ff fix(ProgressBar): extend correct prop type 2022-07-12 21:06:46 -04:00
AAGaming
0a2220b4b4 chore(ProgressBar): formatting 2022-07-12 20:45:56 -04:00
8 changed files with 372 additions and 743 deletions

View File

@@ -1,3 +1,66 @@
# [1.6.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.5.1...v1.6.0) (2022-08-13)
### Features
* **Utilities:** add wrapReactType utility ([7cf45cf](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/7cf45cf3718d6e5295115f28a5f4dd24c6ff14e3))
## [1.5.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.5.0...v1.5.1) (2022-08-10)
### Bug Fixes
* **security:** update for minimist pollution exploit ([1de979f](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/1de979f7135c8d5eea1faca3d480d662c5e41d3d))
# [1.5.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.4.0...v1.5.0) (2022-08-10)
### Features
* **ServerAPI:** add Toaster to serverAPI ([e2126af](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/e2126afd06f339a22dbbaea89b834157a5975b96))
# [1.4.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.3.0...v1.4.0) (2022-08-08)
### Features
* **utils:** add findInTree and findInReactTree ([b21dfcd](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/b21dfcdb661fd7ad43213756dadb6cfdf0ac1e94))
# [1.3.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.2.4...v1.3.0) (2022-08-02)
### Features
* **plugin:** api for patching existing routes ([5b29447](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/5b29447cfa597773a81aa233da9362346683505d))
## [1.2.4](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.2.3...v1.2.4) (2022-07-25)
### Bug Fixes
* **Modal:** add closeModal ([994b9e2](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/994b9e2cc6f41da3d813e6f339bd2fd30e4fa3ad))
## [1.2.3](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.2.2...v1.2.3) (2022-07-25)
### Bug Fixes
* **Modal:** add another prop ([2fdfcdd](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/2fdfcdd4788ea0d6483e92729c3102212f3ec0fb))
## [1.2.2](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.2.1...v1.2.2) (2022-07-25)
### Bug Fixes
* **Modal:** add more props to typings ([97997ad](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/97997adfaf1a68ef436279e6e48f34f5eaa9531c))
## [1.2.1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.2.0...v1.2.1) (2022-07-13)
### Bug Fixes
* **ProgressBar:** extend correct prop type ([944a902](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/944a9024ff20f0b596869564d014d7dd73e74254))
# [1.2.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v1.1.0...v1.2.0) (2022-07-13)

View File

@@ -1 +1,27 @@
# Decky Frontend Library
Library used to develop plugins used for use with [decky-loader](https://github.com/SteamDeckHomebrew/decky-loader).
## Decky Loader Discord [![Chat](https://img.shields.io/badge/chat-on%20discord-7289da.svg)](https://discord.gg/ZU74G2NJzk)
Please contact the developers here for questions and support that cannot be addressed via a Github issue.
## Developers and Contributors
This library is focused on usage by developers to provide custom React components based on those found in the Steam Deck's React UI.
This method allows developers to add UI elements and code without clobbering the existing UI of the deck in order to do so.
This library can also theoretically be used to extend existing UI elements of the Steam Deck UI but this has not been tested extensively.
### Getting Started (Contributors)
1. Clone the repository to your preferred location
2. If you wish to add features such as new UI components, please create a feature branch to PR to the original repo.
3. Bug/hotfixes are acceptable on the main branch,
### Getting Started (Developers)
If you would like a feature added to decky-frontend-lib, please request it via a Github issue.
If you want to start making a plugin with decky-frontend-lib, please direct your attention to the [decky-plugin-template](https://github.com/SteamDeckHomebrew/decky-plugin-template) repository.
This library can be found on [npm](https://www.npmjs.com/package/decky-frontend-lib) and as such you can pull it without a local copy for your project as needed.

946
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "decky-frontend-lib",
"version": "1.2.0",
"version": "1.6.0",
"description": "A library for building decky plugins",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@@ -54,7 +54,7 @@
"import-sort-style-module": "^6.0.0",
"jest": "^27.5.1",
"prettier-plugin-import-sort": "^0.0.7",
"semantic-release": "^19.0.2",
"semantic-release": "^19.0.3",
"shx": "^0.3.4",
"ts-jest": "^27.1.4",
"typescript": "^4.6.3"
@@ -72,5 +72,8 @@
"style": "module",
"parser": "typescript"
}
},
"dependencies": {
"minimist": "^1.2.6"
}
}

View File

@@ -16,7 +16,15 @@ export interface ModalRootProps {
onMiddleButton?(): void;
onCancel?(): void;
onOK?(): void;
onEscKeypress?(): void;
closeModal?(): void;
className?: string;
modalClassName?: string;
bAllowFullSize?: boolean;
bDestructiveWarning?: boolean;
bDisableBackgroundDismiss?: boolean;
bHideCloseIcon?: boolean;
bOKDisabled?: boolean;
}
export const ModalRoot = findModuleChild((m) => {

View File

@@ -10,7 +10,6 @@ export interface ProgressBarItemProps extends ItemProps {
focusable?: boolean;
}
export interface ProgressBarProps {
indeterminate?: boolean;
nTransitionSec?: number;
@@ -18,7 +17,7 @@ export interface ProgressBarProps {
focusable?: boolean;
}
export interface ProgressBarWithInfoProps extends ProgressBarProps {
export interface ProgressBarWithInfoProps extends ProgressBarItemProps {
sTimeRemaining?: ReactNode;
sOperationText?: ReactNode;
}
@@ -37,7 +36,6 @@ export const ProgressBarWithInfo = findModuleChild((m) => {
}
}) as VFC<ProgressBarWithInfoProps>;
export const ProgressBarItem = findModuleChild((m) => {
if (typeof m !== 'object') return undefined;
for (let prop in m) {

View File

@@ -1,4 +1,4 @@
import type { ComponentType } from 'react';
import type { ComponentType, ReactNode } from 'react';
import { RouteProps } from 'react-router';
export interface Plugin {
@@ -20,13 +20,34 @@ interface ServerResponseError {
type ServerResponse<TRes> = ServerResponseSuccess<TRes> | ServerResponseError;
interface RouterHook {
type RoutePatch = (route: RouteProps) => RouteProps;
export interface RouterHook {
addRoute(path: string, component: ComponentType, props?: Omit<RouteProps, 'path' | 'children'>): void;
addPatch(path: string, patch: RoutePatch): RoutePatch;
removePatch(path: string, patch: RoutePatch): void;
removeRoute(path: string): void;
}
export interface ToastData {
title: ReactNode;
body: ReactNode;
onClick?: () => void;
logo?: ReactNode;
icon?: ReactNode;
className?: string;
contentClassName?: string;
duration?: number
critical?: boolean
}
export interface Toaster {
toast(toast: ToastData): void;
}
export interface ServerAPI {
routerHook: RouterHook;
toaster: Toaster;
callPluginMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;
callServerMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;
fetchNoCors<TRes = {}>(url: RequestInfo, request?: RequestInit): Promise<ServerResponse<TRes>>;

View File

@@ -82,6 +82,11 @@ export function unpatch(obj: any, name: any): void {
obj[name] = obj[name].__deckyOrig;
}
export function wrapReactType(node: any) {
const oldComponent = node.type;
return node.type = (...args: any[]) => React.createElement(oldComponent, ...args)
}
export function getReactInstance(o: HTMLElement | Element | Node) {
return o[Object.keys(o).find(k => k.startsWith('__reactInternalInstance')) as string]
}
@@ -92,4 +97,33 @@ export function joinClassNames(...classes: string[]): string {
export function sleep(ms: number) {
return new Promise(res => setTimeout(res, ms));
}
}
// Based on https://github.com/GooseMod/GooseMod/blob/9ef146515a9e59ed4e25665ed365fd72fc0dcf23/src/util/react.js#L20
export interface findInTreeOpts {
walkable?: string[],
ignore?: string[]
}
export declare type findInTreeFilter = (element: any) => boolean
export const findInTree = (parent: any, filter: findInTreeFilter, opts: findInTreeOpts): any => {
const { walkable = null, ignore = [] } = opts ?? {};
if (!parent || typeof parent !== 'object') { // Parent is invalid to search through
return null;
}
if (filter(parent)) return parent; // Parent matches, just return
if (Array.isArray(parent)) { // Parent is an array, go through values
return parent.map((x) => findInTree(x, filter, opts)).find((x) => x);
}
// Parent is an object, go through values (or option to only use certain keys)
return (walkable || Object.keys(parent)).map((x) => !ignore.includes(x) && findInTree(parent[x], filter, opts)).find((x: any) => x);
};
export const findInReactTree = (node: any, filter: findInTreeFilter) => findInTree(node, filter, { // Specialised findInTree for React nodes
walkable: [ 'props', 'children', 'child', 'sibling' ]
});