diff --git a/admin/admin.py b/admin/admin.py index f02ad51..57bee49 100644 --- a/admin/admin.py +++ b/admin/admin.py @@ -295,6 +295,15 @@ def __handle_command_with_file(log: Log, api: AdminAPI, cmd: str, file: str) -> log.info("Logs has been saved") +commands = [ + "add_service", + "del_service", + "check_services", + "add_news", + "del_news", + "logs" +] + if __name__ == "__main__": log = Log() @@ -310,6 +319,18 @@ if __name__ == "__main__": exit(1) url = getenv(API_URL_ENV) + valid_cmd = False + + for cmd in commands: + if argv[1] == cmd: + valid_cmd = True + break + + if not valid_cmd: + log.error( + "Invalid command, run the script with no commands to list the available commands" + ) + exit(1) if url is None: log.error( diff --git a/app/package-lock.json b/app/package-lock.json index a9a0132..6f4b5f3 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -10,7 +10,8 @@ "dependencies": { "@types/dompurify": "^3.2.0", "dompurify": "^3.2.3", - "marked": "^15.0.4" + "marked": "^15.0.4", + "svelte-i18n": "^4.0.1" }, "devDependencies": { "@sveltejs/adapter-auto": "^3.3.1", @@ -27,7 +28,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -405,11 +405,61 @@ "node": ">=12" } }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.2.tgz", + "integrity": "sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==", + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.6", + "@formatjs/intl-localematcher": "0.5.10", + "decimal.js": "10", + "tslib": "2" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.6.tgz", + "integrity": "sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.9.8", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.8.tgz", + "integrity": "sha512-hZlLNI3+Lev8IAXuwehLoN7QTKqbx3XXwFW1jh0AdIA9XJdzn9Uzr+2LLBspPm/PX0+NLIfykj/8IKxQqHUcUQ==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.2", + "@formatjs/icu-skeleton-parser": "1.8.12", + "tslib": "2" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.12", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.12.tgz", + "integrity": "sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg==", + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.2", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.10.tgz", + "integrity": "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==", + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", @@ -424,7 +474,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -434,7 +483,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -443,14 +491,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -489,12 +535,6 @@ } } }, - "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/@rollup/plugin-commonjs/node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", @@ -572,13 +612,6 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -916,7 +949,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, "license": "MIT" }, "node_modules/@types/resolve": { @@ -935,7 +967,6 @@ "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -947,7 +978,6 @@ "version": "1.4.13", "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", - "dev": true, "peerDependencies": { "acorn": ">=8.9.0" } @@ -956,7 +986,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -965,16 +994,30 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, "engines": { "node": ">= 0.4" } }, + "node_modules/cli-color": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", + "integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.64", + "es6-iterator": "^2.0.3", + "memoizee": "^0.4.15", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "dev": true, "engines": { "node": ">=6" } @@ -995,6 +1038,19 @@ "node": ">= 0.6" } }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -1012,11 +1068,16 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "license": "MIT" + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -1036,6 +1097,58 @@ "@types/trusted-types": "^2.0.7" } }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -1077,18 +1190,56 @@ "node_modules/esm-env": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.1.tgz", - "integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==", - "dev": true + "integrity": "sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==" + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } }, "node_modules/esrap": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.3.2.tgz", "integrity": "sha512-C4PXusxYhFT98GjLSmb20k9PREuUdporer50dhzGuJu9IJXktbMddVCMLAERl5dAHyAi73GWWCE4FVHGP1794g==", - "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, "node_modules/fdir": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", @@ -1131,14 +1282,12 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true, "license": "MIT" }, "node_modules/globrex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true, "license": "MIT" }, "node_modules/hasown": { @@ -1164,6 +1313,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/intl-messageformat": { + "version": "10.7.11", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.11.tgz", + "integrity": "sha512-IB2N1tmI24k2EFH3PWjU7ivJsnWyLwOWOva0jnXFa29WzB6fb0JZ5EMQGu+XN5lDtjHYFo0/UooP67zBwUg7rQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.2", + "@formatjs/fast-memoize": "2.2.6", + "@formatjs/icu-messageformat-parser": "2.9.8", + "tslib": "2" + } + }, "node_modules/is-core-module": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz", @@ -1185,11 +1346,16 @@ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, "node_modules/is-reference": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", - "dev": true, "dependencies": { "@types/estree": "^1.0.6" } @@ -1197,8 +1363,7 @@ "node_modules/is-reference/node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/kleur": { "version": "4.1.5", @@ -1214,14 +1379,21 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "dev": true, "license": "MIT" }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "license": "MIT", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, "node_modules/magic-string": { "version": "0.30.12", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -1237,11 +1409,29 @@ "node": ">= 18" } }, + "node_modules/memoizee": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", + "integrity": "sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "es5-ext": "^0.10.64", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -1280,6 +1470,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -1415,7 +1611,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, "license": "MIT", "dependencies": { "mri": "^1.1.0" @@ -1471,7 +1666,6 @@ "version": "5.16.0", "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.16.0.tgz", "integrity": "sha512-Ygqsiac6UogVED2ruKclU+pOeMThxWtp9LG+li7BXeDKC2paVIsRTMkNmcON4Zejerd1s5sZHWx6ZtU85xklVg==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.3.0", "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1492,11 +1686,453 @@ "node": ">=18" } }, + "node_modules/svelte-i18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/svelte-i18n/-/svelte-i18n-4.0.1.tgz", + "integrity": "sha512-jaykGlGT5PUaaq04JWbJREvivlCnALtT+m87Kbm0fxyYHynkQaxQMnIKHLm2WeIuBRoljzwgyvz0Z6/CMwfdmQ==", + "license": "MIT", + "dependencies": { + "cli-color": "^2.0.3", + "deepmerge": "^4.2.2", + "esbuild": "^0.19.2", + "estree-walker": "^2", + "intl-messageformat": "^10.5.3", + "sade": "^1.8.1", + "tiny-glob": "^0.2.9" + }, + "bin": { + "svelte-i18n": "dist/cli.js" + }, + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "svelte": "^3 || ^4 || ^5" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/svelte-i18n/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/timers-ext": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", + "integrity": "sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/tiny-glob": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", - "dev": true, "license": "MIT", "dependencies": { "globalyzer": "0.1.0", @@ -1512,6 +2148,18 @@ "node": ">=6" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, "node_modules/vite": { "version": "5.4.11", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", @@ -1588,8 +2236,7 @@ "node_modules/zimmerframe": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", - "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", - "dev": true + "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==" } } } diff --git a/app/package.json b/app/package.json index 5fb0bfc..67c5ca6 100644 --- a/app/package.json +++ b/app/package.json @@ -1,9 +1,9 @@ { "name": "website", - "version": "5.0.0", + "version": "6.0", "private": true, "scripts": { - "dev": "VITE_API_URL_DEV=http://127.0.0.1:7001 vite dev", + "dev": "VITE_API_URL=http://127.0.0.1:7001 VITE_FRONTEND_URL=http://localhost:5173 vite dev", "build": "vite build", "preview": "vite preview --host", "lint": "prettier --check .", @@ -23,6 +23,7 @@ "dependencies": { "@types/dompurify": "^3.2.0", "dompurify": "^3.2.3", - "marked": "^15.0.4" + "marked": "^15.0.4", + "svelte-i18n": "^4.0.1" } } diff --git a/app/src/hooks.server.js b/app/src/hooks.server.js new file mode 100644 index 0000000..3987d75 --- /dev/null +++ b/app/src/hooks.server.js @@ -0,0 +1,7 @@ +import { locale } from "svelte-i18n"; + +export const handle = async ({ event, resolve }) => { + const lang = event.request.headers.get("accept-language")?.split(",")[0]; + if (lang) locale.set(lang); + return resolve(event); +}; diff --git a/app/src/lib/api.js b/app/src/lib/api.js new file mode 100644 index 0000000..f108136 --- /dev/null +++ b/app/src/lib/api.js @@ -0,0 +1,21 @@ +const version = "v1"; +const url = new URL(version + "/", import.meta.env.VITE_API_URL).href; + +function join(path) { + if (null === path || path === "") return url; + + if (path[0] === "/") path = path.slice(1); + + return new URL(path, url).href; +} + +async function services(fetch) { + const res = await fetch(join("/services")); + const json = await res.json(); + + if (!("result" in json)) return []; + + return json.result; +} + +export { version, join, services }; diff --git a/app/src/lib/card.svelte b/app/src/lib/card.svelte index e0c1954..d76bd2a 100644 --- a/app/src/lib/card.svelte +++ b/app/src/lib/card.svelte @@ -1,46 +1,24 @@ -
-
- root@ngn.tf:~# {current} -
-
+
+

{title}

+
-
+ diff --git a/app/src/lib/card_link.svelte b/app/src/lib/card_link.svelte index 8b79510..36a40e3 100644 --- a/app/src/lib/card_link.svelte +++ b/app/src/lib/card_link.svelte @@ -1,7 +1,7 @@ - - +
{current}
diff --git a/app/src/lib/content.svelte b/app/src/lib/content.svelte new file mode 100644 index 0000000..3d2cae5 --- /dev/null +++ b/app/src/lib/content.svelte @@ -0,0 +1,25 @@ + + +
+ +
+ + diff --git a/app/src/lib/footer.svelte b/app/src/lib/footer.svelte new file mode 100644 index 0000000..c535879 --- /dev/null +++ b/app/src/lib/footer.svelte @@ -0,0 +1,77 @@ + + +
+
+ + + {$_("footer.powered")} + +
+
+ + {$_("footer.number", { values: { count: visitor_count } })} + {#if should_congrat()} + ({$_("footer.congrats")}) + {/if} + + + {$_("footer.version", { values: { api_version: "v1", frontend_version: pkg.version } })} + +
+
+ + diff --git a/app/src/lib/head.svelte b/app/src/lib/head.svelte new file mode 100644 index 0000000..ccb3764 --- /dev/null +++ b/app/src/lib/head.svelte @@ -0,0 +1,15 @@ + + + + [ngn.tf] | {title} + + + + + + + + diff --git a/app/src/lib/header.svelte b/app/src/lib/header.svelte index 6522c7a..cd4bd0e 100644 --- a/app/src/lib/header.svelte +++ b/app/src/lib/header.svelte @@ -1,12 +1,25 @@
-

- -

-

{subtitle}

+

{current}

+
diff --git a/app/src/lib/icon.svelte b/app/src/lib/icon.svelte new file mode 100644 index 0000000..d0a6189 --- /dev/null +++ b/app/src/lib/icon.svelte @@ -0,0 +1,6 @@ + + + diff --git a/app/src/lib/lang.js b/app/src/lib/lang.js new file mode 100644 index 0000000..b9558b3 --- /dev/null +++ b/app/src/lib/lang.js @@ -0,0 +1,4 @@ +export default [ + { code: "en", name: "English", icon: "🇬🇧", path: "../locales/en.json" }, + { code: "tr", name: "Turkish", icon: "🇹🇷", path: "../locales/tr.json" }, +]; diff --git a/app/src/lib/link.svelte b/app/src/lib/link.svelte new file mode 100644 index 0000000..ace1af1 --- /dev/null +++ b/app/src/lib/link.svelte @@ -0,0 +1,22 @@ + + +{#if icon != ""} + +{/if} +
+ + diff --git a/app/src/lib/navbar.svelte b/app/src/lib/navbar.svelte index 3b6037b..9a73cec 100644 --- a/app/src/lib/navbar.svelte +++ b/app/src/lib/navbar.svelte @@ -1,30 +1,29 @@ diff --git a/app/src/lib/navbar_link.svelte b/app/src/lib/navbar_link.svelte index 90dc3a7..acdef29 100644 --- a/app/src/lib/navbar_link.svelte +++ b/app/src/lib/navbar_link.svelte @@ -1,10 +1,16 @@ a { - font-weight: 700; - font-size: 20px; - text-decoration: none; - color: white; - cursor: pointer; - } - - a:hover { - text-decoration: underline; - text-shadow: 3px 4px 7px rgba(81, 67, 21, 0.8); + font-weight: 900; + font-size: var(--size-4); + color: var(--white-1); } diff --git a/app/src/lib/navbar_switch.svelte b/app/src/lib/navbar_switch.svelte new file mode 100644 index 0000000..979856d --- /dev/null +++ b/app/src/lib/navbar_switch.svelte @@ -0,0 +1,38 @@ + + + + + diff --git a/app/src/lib/service.svelte b/app/src/lib/service.svelte index 114c0aa..0dd8683 100644 --- a/app/src/lib/service.svelte +++ b/app/src/lib/service.svelte @@ -1,80 +1,102 @@ -
- -
-

-

{desc}

+
+
+
+

{service.name}

+

{service.desc[$locale.slice(0, 2)]}

+
+
-
- - +
+

Last checked at {time_from_ts(service.check_time)}

+ {#if service.check_res == 0} + Down + {:else if service.check_res == 1} + Up + {:else if service.check_res == 2} + Slow + {/if}
diff --git a/app/src/lib/util.js b/app/src/lib/util.js index 457dad0..2caf6ce 100644 --- a/app/src/lib/util.js +++ b/app/src/lib/util.js @@ -1,10 +1,15 @@ -function click() { - let audio = new Audio("/click.wav"); - audio.play(); -} +import { join } from "$lib/api.js"; +const colors = [ + "yellow", + "cyan", + "green", + "pinkish", + "red", + // "blue" (looks kinda ass) +]; let colors_pos = -1; -const colors = ["yellow", "cyan", "green", "pinkish", "red", "blue"]; +let api_url = join; function color() { if (colors_pos < 0) colors_pos = Math.floor(Math.random() * colors.length); @@ -13,4 +18,18 @@ function color() { return colors[colors_pos]; } -export { click, color }; +function click() { + let audio = new Audio("/click.wav"); + audio.play(); +} + +function frontend_url(path) { + if (null !== path && path !== "") return new URL(path, import.meta.env.VITE_FRONTEND_URL).href; + else return new URL(import.meta.env.VITE_FRONTEND_URL).href; +} + +function time_from_ts(ts) { + return new Date(ts * 1000).toLocaleTimeString(); +} + +export { api_url, frontend_url, click, color, time_from_ts }; diff --git a/app/src/locales/en.json b/app/src/locales/en.json new file mode 100644 index 0000000..fd0c6f6 --- /dev/null +++ b/app/src/locales/en.json @@ -0,0 +1,49 @@ +{ + "navbar": { + "home": "home", + "services": "services", + "news": "news", + "donate": "donate" + }, + "home": { + "title": "hello world!", + "welcome": { + "title": "about", + "desc": "Welcome to my website, I'm ngn", + "whoami": "I'm a privacy, security and freedom addvocate high-schooler from Turkey", + "interest": "I'm interested in system security and software development", + "support": "I love and support Free/Libre and Open Source Software (FLOSS)" + }, + "work": { + "title": "work", + "desc": "I don't currently have a job, so I spend most of my time...", + "build": "building stupid shit", + "ctf": "solving CTF challenges", + "contribute": "contributing to random projects", + "wiki": "expanding my wiki" + }, + "links": { + "title": "contact", + "desc": "Here are some useful links if you want to get in contact with me", + "prefer": "preferred" + }, + "info": { + "title": "services", + "desc": "A part from working on stupid shit, I host free (as in freedom, and price) services available for all", + "speed": "All of these services are available over a 600 Mbit/s interface", + "security": "All use SSL encrypted connection and they are all privacy-respecting", + "privacy": "Accessible from clearnet, TOR and I2P, no region or network blocks", + "bullshit": "No CDNs, no cloudflare, no CAPTCHA, no analytics, no bullshit", + "link": "see all the services" + } + }, + "footer": { + "source": "Source", + "license": "License", + "privacy": "Privacy", + "powered": "Powered by Svelte, Go, SQLite and donations", + "number": "You are the visitor number {count}", + "congrat": "congrats!!", + "version": "Using API version {api_version}, frontend version {frontend_version}" + } +} diff --git a/app/src/locales/tr.json b/app/src/locales/tr.json new file mode 100644 index 0000000..13725c6 --- /dev/null +++ b/app/src/locales/tr.json @@ -0,0 +1,46 @@ +{ + "navbar": { + "home": "anasayfa", + "news": "haberler", + "services": "servisler", + "language": "dil" + }, + "home": { + "welcome": { + "title": "Websiteme hoşgeldiniz, ben ngn", + "whoami": "Türkiye'den, güvenlik, gizlik ve özgürlük savunucusu bir liseliyim", + "interest": "Sistem güvenliği ve yazılım geliştirmek ile ilgileniyorum", + "support": "Özgür/Libre ve Açık Kaynaklı Yazılımı (FLOSS) seviyorum ve destekliyorum" + }, + "work": { + "title": "Zamanım çoğunlukla şunlar ile geçiyor...", + "build": "salak şeyler inşa etmek", + "fix": "salak şeyleri düzeltmek", + "ctf": "CTF challenge'ları çözmek", + "contribute": "rastgele projelere katkıda bulunmak", + "wiki": "wikimi genişletmek" + }, + "links": { + "title": "Eğer benim ile iletişime geçmek istiyorsanız, işte bazı faydalı linkler", + "prefer": "tercihim" + }, + "info": { + "title": "Salak şeyler inşa etmenin yanı sıra, herkes için kullanıma açık özgür ve ücretsiz servisler host ediyorum", + "speed": "Tüm servisler 600 Mbit/s ağ arayüzü üzerinden erişilebilir", + "security": "Hepsi SSL şifreli bağlantı kullanıyor ve hepsi gizliğinize saygı gösteriyor", + "privacy": "Accessible from clearnet, TOR and I2P, no region or network blocks", + "privacy": "Açık ağdan, TOR ve I2P'den erişilebilirler, bölge ya da ağ blokları yok", + "bullshit": "CDN yok, cloudflare yok, CAPTCHA yok, analitikler yok, boktan saçmalıklar yok", + "link": "tüm servisleri incele" + } + }, + "footer": { + "source": "Kaynak", + "license": "Lisans", + "privacy": "Gizlilik", + "powered": "Svelte, Go, SQLite ve yemek param tarafından destekleniyor", + "number": "{count}. ziyaretçisiniz", + "congrat": "tebrikler!!", + "version": "Kullan API versiyonu {api_version}, arayüz versiyonu {frontend_version}" + } +} diff --git a/app/src/routes/+layout.js b/app/src/routes/+layout.js new file mode 100644 index 0000000..1924049 --- /dev/null +++ b/app/src/routes/+layout.js @@ -0,0 +1,19 @@ +import { locale, waitLocale } from "svelte-i18n"; +import { init, register } from "svelte-i18n"; +import { browser } from "$app/environment"; +import languages from "$lib/lang.js"; + +const defaultLocale = languages[0].code; + +for (let i = 0; i < languages.length; i++) + register(languages[i].code, () => import(/* @vite-ignore */ languages[i].path)); + +init({ + fallbackLocale: defaultLocale, + initialLocale: browser ? window.navigator.language.slice(0, 2).toLowerCase() : defaultLocale, +}); + +export const load = async () => { + if (browser) locale.set(window.navigator.language); + await waitLocale(); +}; diff --git a/app/src/routes/+layout.svelte b/app/src/routes/+layout.svelte index 3dbd4b3..d0b2ed4 100644 --- a/app/src/routes/+layout.svelte +++ b/app/src/routes/+layout.svelte @@ -1,12 +1,27 @@
- +
+ +
+
diff --git a/app/src/routes/+page.svelte b/app/src/routes/+page.svelte index 3c32acd..605be5a 100644 --- a/app/src/routes/+page.svelte +++ b/app/src/routes/+page.svelte @@ -1,189 +1,101 @@ - - [ngn.tf] | homepage - - - - - - - + +
-
- echo - hello world! -
- -
-
- -
- -
- 👋 Hello! I'm ngn! -
    -
  • 🇹🇷 I'm a high school student from Turkey
  • -
  • 🖥️ I'm interested in cyber security and programming.
  • -
  • ❤️ I love and support Free/Libre and Open Source Software (FLOSS)
  • -
  • - 🐧 My GNU/Linux distribution of choice is Artix, however I am currently running Arch -
  • -
-
+ + + 👋 {$_("home.welcome.desc")} +
    +
  • 🇹🇷 {$_("home.welcome.whoami")}
  • +
  • 🖥️ {$_("home.welcome.interest")}
  • +
  • ❤️ {$_("home.welcome.support")}
  • +
+
+ + {$_("home.work.desc")} +
    +
  • ⌨️ {$_("home.work.build")}
  • +
  • 🚩 {$_("home.work.ctf")}
  • +
  • 👥 {$_("home.work.contribute")}
  • +
  • 📑 {$_("home.work.wiki")}
  • +
+
+ + {$_("home.links.desc")}: +
    +
  • + + PGP + +
  • +
  • + Mastodon +
  • +
  • + Github +
  • +
  • + Email + ({$_("home.links.prefer")}) +
  • +
+
+ +
+
+ + {$_("home.info.desc")} + +
    +
  • + + {$_("home.info.speed")} +
  • +
  • + + {$_("home.info.security")} +
  • +
  • + + {$_("home.info.privacy")} +
  • +
  • + + {$_("home.info.bullshit")} +
  • +
- -
- -
- - I usually spend my time... -
    -
  • ⌨️ building random projects
  • -
  • 👥 contributing stuff that I like
  • -
  • 🚩 solving CTFs
  • -
  • 🖥️ customizing my desktop
  • -
  • - 📑 posting random stuff on my blog, you should definitely check it out btw (it's very - active) -
  • -
-
- - - Here are some links if you want to get in contact with me, I highly prefer email and I usually - respond to emails in 1 or 2 days, just make sure to check your spam folder (turns out running - a TOR relay gets your IP into multiple blacklists) - - -
-
- -
-

v5.0

-
+
+ + diff --git a/app/src/routes/blog/+page.js b/app/src/routes/blog/+page.js deleted file mode 100644 index 77fab40..0000000 --- a/app/src/routes/blog/+page.js +++ /dev/null @@ -1,9 +0,0 @@ -export async function load({ fetch }) { - const api = import.meta.env.VITE_API_URL_DEV; - const res = await fetch(api + "/blog/sum"); - const data = await res.json(); - - return { - posts: data["result"], - }; -} diff --git a/app/src/routes/blog/+page.svelte b/app/src/routes/blog/+page.svelte deleted file mode 100644 index 0248304..0000000 --- a/app/src/routes/blog/+page.svelte +++ /dev/null @@ -1,118 +0,0 @@ - - - - [ngn.tf] | blog - - - - - - - - -
- /dev/blog -
- -
- -
- {#each posts as post} - -

{post.author} | {post.date}

-
- {post.content}... -
- {/each} -
-
- - diff --git a/app/src/routes/blog/[id]/+page.server.js b/app/src/routes/blog/[id]/+page.server.js deleted file mode 100644 index 1eb6d58..0000000 --- a/app/src/routes/blog/[id]/+page.server.js +++ /dev/null @@ -1,14 +0,0 @@ -export async function load({ fetch, params }) { - const id = params.id; - const api = import.meta.env.VITE_API_URL_DEV; - const res = await fetch(api + "/blog/get?id=" + id); - const data = await res.json(); - - if (data["error"] != "") { - return { - error: data["error"], - }; - } - - return data["result"]; -} diff --git a/app/src/routes/blog/[id]/+page.svelte b/app/src/routes/blog/[id]/+page.svelte deleted file mode 100644 index 3344df9..0000000 --- a/app/src/routes/blog/[id]/+page.svelte +++ /dev/null @@ -1,191 +0,0 @@ - - - - [ngn.tf] | {data.title} - - - - - - - -
- {data.title} -
- -
- -
- {@html sanitized} -
-
- -

{data.vote}

- -
-
- - diff --git a/app/src/routes/donate/+page.svelte b/app/src/routes/donate/+page.svelte index 1aead48..4f76ee0 100644 --- a/app/src/routes/donate/+page.svelte +++ b/app/src/routes/donate/+page.svelte @@ -1,65 +1,70 @@ - - [ngn.tf] | donate - - - - - - -
- bash - donate.sh -
+ +
- - I work on free/libre and open source software and offer free services. General hosting and stuff - costs around 550₺ (~$17) per month, so feel free to donate in order to help me keep everything - up and running! - - - - - - - - - - - - - -
PlatformAddress/Link
Monero (XMR) - - 46q7G7u7cmASvJm7AmrhmNg6ctS77mYMmDAy1QxpDn5w57xV3GUY5za4ZPZHAjqaXdfS5YRWm4AVj5UArLDA1retRkJp47F - -
- Also huge thanks to all of you who has donated so far, even if it's a small amount, I highly appreciate - it. Thank you! -
+ I spend a lot of time working on different projects and maintaining different services. + I also spend a lot of money, but unlike time, you don't usually get much of it for free. + I mostly pay for hosting and electricity. Which when added up costs around 550₺ per month, that + is Turkish Lira, equals to ~$15 at time of writing. +
+
+ So even a small donation would be highly appreciated and it would help me keep everything up + and running. + + + + + + + + + + + + + +
PlatformAddress/Link
Monero (XMR) + + 46q7G7u7cmASvJm7AmrhmNg6ctS77mYMmDAy1QxpDn5w57xV3GUY5za4ZPZHAjqaXdfS5YRWm4AVj5UArLDA1retRkJp47F + +
+ Also huge thanks to all of you who has donated so far, as I said, I highly appreciate it. Thank + you!