Compare commits

..

16 Commits

Author SHA1 Message Date
semantic-release-bot
fccfdd6f11 chore(release): 0.3.0 [CI SKIP] 2022-06-04 17:43:17 +00:00
AAGaming
f124480af8 feat(typings): add Navigate to router typings 2022-06-04 13:42:23 -04:00
semantic-release-bot
15e672afef chore(release): 0.2.0 [CI SKIP] 2022-06-04 08:54:45 +00:00
Jonas Dellinger
bf0c2b17bf feat(router): expose GetQuickAccessTab and rename QuickAccessTabs to QuickAccessTab 2022-06-04 10:54:01 +02:00
Jonas Dellinger
0625dc385a chore(release): add NPM releaser 2022-06-04 10:49:30 +02:00
semantic-release-bot
b04992d29c chore(release): 0.1.0 [CI SKIP] 2022-06-04 08:44:52 +00:00
Jonas Dellinger
228fe1f22c chore(release): fix release script by installing commitlint cli 2022-06-04 10:44:01 +02:00
Jonas Dellinger
5d4214176e chore(release): try to fix commit message when releasing 2022-06-04 10:37:09 +02:00
Jonas Dellinger
62bf0eaffa feat(router): types for steam router 2022-06-04 10:33:59 +02:00
Jonas Dellinger
43b04b267e chore(release): disable jest for now 2022-06-04 10:19:04 +02:00
Jonas Dellinger
58595d54ea chore(release): fix branch selector 2022-06-04 10:17:17 +02:00
Jonas Dellinger
aec27a18a7 chore(release): introduce release pipeline 2022-06-04 10:14:59 +02:00
Jonas Dellinger
f101e23c1c 0.0.6 2022-06-02 17:58:18 +02:00
Jonas Dellinger
5b3ea8f63f 0.0.5 2022-06-02 17:57:48 +02:00
AAGaming
07ccceb990 add modal support, showModal->showContextMenu and new showModal 2022-06-01 17:51:17 -04:00
Jonas Dellinger
536269b1b7 Expose routerhook 2022-05-30 21:00:38 +02:00
15 changed files with 12520 additions and 112 deletions

3
.commitlintrc.json Normal file
View File

@@ -0,0 +1,3 @@
{
"extends": ["@commitlint/config-conventional"]
}

29
.github/workflows/release.yaml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: Release
on:
push:
branches:
- main
jobs:
release:
name: Release
runs-on: ubuntu-22.04
steps:
- name: Setup | Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Setup | Node.js
uses: actions/setup-node@v3
with:
node-version: 16
- name: Setup | Dependencies
run: npm ci
- name: Test
run: npm test
- name: Release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
run: npm exec semantic-release

4
.husky/commit-msg Executable file
View File

@@ -0,0 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx --no -- commitlint --edit "${1}"

17
.releaserc.json Normal file
View File

@@ -0,0 +1,17 @@
{
"branches": ["main", "dev"],
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/changelog",
"@semantic-release/npm",
"@semantic-release/github",
[
"@semantic-release/git",
{
"assets": ["CHANGELOG.md", "package.json"],
"message": "chore(release): ${nextRelease.version} [CI SKIP]"
}
]
]
}

20
CHANGELOG.md Normal file
View File

@@ -0,0 +1,20 @@
# [0.3.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.2.0...v0.3.0) (2022-06-04)
### Features
* **typings:** add Navigate to router typings ([f124480](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/f124480af8082d24730ed03fdf88742f76abc026))
# [0.2.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.1.0...v0.2.0) (2022-06-04)
### Features
* **router:** expose GetQuickAccessTab and rename QuickAccessTabs to QuickAccessTab ([bf0c2b1](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/bf0c2b17bfc4e67a8aa90cfee6a91bd1482720d4))
# [0.1.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v0.0.6...v0.1.0) (2022-06-04)
### Features
* **router:** types for steam router ([62bf0ea](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/62bf0eaffa83d85245a038ffe3819315bd02f045))

