mirror of
https://github.com/SteamDeckHomebrew/decky-frontend-lib.git
synced 2026-05-21 18:38:47 +02:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
73b8d52c7f | ||
|
|
2b8d2ae4db | ||
|
|
48de8928e4 | ||
|
|
d60715b755 | ||
|
|
a370c1f7d3 | ||
|
|
d83bada4af |
15
CHANGELOG.md
15
CHANGELOG.md
@@ -1,3 +1,18 @@
|
||||
# [4.6.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v4.5.0...v4.6.0) (2024-07-26)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **classMapper:** add findClassByName back ([2b8d2ae](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/2b8d2ae4dbd9a0c4a59a43be0101a0a8fe1c518f))
|
||||
|
||||
# [4.5.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v4.4.0...v4.5.0) (2024-07-24)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* **classMapper:** add classModuleMap, make findClass require ID ([a370c1f](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/a370c1f7d3dca0db56a346c98c28ed9681a415e0))
|
||||
* **webpack:** refactor to prepare for classMapper changes ([d83bada](https://github.com/SteamDeckHomebrew/decky-frontend-lib/commit/d83bada4af2d16c750955de9a52f94a0080a2c14))
|
||||
|
||||
# [4.4.0](https://github.com/SteamDeckHomebrew/decky-frontend-lib/compare/v4.3.1...v4.4.0) (2024-07-18)
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@decky/ui",
|
||||
"version": "4.4.0",
|
||||
"version": "4.6.0",
|
||||
"description": "A library for interacting with the Steam frontend in Decky plugins and elsewhere.",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { Module, findAllModules } from './webpack';
|
||||
import { Module, ModuleID, createModuleMapping } from './webpack';
|
||||
|
||||
export interface ClassModule {
|
||||
[name: string]: string;
|
||||
}
|
||||
|
||||
export const classMap: ClassModule[] = findAllModules((m: Module) => {
|
||||
export const classModuleMap: Map<ModuleID, ClassModule> = createModuleMapping((m: Module) => {
|
||||
if (typeof m == 'object' && !m.__esModule) {
|
||||
const keys = Object.keys(m);
|
||||
// special case some libraries
|
||||
@@ -17,8 +17,14 @@ export const classMap: ClassModule[] = findAllModules((m: Module) => {
|
||||
return false;
|
||||
});
|
||||
|
||||
export function findClass(name: string): string | void {
|
||||
return classMap.find((m) => m?.[name])?.[name];
|
||||
export const classMap = [...classModuleMap.values()];
|
||||
|
||||
export function findClass(id: string, name: string): string | void {
|
||||
return classModuleMap.get(id)?.[name];
|
||||
}
|
||||
|
||||
export function findClassByName(name: string): string | void {
|
||||
return classMap.find((m) => m[name])?.[name];
|
||||
}
|
||||
|
||||
export function findClassModule(filter: (module: any) => boolean): ClassModule | void {
|
||||
@@ -26,7 +32,7 @@ export function findClassModule(filter: (module: any) => boolean): ClassModule |
|
||||
}
|
||||
|
||||
export function unminifyClass(minifiedClass: string): string | void {
|
||||
for (let m of classMap) {
|
||||
for (let m of classModuleMap.values()) {
|
||||
for (let className of Object.keys(m)) {
|
||||
if (m[className] == minifiedClass) return className;
|
||||
}
|
||||
|
||||
@@ -11,12 +11,14 @@ function getQuickAccessWindow(): Window | null {
|
||||
|
||||
/**
|
||||
* Returns state indicating the visibility of quick access menu.
|
||||
*
|
||||
* @deprecated moved to @decky/api
|
||||
*
|
||||
* @returns `true` if quick access menu is visible and `false` otherwise.
|
||||
*
|
||||
* @example
|
||||
* import { FC, useEffect } from "react";
|
||||
* import { useQuickAccessVisible } from "decky-frontend-lib";
|
||||
* import { useQuickAccessVisible } from "@decky/ui";
|
||||
*
|
||||
* export const PluginPanelView: FC<{}> = ({ }) => {
|
||||
* const isVisible = useQuickAccessVisible();
|
||||
|
||||
@@ -9,20 +9,21 @@ declare global {
|
||||
const logger = new Logger('Webpack');
|
||||
|
||||
// In most case an object with getters for each property. Look for the first call to r.d in the module, usually near or at the top.
|
||||
export type ModuleID = string; // number string
|
||||
export type Module = any;
|
||||
export type Export = any;
|
||||
type FilterFn = (module: any) => boolean;
|
||||
type ExportFilterFn = (moduleExport: any, exportName?: any) => boolean;
|
||||
type FindFn = (module: any) => any;
|
||||
|
||||
export let modules: any = [];
|
||||
export let modules = new Map<ModuleID, Module>();
|
||||
|
||||
function initModuleCache() {
|
||||
const startTime = performance.now();
|
||||
logger.group('Webpack Module Init');
|
||||
// Webpack 5, currently on beta
|
||||
// Generate a fake module ID
|
||||
const id = Math.random(); // really should be an int and not a float but who cares
|
||||
const id = Symbol("@decky/ui");
|
||||
let webpackRequire!: ((id: any) => Module) & { m: object };
|
||||
// Insert our module in a new chunk.
|
||||
// The module will then be called with webpack's internal require function as its first argument
|
||||
@@ -39,14 +40,14 @@ function initModuleCache() {
|
||||
);
|
||||
|
||||
// Loop over every module ID
|
||||
for (let i of Object.keys(webpackRequire.m)) {
|
||||
for (let id of Object.keys(webpackRequire.m)) {
|
||||
try {
|
||||
const module = webpackRequire(i);
|
||||
const module = webpackRequire(id);
|
||||
if (module) {
|
||||
modules.push(module);
|
||||
modules.set(id, module);
|
||||
}
|
||||
} catch (e) {
|
||||
logger.debug('Ignoring require error for module', i, e);
|
||||
logger.debug('Ignoring require error for module', id, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +57,7 @@ function initModuleCache() {
|
||||
initModuleCache();
|
||||
|
||||
export const findModule = (filter: FilterFn) => {
|
||||
for (const m of modules) {
|
||||
for (const m of modules.values()) {
|
||||
if (m.default && filter(m.default)) return m.default;
|
||||
if (filter(m)) return m;
|
||||
}
|
||||
@@ -65,8 +66,8 @@ export const findModule = (filter: FilterFn) => {
|
||||
export const findModuleDetailsByExport = (
|
||||
filter: ExportFilterFn,
|
||||
minExports?: number,
|
||||
): [module: Module | undefined, moduleExport: any, exportName: any] => {
|
||||
for (const m of modules) {
|
||||
): [module: Module | undefined, moduleExport: any, exportName: any, moduleID: string | undefined] => {
|
||||
for (const [id, m] of modules) {
|
||||
if (!m) continue;
|
||||
for (const mod of [m.default, m]) {
|
||||
if (typeof mod !== 'object') continue;
|
||||
@@ -75,7 +76,7 @@ export const findModuleDetailsByExport = (
|
||||
if (mod?.[exportName]) {
|
||||
const filterRes = filter(mod[exportName], exportName);
|
||||
if (filterRes) {
|
||||
return [mod, mod[exportName], exportName];
|
||||
return [mod, mod[exportName], exportName, id];
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
@@ -83,7 +84,7 @@ export const findModuleDetailsByExport = (
|
||||
}
|
||||
}
|
||||
}
|
||||
return [undefined, undefined, undefined];
|
||||
return [undefined, undefined, undefined, undefined];
|
||||
};
|
||||
|
||||
export const findModuleByExport = (filter: ExportFilterFn, minExports?: number) => {
|
||||
@@ -98,7 +99,7 @@ export const findModuleExport = (filter: ExportFilterFn, minExports?: number) =>
|
||||
* @deprecated use findModuleExport instead
|
||||
*/
|
||||
export const findModuleChild = (filter: FindFn) => {
|
||||
for (const m of modules) {
|
||||
for (const m of modules.values()) {
|
||||
for (const mod of [m.default, m]) {
|
||||
const filterRes = filter(mod);
|
||||
if (filterRes) {
|
||||
@@ -110,10 +111,13 @@ export const findModuleChild = (filter: FindFn) => {
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @deprecated use createModuleMapping instead
|
||||
*/
|
||||
export const findAllModules = (filter: FilterFn) => {
|
||||
const out = [];
|
||||
|
||||
for (const m of modules) {
|
||||
for (const m of modules.values()) {
|
||||
if (m.default && filter(m.default)) out.push(m.default);
|
||||
if (filter(m)) out.push(m);
|
||||
}
|
||||
@@ -121,7 +125,18 @@ export const findAllModules = (filter: FilterFn) => {
|
||||
return out;
|
||||
};
|
||||
|
||||
export const CommonUIModule = modules.find((m: Module) => {
|
||||
export const createModuleMapping = (filter: FilterFn) => {
|
||||
const mapping = new Map<ModuleID, Module>();
|
||||
|
||||
for (const [id, m] of modules) {
|
||||
if (m.default && filter(m.default)) mapping.set(id, m.default);
|
||||
if (filter(m)) mapping.set(id, m);
|
||||
}
|
||||
|
||||
return mapping;
|
||||
};
|
||||
|
||||
export const CommonUIModule = findModule((m: Module) => {
|
||||
if (typeof m !== 'object') return false;
|
||||
for (let prop in m) {
|
||||
if (m[prop]?.contextType?._currentValue && Object.keys(m).length > 60) return true;
|
||||
|
||||
Reference in New Issue
Block a user