diff --git a/.gitignore b/.gitignore index c0a6444..b3a0df9 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ coverage # Dependency directory node_modules bower_components +.pnpm-store # Editors .idea diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d9233d0 --- /dev/null +++ b/Makefile @@ -0,0 +1,106 @@ +ifneq (,$(wildcard ./.env)) + include .env + export +endif + +SHELL=bash + +help: ## Display list of tasks with descriptions + @echo "+ $@" + @fgrep -h ": ## " $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed 's/-default//' | awk 'BEGIN {FS = ": ## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +vendor: ## Install project dependencies + @echo "+ $@" + @pnpm i + +env: ## Create default .env file + @echo "+ $@" + @echo -e '# Makefile tools\nDECK_USER=deck\nDECK_HOST=\nDECK_PORT=22\nDECK_HOME=/home/deck\nDECK_KEY=~/.ssh/id_rsa' >> .env + @echo -n "PLUGIN_FOLDER=" >> .env + @jq -r .name package.json >> .env + +init: ## Initialize project + @$(MAKE) env + @$(MAKE) vendor + @echo -e "\n\033[1;36m Almost ready! Just a few things left to do:\033[0m\n" + @echo -e "1. Open .env file and make sure every DECK_* variable matches your steamdeck's ip/host, user, etc" + @echo -e "2. Run \`\033[0;36mmake copy-ssh-key\033[0m\` to copy your public ssh key to steamdeck" + @echo -e "3. Build your code with \`\033[0;36mmake build\033[0m\` or \`\033[0;36mmake docker-build\033[0m\` to build inside a docker container" + @echo -e "4. Deploy your plugin code to steamdeck with \`\033[0;36mmake deploy\033[0m\`" + +update-frontend-lib: ## Update decky-frontend-lib + @echo "+ $@" + @pnpm update decky-frontend-lib --latest + +build-front: ## Build frontend + @echo "+ $@" + @pnpm run build + +build-back: ## Build backend + @echo "+ $@" + @make -C ./backend + +build: ## Build everything + @$(MAKE) build-front build-back + +copy-ssh-key: ## Copy public ssh key to steamdeck + @echo "+ $@" + @ssh-copy-id -i $(DECK_KEY) $(DECK_USER)@$(DECK_HOST) + +deploy-steamdeck: ## Deploy plugin build to steamdeck + @echo "+ $@" + @ssh $(DECK_USER)@$(DECK_HOST) -p $(DECK_PORT) -i $(DECK_KEY) \ + 'chmod -v 755 $(DECK_HOME)/homebrew/plugins/ && mkdir -p $(DECK_HOME)/homebrew/plugins/$(PLUGIN_FOLDER)' + @rsync -azp --delete --progress -e "ssh -i $(DECK_KEY)" \ + --chmod=Du=rwx,Dg=rx,Do=rx,Fu=rwx,Fg=rx,Fo=rx \ + --exclude='.git/' \ + --exclude='.github/' \ + --exclude='.vscode/' \ + --exclude='node_modules/' \ + --exclude='.pnpm-store/' \ + --exclude='src/' \ + --exclude='*.log' \ + --exclude='.gitignore' . \ + --exclude='.idea' . \ + --exclude='.env' . \ + --exclude='Makefile' . \ + ./ $(DECK_USER)@$(DECK_HOST):$(DECK_HOME)/homebrew/plugins/$(PLUGIN_FOLDER)/ + @ssh $(DECK_USER)@$(DECK_HOST) -p $(DECK_PORT) -i $(DECK_KEY) \ + 'chmod -v 755 $(DECK_HOME)/homebrew/plugins/' + +restart-decky: ## Restart Decky on remote steamdeck + @echo "+ $@" + @ssh -t $(DECK_USER)@$(DECK_HOST) -p $(DECK_PORT) -i $(DECK_KEY) \ + 'sudo systemctl restart plugin_loader.service' + @echo -e '\033[0;32m+ all is good, restarting Decky...\033[0m' + +deploy: ## Deploy code to steamdeck and restart Decky + @$(MAKE) deploy-steamdeck + @$(MAKE) restart-decky + +it: ## Build all code, deploy it to steamdeck, restart Decky + @$(MAKE) build deploy + +cleanup: ## Delete all generated files and folders + @echo "+ $@" + @rm -f .env + @rm -rf ./dist + @rm -rf ./tmp + @rm -rf ./node_modules + @rm -rf ./.pnpm-store + @rm -rf ./backend/out + +uninstall-plugin: ## Uninstall plugin from steamdeck, restart Decky + @echo "+ $@" + @ssh -t $(DECK_USER)@$(DECK_HOST) -p $(DECK_PORT) -i $(DECK_KEY) \ + "sudo sh -c 'rm -rf $(DECK_HOME)/homebrew/plugins/$(PLUGIN_FOLDER)/ && systemctl restart plugin_loader.service'" + @echo -e '\033[0;32m+ all is good, restarting Decky...\033[0m' + +docker-rebuild-image: ## Rebuild docker image + @echo "+ $@" + @docker compose build --pull + +docker-build: ## Build project inside docker container + @$(MAKE) build-back + @echo "+ $@" + @docker run --rm -i -v $(PWD):/plugin -v $(PWD)/tmp/out:/out ghcr.io/steamdeckhomebrew/builder:latest diff --git a/package.json b/package.json index a5263a1..966b021 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "typescript": "^4.7.4" }, "dependencies": { - "decky-frontend-lib": "^3.6.1", + "decky-frontend-lib": "^3.18.10", "react-icons": "^4.4.0" }, "pnpm": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1816ea8..424131a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,7 +8,7 @@ specifiers: '@rollup/plugin-typescript': ^8.3.3 '@types/react': 16.14.0 '@types/webpack': ^5.28.0 - decky-frontend-lib: ^3.6.1 + decky-frontend-lib: ^3.18.10 react-icons: ^4.4.0 rollup: ^2.77.1 rollup-plugin-import-assets: ^1.1.1 @@ -17,7 +17,7 @@ specifiers: typescript: ^4.7.4 dependencies: - decky-frontend-lib: 3.6.1 + decky-frontend-lib: 3.18.10 react-icons: 4.4.0 devDependencies: @@ -418,10 +418,8 @@ packages: resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} dev: true - /decky-frontend-lib/3.6.1: - resolution: {integrity: sha512-NBlltn4EktqFgD1fj2AU0ccJJNMNgcqCnmhYd34Z5xR7ypGNT2oSqfSvFIlzU4WbDL9RyrcHSJlSMdYk6n4NXA==} - dependencies: - minimist: 1.2.7 + /decky-frontend-lib/3.18.10: + resolution: {integrity: sha512-2mgbA3sSkuwQR/FnmhXVrcW6LyTS95IuL6muJAmQCruhBvXapDtjk1TcgxqMZxFZwGD1IPnemPYxHZll6IgnZw==} dev: false /deepmerge/4.2.2: @@ -640,10 +638,6 @@ packages: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} dev: true - /minimist/1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} - dev: false - /neo-async/2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true