mirror of
https://github.com/ershisan99/coolify.git
synced 2025-12-25 04:59:32 +00:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8e9668c2b | ||
|
|
425feba0e2 | ||
|
|
c09b8d888f | ||
|
|
748e691a58 | ||
|
|
f8c81ff95f | ||
|
|
d11c4a3cd7 | ||
|
|
3f3ea151ef | ||
|
|
7e2f68870c | ||
|
|
df41cf14da | ||
|
|
111370c025 | ||
|
|
bcb2ba0b1b | ||
|
|
807d526ffa | ||
|
|
2ff9c5fed5 |
@@ -48,11 +48,13 @@ With Github integration
|
||||
|
||||
### Services
|
||||
|
||||
- [WordPress](https://wordpress.org)
|
||||
- [Plausible Analytics](https://plausible.io)
|
||||
- [NocoDB](https://nocodb.com)
|
||||
- [VSCode Server](https://github.com/cdr/code-server)
|
||||
- [MinIO](https://min.io)
|
||||
|
||||
|
||||
## Support
|
||||
|
||||
- Twitter: [@andrasbacsai](https://twitter.com/andrasbacsai)
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "coolify",
|
||||
"description": "An open-source, hassle-free, self-hostable Heroku & Netlify alternative.",
|
||||
"version": "1.0.19",
|
||||
"version": "1.0.21",
|
||||
"license": "AGPL-3.0",
|
||||
"scripts": {
|
||||
"dev:docker:start": "docker-compose -f docker-compose-dev.yml up -d",
|
||||
"dev:docker:stop": "docker-compose -f docker-compose-dev.yml down",
|
||||
"dev": "NODE_ENV=development svelte-kit dev --host 0.0.0.0",
|
||||
"dev": "TAILWIND_MODE=watch NODE_ENV=development svelte-kit dev --host 0.0.0.0",
|
||||
"build": "NODE_ENV=production svelte-kit build",
|
||||
"preview": "svelte-kit preview",
|
||||
"start": "node build",
|
||||
@@ -37,15 +37,16 @@
|
||||
},
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"dotenv-extended": "^2.9.0",
|
||||
"@iarna/toml": "^2.2.5",
|
||||
"@zerodevx/svelte-toast": "^0.3.0",
|
||||
"bcrypt": "^5.0.1",
|
||||
"commander": "^7.2.0",
|
||||
"compare-versions": "^3.6.0",
|
||||
"cookie": "^0.4.1",
|
||||
"cuid": "^2.1.8",
|
||||
"dayjs": "^1.10.5",
|
||||
"dockerode": "^3.3.0",
|
||||
"dotenv-extended": "^2.9.0",
|
||||
"generate-password": "^1.6.0",
|
||||
"js-yaml": "^4.1.0",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
@@ -53,6 +54,7 @@
|
||||
"shelljs": "^0.8.4",
|
||||
"svelte-kit-cookie-session": "^1.0.6",
|
||||
"svelte-select": "^3.17.0",
|
||||
"systeminformation": "^5.7.7",
|
||||
"unique-names-generator": "^4.5.0"
|
||||
}
|
||||
}
|
||||
|
||||
425
pnpm-lock.yaml
generated
425
pnpm-lock.yaml
generated
@@ -9,6 +9,7 @@ specifiers:
|
||||
'@typescript-eslint/parser': ^4.26.1
|
||||
'@zerodevx/svelte-toast': ^0.3.0
|
||||
autoprefixer: ^10.2.6
|
||||
bcrypt: ^5.0.1
|
||||
commander: ^7.2.0
|
||||
compare-versions: ^3.6.0
|
||||
cookie: ^0.4.1
|
||||
@@ -33,7 +34,8 @@ specifiers:
|
||||
svelte-kit-cookie-session: ^1.0.6
|
||||
svelte-preprocess: ^4.7.3
|
||||
svelte-select: ^3.17.0
|
||||
tailwindcss: 2.2.0-canary.8
|
||||
systeminformation: ^5.7.7
|
||||
tailwindcss: 2.2.0
|
||||
tslib: ^2.2.0
|
||||
typescript: ^4.3.2
|
||||
unique-names-generator: ^4.5.0
|
||||
@@ -42,6 +44,7 @@ specifiers:
|
||||
dependencies:
|
||||
'@iarna/toml': 2.2.5
|
||||
'@zerodevx/svelte-toast': 0.3.0
|
||||
bcrypt: 5.0.1
|
||||
commander: 7.2.0
|
||||
compare-versions: 3.6.0
|
||||
cookie: 0.4.1
|
||||
@@ -56,6 +59,7 @@ dependencies:
|
||||
shelljs: 0.8.4
|
||||
svelte-kit-cookie-session: 1.0.6
|
||||
svelte-select: 3.17.0
|
||||
systeminformation: 5.7.7
|
||||
unique-names-generator: 4.5.0
|
||||
|
||||
devDependencies:
|
||||
@@ -75,7 +79,7 @@ devDependencies:
|
||||
prettier-plugin-svelte: 2.3.0_prettier@2.3.1+svelte@3.38.2
|
||||
svelte: 3.38.2
|
||||
svelte-preprocess: 4.7.3_ddfd8490a44ef0de606159ff3aef985a
|
||||
tailwindcss: 2.2.0-canary.8_6daa0ece57b4377652e73c9c66c3b94c
|
||||
tailwindcss: 2.2.0_6daa0ece57b4377652e73c9c66c3b94c
|
||||
tslib: 2.2.0
|
||||
typescript: 4.3.2
|
||||
vite: 2.3.6
|
||||
@@ -88,10 +92,22 @@ packages:
|
||||
'@babel/highlight': 7.14.0
|
||||
dev: true
|
||||
|
||||
/@babel/code-frame/7.14.5:
|
||||
resolution: {integrity: sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/highlight': 7.14.5
|
||||
dev: true
|
||||
|
||||
/@babel/helper-validator-identifier/7.14.0:
|
||||
resolution: {integrity: sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==}
|
||||
dev: true
|
||||
|
||||
/@babel/helper-validator-identifier/7.14.5:
|
||||
resolution: {integrity: sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dev: true
|
||||
|
||||
/@babel/highlight/7.14.0:
|
||||
resolution: {integrity: sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==}
|
||||
dependencies:
|
||||
@@ -100,6 +116,15 @@ packages:
|
||||
js-tokens: 4.0.0
|
||||
dev: true
|
||||
|
||||
/@babel/highlight/7.14.5:
|
||||
resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/helper-validator-identifier': 7.14.5
|
||||
chalk: 2.4.2
|
||||
js-tokens: 4.0.0
|
||||
dev: true
|
||||
|
||||
/@eslint/eslintrc/0.4.2:
|
||||
resolution: {integrity: sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==}
|
||||
engines: {node: ^10.12.0 || >=12.0.0}
|
||||
@@ -117,34 +142,54 @@ packages:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
/@fullhuman/postcss-purgecss/3.1.3:
|
||||
resolution: {integrity: sha512-kwOXw8fZ0Lt1QmeOOrd+o4Ibvp4UTEBFQbzvWldjlKv5n+G9sXfIPn1hh63IQIL8K8vbvv1oYMJiIUbuy9bGaA==}
|
||||
/@fullhuman/postcss-purgecss/4.0.3_postcss@8.3.0:
|
||||
resolution: {integrity: sha512-/EnQ9UDWGGqHkn1UKAwSgh+gJHPKmD+Z+5dQ4gWT4qq2NUyez3zqAfZNwFH3eSgmgO+wjTXfhlLchx2M9/K+7Q==}
|
||||
peerDependencies:
|
||||
postcss: ^8.0.0
|
||||
dependencies:
|
||||
purgecss: 3.1.3
|
||||
postcss: 8.3.0
|
||||
purgecss: 4.0.3
|
||||
dev: true
|
||||
|
||||
/@iarna/toml/2.2.5:
|
||||
resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==}
|
||||
dev: false
|
||||
|
||||
/@nodelib/fs.scandir/2.1.4:
|
||||
resolution: {integrity: sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==}
|
||||
/@mapbox/node-pre-gyp/1.0.5:
|
||||
resolution: {integrity: sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
detect-libc: 1.0.3
|
||||
https-proxy-agent: 5.0.0
|
||||
make-dir: 3.1.0
|
||||
node-fetch: 2.6.1
|
||||
nopt: 5.0.0
|
||||
npmlog: 4.1.2
|
||||
rimraf: 3.0.2
|
||||
semver: 7.3.5
|
||||
tar: 6.1.0
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/@nodelib/fs.scandir/2.1.5:
|
||||
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
|
||||
engines: {node: '>= 8'}
|
||||
dependencies:
|
||||
'@nodelib/fs.stat': 2.0.4
|
||||
'@nodelib/fs.stat': 2.0.5
|
||||
run-parallel: 1.2.0
|
||||
dev: true
|
||||
|
||||
/@nodelib/fs.stat/2.0.4:
|
||||
resolution: {integrity: sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==}
|
||||
/@nodelib/fs.stat/2.0.5:
|
||||
resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
|
||||
engines: {node: '>= 8'}
|
||||
dev: true
|
||||
|
||||
/@nodelib/fs.walk/1.2.6:
|
||||
resolution: {integrity: sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==}
|
||||
/@nodelib/fs.walk/1.2.7:
|
||||
resolution: {integrity: sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==}
|
||||
engines: {node: '>= 8'}
|
||||
dependencies:
|
||||
'@nodelib/fs.scandir': 2.1.4
|
||||
'@nodelib/fs.scandir': 2.1.5
|
||||
fastq: 1.11.0
|
||||
dev: true
|
||||
|
||||
@@ -355,6 +400,10 @@ packages:
|
||||
resolution: {integrity: sha512-TY5dLB5DEpxuHu60M6gum+fDxzIGXg35R8500orz58JTFs9LiHWoEfeJ4n9t7Afix3iMmYLl2thjhnCHCiQIhQ==}
|
||||
dev: false
|
||||
|
||||
/abbrev/1.1.1:
|
||||
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
|
||||
dev: false
|
||||
|
||||
/acorn-jsx/5.3.1_acorn@7.4.1:
|
||||
resolution: {integrity: sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==}
|
||||
peerDependencies:
|
||||
@@ -382,6 +431,15 @@ packages:
|
||||
hasBin: true
|
||||
dev: true
|
||||
|
||||
/agent-base/6.0.2:
|
||||
resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
|
||||
engines: {node: '>= 6.0.0'}
|
||||
dependencies:
|
||||
debug: 4.3.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/ajv/6.12.6:
|
||||
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
|
||||
dependencies:
|
||||
@@ -409,6 +467,11 @@ packages:
|
||||
engines: {node: '>=6'}
|
||||
dev: true
|
||||
|
||||
/ansi-regex/2.1.1:
|
||||
resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/ansi-regex/5.0.0:
|
||||
resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -433,7 +496,22 @@ packages:
|
||||
engines: {node: '>= 8'}
|
||||
dependencies:
|
||||
normalize-path: 3.0.0
|
||||
picomatch: 2.2.3
|
||||
picomatch: 2.3.0
|
||||
dev: true
|
||||
|
||||
/aproba/1.2.0:
|
||||
resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==}
|
||||
dev: false
|
||||
|
||||
/are-we-there-yet/1.1.5:
|
||||
resolution: {integrity: sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==}
|
||||
dependencies:
|
||||
delegates: 1.0.0
|
||||
readable-stream: 2.3.7
|
||||
dev: false
|
||||
|
||||
/arg/5.0.0:
|
||||
resolution: {integrity: sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ==}
|
||||
dev: true
|
||||
|
||||
/argparse/1.0.10:
|
||||
@@ -497,6 +575,17 @@ packages:
|
||||
tweetnacl: 0.14.5
|
||||
dev: false
|
||||
|
||||
/bcrypt/5.0.1:
|
||||
resolution: {integrity: sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
requiresBuild: true
|
||||
dependencies:
|
||||
'@mapbox/node-pre-gyp': 1.0.5
|
||||
node-addon-api: 3.2.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/binary-extensions/2.2.0:
|
||||
resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -621,8 +710,8 @@ packages:
|
||||
engines: {node: '>=8'}
|
||||
dev: true
|
||||
|
||||
/chokidar/3.5.1:
|
||||
resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==}
|
||||
/chokidar/3.5.2:
|
||||
resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==}
|
||||
engines: {node: '>= 8.10.0'}
|
||||
dependencies:
|
||||
anymatch: 3.1.2
|
||||
@@ -631,7 +720,7 @@ packages:
|
||||
is-binary-path: 2.1.0
|
||||
is-glob: 4.0.1
|
||||
normalize-path: 3.0.0
|
||||
readdirp: 3.5.0
|
||||
readdirp: 3.6.0
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.2
|
||||
dev: true
|
||||
@@ -640,6 +729,16 @@ packages:
|
||||
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
|
||||
dev: false
|
||||
|
||||
/chownr/2.0.0:
|
||||
resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
|
||||
engines: {node: '>=10'}
|
||||
dev: false
|
||||
|
||||
/code-point-at/1.1.0:
|
||||
resolution: {integrity: sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/color-convert/1.9.3:
|
||||
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
|
||||
dependencies:
|
||||
@@ -699,6 +798,10 @@ packages:
|
||||
/concat-map/0.0.1:
|
||||
resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
|
||||
|
||||
/console-control-strings/1.1.0:
|
||||
resolution: {integrity: sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=}
|
||||
dev: false
|
||||
|
||||
/cookie/0.4.1:
|
||||
resolution: {integrity: sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==}
|
||||
engines: {node: '>= 0.6'}
|
||||
@@ -889,6 +992,10 @@ packages:
|
||||
resolution: {integrity: sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=}
|
||||
dev: true
|
||||
|
||||
/delegates/1.0.0:
|
||||
resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=}
|
||||
dev: false
|
||||
|
||||
/denque/1.5.0:
|
||||
resolution: {integrity: sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==}
|
||||
engines: {node: '>=0.10'}
|
||||
@@ -899,6 +1006,12 @@ packages:
|
||||
engines: {node: '>=8'}
|
||||
dev: true
|
||||
|
||||
/detect-libc/1.0.3:
|
||||
resolution: {integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=}
|
||||
engines: {node: '>=0.10'}
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/detective/5.2.0:
|
||||
resolution: {integrity: sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==}
|
||||
engines: {node: '>=0.8.0'}
|
||||
@@ -1213,12 +1326,12 @@ packages:
|
||||
resolution: {integrity: sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
'@nodelib/fs.stat': 2.0.4
|
||||
'@nodelib/fs.walk': 1.2.6
|
||||
'@nodelib/fs.stat': 2.0.5
|
||||
'@nodelib/fs.walk': 1.2.7
|
||||
glob-parent: 5.1.2
|
||||
merge2: 1.4.1
|
||||
micromatch: 4.0.4
|
||||
picomatch: 2.2.3
|
||||
picomatch: 2.3.0
|
||||
dev: true
|
||||
|
||||
/fast-json-stable-stringify/2.1.0:
|
||||
@@ -1278,6 +1391,13 @@ packages:
|
||||
universalify: 2.0.0
|
||||
dev: true
|
||||
|
||||
/fs-minipass/2.1.0:
|
||||
resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
|
||||
engines: {node: '>= 8'}
|
||||
dependencies:
|
||||
minipass: 3.1.3
|
||||
dev: false
|
||||
|
||||
/fs.realpath/1.0.0:
|
||||
resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=}
|
||||
|
||||
@@ -1301,24 +1421,23 @@ packages:
|
||||
resolution: {integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=}
|
||||
dev: true
|
||||
|
||||
/gauge/2.7.4:
|
||||
resolution: {integrity: sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=}
|
||||
dependencies:
|
||||
aproba: 1.2.0
|
||||
console-control-strings: 1.1.0
|
||||
has-unicode: 2.0.1
|
||||
object-assign: 4.1.1
|
||||
signal-exit: 3.0.3
|
||||
string-width: 1.0.2
|
||||
strip-ansi: 3.0.1
|
||||
wide-align: 1.1.3
|
||||
dev: false
|
||||
|
||||
/generate-password/1.6.0:
|
||||
resolution: {integrity: sha512-YUJTQkApkLT/fru0QdYWP0lVZdPKhF5kXCP24sgI4gR/vFMJFopCj5t1+9FAKIYcML/nxzx2PMkA1ymO1FC+tQ==}
|
||||
dev: false
|
||||
|
||||
/glob-base/0.3.0:
|
||||
resolution: {integrity: sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dependencies:
|
||||
glob-parent: 2.0.0
|
||||
is-glob: 2.0.1
|
||||
dev: true
|
||||
|
||||
/glob-parent/2.0.0:
|
||||
resolution: {integrity: sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=}
|
||||
dependencies:
|
||||
is-glob: 2.0.1
|
||||
dev: true
|
||||
|
||||
/glob-parent/5.1.2:
|
||||
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
|
||||
engines: {node: '>= 6'}
|
||||
@@ -1326,6 +1445,13 @@ packages:
|
||||
is-glob: 4.0.1
|
||||
dev: true
|
||||
|
||||
/glob-parent/6.0.0:
|
||||
resolution: {integrity: sha512-Hdd4287VEJcZXUwv1l8a+vXC1GjOQqXe+VS30w/ypihpcnu9M1n3xeYeJu5CBpeEQj2nAab2xxz28GuA3vp4Ww==}
|
||||
engines: {node: '>=10.13.0'}
|
||||
dependencies:
|
||||
is-glob: 4.0.1
|
||||
dev: true
|
||||
|
||||
/glob/7.1.6:
|
||||
resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
|
||||
dependencies:
|
||||
@@ -1346,7 +1472,6 @@ packages:
|
||||
minimatch: 3.0.4
|
||||
once: 1.4.0
|
||||
path-is-absolute: 1.0.1
|
||||
dev: true
|
||||
|
||||
/globals/13.8.0:
|
||||
resolution: {integrity: sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==}
|
||||
@@ -1388,6 +1513,10 @@ packages:
|
||||
engines: {node: '>=8'}
|
||||
dev: true
|
||||
|
||||
/has-unicode/2.0.1:
|
||||
resolution: {integrity: sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=}
|
||||
dev: false
|
||||
|
||||
/has/1.0.3:
|
||||
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
|
||||
engines: {node: '>= 0.4.0'}
|
||||
@@ -1411,6 +1540,16 @@ packages:
|
||||
engines: {node: '>=8'}
|
||||
dev: true
|
||||
|
||||
/https-proxy-agent/5.0.0:
|
||||
resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==}
|
||||
engines: {node: '>= 6'}
|
||||
dependencies:
|
||||
agent-base: 6.0.2
|
||||
debug: 4.3.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/ieee754/1.2.1:
|
||||
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
|
||||
dev: false
|
||||
@@ -1502,33 +1641,23 @@ packages:
|
||||
dependencies:
|
||||
has: 1.0.3
|
||||
|
||||
/is-dotfile/1.0.3:
|
||||
resolution: {integrity: sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/is-extglob/1.0.0:
|
||||
resolution: {integrity: sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/is-extglob/2.1.1:
|
||||
resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/is-fullwidth-code-point/1.0.0:
|
||||
resolution: {integrity: sha1-754xOG8DGn8NZDr4L95QxFfvAMs=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dependencies:
|
||||
number-is-nan: 1.0.1
|
||||
dev: false
|
||||
|
||||
/is-fullwidth-code-point/3.0.0:
|
||||
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
|
||||
engines: {node: '>=8'}
|
||||
dev: true
|
||||
|
||||
/is-glob/2.0.1:
|
||||
resolution: {integrity: sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dependencies:
|
||||
is-extglob: 1.0.0
|
||||
dev: true
|
||||
|
||||
/is-glob/4.0.1:
|
||||
resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@@ -1711,7 +1840,13 @@ packages:
|
||||
engines: {node: '>=10'}
|
||||
dependencies:
|
||||
yallist: 4.0.0
|
||||
dev: true
|
||||
|
||||
/make-dir/3.1.0:
|
||||
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
semver: 6.3.0
|
||||
dev: false
|
||||
|
||||
/mdn-data/2.0.14:
|
||||
resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
|
||||
@@ -1732,7 +1867,7 @@ packages:
|
||||
engines: {node: '>=8.6'}
|
||||
dependencies:
|
||||
braces: 3.0.2
|
||||
picomatch: 2.2.3
|
||||
picomatch: 2.3.0
|
||||
dev: true
|
||||
|
||||
/min-indent/1.0.1:
|
||||
@@ -1749,10 +1884,31 @@ packages:
|
||||
resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==}
|
||||
dev: true
|
||||
|
||||
/minipass/3.1.3:
|
||||
resolution: {integrity: sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
yallist: 4.0.0
|
||||
dev: false
|
||||
|
||||
/minizlib/2.1.2:
|
||||
resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
|
||||
engines: {node: '>= 8'}
|
||||
dependencies:
|
||||
minipass: 3.1.3
|
||||
yallist: 4.0.0
|
||||
dev: false
|
||||
|
||||
/mkdirp-classic/0.5.3:
|
||||
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
|
||||
dev: false
|
||||
|
||||
/mkdirp/1.0.4:
|
||||
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/modern-normalize/1.1.0:
|
||||
resolution: {integrity: sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==}
|
||||
engines: {node: '>=6'}
|
||||
@@ -1866,12 +2022,21 @@ packages:
|
||||
resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=}
|
||||
dev: true
|
||||
|
||||
/node-addon-api/3.2.1:
|
||||
resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==}
|
||||
dev: false
|
||||
|
||||
/node-emoji/1.10.0:
|
||||
resolution: {integrity: sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==}
|
||||
dependencies:
|
||||
lodash.toarray: 4.4.0
|
||||
dev: true
|
||||
|
||||
/node-fetch/2.6.1:
|
||||
resolution: {integrity: sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==}
|
||||
engines: {node: 4.x || >=6.0.0}
|
||||
dev: false
|
||||
|
||||
/node-releases/1.1.71:
|
||||
resolution: {integrity: sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==}
|
||||
dev: true
|
||||
@@ -1880,6 +2045,14 @@ packages:
|
||||
resolution: {integrity: sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==}
|
||||
dev: false
|
||||
|
||||
/nopt/5.0.0:
|
||||
resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
|
||||
engines: {node: '>=6'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
abbrev: 1.1.1
|
||||
dev: false
|
||||
|
||||
/normalize-path/3.0.0:
|
||||
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@@ -1895,12 +2068,31 @@ packages:
|
||||
engines: {node: '>=8'}
|
||||
dev: true
|
||||
|
||||
/npmlog/4.1.2:
|
||||
resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==}
|
||||
dependencies:
|
||||
are-we-there-yet: 1.1.5
|
||||
console-control-strings: 1.1.0
|
||||
gauge: 2.7.4
|
||||
set-blocking: 2.0.0
|
||||
dev: false
|
||||
|
||||
/nth-check/2.0.0:
|
||||
resolution: {integrity: sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==}
|
||||
dependencies:
|
||||
boolbase: 1.0.0
|
||||
dev: true
|
||||
|
||||
/number-is-nan/1.0.1:
|
||||
resolution: {integrity: sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/object-assign/4.1.1:
|
||||
resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/object-hash/2.2.0:
|
||||
resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==}
|
||||
engines: {node: '>= 6'}
|
||||
@@ -1935,21 +2127,11 @@ packages:
|
||||
callsites: 3.1.0
|
||||
dev: true
|
||||
|
||||
/parse-glob/3.0.4:
|
||||
resolution: {integrity: sha1-ssN2z7EfNVE7rdFz7wu246OIORw=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dependencies:
|
||||
glob-base: 0.3.0
|
||||
is-dotfile: 1.0.3
|
||||
is-extglob: 1.0.0
|
||||
is-glob: 2.0.1
|
||||
dev: true
|
||||
|
||||
/parse-json/5.2.0:
|
||||
resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
|
||||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
'@babel/code-frame': 7.12.11
|
||||
'@babel/code-frame': 7.14.5
|
||||
error-ex: 1.3.2
|
||||
json-parse-even-better-errors: 2.3.1
|
||||
lines-and-columns: 1.1.6
|
||||
@@ -1963,8 +2145,8 @@ packages:
|
||||
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
|
||||
engines: {node: '>=8'}
|
||||
|
||||
/path-parse/1.0.6:
|
||||
resolution: {integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==}
|
||||
/path-parse/1.0.7:
|
||||
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
|
||||
|
||||
/path-type/4.0.0:
|
||||
resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
|
||||
@@ -1976,6 +2158,11 @@ packages:
|
||||
engines: {node: '>=8.6'}
|
||||
dev: true
|
||||
|
||||
/picomatch/2.3.0:
|
||||
resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==}
|
||||
engines: {node: '>=8.6'}
|
||||
dev: true
|
||||
|
||||
/postcss-calc/8.0.0_postcss@8.3.0:
|
||||
resolution: {integrity: sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==}
|
||||
peerDependencies:
|
||||
@@ -2050,7 +2237,7 @@ packages:
|
||||
engines: {node: '>=10.0'}
|
||||
dependencies:
|
||||
camelcase-css: 2.0.1
|
||||
postcss: 8.3.0
|
||||
postcss: 8.3.5
|
||||
dev: true
|
||||
|
||||
/postcss-load-config/3.0.1:
|
||||
@@ -2320,6 +2507,15 @@ packages:
|
||||
source-map-js: 0.6.2
|
||||
dev: true
|
||||
|
||||
/postcss/8.3.5:
|
||||
resolution: {integrity: sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==}
|
||||
engines: {node: ^10 || ^12 || >=14}
|
||||
dependencies:
|
||||
colorette: 1.2.2
|
||||
nanoid: 3.1.23
|
||||
source-map-js: 0.6.2
|
||||
dev: true
|
||||
|
||||
/prelude-ls/1.2.1:
|
||||
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
@@ -2367,13 +2563,13 @@ packages:
|
||||
engines: {node: '>=6'}
|
||||
dev: true
|
||||
|
||||
/purgecss/3.1.3:
|
||||
resolution: {integrity: sha512-hRSLN9mguJ2lzlIQtW4qmPS2kh6oMnA9RxdIYK8sz18QYqd6ePp4GNDl18oWHA1f2v2NEQIh51CO8s/E3YGckQ==}
|
||||
/purgecss/4.0.3:
|
||||
resolution: {integrity: sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
commander: 6.2.1
|
||||
glob: 7.1.7
|
||||
postcss: 8.3.0
|
||||
postcss: 8.3.5
|
||||
postcss-selector-parser: 6.0.6
|
||||
dev: true
|
||||
|
||||
@@ -2407,11 +2603,11 @@ packages:
|
||||
util-deprecate: 1.0.2
|
||||
dev: false
|
||||
|
||||
/readdirp/3.5.0:
|
||||
resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==}
|
||||
/readdirp/3.6.0:
|
||||
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
|
||||
engines: {node: '>=8.10.0'}
|
||||
dependencies:
|
||||
picomatch: 2.2.3
|
||||
picomatch: 2.3.0
|
||||
dev: true
|
||||
|
||||
/rechoir/0.6.2:
|
||||
@@ -2460,7 +2656,7 @@ packages:
|
||||
resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==}
|
||||
dependencies:
|
||||
is-core-module: 2.4.0
|
||||
path-parse: 1.0.6
|
||||
path-parse: 1.0.7
|
||||
|
||||
/reusify/1.0.4:
|
||||
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
|
||||
@@ -2480,7 +2676,6 @@ packages:
|
||||
hasBin: true
|
||||
dependencies:
|
||||
glob: 7.1.7
|
||||
dev: true
|
||||
|
||||
/rollup/2.46.0:
|
||||
resolution: {integrity: sha512-qPGoUBNl+Z8uNu0z7pD3WPTABWRbcOwIrO/5ccDJzmrtzn0LVf6Lj91+L5CcWhXl6iWf23FQ6m8Jkl2CmN1O7Q==}
|
||||
@@ -2533,13 +2728,21 @@ packages:
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/semver/6.3.0:
|
||||
resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/semver/7.3.5:
|
||||
resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==}
|
||||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
lru-cache: 6.0.0
|
||||
dev: true
|
||||
|
||||
/set-blocking/2.0.0:
|
||||
resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=}
|
||||
dev: false
|
||||
|
||||
/shebang-command/2.0.0:
|
||||
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
|
||||
@@ -2565,6 +2768,10 @@ packages:
|
||||
resolution: {integrity: sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==}
|
||||
dev: false
|
||||
|
||||
/signal-exit/3.0.3:
|
||||
resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==}
|
||||
dev: false
|
||||
|
||||
/simple-swizzle/0.2.2:
|
||||
resolution: {integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=}
|
||||
dependencies:
|
||||
@@ -2639,6 +2846,15 @@ packages:
|
||||
engines: {node: '>=0.8.0'}
|
||||
dev: false
|
||||
|
||||
/string-width/1.0.2:
|
||||
resolution: {integrity: sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dependencies:
|
||||
code-point-at: 1.1.0
|
||||
is-fullwidth-code-point: 1.0.0
|
||||
strip-ansi: 3.0.1
|
||||
dev: false
|
||||
|
||||
/string-width/4.2.2:
|
||||
resolution: {integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -2660,6 +2876,13 @@ packages:
|
||||
safe-buffer: 5.2.1
|
||||
dev: false
|
||||
|
||||
/strip-ansi/3.0.1:
|
||||
resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dependencies:
|
||||
ansi-regex: 2.1.1
|
||||
dev: false
|
||||
|
||||
/strip-ansi/6.0.0:
|
||||
resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==}
|
||||
engines: {node: '>=8'}
|
||||
@@ -2792,6 +3015,13 @@ packages:
|
||||
stable: 0.1.8
|
||||
dev: true
|
||||
|
||||
/systeminformation/5.7.7:
|
||||
resolution: {integrity: sha512-aQ7MBeVI2MKPYOi3YJAoZ45JVlRkBA7IXoqGgtVBamvtE0I6JLOyJzD/VVc9pnMXDb3yqaMwssAjhwtJax4/Rw==}
|
||||
engines: {node: '>=4.0.0'}
|
||||
os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos]
|
||||
hasBin: true
|
||||
dev: false
|
||||
|
||||
/table/6.6.0:
|
||||
resolution: {integrity: sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg==}
|
||||
engines: {node: '>=10.0.0'}
|
||||
@@ -2805,35 +3035,39 @@ packages:
|
||||
strip-ansi: 6.0.0
|
||||
dev: true
|
||||
|
||||
/tailwindcss/2.2.0-canary.8_6daa0ece57b4377652e73c9c66c3b94c:
|
||||
resolution: {integrity: sha512-IVgtzCS3HTq4lsK793isUIhbylCoG/WrarYpK8cAlbjOt5TwLJnhfp2GKjfzK3201eM4YawTjuRI+wesEy8XGg==}
|
||||
/tailwindcss/2.2.0_6daa0ece57b4377652e73c9c66c3b94c:
|
||||
resolution: {integrity: sha512-vzyictuac60cUfky6R4gFW98glcc/UxpaCH+Mt9dq+LEPdZq2Dpvo5iYpPaemutOIjfeiY0Y8j0ZgJG3wBaFDQ==}
|
||||
engines: {node: '>=12.13.0'}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
autoprefixer: ^10.0.2
|
||||
postcss: ^8.0.9
|
||||
dependencies:
|
||||
'@fullhuman/postcss-purgecss': 3.1.3
|
||||
'@fullhuman/postcss-purgecss': 4.0.3_postcss@8.3.0
|
||||
arg: 5.0.0
|
||||
autoprefixer: 10.2.6_postcss@8.3.0
|
||||
bytes: 3.1.0
|
||||
chalk: 4.1.1
|
||||
chokidar: 3.5.1
|
||||
chokidar: 3.5.2
|
||||
color: 3.1.3
|
||||
cosmiconfig: 7.0.0
|
||||
detective: 5.2.0
|
||||
didyoumean: 1.2.1
|
||||
dlv: 1.1.3
|
||||
fast-glob: 3.2.5
|
||||
fs-extra: 10.0.0
|
||||
glob-parent: 6.0.0
|
||||
html-tags: 3.1.0
|
||||
is-glob: 4.0.1
|
||||
lodash: 4.17.21
|
||||
lodash.topath: 4.5.2
|
||||
modern-normalize: 1.1.0
|
||||
node-emoji: 1.10.0
|
||||
normalize-path: 3.0.0
|
||||
object-hash: 2.2.0
|
||||
parse-glob: 3.0.4
|
||||
postcss: 8.3.0
|
||||
postcss-js: 3.0.3
|
||||
postcss-load-config: 3.0.1
|
||||
postcss-nested: 5.0.5_postcss@8.3.0
|
||||
postcss-selector-parser: 6.0.6
|
||||
postcss-value-parser: 4.1.0
|
||||
@@ -2841,6 +3075,7 @@ packages:
|
||||
quick-lru: 5.1.1
|
||||
reduce-css-calc: 2.1.8
|
||||
resolve: 1.20.0
|
||||
tmp: 0.2.1
|
||||
dev: true
|
||||
|
||||
/tar-fs/2.0.1:
|
||||
@@ -2863,6 +3098,18 @@ packages:
|
||||
readable-stream: 3.6.0
|
||||
dev: false
|
||||
|
||||
/tar/6.1.0:
|
||||
resolution: {integrity: sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==}
|
||||
engines: {node: '>= 10'}
|
||||
dependencies:
|
||||
chownr: 2.0.0
|
||||
fs-minipass: 2.1.0
|
||||
minipass: 3.1.3
|
||||
minizlib: 2.1.2
|
||||
mkdirp: 1.0.4
|
||||
yallist: 4.0.0
|
||||
dev: false
|
||||
|
||||
/text-table/0.2.0:
|
||||
resolution: {integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=}
|
||||
dev: true
|
||||
@@ -2871,6 +3118,13 @@ packages:
|
||||
resolution: {integrity: sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=}
|
||||
dev: true
|
||||
|
||||
/tmp/0.2.1:
|
||||
resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==}
|
||||
engines: {node: '>=8.17.0'}
|
||||
dependencies:
|
||||
rimraf: 3.0.2
|
||||
dev: true
|
||||
|
||||
/to-regex-range/5.0.1:
|
||||
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
|
||||
engines: {node: '>=8.0'}
|
||||
@@ -2988,6 +3242,12 @@ packages:
|
||||
dependencies:
|
||||
isexe: 2.0.0
|
||||
|
||||
/wide-align/1.1.3:
|
||||
resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==}
|
||||
dependencies:
|
||||
string-width: 1.0.2
|
||||
dev: false
|
||||
|
||||
/word-wrap/1.2.3:
|
||||
resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@@ -3003,7 +3263,6 @@ packages:
|
||||
|
||||
/yallist/4.0.0:
|
||||
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
|
||||
dev: true
|
||||
|
||||
/yaml/1.10.2:
|
||||
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
|
||||
|
||||
@@ -339,7 +339,7 @@
|
||||
>
|
||||
<span class="sr-only">Use setting</span>
|
||||
<span
|
||||
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transition ease-in-out duration-200"
|
||||
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transition ease-in-out duration-200 transform"
|
||||
class:translate-x-5={$application.general.isPreviewDeploymentEnabled}
|
||||
class:translate-x-0={!$application.general.isPreviewDeploymentEnabled}
|
||||
>
|
||||
|
||||
@@ -52,8 +52,7 @@
|
||||
);
|
||||
}
|
||||
} catch (error) {
|
||||
// console.log(error);
|
||||
// toast.push(error.error || error || 'Ooops something went wrong.');
|
||||
browser && toast.push(error.error || error || 'Ooops something went wrong.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,80 +1,83 @@
|
||||
<script>
|
||||
export let github = false;
|
||||
export let githubLoadingText = 'Loading GitHub...';
|
||||
export let fullscreen = true;
|
||||
</script>
|
||||
|
||||
{#if fullscreen}
|
||||
{#if github}
|
||||
<div class="fixed left-0 top-0 flex flex-wrap content-center h-full w-full">
|
||||
<div class="main flex justify-center items-center">
|
||||
<div class="w-64">
|
||||
<svg
|
||||
class=" w-28 animate-bounce mx-auto"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
><path
|
||||
d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"
|
||||
/></svg
|
||||
>
|
||||
<div class="text-xl font-bold text-center">
|
||||
{githubLoadingText}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="main fixed left-0 top-0 flex flex-wrap content-center h-full">
|
||||
<span class="loader" />
|
||||
</div>
|
||||
{/if}
|
||||
{:else}
|
||||
<div class="main h-64 py-24 left-0 top-0 flex flex-wrap content-center mx-auto">
|
||||
<span class="loader" />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<style lang="postcss">
|
||||
.loader {
|
||||
width: 8px;
|
||||
height: 40px;
|
||||
border-radius: 4px;
|
||||
display: block;
|
||||
margin: 20px auto;
|
||||
position: relative;
|
||||
background: currentColor;
|
||||
color: #fff;
|
||||
box-sizing: border-box;
|
||||
animation: animloader 0.3s 0.3s linear infinite alternate;
|
||||
}
|
||||
|
||||
.loader::after,
|
||||
.loader::before {
|
||||
content: "";
|
||||
width: 8px;
|
||||
height: 40px;
|
||||
border-radius: 4px;
|
||||
background: currentColor;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
left: 20px;
|
||||
box-sizing: border-box;
|
||||
animation: animloader 0.3s 0.45s linear infinite alternate;
|
||||
}
|
||||
.loader::before {
|
||||
left: -20px;
|
||||
animation-delay: 0s;
|
||||
}
|
||||
|
||||
@keyframes animloader {
|
||||
0% {
|
||||
height: 48px;
|
||||
}
|
||||
100% {
|
||||
height: 4px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
export let github = false;
|
||||
export let githubLoadingText = "Loading GitHub...";
|
||||
export let fullscreen = true;
|
||||
</script>
|
||||
|
||||
{#if fullscreen}
|
||||
{#if github}
|
||||
<div class="fixed left-0 top-0 flex flex-wrap content-center h-full w-full">
|
||||
<div class="main flex justify-center items-center">
|
||||
<div class="w-64">
|
||||
<svg
|
||||
class=" w-28 animate-bounce mx-auto"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
><path
|
||||
d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"
|
||||
></path></svg
|
||||
>
|
||||
<div class="text-xl font-bold text-center">
|
||||
{githubLoadingText}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="main fixed left-0 top-0 flex flex-wrap content-center h-full">
|
||||
<span class=" loader"></span>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
.loader {
|
||||
width: 8px;
|
||||
height: 40px;
|
||||
border-radius: 4px;
|
||||
display: block;
|
||||
margin: 20px auto;
|
||||
position: relative;
|
||||
background: currentColor;
|
||||
color: #fff;
|
||||
box-sizing: border-box;
|
||||
animation: animloader 0.3s 0.3s linear infinite alternate;
|
||||
}
|
||||
|
||||
.loader::after,
|
||||
.loader::before {
|
||||
content: '';
|
||||
width: 8px;
|
||||
height: 40px;
|
||||
border-radius: 4px;
|
||||
background: currentColor;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
left: 20px;
|
||||
box-sizing: border-box;
|
||||
animation: animloader 0.3s 0.45s linear infinite alternate;
|
||||
}
|
||||
.loader::before {
|
||||
left: -20px;
|
||||
animation-delay: 0s;
|
||||
}
|
||||
|
||||
@keyframes animloader {
|
||||
0% {
|
||||
height: 48px;
|
||||
}
|
||||
100% {
|
||||
height: 4px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,54 +1,56 @@
|
||||
<script>
|
||||
export let value;
|
||||
let showPassword = false;
|
||||
export let value;
|
||||
let showPassword = false;
|
||||
export let isEditable = false;
|
||||
</script>
|
||||
|
||||
<div class="relative w-full">
|
||||
<input
|
||||
type="{showPassword ? 'text' : 'password'}"
|
||||
class="w-full "
|
||||
{value}
|
||||
disabled
|
||||
/>
|
||||
<div
|
||||
class="absolute top-0 my-2 mx-2 right-0 cursor-pointer text-warmGray-600 hover:text-white"
|
||||
on:click="{() => showPassword = !showPassword}"
|
||||
>
|
||||
{#if showPassword}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="h-6 w-6"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"
|
||||
></path>
|
||||
</svg>
|
||||
{:else}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="h-6 w-6"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
|
||||
></path>
|
||||
</svg>
|
||||
{/if}
|
||||
</div>
|
||||
{#if showPassword}
|
||||
<input type="text" class="w-full" bind:value disabled={!isEditable} />
|
||||
{:else}
|
||||
<input type="password" class="w-full" bind:value disabled={!isEditable} />
|
||||
{/if}
|
||||
|
||||
<div
|
||||
class="absolute top-0 my-2 mx-2 right-0 cursor-pointer text-warmGray-600 hover:text-white"
|
||||
on:click={() => (showPassword = !showPassword)}
|
||||
>
|
||||
{#if showPassword}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="h-6 w-6"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"
|
||||
/>
|
||||
</svg>
|
||||
{:else}
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
class="h-6 w-6"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"
|
||||
/>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"
|
||||
/>
|
||||
</svg>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -98,7 +98,7 @@ export async function handle({ request, resolve }) {
|
||||
try {
|
||||
session = initializeSession(request.headers, {
|
||||
secret: SECRETS_ENCRYPTION_KEY,
|
||||
cookie: { path: '/' }
|
||||
cookie: { path: '/', secure: true }
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
@@ -146,6 +146,6 @@ export function getSession(request) {
|
||||
isLoggedIn: data && Object.keys(data).length !== 0 ? true : false,
|
||||
expires: data.expires,
|
||||
coolToken: data.coolToken,
|
||||
ghToken: data.ghToken
|
||||
ghToken: data.ghToken || null
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
export const publicPages = ['/', '/api/v1/login/github/app', '/api/v1/webhooks/deploy', '/success'];
|
||||
export const VITE_GITHUB_APP_NAME = import.meta.env.VITE_GITHUB_APP_NAME;
|
||||
export const publicPages = ['/', '/api/v1/login/github/app', '/api/v1/webhooks/deploy', '/success', '/api/v1/login/email']
|
||||
export const VITE_GITHUB_APP_NAME = import.meta.env.VITE_GITHUB_APP_NAME
|
||||
|
||||
@@ -4,12 +4,16 @@ export interface IUser extends Document {
|
||||
email: string;
|
||||
avatar?: string;
|
||||
uid: string;
|
||||
type: string;
|
||||
password: string;
|
||||
}
|
||||
|
||||
const UserSchema = new Schema({
|
||||
email: { type: String, required: true, unique: true },
|
||||
avatar: { type: String },
|
||||
uid: { type: String, required: true }
|
||||
uid: { type: String, required: true },
|
||||
type: { type: String, required: true, default: 'github' },
|
||||
password: { type: String }
|
||||
});
|
||||
|
||||
UserSchema.set('timestamps', true);
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
@@ -37,8 +36,9 @@
|
||||
import Tooltip from '$components/Tooltip.svelte';
|
||||
import compareVersions from 'compare-versions';
|
||||
import packageJson from '../../package.json';
|
||||
import { dashboard } from '$store';
|
||||
import { dashboard, settings } from '$store';
|
||||
import { browser } from '$app/env';
|
||||
$settings.clientId = import.meta.env.VITE_GITHUB_APP_CLIENTID !== 'null' ? import.meta.env.VITE_GITHUB_APP_CLIENTID : null
|
||||
$dashboard = initDashboard;
|
||||
const branch =
|
||||
process.env.NODE_ENV === 'production' &&
|
||||
@@ -53,12 +53,13 @@
|
||||
let upgradeDisabled = false;
|
||||
let upgradeDone = false;
|
||||
let showAck = false;
|
||||
let globalFeatureFlag = browser && localStorage.getItem('globalFeatureFlag');
|
||||
const options = {
|
||||
duration: 2000
|
||||
};
|
||||
onMount(async () => {
|
||||
upgradeAvailable = await checkUpgrade();
|
||||
browser && localStorage.removeItem('token')
|
||||
browser && localStorage.removeItem('token');
|
||||
if (!localStorage.getItem('automaticErrorReportsAck')) {
|
||||
showAck = true;
|
||||
if (latest?.coolify[branch]?.settings?.sendErrors) {
|
||||
@@ -103,7 +104,6 @@
|
||||
localStorage.setItem('automaticErrorReportsAck', 'true');
|
||||
showAck = false;
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<SvelteToast {options} />
|
||||
@@ -135,69 +135,136 @@
|
||||
class:border-purple-500={$page.path === '/dashboard/databases'}
|
||||
>
|
||||
<div class="w-10 pt-4 pb-4"><img src="/favicon.png" alt="coolLabs logo" /></div>
|
||||
|
||||
<Tooltip position="right" label="Applications">
|
||||
<div
|
||||
class="p-2 hover:bg-warmGray-700 rounded hover:text-green-500 mt-4 transition-all duration-100 cursor-pointer"
|
||||
on:click={() => goto('/dashboard/applications')}
|
||||
class:text-green-500={$page.path === '/dashboard/applications' ||
|
||||
$page.path.startsWith('/application')}
|
||||
class:bg-warmGray-700={$page.path === '/dashboard/applications' ||
|
||||
$page.path.startsWith('/application')}
|
||||
>
|
||||
<svg
|
||||
class="w-8"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
><rect x="4" y="4" width="16" height="16" rx="2" ry="2" /><rect
|
||||
x="9"
|
||||
y="9"
|
||||
width="6"
|
||||
height="6"
|
||||
/><line x1="9" y1="1" x2="9" y2="4" /><line x1="15" y1="1" x2="15" y2="4" /><line
|
||||
x1="9"
|
||||
y1="20"
|
||||
x2="9"
|
||||
y2="23"
|
||||
/><line x1="15" y1="20" x2="15" y2="23" /><line x1="20" y1="9" x2="23" y2="9" /><line
|
||||
x1="20"
|
||||
y1="14"
|
||||
x2="23"
|
||||
y2="14"
|
||||
/><line x1="1" y1="9" x2="4" y2="9" /><line x1="1" y1="14" x2="4" y2="14" /></svg
|
||||
{#if $settings.clientId}
|
||||
<Tooltip position="right" label="Applications">
|
||||
<div
|
||||
class="p-2 hover:bg-warmGray-700 rounded hover:text-green-500 mt-4 transition-all duration-100 cursor-pointer"
|
||||
on:click={() => goto('/dashboard/applications')}
|
||||
class:text-green-500={$page.path === '/dashboard/applications' ||
|
||||
$page.path.startsWith('/application')}
|
||||
class:bg-warmGray-700={$page.path === '/dashboard/applications' ||
|
||||
$page.path.startsWith('/application')}
|
||||
>
|
||||
</div>
|
||||
</Tooltip>
|
||||
<Tooltip position="right" label="Databases">
|
||||
<div
|
||||
class="p-2 hover:bg-warmGray-700 rounded hover:text-purple-500 my-4 transition-all duration-100 cursor-pointer"
|
||||
on:click={() => goto('/dashboard/databases')}
|
||||
class:text-purple-500={$page.path === '/dashboard/databases' ||
|
||||
$page.path.startsWith('/database')}
|
||||
class:bg-warmGray-700={$page.path === '/dashboard/databases' ||
|
||||
$page.path.startsWith('/database')}
|
||||
>
|
||||
<svg
|
||||
class="w-8"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
<svg
|
||||
class="w-8"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
><rect x="4" y="4" width="16" height="16" rx="2" ry="2" /><rect
|
||||
x="9"
|
||||
y="9"
|
||||
width="6"
|
||||
height="6"
|
||||
/><line x1="9" y1="1" x2="9" y2="4" /><line x1="15" y1="1" x2="15" y2="4" /><line
|
||||
x1="9"
|
||||
y1="20"
|
||||
x2="9"
|
||||
y2="23"
|
||||
/><line x1="15" y1="20" x2="15" y2="23" /><line
|
||||
x1="20"
|
||||
y1="9"
|
||||
x2="23"
|
||||
y2="9"
|
||||
/><line x1="20" y1="14" x2="23" y2="14" /><line x1="1" y1="9" x2="4" y2="9" /><line
|
||||
x1="1"
|
||||
y1="14"
|
||||
x2="4"
|
||||
y2="14"
|
||||
/></svg
|
||||
>
|
||||
</div>
|
||||
</Tooltip>
|
||||
<Tooltip position="right" label="Databases">
|
||||
<div
|
||||
class="p-2 hover:bg-warmGray-700 rounded hover:text-purple-500 my-4 transition-all duration-100 cursor-pointer"
|
||||
on:click={() => goto('/dashboard/databases')}
|
||||
class:text-purple-500={$page.path === '/dashboard/databases' ||
|
||||
$page.path.startsWith('/database')}
|
||||
class:bg-warmGray-700={$page.path === '/dashboard/databases' ||
|
||||
$page.path.startsWith('/database')}
|
||||
>
|
||||
<svg
|
||||
class="w-8"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</Tooltip>
|
||||
{:else}
|
||||
<Tooltip
|
||||
position="right"
|
||||
label="Applications disabled, no GitHub Integration detected"
|
||||
size="large"
|
||||
>
|
||||
<div class="p-2 text-warmGray-700 mt-4 transition-all duration-100 cursor-pointer">
|
||||
<svg
|
||||
class="w-8"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</Tooltip>
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
><rect x="4" y="4" width="16" height="16" rx="2" ry="2" /><rect
|
||||
x="9"
|
||||
y="9"
|
||||
width="6"
|
||||
height="6"
|
||||
/><line x1="9" y1="1" x2="9" y2="4" /><line x1="15" y1="1" x2="15" y2="4" /><line
|
||||
x1="9"
|
||||
y1="20"
|
||||
x2="9"
|
||||
y2="23"
|
||||
/><line x1="15" y1="20" x2="15" y2="23" /><line
|
||||
x1="20"
|
||||
y1="9"
|
||||
x2="23"
|
||||
y2="9"
|
||||
/><line x1="20" y1="14" x2="23" y2="14" /><line x1="1" y1="9" x2="4" y2="9" /><line
|
||||
x1="1"
|
||||
y1="14"
|
||||
x2="4"
|
||||
y2="14"
|
||||
/></svg
|
||||
>
|
||||
</div>
|
||||
</Tooltip>
|
||||
<Tooltip position="right" label="Databases disabled, no GitHub Integration detected" size="large">
|
||||
<div
|
||||
class="p-2 text-warmGray-700 my-4 transition-all duration-100 cursor-pointer"
|
||||
>
|
||||
<svg
|
||||
class="w-8"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
||||
<Tooltip position="right" label="Services">
|
||||
<div
|
||||
class="p-2 hover:bg-warmGray-700 rounded hover:text-blue-500 transition-all duration-100 cursor-pointer"
|
||||
@@ -224,6 +291,31 @@
|
||||
</div>
|
||||
</Tooltip>
|
||||
<div class="flex-1" />
|
||||
{#if globalFeatureFlag}
|
||||
<Tooltip position="right" label="Servers">
|
||||
<div
|
||||
class="p-2 hover:bg-warmGray-700 rounded hover:text-red-500 mb-4 transition-all duration-100 cursor-pointer"
|
||||
on:click={() => goto('/servers')}
|
||||
class:text-red-500={$page.path === '/servers' || $page.path.startsWith('/servers')}
|
||||
class:bg-warmGray-700={$page.path === '/servers' || $page.path.startsWith('/servers')}
|
||||
>
|
||||
<svg
|
||||
class="w-8"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke="currentColor"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
d="M5 12h14M5 12a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v4a2 2 0 01-2 2M5 12a2 2 0 00-2 2v4a2 2 0 002 2h14a2 2 0 002-2v-4a2 2 0 00-2-2m-2-4h.01M17 16h.01"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
<Tooltip position="right" label="Settings">
|
||||
<button
|
||||
class="p-2 hover:bg-warmGray-700 rounded hover:text-yellow-500 transition-all duration-100 cursor-pointer"
|
||||
|
||||
105
src/routes/api/v1/login/email.ts
Normal file
105
src/routes/api/v1/login/email.ts
Normal file
@@ -0,0 +1,105 @@
|
||||
import mongoose from 'mongoose';
|
||||
import Settings from '$models/Settings';
|
||||
import User from '$models/User';
|
||||
import bcrypt from 'bcrypt';
|
||||
import cuid from 'cuid';
|
||||
import jsonwebtoken from 'jsonwebtoken';
|
||||
import type { Request } from '@sveltejs/kit';
|
||||
|
||||
const saltRounds = 15;
|
||||
|
||||
export async function post(request: Request) {
|
||||
const { email, password } = request.body
|
||||
const { JWT_SIGN_KEY } = process.env;
|
||||
const settings = await Settings.findOne({ applicationName: 'coolify' });
|
||||
const registeredUsers = await User.find().countDocuments();
|
||||
const foundUser = await User.findOne({ email });
|
||||
try {
|
||||
let uid = cuid();
|
||||
if (foundUser) {
|
||||
if (foundUser.type === 'github') {
|
||||
return {
|
||||
status: 500,
|
||||
body: {
|
||||
error: 'Wrong password or email address.'
|
||||
}
|
||||
};
|
||||
}
|
||||
uid = foundUser.uid;
|
||||
if (!await bcrypt.compare(password, foundUser.password)) {
|
||||
return {
|
||||
status: 500,
|
||||
body: {
|
||||
error: 'Wrong password or email address.'
|
||||
}
|
||||
};
|
||||
}
|
||||
} else {
|
||||
if (registeredUsers === 0) {
|
||||
const newUser = new User({
|
||||
_id: new mongoose.Types.ObjectId(),
|
||||
email,
|
||||
uid,
|
||||
type: 'email',
|
||||
password: await bcrypt.hash(password, saltRounds)
|
||||
});
|
||||
const defaultSettings = new Settings({
|
||||
_id: new mongoose.Types.ObjectId()
|
||||
});
|
||||
try {
|
||||
await newUser.save();
|
||||
await defaultSettings.save();
|
||||
} catch (error) {
|
||||
return {
|
||||
status: 500,
|
||||
error: error.message || error
|
||||
};
|
||||
}
|
||||
} else {
|
||||
if (!settings?.allowRegistration) {
|
||||
return {
|
||||
status: 500,
|
||||
body: {
|
||||
error: 'Registration disabled, enable it in settings.'
|
||||
}
|
||||
};
|
||||
} else {
|
||||
const newUser = new User({
|
||||
_id: new mongoose.Types.ObjectId(),
|
||||
email,
|
||||
uid,
|
||||
type: 'email',
|
||||
password: await bcrypt.hash(password, saltRounds)
|
||||
});
|
||||
try {
|
||||
await newUser.save();
|
||||
} catch (error) {
|
||||
return {
|
||||
status: 500,
|
||||
error: error.message || error
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const coolToken = jsonwebtoken.sign({}, JWT_SIGN_KEY, {
|
||||
expiresIn: 15778800,
|
||||
algorithm: 'HS256',
|
||||
audience: 'coolLabs',
|
||||
issuer: 'coolLabs',
|
||||
jwtid: uid,
|
||||
subject: `User:${uid}`,
|
||||
notBefore: -1000
|
||||
});
|
||||
request.locals.session.data = { coolToken, ghToken: null };
|
||||
return {
|
||||
status: 200,
|
||||
body: {
|
||||
message: "Successfully logged in."
|
||||
}
|
||||
};
|
||||
} catch (error) {
|
||||
return { status: 500, body: { error: error.message || error } };
|
||||
}
|
||||
|
||||
}
|
||||
@@ -33,7 +33,8 @@ export async function get(request: Request) {
|
||||
_id: new mongoose.Types.ObjectId(),
|
||||
email,
|
||||
avatar: avatar_url,
|
||||
uid
|
||||
uid,
|
||||
type: 'github'
|
||||
});
|
||||
const defaultSettings = new Settings({
|
||||
_id: new mongoose.Types.ObjectId()
|
||||
@@ -68,7 +69,8 @@ export async function get(request: Request) {
|
||||
_id: new mongoose.Types.ObjectId(),
|
||||
email,
|
||||
avatar: avatar_url,
|
||||
uid
|
||||
uid,
|
||||
type: 'github'
|
||||
});
|
||||
try {
|
||||
await newUser.save();
|
||||
|
||||
25
src/routes/api/v1/servers/cleanups/caches.ts
Normal file
25
src/routes/api/v1/servers/cleanups/caches.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { saveServerLog } from '$lib/api/applications/logging';
|
||||
import { execShellAsync } from '$lib/api/common';
|
||||
import type { Request } from '@sveltejs/kit';
|
||||
|
||||
|
||||
export async function post(request: Request) {
|
||||
try {
|
||||
const output = await execShellAsync('docker builder prune -af')
|
||||
return {
|
||||
status: 200,
|
||||
body: {
|
||||
message: 'OK',
|
||||
output: output.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm,"").split('\n').pop()
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
await saveServerLog(error);
|
||||
return {
|
||||
status: 500,
|
||||
body: {
|
||||
error: error.message || error
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
25
src/routes/api/v1/servers/cleanups/containers.ts
Normal file
25
src/routes/api/v1/servers/cleanups/containers.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { saveServerLog } from '$lib/api/applications/logging';
|
||||
import { execShellAsync } from '$lib/api/common';
|
||||
import type { Request } from '@sveltejs/kit';
|
||||
|
||||
|
||||
export async function post(request: Request) {
|
||||
try {
|
||||
const output = await execShellAsync('docker container prune -f')
|
||||
return {
|
||||
status: 200,
|
||||
body: {
|
||||
message: 'OK',
|
||||
output: output.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm,"").split('\n').pop()
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
await saveServerLog(error);
|
||||
return {
|
||||
status: 500,
|
||||
body: {
|
||||
error: error.message || error
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
25
src/routes/api/v1/servers/cleanups/images.ts
Normal file
25
src/routes/api/v1/servers/cleanups/images.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { saveServerLog } from '$lib/api/applications/logging';
|
||||
import { execShellAsync } from '$lib/api/common';
|
||||
import type { Request } from '@sveltejs/kit';
|
||||
|
||||
|
||||
export async function post(request: Request) {
|
||||
try {
|
||||
const output = await execShellAsync('docker image prune -af')
|
||||
return {
|
||||
status: 200,
|
||||
body: {
|
||||
message: 'OK',
|
||||
output: output.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm,"").split('\n').pop()
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
await saveServerLog(error);
|
||||
return {
|
||||
status: 500,
|
||||
body: {
|
||||
error: error.message || error
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
25
src/routes/api/v1/servers/cleanups/volumes.ts
Normal file
25
src/routes/api/v1/servers/cleanups/volumes.ts
Normal file
@@ -0,0 +1,25 @@
|
||||
import { saveServerLog } from '$lib/api/applications/logging';
|
||||
import { execShellAsync } from '$lib/api/common';
|
||||
import type { Request } from '@sveltejs/kit';
|
||||
|
||||
|
||||
export async function post(request: Request) {
|
||||
try {
|
||||
const output = await execShellAsync('docker volume prune -f')
|
||||
return {
|
||||
status: 200,
|
||||
body: {
|
||||
message: 'OK',
|
||||
output: output.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm,"").split('\n').pop()
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
await saveServerLog(error);
|
||||
return {
|
||||
status: 500,
|
||||
body: {
|
||||
error: error.message || error
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
34
src/routes/api/v1/servers/index.ts
Normal file
34
src/routes/api/v1/servers/index.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import { saveServerLog } from '$lib/api/applications/logging';
|
||||
import { execShellAsync } from '$lib/api/common';
|
||||
import { docker } from '$lib/api/docker';
|
||||
import type { Request } from '@sveltejs/kit';
|
||||
import systeminformation from 'systeminformation'
|
||||
|
||||
export async function get(request: Request) {
|
||||
try {
|
||||
const df = await execShellAsync(
|
||||
`docker system df --format '{{ json . }}'`
|
||||
);
|
||||
const dockerReclaimable = df
|
||||
.split('\n')
|
||||
.filter((n) => n)
|
||||
.map((s) => JSON.parse(s))
|
||||
|
||||
return {
|
||||
status: 200,
|
||||
body: {
|
||||
hostname: await (await systeminformation.osInfo()).hostname,
|
||||
filesystems: await (await systeminformation.fsSize()).filter(fs => !fs.fs.match('/dev/loop') || !fs.fs.match('/var/lib/docker/')),
|
||||
dockerReclaimable
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
await saveServerLog(error);
|
||||
return {
|
||||
status: 500,
|
||||
body: {
|
||||
error: error.message || error
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
172
src/routes/api/v1/services/deploy/wordpress/index.ts
Normal file
172
src/routes/api/v1/services/deploy/wordpress/index.ts
Normal file
@@ -0,0 +1,172 @@
|
||||
import type { Request } from '@sveltejs/kit';
|
||||
import yaml from 'js-yaml';
|
||||
import generator from 'generate-password';
|
||||
import { promises as fs } from 'fs';
|
||||
import { docker } from '$lib/api/docker';
|
||||
import { baseServiceConfiguration } from '$lib/api/applications/common';
|
||||
import { cleanupTmp, execShellAsync } from '$lib/api/common';
|
||||
|
||||
export async function post(request: Request) {
|
||||
let { baseURL, remoteDB, database, wordpressExtraConfiguration } = request.body;
|
||||
const traefikURL = baseURL;
|
||||
baseURL = `https://${baseURL}`;
|
||||
console.log({ baseURL, remoteDB, database, wordpressExtraConfiguration })
|
||||
|
||||
const workdir = '/tmp/wordpress';
|
||||
const deployId = `wp-${generator.generate({ length: 5, numbers: true, strict: true })}`
|
||||
const defaultDatabaseName = generator.generate({ length: 12, numbers: true, strict: true })
|
||||
const defaultDatabaseHost = `${deployId}-mysql`
|
||||
const defaultDatabaseUser = generator.generate({ length: 12, numbers: true, strict: true })
|
||||
const defaultDatabasePassword = generator.generate({ length: 24, numbers: true, strict: true })
|
||||
const defaultDatabaseRootPassword = generator.generate({ length: 24, numbers: true, strict: true })
|
||||
const defaultDatabaseRootUser = generator.generate({ length: 12, numbers: true, strict: true })
|
||||
let secrets = [
|
||||
{ name: 'WORDPRESS_DB_HOST', value: defaultDatabaseHost },
|
||||
{ name: 'WORDPRESS_DB_USER', value: defaultDatabaseUser },
|
||||
{ name: 'WORDPRESS_DB_PASSWORD', value: defaultDatabasePassword },
|
||||
{ name: 'WORDPRESS_DB_NAME', value: defaultDatabaseName },
|
||||
{ name: 'WORDPRESS_CONFIG_EXTRA', value: wordpressExtraConfiguration }
|
||||
];
|
||||
|
||||
const generateEnvsMySQL = {
|
||||
MYSQL_ROOT_PASSWORD: defaultDatabaseRootPassword,
|
||||
MYSQL_ROOT_USER: defaultDatabaseRootUser,
|
||||
MYSQL_USER: defaultDatabaseUser,
|
||||
MYSQL_PASSWORD: defaultDatabasePassword,
|
||||
MYSQL_DATABASE: defaultDatabaseName
|
||||
};
|
||||
const image = 'bitnami/mysql:8.0';
|
||||
const volume = `${deployId}-mysql-data:/bitnami/mysql/data`;
|
||||
|
||||
if (remoteDB) {
|
||||
secrets = [
|
||||
{ name: 'WORDPRESS_DB_HOST', value: database.host },
|
||||
{ name: 'WORDPRESS_DB_USER', value: database.user },
|
||||
{ name: 'WORDPRESS_DB_PASSWORD', value: database.password },
|
||||
{ name: 'WORDPRESS_DB_NAME', value: database.name },
|
||||
{ name: 'WORDPRESS_TABLE_PREFIX', value: database.tablePrefix },
|
||||
{ name: 'WORDPRESS_CONFIG_EXTRA', value: wordpressExtraConfiguration }
|
||||
]
|
||||
}
|
||||
|
||||
const generateEnvsWordpress = {};
|
||||
for (const secret of secrets) generateEnvsWordpress[secret.name] = secret.value;
|
||||
let stack = {
|
||||
version: '3.8',
|
||||
services: {
|
||||
[deployId]: {
|
||||
image: 'wordpress',
|
||||
networks: [`${docker.network}`],
|
||||
environment: generateEnvsWordpress,
|
||||
volumes: [`${deployId}-wordpress-data:/var/www/html`],
|
||||
deploy: {
|
||||
...baseServiceConfiguration,
|
||||
labels: [
|
||||
'managedBy=coolify',
|
||||
'type=service',
|
||||
'serviceName=' + deployId,
|
||||
'configuration=' +
|
||||
JSON.stringify({
|
||||
deployId,
|
||||
baseURL,
|
||||
generateEnvsWordpress
|
||||
}),
|
||||
'traefik.enable=true',
|
||||
'traefik.http.services.' + deployId + '.loadbalancer.server.port=80',
|
||||
'traefik.http.routers.' + deployId + '.entrypoints=websecure',
|
||||
'traefik.http.routers.' +
|
||||
deployId +
|
||||
'.rule=Host(`' +
|
||||
traefikURL +
|
||||
'`) && PathPrefix(`/`)',
|
||||
'traefik.http.routers.' + deployId + '.tls.certresolver=letsencrypt',
|
||||
'traefik.http.routers.' + deployId + '.middlewares=global-compress'
|
||||
]
|
||||
}
|
||||
},
|
||||
[`${deployId}-mysql`]: {
|
||||
image,
|
||||
networks: [`${docker.network}`],
|
||||
environment: generateEnvsMySQL,
|
||||
volumes: [volume],
|
||||
deploy: {
|
||||
...baseServiceConfiguration,
|
||||
labels: [
|
||||
'managedBy=coolify',
|
||||
'type=service',
|
||||
'serviceName=' + deployId,
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
networks: {
|
||||
[`${docker.network}`]: {
|
||||
external: true
|
||||
}
|
||||
},
|
||||
volumes: {
|
||||
[`${deployId}-wordpress-data`]: {
|
||||
external: true
|
||||
},
|
||||
[`${deployId}-mysql-data`]: {
|
||||
external: true
|
||||
}
|
||||
},
|
||||
};
|
||||
if (remoteDB) {
|
||||
stack = {
|
||||
version: '3.8',
|
||||
services: {
|
||||
[deployId]: {
|
||||
image: 'wordpress',
|
||||
networks: [`${docker.network}`],
|
||||
environment: generateEnvsWordpress,
|
||||
volumes: [`${deployId}-wordpress-data:/var/www/html`],
|
||||
deploy: {
|
||||
...baseServiceConfiguration,
|
||||
labels: [
|
||||
'managedBy=coolify',
|
||||
'type=service',
|
||||
'serviceName=' + deployId,
|
||||
'configuration=' +
|
||||
JSON.stringify({
|
||||
deployId,
|
||||
baseURL,
|
||||
generateEnvsWordpress
|
||||
}),
|
||||
'traefik.enable=true',
|
||||
'traefik.http.services.' + deployId + '.loadbalancer.server.port=80',
|
||||
'traefik.http.routers.' + deployId + '.entrypoints=websecure',
|
||||
'traefik.http.routers.' +
|
||||
deployId +
|
||||
'.rule=Host(`' +
|
||||
traefikURL +
|
||||
'`) && PathPrefix(`/`)',
|
||||
'traefik.http.routers.' + deployId + '.tls.certresolver=letsencrypt',
|
||||
'traefik.http.routers.' + deployId + '.middlewares=global-compress'
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
networks: {
|
||||
[`${docker.network}`]: {
|
||||
external: true
|
||||
}
|
||||
},
|
||||
volumes: {
|
||||
[`${deployId}-wordpress-data`]: {
|
||||
external: true
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
await execShellAsync(`mkdir -p ${workdir}`);
|
||||
await fs.writeFile(`${workdir}/stack.yml`, yaml.dump(stack));
|
||||
await execShellAsync(`docker stack rm ${deployId}`);
|
||||
await execShellAsync(`cat ${workdir}/stack.yml | docker stack deploy --prune -c - ${deployId}`);
|
||||
cleanupTmp(workdir);
|
||||
return {
|
||||
status: 200,
|
||||
body: { message: 'OK' }
|
||||
};
|
||||
}
|
||||
@@ -1,3 +1,18 @@
|
||||
<script context="module" lang="ts">
|
||||
/**
|
||||
* @type {import('@sveltejs/kit').Load}
|
||||
*/
|
||||
export async function load(session) {
|
||||
if (!browser && !process.env.VITE_GITHUB_APP_CLIENTID) {
|
||||
return {
|
||||
status: 301,
|
||||
redirect: '/dashboard/services'
|
||||
};
|
||||
}
|
||||
return {};
|
||||
}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
import { application, initialApplication, initConf, dashboard, prApplication } from '$store';
|
||||
import { onDestroy } from 'svelte';
|
||||
@@ -58,7 +73,6 @@
|
||||
onDestroy(() => {
|
||||
$application = JSON.parse(JSON.stringify(initialApplication));
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
{#await loadConfiguration()}
|
||||
|
||||
@@ -1,8 +1,28 @@
|
||||
<script context="module" lang="ts">
|
||||
import { request } from '$lib/request';
|
||||
/**
|
||||
* @type {import('@sveltejs/kit').Load}
|
||||
*/
|
||||
export async function load(session) {
|
||||
if (!browser && !process.env.VITE_GITHUB_APP_CLIENTID) {
|
||||
return {
|
||||
status: 301,
|
||||
redirect: '/dashboard/services'
|
||||
};
|
||||
}
|
||||
return {
|
||||
props: {
|
||||
initDashboard: await request('/api/v1/dashboard', session)
|
||||
}
|
||||
};
|
||||
}
|
||||
</script>
|
||||
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
import { dashboard, dateOptions } from '$store';
|
||||
import { dashboard, dateOptions, settings } from '$store';
|
||||
import { fade } from 'svelte/transition';
|
||||
|
||||
import { browser } from '$app/env';
|
||||
</script>
|
||||
|
||||
<div
|
||||
|
||||
@@ -1,3 +1,18 @@
|
||||
<script context="module" lang="ts">
|
||||
/**
|
||||
* @type {import('@sveltejs/kit').Load}
|
||||
*/
|
||||
export async function load(session) {
|
||||
if (!browser && !process.env.VITE_GITHUB_APP_CLIENTID) {
|
||||
return {
|
||||
status: 301,
|
||||
redirect: '/dashboard/services'
|
||||
};
|
||||
}
|
||||
return {};
|
||||
}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
import { goto } from '$app/navigation';
|
||||
import MongoDb from '$components/Database/SVGs/MongoDb.svelte';
|
||||
@@ -8,7 +23,7 @@
|
||||
import { dashboard } from '$store';
|
||||
import { fade } from 'svelte/transition';
|
||||
import Redis from '$components/Database/SVGs/Redis.svelte';
|
||||
|
||||
import { browser } from '$app/env';
|
||||
</script>
|
||||
|
||||
<div class="py-5 text-left px-6 text-3xl tracking-tight font-bold flex items-center">
|
||||
@@ -59,9 +74,7 @@
|
||||
customClass="w-10 h-10 fill-current text-red-600 absolute top-0 left-0 -m-4"
|
||||
/>
|
||||
{:else if database.configuration.general.type == 'redis'}
|
||||
<Redis
|
||||
customClass="w-10 h-10 absolute top-0 left-0 -m-4"
|
||||
/>
|
||||
<Redis customClass="w-10 h-10 absolute top-0 left-0 -m-4" />
|
||||
{:else if database.configuration.general.type == 'clickhouse'}
|
||||
<Clickhouse
|
||||
customClass="w-10 h-10 fill-current text-red-600 absolute top-0 left-0 -m-4"
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
import { goto } from '$app/navigation';
|
||||
import { dashboard } from '$store';
|
||||
import { fade } from 'svelte/transition';
|
||||
async function openConfiguration(service) {
|
||||
if (service.serviceName === 'wordpress') {
|
||||
goto(`/service/${service.configuration.deployId}/configuration`);
|
||||
} else {
|
||||
goto(`/service/${service.serviceName}/configuration`);
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div
|
||||
@@ -34,7 +42,7 @@
|
||||
<div
|
||||
in:fade={{ duration: 200 }}
|
||||
class="px-4 pb-4"
|
||||
on:click={() => goto(`/service/${service.serviceName}/configuration`)}
|
||||
on:click={() => openConfiguration(service)}
|
||||
>
|
||||
<div
|
||||
class="relative rounded-xl p-6 bg-warmGray-800 border-2 border-dashed border-transparent hover:border-blue-500 text-white shadow-md cursor-pointer ease-in-out hover:scale-105 duration-100 group"
|
||||
@@ -49,7 +57,7 @@
|
||||
/>
|
||||
<div class="text-white font-bold">Plausible Analytics</div>
|
||||
</div>
|
||||
{:else if service.serviceName == 'nocodb'}
|
||||
{:else if service.serviceName == 'nocodb'}
|
||||
<div>
|
||||
<img
|
||||
alt="nocodedb"
|
||||
@@ -58,15 +66,27 @@
|
||||
/>
|
||||
<div class="text-white font-bold">NocoDB</div>
|
||||
</div>
|
||||
{:else if service.serviceName == 'code-server'}
|
||||
{:else if service.serviceName == 'code-server'}
|
||||
<div>
|
||||
<svg class="w-10 absolute top-0 left-0 -m-6" viewBox="0 0 128 128">
|
||||
<path d="M3.656 45.043s-3.027-2.191.61-5.113l8.468-7.594s2.426-2.559 4.989-.328l78.175 59.328v28.45s-.039 4.468-5.757 3.976zm0 0" fill="#2489ca"></path><path d="M23.809 63.379L3.656 81.742s-2.07 1.543 0 4.305l9.356 8.527s2.222 2.395 5.508-.328l21.359-16.238zm0 0" fill="#1070b3"></path><path d="M59.184 63.531l36.953-28.285-.239-28.297S94.32.773 89.055 3.99L39.879 48.851zm0 0" fill="#0877b9"></path><path d="M90.14 123.797c2.145 2.203 4.747 1.48 4.747 1.48l28.797-14.222c3.687-2.52 3.171-5.645 3.171-5.645V20.465c0-3.735-3.812-5.024-3.812-5.024L98.082 3.38c-5.453-3.379-9.027.61-9.027.61s4.593-3.317 6.843 2.96v112.317c0 .773-.164 1.53-.492 2.214-.656 1.332-2.086 2.57-5.504 2.051zm0 0" fill="#3c99d4"></path>
|
||||
</svg>
|
||||
<path
|
||||
d="M3.656 45.043s-3.027-2.191.61-5.113l8.468-7.594s2.426-2.559 4.989-.328l78.175 59.328v28.45s-.039 4.468-5.757 3.976zm0 0"
|
||||
fill="#2489ca"
|
||||
/><path
|
||||
d="M23.809 63.379L3.656 81.742s-2.07 1.543 0 4.305l9.356 8.527s2.222 2.395 5.508-.328l21.359-16.238zm0 0"
|
||||
fill="#1070b3"
|
||||
/><path
|
||||
d="M59.184 63.531l36.953-28.285-.239-28.297S94.32.773 89.055 3.99L39.879 48.851zm0 0"
|
||||
fill="#0877b9"
|
||||
/><path
|
||||
d="M90.14 123.797c2.145 2.203 4.747 1.48 4.747 1.48l28.797-14.222c3.687-2.52 3.171-5.645 3.171-5.645V20.465c0-3.735-3.812-5.024-3.812-5.024L98.082 3.38c-5.453-3.379-9.027.61-9.027.61s4.593-3.317 6.843 2.96v112.317c0 .773-.164 1.53-.492 2.214-.656 1.332-2.086 2.57-5.504 2.051zm0 0"
|
||||
fill="#3c99d4"
|
||||
/>
|
||||
</svg>
|
||||
|
||||
<div class="text-white font-bold">VSCode Server</div>
|
||||
</div>
|
||||
{:else if service.serviceName == 'minio'}
|
||||
{:else if service.serviceName == 'minio'}
|
||||
<div>
|
||||
<img
|
||||
alt="minio"
|
||||
@@ -76,6 +96,21 @@
|
||||
|
||||
<div class="text-white font-bold">MinIO</div>
|
||||
</div>
|
||||
{:else if service.serviceName.match(/wp-/)}
|
||||
<svg class="w-10 absolute top-0 left-0 -m-6" viewBox="0 0 128 128">
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
fill="white"
|
||||
d="M64.094 126.224c34.275-.052 62.021-27.933 62.021-62.325 0-33.833-27.618-61.697-60.613-62.286C30.85.995 1.894 29.113 1.885 63.21c-.01 35.079 27.612 63.064 62.209 63.014zM63.993 4.63c32.907-.011 59.126 26.725 59.116 60.28-.011 31.679-26.925 58.18-59.092 58.187-32.771.007-59.125-26.563-59.124-59.608.002-32.193 26.766-58.848 59.1-58.859zM39.157 35.896c.538 1.793-.968 2.417-2.569 2.542-1.685.13-3.369.257-5.325.406 6.456 19.234 12.815 38.183 19.325 57.573.464-.759.655-.973.739-1.223 3.574-10.682 7.168-21.357 10.651-32.069.318-.977.16-2.271-.188-3.275-1.843-5.32-4.051-10.524-5.667-15.908-1.105-3.686-2.571-6.071-6.928-5.644-.742.073-1.648-1.524-2.479-2.349 1.005-.6 2.003-1.704 3.017-1.719a849.593 849.593 0 0126.618.008c1.018.017 2.016 1.15 3.021 1.765-.88.804-1.639 2.01-2.668 2.321-1.651.498-3.482.404-5.458.58l19.349 57.56c2.931-9.736 5.658-18.676 8.31-27.639 2.366-8.001.956-15.473-3.322-22.52-1.286-2.119-2.866-4.175-3.595-6.486-.828-2.629-1.516-5.622-1.077-8.259.745-4.469 4.174-6.688 8.814-7.113C74.333.881 34.431 9.317 19.728 34.922c5.66-.261 11.064-.604 16.472-.678 1.022-.013 2.717.851 2.957 1.652zm10.117 77.971c-.118.345-.125.729-.218 1.302 10.943 3.034 21.675 2.815 32.659-.886l-16.78-45.96c-5.37 15.611-10.52 30.575-15.661 45.544zm-8.456-2.078l-25.281-69.35c-11.405 22.278-2.729 56.268 25.281 69.35zm76.428-44.562c.802-10.534-2.832-25.119-5.97-27.125-.35 3.875-.106 8.186-1.218 12.114-2.617 9.255-5.817 18.349-8.899 27.468-3.35 9.912-6.832 19.779-10.257 29.666 16.092-9.539 24.935-23.618 26.344-42.123z"
|
||||
/>
|
||||
</svg>
|
||||
<div class="text-white font-bold text-center">
|
||||
Wordpress<span
|
||||
class="flex text-xs items-center justify-center text-warmGray-300 group-hover:text-white"
|
||||
>({service.configuration.baseURL.replace('https://', '')})</span
|
||||
>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
<script>
|
||||
import { browser } from '$app/env';
|
||||
|
||||
import { goto } from '$app/navigation';
|
||||
import { session } from '$app/stores';
|
||||
import { toast } from '@zerodevx/svelte-toast';
|
||||
import PasswordField from '$components/PasswordField.svelte';
|
||||
import { request } from '$lib/request';
|
||||
|
||||
import { settings } from '$store';
|
||||
import Loading from '$components/Loading.svelte';
|
||||
let loading = false;
|
||||
let email = null;
|
||||
let password = null;
|
||||
async function login() {
|
||||
const left = screen.width / 2 - 1020 / 2;
|
||||
const top = screen.height / 2 - 618 / 2;
|
||||
@@ -22,11 +27,30 @@
|
||||
const timer = setInterval(() => {
|
||||
if (newWindow?.closed) {
|
||||
clearInterval(timer);
|
||||
browser && location.reload()
|
||||
// WHY need to navigate to / to get cookies?!
|
||||
browser && window.location.replace('/')
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
|
||||
async function loginWithEmail() {
|
||||
try {
|
||||
loading = true;
|
||||
const { message } = await request('/api/v1/login/email', $session, {
|
||||
body: {
|
||||
email,
|
||||
password
|
||||
}
|
||||
});
|
||||
toast.push(message);
|
||||
setTimeout(() => {
|
||||
// WHY need to navigate to / to get cookies?!
|
||||
browser && window.location.replace('/')
|
||||
}, 1000);
|
||||
} catch (error) {
|
||||
loading = false;
|
||||
browser && toast.push(error.error || error || 'Ooops something went wrong.');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="flex justify-center items-center h-screen w-full bg-warmGray-900">
|
||||
@@ -37,24 +61,56 @@
|
||||
>
|
||||
<span class="border-gradient">Coolify</span>
|
||||
</p>
|
||||
<h2 class="text-2xl md:text-3xl font-extrabold text-white">
|
||||
<h2 class="text-2xl md:text-3xl font-extrabold text-white py-10">
|
||||
An open-source, hassle-free, self-hostable<br />
|
||||
<span class="text-indigo-400">Heroku</span>
|
||||
& <span class="text-green-400">Netlify</span> alternative
|
||||
</h2>
|
||||
<div class="text-center py-10">
|
||||
{#if !$session.isLoggedIn}
|
||||
<button
|
||||
class="text-white bg-warmGray-800 hover:bg-warmGray-700 rounded p-2 px-10 font-bold"
|
||||
on:click={login}>Login with Github</button
|
||||
>
|
||||
{:else}
|
||||
<button
|
||||
class="text-white bg-warmGray-800 hover:bg-warmGray-700 rounded p-2 px-10 font-bold"
|
||||
on:click={() => goto('/dashboard/applications')}>Get Started</button
|
||||
>
|
||||
{/if}
|
||||
</div>
|
||||
{#if loading}
|
||||
<Loading fullscreen={false} />
|
||||
{:else}
|
||||
<div class="text-center py-10 max-w-7xl">
|
||||
{#if !$session.isLoggedIn}
|
||||
{#if $settings.clientId}
|
||||
<button
|
||||
class="text-white bg-warmGray-800 hover:bg-warmGray-700 rounded p-2 px-10 font-bold"
|
||||
on:click={login}>Login with GitHub</button
|
||||
>
|
||||
{:else}
|
||||
<div>
|
||||
<div class="grid grid-flow-row gap-2 items-center pb-6">
|
||||
<div class="grid grid-flow-row">
|
||||
<label for="Email" class="">Email address</label>
|
||||
<input
|
||||
class="border-2"
|
||||
id="Email"
|
||||
bind:value={email}
|
||||
placeholder="hi@coollabs.io"
|
||||
/>
|
||||
</div>
|
||||
<div class="grid grid-flow-row">
|
||||
<label for="Password" class="">Password</label>
|
||||
<PasswordField bind:value={password} isEditable />
|
||||
</div>
|
||||
</div>
|
||||
<div class="space-x-4 pt-10">
|
||||
<button
|
||||
class="text-white bg-warmGray-800 hover:bg-warmGray-700 rounded p-2 px-10 font-bold"
|
||||
on:click={loginWithEmail}>Login with Email</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{:else}
|
||||
<button
|
||||
class="text-white bg-warmGray-800 hover:bg-warmGray-700 rounded p-2 px-10 font-bold"
|
||||
on:click={() =>
|
||||
$settings.clientId ? goto('/dashboard/applications') : goto('/dashboard/services')}
|
||||
>Get Started</button
|
||||
>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
101
src/routes/servers/index.svelte
Normal file
101
src/routes/servers/index.svelte
Normal file
@@ -0,0 +1,101 @@
|
||||
<script context="module">
|
||||
/**
|
||||
* @type {import('@sveltejs/kit').Load}
|
||||
*/
|
||||
export async function load({ fetch }) {
|
||||
try {
|
||||
const { hostname, filesystems,dockerReclaimable } = await (await fetch(`/api/v1/servers`)).json();
|
||||
return {
|
||||
props: {
|
||||
hostname,
|
||||
filesystems,
|
||||
dockerReclaimable
|
||||
}
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
props: {
|
||||
hostname: null,
|
||||
filesystems: null,
|
||||
dockerReclaimable: null
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
export let hostname;
|
||||
export let filesystems;
|
||||
export let dockerReclaimable;
|
||||
import { browser } from '$app/env';
|
||||
import { session } from '$app/stores';
|
||||
import { request } from '$lib/request';
|
||||
import { toast } from '@zerodevx/svelte-toast';
|
||||
import { fade } from 'svelte/transition';
|
||||
async function refetch() {
|
||||
const data = await request('/api/v1/servers', $session)
|
||||
filesystems = data.filesystems
|
||||
dockerReclaimable = data.dockerReclaimable
|
||||
}
|
||||
async function cleanupVolumes() {
|
||||
const { output } = await request('/api/v1/servers/cleanups/volumes', $session, {
|
||||
body: {}
|
||||
});
|
||||
browser && toast.push(output);
|
||||
await refetch()
|
||||
}
|
||||
async function cleanupImages() {
|
||||
const { output } = await request('/api/v1/servers/cleanups/images', $session, {
|
||||
body: {}
|
||||
});
|
||||
browser && toast.push(output);
|
||||
await refetch()
|
||||
}
|
||||
async function cleanupBuildCache() {
|
||||
const { output } = await request('/api/v1/servers/cleanups/caches', $session, {
|
||||
body: {}
|
||||
});
|
||||
browser && toast.push(output);
|
||||
await refetch()
|
||||
}
|
||||
async function cleanupContainers() {
|
||||
const { output } = await request('/api/v1/servers/cleanups/containers', $session, {
|
||||
body: {}
|
||||
});
|
||||
browser && toast.push(output);
|
||||
await refetch()
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div class="min-h-full text-white" in:fade={{ duration: 100 }}>
|
||||
<div class="py-5 text-left px-6 text-3xl tracking-tight font-bold flex items-center">
|
||||
<div>Servers</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div in:fade={{ duration: 100 }}>
|
||||
<div class="max-w-4xl mx-auto px-6 pb-4 h-64 ">
|
||||
<div class="text-center font-bold text-xl">{hostname}</div>
|
||||
<div class="font-bold">Filesystem Usage</div>
|
||||
{#each filesystems as filesystem}
|
||||
<!-- <div>{JSON.stringify(filesystem)}</div> -->
|
||||
<div class="text-xs">
|
||||
{filesystem.mount}: {(filesystem.available / 1024 / 1024).toFixed()}MB ({filesystem.use}%) free of {(filesystem.size /1024 /1024).toFixed()}MB
|
||||
</div>
|
||||
{/each}
|
||||
<div class="font-bold">Docker Reclaimable</div>
|
||||
{#each dockerReclaimable as reclaimable}
|
||||
<div class="text-xs">
|
||||
{reclaimable.Type}: {reclaimable.Reclaimable} of {reclaimable.Size}
|
||||
</div>
|
||||
{/each}
|
||||
|
||||
<button class="button hover:bg-warmGray-700 bg-warmGray-800 rounded p-2 font-bold" on:click={cleanupVolumes}>Cleanup unused volumes</button>
|
||||
<button class="button hover:bg-warmGray-700 bg-warmGray-800 rounded p-2 font-bold" on:click={cleanupImages}>Cleanup unused images</button>
|
||||
<button class="button hover:bg-warmGray-700 bg-warmGray-800 rounded p-2 font-bold" on:click={cleanupBuildCache}>Cleanup build caches</button>
|
||||
<button class="button hover:bg-warmGray-700 bg-warmGray-800 rounded p-2 font-bold" on:click={cleanupContainers}>Cleanup containers</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -13,6 +13,7 @@
|
||||
let service = {};
|
||||
async function loadServiceConfig() {
|
||||
if ($page.params.name) {
|
||||
|
||||
try {
|
||||
service = await request(`/api/v1/services/${$page.params.name}`, $session);
|
||||
} catch (error) {
|
||||
@@ -39,6 +40,8 @@
|
||||
<div>VSCode Server</div>
|
||||
{:else if $page.params.name === 'minio'}
|
||||
<div>MinIO</div>
|
||||
{:else if $page.params.name.match(/wp-/)}
|
||||
<div>Wordpress<span class="flex text-xs items-center justify-center">({service.config.baseURL.replace('https://','')})</span></div>
|
||||
{/if}
|
||||
|
||||
<div class="px-4">
|
||||
@@ -76,6 +79,15 @@
|
||||
class="w-7 mx-auto"
|
||||
src="https://cdn.coollabs.io/assets/coolify/services/minio/MINIO_Bird.png"
|
||||
/>
|
||||
{:else if $page.params.name.match(/wp-/)}
|
||||
<svg class="w-8 mx-auto" viewBox="0 0 128 128">
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
fill="white"
|
||||
d="M64.094 126.224c34.275-.052 62.021-27.933 62.021-62.325 0-33.833-27.618-61.697-60.613-62.286C30.85.995 1.894 29.113 1.885 63.21c-.01 35.079 27.612 63.064 62.209 63.014zM63.993 4.63c32.907-.011 59.126 26.725 59.116 60.28-.011 31.679-26.925 58.18-59.092 58.187-32.771.007-59.125-26.563-59.124-59.608.002-32.193 26.766-58.848 59.1-58.859zM39.157 35.896c.538 1.793-.968 2.417-2.569 2.542-1.685.13-3.369.257-5.325.406 6.456 19.234 12.815 38.183 19.325 57.573.464-.759.655-.973.739-1.223 3.574-10.682 7.168-21.357 10.651-32.069.318-.977.16-2.271-.188-3.275-1.843-5.32-4.051-10.524-5.667-15.908-1.105-3.686-2.571-6.071-6.928-5.644-.742.073-1.648-1.524-2.479-2.349 1.005-.6 2.003-1.704 3.017-1.719a849.593 849.593 0 0126.618.008c1.018.017 2.016 1.15 3.021 1.765-.88.804-1.639 2.01-2.668 2.321-1.651.498-3.482.404-5.458.58l19.349 57.56c2.931-9.736 5.658-18.676 8.31-27.639 2.366-8.001.956-15.473-3.322-22.52-1.286-2.119-2.866-4.175-3.595-6.486-.828-2.629-1.516-5.622-1.077-8.259.745-4.469 4.174-6.688 8.814-7.113C74.333.881 34.431 9.317 19.728 34.922c5.66-.261 11.064-.604 16.472-.678 1.022-.013 2.717.851 2.957 1.652zm10.117 77.971c-.118.345-.125.729-.218 1.302 10.943 3.034 21.675 2.815 32.659-.886l-16.78-45.96c-5.37 15.611-10.52 30.575-15.661 45.544zm-8.456-2.078l-25.281-69.35c-11.405 22.278-2.729 56.268 25.281 69.35zm76.428-44.562c.802-10.534-2.832-25.119-5.97-27.125-.35 3.875-.106 8.186-1.218 12.114-2.617 9.255-5.817 18.349-8.899 27.468-3.35 9.912-6.832 19.779-10.257 29.666 16.092-9.539 24.935-23.618 26.344-42.123z"
|
||||
/>
|
||||
</svg>
|
||||
{/if}
|
||||
</div>
|
||||
<a target="_blank" class="icon mx-2" href={service.config.baseURL}>
|
||||
@@ -106,6 +118,8 @@
|
||||
<CodeServer {service} />
|
||||
{:else if $page.params.name === 'minio'}
|
||||
<MinIo {service} />
|
||||
{:else if $page.params.name.match(/wp-/)}
|
||||
<div class="font-bold">Nothing to show here. Enjoy using WordPress!</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import { fade } from 'svelte/transition';
|
||||
|
||||
import { toast } from '@zerodevx/svelte-toast';
|
||||
import { newService } from '$store';
|
||||
import { newService, newWordpressService } from '$store';
|
||||
import { page, session } from '$app/stores';
|
||||
import { request } from '$lib/request';
|
||||
import { goto } from '$app/navigation';
|
||||
@@ -25,7 +25,7 @@
|
||||
$: deployableNocoDB = $newService.baseURL === '' || $newService.baseURL === null;
|
||||
$: deployableCodeServer = $newService.baseURL === '' || $newService.baseURL === null;
|
||||
$: deployableMinIO = $newService.baseURL === '' || $newService.baseURL === null;
|
||||
|
||||
$: deployableWordpress = false
|
||||
let loading = false;
|
||||
async function deployPlausible() {
|
||||
try {
|
||||
@@ -115,6 +115,28 @@
|
||||
loading = false;
|
||||
}
|
||||
}
|
||||
async function deployWordpress() {
|
||||
try {
|
||||
loading = true;
|
||||
await request(`/api/v1/services/deploy/${$page.params.type}`, $session, {
|
||||
body: {
|
||||
...$newWordpressService
|
||||
}
|
||||
});
|
||||
if (browser) {
|
||||
toast.push(
|
||||
'Service deployment queued.<br><br><br>It could take 2-5 minutes to be ready, be patient and grab a coffee/tea!',
|
||||
{ duration: 4000 }
|
||||
);
|
||||
goto(`/dashboard/services`, { replaceState: true });
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
browser && toast.push('Oops something went wrong. See console.log.');
|
||||
} finally {
|
||||
loading = false;
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
@@ -129,13 +151,15 @@
|
||||
<span class="text-blue-500 px-2 capitalize">VSCode Server</span>
|
||||
{:else if $page.params.type === 'minio'}
|
||||
<span class="text-blue-500 px-2 capitalize">MinIO</span>
|
||||
{:else if $page.params.type === 'wordpress'}
|
||||
<span class="text-blue-500 px-2 capitalize">Wordpress</span>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{#if loading}
|
||||
<Loading />
|
||||
{:else if $page.params.type === 'plausible'}
|
||||
<div class="space-y-2 max-w-4xl mx-auto px-6 flex-col text-center" in:fade={{ duration: 100 }}>
|
||||
<div class="space-y-2 max-w-xl mx-auto px-6 flex-col text-center" in:fade={{ duration: 100 }}>
|
||||
<div class="grid grid-flow-row">
|
||||
<label for="Domain"
|
||||
>Domain <TooltipInfo
|
||||
@@ -298,4 +322,188 @@
|
||||
Deploy
|
||||
</button>
|
||||
</div>
|
||||
{:else if $page.params.type === 'wordpress'}
|
||||
<div class="space-y-2 max-w-xl mx-auto px-6 flex-col text-center" in:fade={{ duration: 100 }}>
|
||||
<div class="grid grid-flow-row pb-5">
|
||||
<label for="Domain"
|
||||
>Domain <TooltipInfo
|
||||
position="right"
|
||||
label={`You could reach your Wordpress instance here.`}
|
||||
/></label
|
||||
>
|
||||
<input
|
||||
id="Domain"
|
||||
class:border-red-500={$newWordpressService.baseURL == null || $newWordpressService.baseURL == ''}
|
||||
bind:value={$newWordpressService.baseURL}
|
||||
placeholder="wordpress.coollabs.io"
|
||||
/>
|
||||
</div>
|
||||
<div class="">
|
||||
<div class="px-4 sm:px-6">
|
||||
<ul class="divide-y divide-warmGray-800">
|
||||
<li class="py-4 flex items-center justify-between text-left">
|
||||
<div class="flex flex-col">
|
||||
<p class="text-base font-bold text-warmGray-100">Use remote MySQL database?</p>
|
||||
<p class="text-sm font-medium text-warmGray-400">
|
||||
If not, Coolify will create a local database for you.
|
||||
</p>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
on:click={() => ($newWordpressService.remoteDB = !$newWordpressService.remoteDB)}
|
||||
aria-pressed="true"
|
||||
class="relative inline-flex flex-shrink-0 h-6 w-11 border-2 border-transparent rounded-full cursor-pointer transition-colors ease-in-out duration-200"
|
||||
class:bg-green-600={$newWordpressService.remoteDB}
|
||||
class:bg-warmGray-700={!$newWordpressService.remoteDB}
|
||||
>
|
||||
<span class="sr-only">Use setting</span>
|
||||
<span
|
||||
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transition ease-in-out duration-200 transform"
|
||||
class:translate-x-5={$newWordpressService.remoteDB}
|
||||
class:translate-x-0={!$newWordpressService.remoteDB}
|
||||
>
|
||||
<span
|
||||
class=" ease-in duration-200 absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
|
||||
class:opacity-0={$newWordpressService.remoteDB}
|
||||
class:opacity-100={!$newWordpressService.remoteDB}
|
||||
aria-hidden="true"
|
||||
>
|
||||
<svg class="bg-white h-3 w-3 text-red-600" fill="none" viewBox="0 0 12 12">
|
||||
<path
|
||||
d="M4 8l2-2m0 0l2-2M6 6L4 4m2 2l2 2"
|
||||
stroke="currentColor"
|
||||
stroke-width="2"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
/>
|
||||
</svg>
|
||||
</span>
|
||||
<span
|
||||
class="ease-out duration-100 absolute inset-0 h-full w-full flex items-center justify-center transition-opacity"
|
||||
aria-hidden="true"
|
||||
class:opacity-100={$newWordpressService.remoteDB}
|
||||
class:opacity-0={!$newWordpressService.remoteDB}
|
||||
>
|
||||
<svg
|
||||
class="bg-white h-3 w-3 text-green-600"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 12 12"
|
||||
>
|
||||
<path
|
||||
d="M3.707 5.293a1 1 0 00-1.414 1.414l1.414-1.414zM5 8l-.707.707a1 1 0 001.414 0L5 8zm4.707-3.293a1 1 0 00-1.414-1.414l1.414 1.414zm-7.414 2l2 2 1.414-1.414-2-2-1.414 1.414zm3.414 2l4-4-1.414-1.414-4 4 1.414 1.414z"
|
||||
/>
|
||||
</svg>
|
||||
</span>
|
||||
</span>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{#if $newWordpressService.remoteDB}
|
||||
<div class="grid grid-flow-row pb-5">
|
||||
<label for="database.host"
|
||||
>DB Host <TooltipInfo
|
||||
position="right"
|
||||
label={`IP address of a remote Mysql instance.`}
|
||||
/></label
|
||||
>
|
||||
<input
|
||||
id="database.host"
|
||||
class:border-red-500={$newWordpressService.database.host == null ||
|
||||
$newWordpressService.database.host == ''}
|
||||
bind:value={$newWordpressService.database.host}
|
||||
placeholder="10.10.10.10:3306"
|
||||
/>
|
||||
</div>
|
||||
<div class="grid grid-flow-row pb-5">
|
||||
<label for="database.user"
|
||||
>DB User <TooltipInfo position="right" label={`Database user.`} /></label
|
||||
>
|
||||
<input
|
||||
id="database.user"
|
||||
class:border-red-500={$newWordpressService.database.user == null ||
|
||||
$newWordpressService.database.user == ''}
|
||||
bind:value={$newWordpressService.database.user}
|
||||
placeholder="wordpressuser"
|
||||
/>
|
||||
</div>
|
||||
<div class="grid grid-flow-row pb-5">
|
||||
<label for="database.password"
|
||||
>DB Password <TooltipInfo
|
||||
position="right"
|
||||
label={`Database password for the database user.`}
|
||||
/></label
|
||||
>
|
||||
<input
|
||||
id="database.password"
|
||||
class:border-red-500={$newWordpressService.database.password == null ||
|
||||
$newWordpressService.database.password == ''}
|
||||
bind:value={$newWordpressService.database.password}
|
||||
placeholder="supersecretuserpasswordforwordpress"
|
||||
/>
|
||||
</div>
|
||||
<div class="grid grid-flow-row pb-5">
|
||||
<label for="database.name"
|
||||
>DB Name<TooltipInfo
|
||||
position="right"
|
||||
label={`Database name`}
|
||||
/></label
|
||||
>
|
||||
<input
|
||||
id="database.name"
|
||||
class:border-red-500={$newWordpressService.database.name == null ||
|
||||
$newWordpressService.database.name == ''}
|
||||
bind:value={$newWordpressService.database.name}
|
||||
placeholder="wordpress"
|
||||
/>
|
||||
</div>
|
||||
<div class="grid grid-flow-row pb-5">
|
||||
<label for="database.tablePrefix"
|
||||
>DB Table Prefix <TooltipInfo
|
||||
position="right"
|
||||
label={`Table prefix for wordpress`}
|
||||
/></label
|
||||
>
|
||||
<input
|
||||
id="database.tablePrefix"
|
||||
class:border-red-500={$newWordpressService.database.tablePrefix == null ||
|
||||
$newWordpressService.database.tablePrefix == ''}
|
||||
bind:value={$newWordpressService.database.tablePrefix}
|
||||
placeholder="wordpress"
|
||||
/>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="grid grid-flow-row py-5">
|
||||
<label for="wordpressExtraConfiguration"
|
||||
>Wordpress Configuration Extra <TooltipInfo
|
||||
position="right"
|
||||
label={`Database password for the database user.`}
|
||||
/></label
|
||||
>
|
||||
<textarea
|
||||
class="h-32"
|
||||
id="wordpressExtraConfiguration"
|
||||
bind:value={$newWordpressService.wordpressExtraConfiguration}
|
||||
placeholder="// Example Extra Configuration
|
||||
define('WP_ALLOW_MULTISITE', true );
|
||||
define('MULTISITE', true);
|
||||
define('SUBDOMAIN_INSTALL', false);"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
disabled={deployableWordpress}
|
||||
class:cursor-not-allowed={deployableWordpress}
|
||||
class:bg-blue-500={!deployableWordpress}
|
||||
class:hover:bg-blue-400={!deployableWordpress}
|
||||
class:hover:bg-transparent={deployableWordpress}
|
||||
class:text-warmGray-700={deployableWordpress}
|
||||
class:text-white={!deployableWordpress}
|
||||
class="button p-2 w-64 bg-blue-500 hover:bg-blue-400 text-white"
|
||||
on:click={deployWordpress}
|
||||
>
|
||||
Deploy
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
Select a service
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center space-y-2 max-w-4xl mx-auto px-6" in:fade={{ duration: 100 }}>
|
||||
<div class="text-center space-y-2 max-w-7xl mx-auto px-6" in:fade={{ duration: 100 }}>
|
||||
{#if $page.path === '/service/new'}
|
||||
<div class="flex justify-center space-x-4 font-bold pb-6">
|
||||
<div class="flex justify-center font-bold pb-6 flex-wrap">
|
||||
<div
|
||||
class="text-center flex-col items-center cursor-pointer ease-in-out hover:scale-105 duration-100 border-2 border-dashed border-transparent hover:border-blue-500 p-2 rounded bg-warmGray-800 w-48"
|
||||
class="text-center flex-col items-center cursor-pointer ease-in-out hover:scale-105 duration-100 border-2 border-dashed border-transparent hover:border-blue-500 p-2 m-2 rounded bg-warmGray-800 w-48"
|
||||
on:click={() => goto('/service/new/plausible')}
|
||||
>
|
||||
<img
|
||||
@@ -25,7 +25,7 @@
|
||||
<div class="text-white">Plausible Analytics</div>
|
||||
</div>
|
||||
<div
|
||||
class="text-center flex-col items-center cursor-pointer ease-in-out hover:scale-105 duration-100 border-2 border-dashed border-transparent hover:border-white p-2 rounded bg-warmGray-800 w-48"
|
||||
class="text-center flex-col items-center cursor-pointer ease-in-out hover:scale-105 duration-100 border-2 border-dashed border-transparent hover:border-blue-500 p-2 m-2 rounded bg-warmGray-800 w-48"
|
||||
on:click={() => goto('/service/new/nocodb')}
|
||||
>
|
||||
<img
|
||||
@@ -37,7 +37,7 @@
|
||||
<div class="text-white">NocoDB</div>
|
||||
</div>
|
||||
<div
|
||||
class="text-center flex-col items-center cursor-pointer ease-in-out hover:scale-105 duration-100 border-2 border-dashed border-transparent hover:border-green-500 p-2 rounded bg-warmGray-800 w-48"
|
||||
class="text-center flex-col items-center cursor-pointer ease-in-out hover:scale-105 duration-100 border-2 border-dashed border-transparent hover:border-blue-500 p-2 m-2 rounded bg-warmGray-800 w-48"
|
||||
on:click={() => goto('/service/new/code-server')}
|
||||
>
|
||||
<svg class="w-14 mx-auto pb-2" viewBox="0 0 128 128">
|
||||
@@ -59,7 +59,7 @@
|
||||
<div class="text-white">VSCode Server</div>
|
||||
</div>
|
||||
<div
|
||||
class="text-center flex-col items-center cursor-pointer ease-in-out hover:scale-105 duration-100 border-2 border-dashed border-transparent hover:border-red-500 p-2 rounded bg-warmGray-800 w-48"
|
||||
class="text-center flex-col items-center cursor-pointer ease-in-out hover:scale-105 duration-100 border-2 border-dashed border-transparent hover:border-blue-500 p-2 m-2 rounded bg-warmGray-800 w-48"
|
||||
on:click={() => goto('/service/new/minio')}
|
||||
>
|
||||
<img
|
||||
@@ -70,6 +70,21 @@
|
||||
<div class="flex-1" />
|
||||
<div class="text-white">MinIO</div>
|
||||
</div>
|
||||
<div
|
||||
class="text-center flex-col items-center cursor-pointer ease-in-out hover:scale-105 duration-100 border-2 border-dashed border-transparent hover:border-blue-500 p-2 m-2 rounded bg-warmGray-800 w-48"
|
||||
on:click={() => goto('/service/new/wordpress')}
|
||||
>
|
||||
<svg class="w-14 mx-auto pb-2" viewBox="0 0 128 128">
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
fill="white"
|
||||
d="M64.094 126.224c34.275-.052 62.021-27.933 62.021-62.325 0-33.833-27.618-61.697-60.613-62.286C30.85.995 1.894 29.113 1.885 63.21c-.01 35.079 27.612 63.064 62.209 63.014zM63.993 4.63c32.907-.011 59.126 26.725 59.116 60.28-.011 31.679-26.925 58.18-59.092 58.187-32.771.007-59.125-26.563-59.124-59.608.002-32.193 26.766-58.848 59.1-58.859zM39.157 35.896c.538 1.793-.968 2.417-2.569 2.542-1.685.13-3.369.257-5.325.406 6.456 19.234 12.815 38.183 19.325 57.573.464-.759.655-.973.739-1.223 3.574-10.682 7.168-21.357 10.651-32.069.318-.977.16-2.271-.188-3.275-1.843-5.32-4.051-10.524-5.667-15.908-1.105-3.686-2.571-6.071-6.928-5.644-.742.073-1.648-1.524-2.479-2.349 1.005-.6 2.003-1.704 3.017-1.719a849.593 849.593 0 0126.618.008c1.018.017 2.016 1.15 3.021 1.765-.88.804-1.639 2.01-2.668 2.321-1.651.498-3.482.404-5.458.58l19.349 57.56c2.931-9.736 5.658-18.676 8.31-27.639 2.366-8.001.956-15.473-3.322-22.52-1.286-2.119-2.866-4.175-3.595-6.486-.828-2.629-1.516-5.622-1.077-8.259.745-4.469 4.174-6.688 8.814-7.113C74.333.881 34.431 9.317 19.728 34.922c5.66-.261 11.064-.604 16.472-.678 1.022-.013 2.717.851 2.957 1.652zm10.117 77.971c-.118.345-.125.729-.218 1.302 10.943 3.034 21.675 2.815 32.659-.886l-16.78-45.96c-5.37 15.611-10.52 30.575-15.661 45.544zm-8.456-2.078l-25.281-69.35c-11.405 22.278-2.729 56.268 25.281 69.35zm76.428-44.562c.802-10.534-2.832-25.119-5.97-27.125-.35 3.875-.106 8.186-1.218 12.114-2.617 9.255-5.817 18.349-8.899 27.468-3.35 9.912-6.832 19.779-10.257 29.666 16.092-9.539 24.935-23.618 26.344-42.123z"
|
||||
/>
|
||||
</svg>
|
||||
<div class="flex-1" />
|
||||
<div class="text-white">Wordpress</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
>
|
||||
<span class="sr-only">Use setting</span>
|
||||
<span
|
||||
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transition ease-in-out duration-200"
|
||||
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transition ease-in-out duration-200 transform"
|
||||
class:translate-x-5={settings?.allowRegistration}
|
||||
class:translate-x-0={!settings?.allowRegistration}
|
||||
>
|
||||
@@ -143,7 +143,7 @@
|
||||
>
|
||||
<span class="sr-only">Use setting</span>
|
||||
<span
|
||||
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transition ease-in-out duration-200"
|
||||
class="pointer-events-none relative inline-block h-5 w-5 rounded-full bg-white shadow transition ease-in-out duration-200 transform"
|
||||
class:translate-x-5={settings?.sendErrors}
|
||||
class:translate-x-0={!settings?.sendErrors}
|
||||
>
|
||||
|
||||
@@ -6,7 +6,9 @@ import type {
|
||||
GithubInstallations
|
||||
} from 'src/global';
|
||||
import { writable } from 'svelte/store';
|
||||
|
||||
export const settings = writable({
|
||||
clientId: null
|
||||
})
|
||||
export const dashboard = writable<Dashboard>({
|
||||
databases: {
|
||||
deployed: []
|
||||
@@ -167,5 +169,17 @@ export const initialNewService = {
|
||||
userPasswordAgain: null,
|
||||
baseURL: null
|
||||
};
|
||||
export const newWordpressService = writable({
|
||||
baseURL: null,
|
||||
remoteDB: false,
|
||||
database: {
|
||||
host: null,
|
||||
name: 'wordpress',
|
||||
user: null,
|
||||
password: null,
|
||||
tablePrefix: 'wordpress'
|
||||
},
|
||||
wordpressExtraConfiguration: null
|
||||
});
|
||||
|
||||
export const isPullRequestPermissionsGranted = writable(false);
|
||||
|
||||
Reference in New Issue
Block a user