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}
-
-
+
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.source")}
+
+ /
+
+ {$_("footer.license")}
+
+ /
+
+ {$_("footer.privacy")}
+
+
+
+ {$_("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 @@
[ngn.tf]
-
- home
- news
- services
-
+ {$_("navbar.home")}
+ {$_("navbar.services")}
+ {$_("navbar.donate")}
+
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 @@
+
+
+{icon}
+
+
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)]}
+
+
+
+ {#if service.onion != ""}
+
+ {/if}
+ {#if service.i2p != ""}
+ I2P
+ {/if}
+
-
-
{@html icon}
-
+
+
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
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
- 👋 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)
-
-
-
-
-
-
+
+
+
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
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#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}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {@html sanitized}
-
-
-
{
- upvote();
- }}
- class={upvote_status}
- >
-
-
-
{data.vote}
-
{
- downvote();
- }}
- class={downvote_status}
- >
-
-
-
-
-
-
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
-
-
-
-
-
-
-
+
+
-
- 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!
-
-
-
- Platform
- Address/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.
+
+
+
+ Platform
+ Address/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!