12418
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": "0.0.4",
"version": "0.3.0",
"description": "A library for building decky plugins",
"main": "dist/index.js",
"types": "dist/index.d.ts",
@@ -9,7 +9,9 @@
"build": "shx rm -rf dist && tsc -b",
"dev": "tsc -b -w",
"prepack": "npm run build",
"test": "jest"
"test": "echo 'No tests for now!'",
"postinstall": "husky install",
"commit": "git-cz"
},
"files": [
"/lib",
@@ -32,12 +34,26 @@
"url": "https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues"
},
"homepage": "https://github.com/SteamDeckHomebrew/decky-frontend-lib#readme",
"config": {
"commitizen": {
"path": "@commitlint/cz-commitlint"
}
},
"devDependencies": {
"@commitlint/cli": "^17.0.2",
"@commitlint/config-conventional": "^17.0.2",
"@commitlint/cz-commitlint": "^17.0.0",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/git": "^10.0.1",
"@types/jest": "^27.4.1",
"@types/react": "16.14.0",
"@types/react-router": "5.1.18",
"commitizen": "^4.2.4",
"husky": "^8.0.1",
"import-sort-style-module": "^6.0.0",
"jest": "^27.5.1",
"prettier-plugin-import-sort": "^0.0.7",
"semantic-release": "^19.0.2",
"shx": "^0.3.4",
"ts-jest": "^27.1.4",
"typescript": "^4.6.3"

11
src/deck-components/Menu.tsx Normal file → Executable file
View File

@@ -1,7 +1,16 @@
import { FC } from 'react';
import { FC, ReactNode } from 'react';
import { findModuleChild } from '../webpack';
export const showContextMenu: (children: ReactNode, parent?: EventTarget) => void = findModuleChild((m) => {
if (typeof m !== 'object') return undefined;
for (let prop in m) {
if (typeof m[prop] === 'function' && m[prop].toString().includes('stopPropagation))')) {
return m[prop];
}
}
});
interface MenuProps {
label: string;
onCancel?(): void;

24
src/deck-components/Modal.tsx Normal file → Executable file
View File

@@ -1,12 +1,28 @@
import { ReactNode } from 'react';
import { FC, ReactNode } from 'react';
import { findModuleChild } from '../webpack';
export const showModal: (children: ReactNode, parent: EventTarget) => void = findModuleChild((m) => {
// TODO: there is another argument, figure out what it does
export const showModal: (children: ReactNode, parent?: EventTarget) => void = findModuleChild((m) => {
if (typeof m !== 'object') return undefined;
for (let prop in m) {
if (typeof m[prop] === 'function' && m[prop].toString().includes('stopPropagation))')) {
if (typeof m[prop] === 'function' && m[prop].toString().includes('bHideMainWindowForPopouts:!0')) {
return m[prop];
}
}
});
interface ModalRootProps {
onMiddleButton?(): void,
onCancel?(): void;
onOK?(): void;
bAllowFullSize?: boolean;
}
export const ModalRoot = findModuleChild(m => {
if (typeof m !== "object") return undefined;
for (let prop in m) {
if (!m[prop]?.prototype?.OK && m[prop]?.prototype?.Cancel && m[prop]?.prototype?.render) {
return m[prop];
}
}
}) as FC<ModalRootProps>;

View File

@@ -0,0 +1,38 @@
import { Module, findModuleChild } from '../webpack';
export enum SideMenu {
None,
Main,
QuickAccess,
}
export enum QuickAccessTab {
Notifications,
RemotePlayTogetherControls,
VoiceChat,
Friends,
Settings,
Perf,
Help,
Decky,
}
interface Router {
CloseSideMenus(): void;
OpenQuickAccessMenu(quickAccessTab: QuickAccessTab): void;
GetQuickAccessTab(): QuickAccessTab;
Navigate(path: string): void;
NavigateToExternalWeb(url: string): void;
ToggleSideMenu(sideMenu: SideMenu): void;
CloseSideMenus(): void;
OpenSideMenu(sideMenu: SideMenu): void;
OpenPowerMenu(unknown?: any): void;
get RunningApps(): any;
}
export const Router = findModuleChild((m: Module) => {
if (typeof m !== 'object') return undefined;
for (let prop in m) {
if (m[prop]?.Navigate && m[prop]?.NavigationManager) return m[prop];
}
}) as Router;

10
src/deck-components/Spinner.tsx Normal file → Executable file
View File

@@ -2,15 +2,7 @@ import { FC } from 'react';
import { IconsModule } from '../webpack';
// interface ButtonProps {
// label?: string;
// description?: string;
// layout?: 'below';
// onClick?(e: MouseEvent): void;
// disabled?: boolean;
// bottomSeparator?: boolean;
// }
// TODO type this and other icons?
export const Spinner = Object.values(IconsModule).find((mod: any) =>
mod?.toString && /Spinner\)}\),.\.createElement\(\"path\",{d:\"M18 /.test(mod.toString())
) as FC<{}>;

View File

@@ -0,0 +1,9 @@
import { FC } from 'react';
import { findModuleChild } from '../webpack';
export const SteamSpinner = findModuleChild((m) => {
if (typeof m !== "object") return undefined;
for (let prop in m) {
if (m[prop]?.toString()?.includes("Steam Spinner") && m[prop].toString().includes("PreloadThrobber")) return m[prop]
}
}) as FC<{}>;

2
src/deck-components/index.ts Normal file → Executable file
View File

@@ -3,7 +3,9 @@ export * from './ButtonItem';
export * from './Menu';
export * from './Modal';
export * from './Panel';
export * from './Router';
export * from './Slider';
export * from './Spinner';
export * from './static-classes';
export * from './SteamSpinner';
export * from './Toggle';

View File

@@ -1,3 +1,6 @@
import type { ComponentType } from 'react';
import { RouteProps } from 'react-router';
export interface Plugin {
title: JSX.Element;
icon: JSX.Element;
@@ -17,7 +20,13 @@ interface ServerResponseError {
type ServerResponse<TRes> = ServerResponseSuccess<TRes> | ServerResponseError;
interface RouterHook {
addRoute(path: string, component: ComponentType, props?: Omit<RouteProps, 'path' | 'children'>): void;
removeRoute(path: string): void;
}
export interface ServerAPI {
routerHook: RouterHook;
callPluginMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;
callServerMethod<TArgs = {}, TRes = {}>(methodName: string, args: TArgs): Promise<ServerResponse<TRes>>;
fetchNoCors<TRes = {}>(url: string, request: RequestInfo): Promise<ServerResponse<TRes>>;

View File

@@ -5,7 +5,7 @@ declare global {
}
// TODO
type Module = any;
export type Module = any;
type FilterFn = (module: any) => boolean;
type FindFn = (module: any) => any;
@@ -59,23 +59,17 @@ export const CommonUIModule = allModules.find((m: Module) => {
});
export const IconsModule = findModule((m: Module) => {
if (typeof m !== "object") return false;
if (typeof m !== 'object') return false;
for (let prop in m) {
if (m[prop]?.toString && /Spinner\)}\),.\.createElement\(\"path\",{d:\"M18 /.test(m[prop].toString())) return true;
}
return false;
})
export const Router = findModuleChild((m: Module) => {
if (typeof m !== "object") return undefined;
for (let prop in m) {
if (m[prop]?.Navigate && m[prop]?.NavigationManager) return m[prop]
}
})
});
export const ReactRouter = allModules.find((m: Module) => {
if (typeof m !== "object") return undefined;
if (typeof m !== 'object') return undefined;
for (let prop in m) {
if (m[prop]?.computeRootMatch) return true
if (m[prop]?.computeRootMatch) return true;
}
return false;
})
});