feat: remove vue and work on init
Some checks failed
retro / xml (push) Successful in 22s
retro / php (push) Failing after 34s
retro / nodejs (push) Failing after 1m0s
retro / release (push) Has been skipped

This commit is contained in:
Michel Roux 2025-01-02 08:10:20 +01:00
parent 64361f02fe
commit dc16fc8c49
16 changed files with 524 additions and 2445 deletions

View File

@ -1,14 +1,7 @@
module.exports = { module.exports = {
extends: [ extends: ['@nextcloud', 'plugin:prettier/recommended'],
'@nextcloud',
'@vue/eslint-config-typescript/recommended',
'plugin:prettier/recommended',
],
parser: 'vue-eslint-parser',
rules: { rules: {
'jsdoc/require-jsdoc': 'off', 'jsdoc/require-jsdoc': 'off',
'vue/first-attribute-linebreak': 'off',
'sort-imports': 'error', 'sort-imports': 'error',
'vue/attributes-order': ['error', { alphabetical: true }],
}, },
} }

View File

@ -5,7 +5,7 @@
<name>Retro</name> <name>Retro</name>
<summary>🕹️ Play your favorite retro games in Nextcloud</summary> <summary>🕹️ Play your favorite retro games in Nextcloud</summary>
<description>An example description</description> <description>An example description</description>
<version>0.1.0</version> <version>1.0.0</version>
<licence>agpl</licence> <licence>agpl</licence>
<author mail="xefir@crystalyx.net" homepage="https://www.crystalyx.net">Michel Roux</author> <author mail="xefir@crystalyx.net" homepage="https://www.crystalyx.net">Michel Roux</author>
<namespace>Retro</namespace> <namespace>Retro</namespace>
@ -13,7 +13,7 @@
<website>https://git.crystalyx.net/Xefir/retro</website> <website>https://git.crystalyx.net/Xefir/retro</website>
<bugs>https://git.crystalyx.net/Xefir/retro/issues</bugs> <bugs>https://git.crystalyx.net/Xefir/retro/issues</bugs>
<dependencies> <dependencies>
<php min-version="8.1"/> <php min-version="8.2"/>
<nextcloud min-version="29" max-version="30"/> <nextcloud min-version="29" max-version="30"/>
</dependencies> </dependencies>
<navigations> <navigations>

View File

@ -16,7 +16,7 @@
"rector": "rector && composer cs:fix" "rector": "rector && composer cs:fix"
}, },
"require": { "require": {
"php": "^8.1" "php": "^8.2"
}, },
"require-dev": { "require-dev": {
"nextcloud/ocp": "^30.0.4", "nextcloud/ocp": "^30.0.4",
@ -24,13 +24,14 @@
"nextcloud/coding-standard": "^1.3.2", "nextcloud/coding-standard": "^1.3.2",
"nextcloud/rector": "^0.2.1", "nextcloud/rector": "^0.2.1",
"rector/rector": "~1.2.10", "rector/rector": "~1.2.10",
"symfony/mime": "^7.2.1",
"vimeo/psalm": "^5.26.1" "vimeo/psalm": "^5.26.1"
}, },
"config": { "config": {
"optimize-autoloader": true, "optimize-autoloader": true,
"sort-packages": true, "sort-packages": true,
"platform": { "platform": {
"php": "8.1" "php": "8.2"
} }
} }
} }

