Initial commit
commit
52f6ca1c58
@ -0,0 +1,37 @@
|
||||
lib-cov
|
||||
*.seed
|
||||
*.log
|
||||
*.csv
|
||||
*.dat
|
||||
*.out
|
||||
*.pid
|
||||
*.gz
|
||||
*.swp
|
||||
|
||||
pids
|
||||
logs
|
||||
results
|
||||
tmp
|
||||
|
||||
# Coverage reports
|
||||
coverage
|
||||
|
||||
# API keys and secrets
|
||||
.env
|
||||
|
||||
# Dependency directory
|
||||
node_modules
|
||||
bower_components
|
||||
|
||||
# Editors
|
||||
.idea
|
||||
*.iml
|
||||
|
||||
# OS metadata
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
# Ignore built ts files
|
||||
dist/
|
||||
|
||||
__pycache__/
|
@ -0,0 +1,9 @@
|
||||
class Plugin:
|
||||
# A normal method. It can be called from JavaScript using call_plugin_function("method_1", argument1, argument2)
|
||||
async def add(self, left, right):
|
||||
return left + right
|
||||
|
||||
|
||||
# Asyncio-compatible long-running code, executed in a task when the plugin is loaded
|
||||
async def _main(self):
|
||||
pass
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "decky-plugin-template",
|
||||
"version": "0.0.1",
|
||||
"description": "A template to quickly create decky plugins from scratch, based on TypeScript and webpack",
|
||||
"scripts": {
|
||||
"build": "shx rm -rf dist && rollup -c",
|
||||
"dev": "rollup -c -w",
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/SteamDeckHomebrew/decky-plugin-template.git"
|
||||
},
|
||||
"keywords": [
|
||||
"decky",
|
||||
"plugin",
|
||||
"plugin-template",
|
||||
"steam-deck",
|
||||
"deck"
|
||||
],
|
||||
"author": "Jonas Dellinger <jonas@dellinger.dev>",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"bugs": {
|
||||
"url": "https://github.com/SteamDeckHomebrew/decky-plugin-template/issues"
|
||||
},
|
||||
"homepage": "https://github.com/SteamDeckHomebrew/decky-plugin-template#readme",
|
||||
"devDependencies": {
|
||||
"@rollup/plugin-commonjs": "^21.1.0",
|
||||
"@rollup/plugin-node-resolve": "^13.2.1",
|
||||
"@rollup/plugin-replace": "^4.0.0",
|
||||
"@rollup/plugin-typescript": "^8.3.2",
|
||||
"@types/react": "16.14.0",
|
||||
"@types/webpack": "^5.28.0",
|
||||
"react": "16.14.0",
|
||||
"react-dom": "16.14.0",
|
||||
"rollup": "^2.70.2",
|
||||
"shx": "^0.3.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"decky-frontend-lib": "file:../decky-frontend-lib",
|
||||
"react-icons": "^4.3.1"
|
||||
}
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "Example Plugin",
|
||||
"author": "John Doe",
|
||||
"frontend_bundle": "dist/example-plugin.js",
|
||||
"flags": ["hot_reload", "_root"]
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
import commonjs from '@rollup/plugin-commonjs';
|
||||
import { nodeResolve } from '@rollup/plugin-node-resolve';
|
||||
import replace from '@rollup/plugin-replace';
|
||||
import typescript from '@rollup/plugin-typescript';
|
||||
import { defineConfig } from 'rollup';
|
||||
|
||||
export default defineConfig({
|
||||
input: './src/index.tsx',
|
||||
plugins: [
|
||||
commonjs(),
|
||||
nodeResolve(),
|
||||
typescript(),
|
||||
replace({
|
||||
preventAssignment: false,
|
||||
'process.env.NODE_ENV': JSON.stringify('production'),
|
||||
}),
|
||||
],
|
||||
context: 'window',
|
||||
external: ['react', 'react-dom'],
|
||||
output: {
|
||||
file: 'dist/example-plugin.js',
|
||||
globals: {
|
||||
react: 'SP_REACT',
|
||||
},
|
||||
format: 'iife',
|
||||
exports: 'default',
|
||||
},
|
||||
});
|
@ -0,0 +1,51 @@
|
||||
import {
|
||||
Button,
|
||||
definePlugin,
|
||||
PanelSection,
|
||||
PanelSectionRow,
|
||||
ServerAPI,
|
||||
TabTitle,
|
||||
} from "decky-frontend-lib";
|
||||
import { useState, VFC } from "react";
|
||||
import { FaShip } from "react-icons/fa";
|
||||
|
||||
interface AddMethodArgs {
|
||||
left: number;
|
||||
right: number;
|
||||
}
|
||||
|
||||
const Content: VFC<{ serverAPI: ServerAPI }> = ({ serverAPI }) => {
|
||||
const [result, setResult] = useState<number | undefined>();
|
||||
|
||||
const onClick = async () => {
|
||||
const result = await serverAPI.callPluginMethod<AddMethodArgs, number>(
|
||||
"add",
|
||||
{
|
||||
left: 2,
|
||||
right: 2,
|
||||
}
|
||||
);
|
||||
if (result.success) {
|
||||
setResult(result.result);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<PanelSection>
|
||||
<PanelSectionRow>
|
||||
<Button layout="below" bottomSeparator={false} onClick={onClick}>
|
||||
What is 2+2?
|
||||
</Button>
|
||||
<div>Server says: {result}</div>
|
||||
</PanelSectionRow>
|
||||
</PanelSection>
|
||||
);
|
||||
};
|
||||
|
||||
export default definePlugin((serverApi) => {
|
||||
return {
|
||||
title: <TabTitle>Example Plugin</TabTitle>,
|
||||
content: <Content serverAPI={serverApi} />,
|
||||
icon: <FaShip />,
|
||||
};
|
||||
});
|
@ -0,0 +1,22 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"outDir": "dist",
|
||||
"module": "ESNext",
|
||||
"target": "ES2020",
|
||||
"jsx": "react-jsx",
|
||||
"declaration": false,
|
||||
"moduleResolution": "node",
|
||||
"noUnusedLocals": true,
|
||||
"noUnusedParameters": true,
|
||||
"esModuleInterop": true,
|
||||
"noImplicitReturns": true,
|
||||
"noImplicitThis": true,
|
||||
"noImplicitAny": true,
|
||||
"strict": true,
|
||||
"suppressImplicitAnyIndexErrors": true,
|
||||
"allowSyntheticDefaultImports": true,
|
||||
"skipLibCheck": true
|
||||
},
|
||||
"include": ["src"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
Loading…
Reference in New Issue