Initial commit

This commit is contained in:
Jonas Dellinger 2022-04-23 00:42:11 +02:00
commit 52f6ca1c58
8 changed files with 2679 additions and 0 deletions

37
.gitignore vendored Normal file
View file

@ -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__/

9
main.py Normal file
View file

@ -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

2483
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

43
package.json Normal file
View file

@ -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"
}
}

6
plugin.json Normal file
View file

@ -0,0 +1,6 @@
{
"name": "Example Plugin",
"author": "John Doe",
"frontend_bundle": "dist/example-plugin.js",
"flags": ["hot_reload", "_root"]
}

28
rollup.config.js Normal file
View file

@ -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',
},
});

51
src/index.tsx Normal file
View file

@ -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 />,
};
});

22
tsconfig.json Normal file
View file

@ -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"]
}