285
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "71be025f1b762a92e851b18347e49db6", "content-hash": "1c093d99c361ea9e5e1b4e69b06dd6d9",
"packages": [], "packages": [],
"packages-dev": [ "packages-dev": [
{ {
@ -1214,16 +1214,16 @@
}, },
{ {
"name": "phpstan/phpstan", "name": "phpstan/phpstan",
"version": "1.12.13", "version": "1.12.14",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpstan.git", "url": "https://github.com/phpstan/phpstan.git",
"reference": "9b469068840cfa031e1deaf2fa1886d00e20680f" "reference": "e73868f809e68fff33be961ad4946e2e43ec9e38"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b469068840cfa031e1deaf2fa1886d00e20680f", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e73868f809e68fff33be961ad4946e2e43ec9e38",
"reference": "9b469068840cfa031e1deaf2fa1886d00e20680f", "reference": "e73868f809e68fff33be961ad4946e2e43ec9e38",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1268,7 +1268,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-12-17T17:00:20+00:00" "time": "2024-12-31T07:26:13+00:00"
}, },
{ {
"name": "psr/clock", "name": "psr/clock",
@ -2387,29 +2387,29 @@
}, },
{ {
"name": "sebastian/diff", "name": "sebastian/diff",
"version": "5.1.1", "version": "6.0.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/diff.git", "url": "https://github.com/sebastianbergmann/diff.git",
"reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544",
"reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1" "php": ">=8.2"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^10.0", "phpunit/phpunit": "^11.0",
"symfony/process": "^6.4" "symfony/process": "^4.2 || ^5"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "5.1-dev" "dev-main": "6.0-dev"
} }
}, },
"autoload": { "autoload": {
@ -2442,7 +2442,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/diff/issues", "issues": "https://github.com/sebastianbergmann/diff/issues",
"security": "https://github.com/sebastianbergmann/diff/security/policy", "security": "https://github.com/sebastianbergmann/diff/security/policy",
"source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2"
}, },
"funding": [ "funding": [
{ {
@ -2450,7 +2450,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-02T07:15:17+00:00" "time": "2024-07-03T04:53:05+00:00"
}, },
{ {
"name": "spatie/array-to-xml", "name": "spatie/array-to-xml",
@ -2522,47 +2522,46 @@
}, },
{ {
"name": "symfony/console", "name": "symfony/console",
"version": "v6.4.15", "version": "v7.2.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/console.git", "url": "https://github.com/symfony/console.git",
"reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd" "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", "url": "https://api.github.com/repos/symfony/console/zipball/fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
"reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", "reference": "fefcc18c0f5d0efe3ab3152f15857298868dc2c3",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/deprecation-contracts": "^2.5|^3",
"symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-mbstring": "~1.0",
"symfony/service-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3",
"symfony/string": "^5.4|^6.0|^7.0" "symfony/string": "^6.4|^7.0"
}, },
"conflict": { "conflict": {
"symfony/dependency-injection": "<5.4", "symfony/dependency-injection": "<6.4",
"symfony/dotenv": "<5.4", "symfony/dotenv": "<6.4",
"symfony/event-dispatcher": "<5.4", "symfony/event-dispatcher": "<6.4",
"symfony/lock": "<5.4", "symfony/lock": "<6.4",
"symfony/process": "<5.4" "symfony/process": "<6.4"
}, },
"provide": { "provide": {
"psr/log-implementation": "1.0|2.0|3.0" "psr/log-implementation": "1.0|2.0|3.0"
}, },
"require-dev": { "require-dev": {
"psr/log": "^1|^2|^3", "psr/log": "^1|^2|^3",
"symfony/config": "^5.4|^6.0|^7.0", "symfony/config": "^6.4|^7.0",
"symfony/dependency-injection": "^5.4|^6.0|^7.0", "symfony/dependency-injection": "^6.4|^7.0",
"symfony/event-dispatcher": "^5.4|^6.0|^7.0", "symfony/event-dispatcher": "^6.4|^7.0",
"symfony/http-foundation": "^6.4|^7.0", "symfony/http-foundation": "^6.4|^7.0",
"symfony/http-kernel": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0",
"symfony/lock": "^5.4|^6.0|^7.0", "symfony/lock": "^6.4|^7.0",
"symfony/messenger": "^5.4|^6.0|^7.0", "symfony/messenger": "^6.4|^7.0",
"symfony/process": "^5.4|^6.0|^7.0", "symfony/process": "^6.4|^7.0",
"symfony/stopwatch": "^5.4|^6.0|^7.0", "symfony/stopwatch": "^6.4|^7.0",
"symfony/var-dumper": "^5.4|^6.0|^7.0" "symfony/var-dumper": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -2596,7 +2595,7 @@
"terminal" "terminal"
], ],
"support": { "support": {
"source": "https://github.com/symfony/console/tree/v6.4.15" "source": "https://github.com/symfony/console/tree/v7.2.1"
}, },
"funding": [ "funding": [
{ {
@ -2612,7 +2611,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-11-06T14:19:14+00:00" "time": "2024-12-11T03:49:26+00:00"
}, },
{ {
"name": "symfony/deprecation-contracts", "name": "symfony/deprecation-contracts",
@ -2683,25 +2682,25 @@
}, },
{ {
"name": "symfony/filesystem", "name": "symfony/filesystem",
"version": "v6.4.13", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/filesystem.git", "url": "https://github.com/symfony/filesystem.git",
"reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3" "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/4856c9cf585d5a0313d8d35afd681a526f038dd3", "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
"reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3", "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/polyfill-ctype": "~1.8", "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-mbstring": "~1.8" "symfony/polyfill-mbstring": "~1.8"
}, },
"require-dev": { "require-dev": {
"symfony/process": "^5.4|^6.4|^7.0" "symfony/process": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -2729,7 +2728,7 @@
"description": "Provides basic utilities for the filesystem", "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"support": { "support": {
"source": "https://github.com/symfony/filesystem/tree/v6.4.13" "source": "https://github.com/symfony/filesystem/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -2745,7 +2744,91 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-10-25T15:07:50+00:00" "time": "2024-10-25T15:15:23+00:00"
},
{
"name": "symfony/mime",
"version": "v7.2.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
"reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/mime/zipball/7f9617fcf15cb61be30f8b252695ed5e2bfac283",
"reference": "7f9617fcf15cb61be30f8b252695ed5e2bfac283",
"shasum": ""
},
"require": {
"php": ">=8.2",
"symfony/polyfill-intl-idn": "^1.10",
"symfony/polyfill-mbstring": "^1.0"
},
"conflict": {
"egulias/email-validator": "~3.0.0",
"phpdocumentor/reflection-docblock": "<3.2.2",
"phpdocumentor/type-resolver": "<1.4.0",
"symfony/mailer": "<6.4",
"symfony/serializer": "<6.4.3|>7.0,<7.0.3"
},
"require-dev": {
"egulias/email-validator": "^2.1.10|^3.1|^4",
"league/html-to-markdown": "^5.0",
"phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
"symfony/dependency-injection": "^6.4|^7.0",
"symfony/process": "^6.4|^7.0",
"symfony/property-access": "^6.4|^7.0",
"symfony/property-info": "^6.4|^7.0",
"symfony/serializer": "^6.4.3|^7.0.3"
},
"type": "library",
"autoload": {
"psr-4": {
"Symfony\\Component\\Mime\\": ""
},
"exclude-from-classmap": [
"/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Allows manipulating MIME messages",
"homepage": "https://symfony.com",
"keywords": [
"mime",
"mime-type"
],
"support": {
"source": "https://github.com/symfony/mime/tree/v7.2.1"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-12-07T08:50:44+00:00"
}, },
{ {
"name": "symfony/polyfill-ctype", "name": "symfony/polyfill-ctype",
@ -2904,6 +2987,89 @@
], ],
"time": "2024-09-09T11:45:10+00:00" "time": "2024-09-09T11:45:10+00:00"
}, },
{
"name": "symfony/polyfill-intl-idn",
"version": "v1.31.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773",
"reference": "c36586dcf89a12315939e00ec9b4474adcb1d773",
"shasum": ""
},
"require": {
"php": ">=7.2",
"symfony/polyfill-intl-normalizer": "^1.10"
},
"suggest": {
"ext-intl": "For best performance"
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Intl\\Idn\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Laurent Bassin",
"email": "laurent@bassin.info"
},
{
"name": "Trevor Rowbotham",
"email": "trevor.rowbotham@pm.me"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"idn",
"intl",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-09-09T11:45:10+00:00"
},
{ {
"name": "symfony/polyfill-intl-normalizer", "name": "symfony/polyfill-intl-normalizer",
"version": "v1.31.0", "version": "v1.31.0",
@ -3150,20 +3316,20 @@
}, },
{ {
"name": "symfony/string", "name": "symfony/string",
"version": "v6.4.15", "version": "v7.2.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/symfony/string.git", "url": "https://github.com/symfony/string.git",
"reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82",
"reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": ">=8.1", "php": ">=8.2",
"symfony/polyfill-ctype": "~1.8", "symfony/polyfill-ctype": "~1.8",
"symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-grapheme": "~1.0",
"symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0",
@ -3173,11 +3339,12 @@
"symfony/translation-contracts": "<2.5" "symfony/translation-contracts": "<2.5"
}, },
"require-dev": { "require-dev": {
"symfony/error-handler": "^5.4|^6.0|^7.0", "symfony/emoji": "^7.1",
"symfony/http-client": "^5.4|^6.0|^7.0", "symfony/error-handler": "^6.4|^7.0",
"symfony/intl": "^6.2|^7.0", "symfony/http-client": "^6.4|^7.0",
"symfony/intl": "^6.4|^7.0",
"symfony/translation-contracts": "^2.5|^3.0", "symfony/translation-contracts": "^2.5|^3.0",
"symfony/var-exporter": "^5.4|^6.0|^7.0" "symfony/var-exporter": "^6.4|^7.0"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -3216,7 +3383,7 @@
"utf8" "utf8"
], ],
"support": { "support": {
"source": "https://github.com/symfony/string/tree/v6.4.15" "source": "https://github.com/symfony/string/tree/v7.2.0"
}, },
"funding": [ "funding": [
{ {
@ -3232,7 +3399,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-11-13T13:31:12+00:00" "time": "2024-11-13T13:31:26+00:00"
}, },
{ {
"name": "vimeo/psalm", "name": "vimeo/psalm",
@ -3411,11 +3578,11 @@
"prefer-stable": false, "prefer-stable": false,
"prefer-lowest": false, "prefer-lowest": false,
"platform": { "platform": {
"php": "^8.1" "php": "^8.2"
}, },
"platform-dev": [], "platform-dev": [],
"platform-overrides": { "platform-overrides": {
"php": "8.1" "php": "8.2"
}, },
"plugin-api-version": "2.6.0" "plugin-api-version": "2.6.0"
} }

View File

@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="2 2 22 22"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path <path
d="M16.5,9L13.5,12L16.5,15H22V9M9,16.5V22H15V16.5L12,13.5M7.5,9H2V15H7.5L10.5,12M15,7.5V2H9V7.5L12,10.5L15,7.5Z" d="M7,6H17A6,6 0 0,1 23,12A6,6 0 0,1 17,18C15.22,18 13.63,17.23 12.53,16H11.47C10.37,17.23 8.78,18 7,18A6,6 0 0,1 1,12A6,6 0 0,1 7,6M6,9V11H4V13H6V15H8V13H10V11H8V9H6M15.5,12A1.5,1.5 0 0,0 14,13.5A1.5,1.5 0 0,0 15.5,15A1.5,1.5 0 0,0 17,13.5A1.5,1.5 0 0,0 15.5,12M18.5,9A1.5,1.5 0 0,0 17,10.5A1.5,1.5 0 0,0 18.5,12A1.5,1.5 0 0,0 20,10.5A1.5,1.5 0 0,0 18.5,9Z"
style="fill:#ffffff" /> style="fill:#ffffff" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 230 B

After

Width:  |  Height:  |  Size: 476 B

View File

@ -1,29 +0,0 @@
<?php
declare(strict_types=1);
namespace OCA\Retro\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\ApiRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;
class ApiController extends OCSController
{
/**
* An example API endpoint.
*
* @return DataResponse<Http::STATUS_OK, array{message: string}, array{}>
*
* 200: Data returned
*/
#[NoAdminRequired]
#[ApiRoute(verb: 'GET', url: '/api')]
public function index(): DataResponse {
return new DataResponse(
['message' => 'Hello world!']
);
}
}

View File

@ -9,16 +9,28 @@ use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Attribute\FrontpageRoute; use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired; use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Services\IInitialState;
use OCP\IRequest;
use OCP\Util;
class PageController extends Controller class PageController extends Controller
{ {
public function __construct(IRequest $request, private IInitialState $initialState)
{
parent::__construct(Application::APP_ID, $request);
}
#[NoCSRFRequired] #[NoCSRFRequired]
#[NoAdminRequired] #[NoAdminRequired]
#[OpenAPI(OpenAPI::SCOPE_IGNORE)] #[FrontpageRoute(verb: 'GET', url: '/{path}')]
#[FrontpageRoute(verb: 'GET', url: '/')] public function index(): TemplateResponse
public function index(): TemplateResponse { {
Util::addStyle(Application::APP_ID, Application::APP_ID . '-main');
Util::addScript(Application::APP_ID, Application::APP_ID . '-main');
$this->initialState->provideInitialState();
return new TemplateResponse( return new TemplateResponse(
Application::APP_ID, Application::APP_ID,
'index', 'index',

View File

@ -10,6 +10,9 @@ use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener; use OCP\EventDispatcher\IEventListener;
use OCP\Util; use OCP\Util;
/**
* @implements IEventListener<Event>
*/
class LoadAdditionalScriptsListener implements IEventListener class LoadAdditionalScriptsListener implements IEventListener
{ {
public function handle(Event $event): void { public function handle(Event $event): void {

25
mime.php Normal file
View File

@ -0,0 +1,25 @@
<?php
// https://github.com/EmulatorJS/EmulatorJS/blob/main/index.html
declare(strict_types=1);
require_once __DIR__.'/vendor/autoload.php';
use Symfony\Component\Mime\MimeTypes;
$mime = new MimeTypes();
foreach ($argv as $i => $arg) {
if (!$i) {
continue;
}
$types = $mime->getMimeTypes($arg);
foreach ($types as $type) {
if (preg_match('/^application\/x-.*-rom$/', $type)) {
echo $type.PHP_EOL;
}
}
}

2395
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -9,10 +9,10 @@
"build": "vite build", "build": "vite build",
"dev": "vite --mode development build", "dev": "vite --mode development build",
"watch": "vite --mode development build --watch", "watch": "vite --mode development build --watch",
"lint": "vue-tsc && eslint src", "lint": "tsc && eslint src",
"lint:fix": "vue-tsc && eslint src --fix", "lint:fix": "tsc && eslint src --fix",
"stylelint": "stylelint src/**/*.vue src/**/*.scss src/**/*.css", "stylelint": "stylelint src/**/*.scss src/**/*.css",
"stylelint:fix": "stylelint src/**/*.vue src/**/*.scss src/**/*.css --fix" "stylelint:fix": "stylelint src/**/*.scss src/**/*.css --fix"
}, },
"type": "module", "type": "module",
"browserslist": [ "browserslist": [
@ -20,28 +20,21 @@
], ],
"dependencies": { "dependencies": {
"@emulatorjs/emulatorjs": "^4.2.0", "@emulatorjs/emulatorjs": "^4.2.0",
"@formatjs/intl-segmenter": "^11.7.7",
"@nextcloud/files": "^3.10.1", "@nextcloud/files": "^3.10.1",
"@nextcloud/initial-state": "^2.2.0", "@nextcloud/initial-state": "^2.2.0",
"@nextcloud/l10n": "^3.1.0", "@nextcloud/l10n": "^3.1.0",
"@nextcloud/paths": "^2.2.1",
"@nextcloud/router": "^3.0.1", "@nextcloud/router": "^3.0.1",
"@nextcloud/vite-config": "^2.2.2", "@nextcloud/vite-config": "^2.2.2",
"@nextcloud/vue": "9.0.0-alpha.5", "vite": "~5.4.11"
"vite": "~5.4.11",
"vue": "^3.5.13"
}, },
"devDependencies": { "devDependencies": {
"@nextcloud/browserslist-config": "^3.0.1", "@nextcloud/browserslist-config": "^3.0.1",
"@nextcloud/eslint-config": "^8.4.1", "@nextcloud/eslint-config": "^8.4.1",
"@nextcloud/prettier-config": "^1.1.0", "@nextcloud/prettier-config": "^1.1.0",
"@nextcloud/stylelint-config": "^3.0.1", "@nextcloud/stylelint-config": "^3.0.1",
"@vue/eslint-config-typescript": "~13.0.0",
"@vue/tsconfig": "^0.7.0",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.1",
"typescript": "~5.5.4", "typescript": "~5.5.4"
"vue-tsc": "^2.2.0"
}, },
"prettier": "@nextcloud/prettier-config" "prettier": "@nextcloud/prettier-config"
} }

View File

@ -1,26 +0,0 @@
<template>
<NcAppContent>
<div id="retro">
<h1>Hello world!</h1>
</div>
</NcAppContent>
</template>
<script>
import { NcAppContent } from '@nextcloud/vue'
export default {
name: 'App',
components: {
NcAppContent,
},
}
</script>
<style scoped>
#retro {
display: flex;
justify-content: center;
margin: 16px;
}
</style>

View File

@ -0,0 +1,27 @@
import { FileAction, FileType, Node, registerFileAction } from '@nextcloud/files'
import cores from './mime.json'
import { generateUrl } from '@nextcloud/router'
import icon from '../img/'
import { t } from '@nextcloud/l10n'
const action = new FileAction({
id: 'retro',
displayName: () => t('repod', 'Play'),
iconSvgInline: () => icon,
enabled: (files: Node[]) => {
if (files.length !== 1) return false
const file = files[0]
if (file.type !== FileType.File) return false
for (const core in cores) {
if (cores[core].types === file.mime) return true
if (cores[core].extensions.includes(file.extension)) return true
}
return false
},
exec: async (file: Node) => {
location.href = generateUrl('/apps/retro/' + file.path)
return true
},
})
registerFileAction(action)

View File

@ -1,6 +0,0 @@
import '@formatjs/intl-segmenter/polyfill'
import App from './App.vue'
import { createApp } from 'vue'
const View = createApp(App)
View.mount('#retro')

109
src/mime.json Normal file
View File

@ -0,0 +1,109 @@
{
"nes": {
"types": [
"application/x-nes-rom"
],
"extensions": [
"fds",
"nes",
"unif",
"unf",
"nez"
]
},
"snes": {
"types": [
"application/x-snes-rom"
],
"extensions": [
"smc",
"fig",
"sfc",
"gd3",
"gd7",
"dx2",
"bsx",
"swc"
]
},
"n64": {
"types": [
"application/x-n64-rom"
],
"extensions": [
"z64",
"n64",
"v64"
]
},
"pce": {
"types": [
"application/x-pc-engine-rom"
],
"extensions": [
"pce"
]
},
"ngp": {
"types": [
"application/x-neo-geo-pocket-rom",
"application/x-neo-geo-pocket-color-rom"
],
"extensions": [
"ngp",
"ngc"
]
},
"ws": {
"types": [
"application/x-wonderswan-rom",
"application/x-wonderswan-color-rom"
],
"extensions": [
"ws",
"wsc"
]
},
"coleco": {
"types": [],
"extensions": [
"col",
"cv"
]
},
"vice_x64sc": {
"types": [],
"extensions": [
"d64"
]
},
"nds": {
"types": [
"application/x-nintendo-ds-rom"
],
"extensions": [
"nds"
]
},
"gba": {
"types": [
"application/x-gba-rom"
],
"extensions": [
"gba",
"agb"
]
},
"gb": {
"types": [
"application/x-gameboy-rom",
"application/x-gameboy-color-rom"
],
"extensions": [
"gb",
"sgb",
"gbc",
"cgb"
]
}
}

View File

@ -1,6 +1,5 @@
{ {
"extends": "@vue/tsconfig", "include": ["./src/**/*.ts", "**/*.ts"],
"include": ["./src/**/*.ts", "./src/**/*.vue", "**/*.ts"],
"compilerOptions": { "compilerOptions": {
"allowImportingTsExtensions": true, "allowImportingTsExtensions": true,
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,