mirror of
https://github.com/SteamDeckHomebrew/decky-frontend-lib.git
synced 2026-05-21 10:29:00 +02:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fccfdd6f11 | ||
|
|
f124480af8 | ||
|
|
15e672afef | ||
|
|
bf0c2b17bf | ||
|
|
0625dc385a | ||
|
|
b04992d29c | ||
|
|
228fe1f22c | ||
|
|
5d4214176e | ||
|
|
62bf0eaffa | ||
|
|
43b04b267e | ||
|
|
58595d54ea | ||
|
|
aec27a18a7 | ||
|
|
f101e23c1c | ||
|
|
5b3ea8f63f | ||
|
|
07ccceb990 |
3
.commitlintrc.json
Normal file
3
.commitlintrc.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"extends": ["@commitlint/config-conventional"]
|
||||||
|
}
|
||||||
29
.github/workflows/release.yaml
vendored
Normal file
29
.github/workflows/release.yaml
vendored
Normal 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
4
.husky/commit-msg
Executable file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env sh
|
||||||
|
. "$(dirname -- "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
npx --no -- commitlint --edit "${1}"
|
||||||
17
.releaserc.json
Normal file
17
.releaserc.json
Normal 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
20
CHANGELOG.md
Normal 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))
|
||||||
12332
package-lock.json
generated
12332
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
19
package.json
19
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "decky-frontend-lib",
|
"name": "decky-frontend-lib",
|
||||||
"version": "0.0.4",
|
"version": "0.3.0",
|
||||||
"description": "A library for building decky plugins",
|
"description": "A library for building decky plugins",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"types": "dist/index.d.ts",
|
"types": "dist/index.d.ts",
|
||||||
@@ -9,7 +9,9 @@
|
|||||||
"build": "shx rm -rf dist && tsc -b",
|
"build": "shx rm -rf dist && tsc -b",
|
||||||
"dev": "tsc -b -w",
|
"dev": "tsc -b -w",
|
||||||
"prepack": "npm run build",
|
"prepack": "npm run build",
|
||||||
"test": "jest"
|
"test": "echo 'No tests for now!'",
|
||||||
|
"postinstall": "husky install",
|
||||||
|
"commit": "git-cz"
|
||||||
},
|
},
|
||||||
"files": [
|
"files": [
|
||||||
"/lib",
|
"/lib",
|
||||||
@@ -32,13 +34,26 @@
|
|||||||
"url": "https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues"
|
"url": "https://github.com/SteamDeckHomebrew/decky-frontend-lib/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/SteamDeckHomebrew/decky-frontend-lib#readme",
|
"homepage": "https://github.com/SteamDeckHomebrew/decky-frontend-lib#readme",
|
||||||
|
"config": {
|
||||||
|
"commitizen": {
|
||||||
|
"path": "@commitlint/cz-commitlint"
|
||||||
|
}
|
||||||
|
},
|
||||||
"devDependencies": {
|
"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/jest": "^27.4.1",
|
||||||
"@types/react": "16.14.0",
|
"@types/react": "16.14.0",
|
||||||
"@types/react-router": "5.1.18",
|
"@types/react-router": "5.1.18",
|
||||||
|
"commitizen": "^4.2.4",
|
||||||
|
"husky": "^8.0.1",
|
||||||
"import-sort-style-module": "^6.0.0",
|
"import-sort-style-module": "^6.0.0",
|
||||||
"jest": "^27.5.1",
|
"jest": "^27.5.1",
|
||||||
"prettier-plugin-import-sort": "^0.0.7",
|
"prettier-plugin-import-sort": "^0.0.7",
|
||||||
|
"semantic-release": "^19.0.2",
|
||||||
"shx": "^0.3.4",
|
"shx": "^0.3.4",
|
||||||
"ts-jest": "^27.1.4",
|
"ts-jest": "^27.1.4",
|
||||||
"typescript": "^4.6.3"
|
"typescript": "^4.6.3"
|
||||||
|
|||||||
11
src/deck-components/Menu.tsx
Normal file → Executable file
11
src/deck-components/Menu.tsx
Normal file → Executable file
@@ -1,7 +1,16 @@
|
|||||||
import { FC } from 'react';
|
import { FC, ReactNode } from 'react';
|
||||||
|
|
||||||
import { findModuleChild } from '../webpack';
|
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 {
|
interface MenuProps {
|
||||||
label: string;
|
label: string;
|
||||||
onCancel?(): void;
|
onCancel?(): void;
|
||||||
|
|||||||
24
src/deck-components/Modal.tsx
Normal file → Executable file
24
src/deck-components/Modal.tsx
Normal file → Executable file
@@ -1,12 +1,28 @@
|
|||||||
import { ReactNode } from 'react';
|
import { FC, ReactNode } from 'react';
|
||||||
|
|
||||||
import { findModuleChild } from '../webpack';
|
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;
|
if (typeof m !== 'object') return undefined;
|
||||||
for (let prop in m) {
|
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];
|
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>;
|
||||||
38
src/deck-components/Router.tsx
Normal file
38
src/deck-components/Router.tsx
Normal 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
10
src/deck-components/Spinner.tsx
Normal file → Executable file
@@ -2,15 +2,7 @@ import { FC } from 'react';
|
|||||||
|
|
||||||
import { IconsModule } from '../webpack';
|
import { IconsModule } from '../webpack';
|
||||||
|
|
||||||
// interface ButtonProps {
|
// TODO type this and other icons?
|
||||||
// label?: string;
|
|
||||||
// description?: string;
|
|
||||||
// layout?: 'below';
|
|
||||||
// onClick?(e: MouseEvent): void;
|
|
||||||
// disabled?: boolean;
|
|
||||||
// bottomSeparator?: boolean;
|
|
||||||
// }
|
|
||||||
|
|
||||||
export const Spinner = Object.values(IconsModule).find((mod: any) =>
|
export const Spinner = Object.values(IconsModule).find((mod: any) =>
|
||||||
mod?.toString && /Spinner\)}\),.\.createElement\(\"path\",{d:\"M18 /.test(mod.toString())
|
mod?.toString && /Spinner\)}\),.\.createElement\(\"path\",{d:\"M18 /.test(mod.toString())
|
||||||
) as FC<{}>;
|
) as FC<{}>;
|
||||||
9
src/deck-components/SteamSpinner.tsx
Executable file
9
src/deck-components/SteamSpinner.tsx
Executable 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
2
src/deck-components/index.ts
Normal file → Executable file
@@ -3,7 +3,9 @@ export * from './ButtonItem';
|
|||||||
export * from './Menu';
|
export * from './Menu';
|
||||||
export * from './Modal';
|
export * from './Modal';
|
||||||
export * from './Panel';
|
export * from './Panel';
|
||||||
|
export * from './Router';
|
||||||
export * from './Slider';
|
export * from './Slider';
|
||||||
export * from './Spinner';
|
export * from './Spinner';
|
||||||
export * from './static-classes';
|
export * from './static-classes';
|
||||||
|
export * from './SteamSpinner';
|
||||||
export * from './Toggle';
|
export * from './Toggle';
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ declare global {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
type Module = any;
|
export type Module = any;
|
||||||
type FilterFn = (module: any) => boolean;
|
type FilterFn = (module: any) => boolean;
|
||||||
type FindFn = (module: any) => any;
|
type FindFn = (module: any) => any;
|
||||||
|
|
||||||
@@ -59,23 +59,17 @@ export const CommonUIModule = allModules.find((m: Module) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const IconsModule = findModule((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) {
|
for (let prop in m) {
|
||||||
if (m[prop]?.toString && /Spinner\)}\),.\.createElement\(\"path\",{d:\"M18 /.test(m[prop].toString())) return true;
|
if (m[prop]?.toString && /Spinner\)}\),.\.createElement\(\"path\",{d:\"M18 /.test(m[prop].toString())) return true;
|
||||||
}
|
}
|
||||||
return false;
|
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) => {
|
export const ReactRouter = allModules.find((m: Module) => {
|
||||||
if (typeof m !== "object") return undefined;
|
if (typeof m !== 'object') return undefined;
|
||||||
for (let prop in m) {
|
for (let prop in m) {
|
||||||
if (m[prop]?.computeRootMatch) return true
|
if (m[prop]?.computeRootMatch) return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
})
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user