initial login contribution

Signed-off-by: Andrey Platov <andrey@hardcoreeng.com>
This commit is contained in:
Andrey Platov 2021-08-05 16:55:54 +02:00
parent aaaa6d26e4
commit 0085a5430d
No known key found for this signature in database
GPG Key ID: C8787EFEB4B64AF0
28 changed files with 1460 additions and 66 deletions

View File

@ -5,6 +5,8 @@ specifiers:
'@rush-temp/core': file:./projects/core.tgz '@rush-temp/core': file:./projects/core.tgz
'@rush-temp/dev-server': file:./projects/dev-server.tgz '@rush-temp/dev-server': file:./projects/dev-server.tgz
'@rush-temp/dev-storage': file:./projects/dev-storage.tgz '@rush-temp/dev-storage': file:./projects/dev-storage.tgz
'@rush-temp/login': file:./projects/login.tgz
'@rush-temp/login-resources': file:./projects/login-resources.tgz
'@rush-temp/platform': file:./projects/platform.tgz '@rush-temp/platform': file:./projects/platform.tgz
'@rush-temp/platform-rig': file:./projects/platform-rig.tgz '@rush-temp/platform-rig': file:./projects/platform-rig.tgz
'@rush-temp/prod': file:./projects/prod.tgz '@rush-temp/prod': file:./projects/prod.tgz
@ -42,6 +44,7 @@ specifiers:
style-loader: ^3.2.1 style-loader: ^3.2.1
svelte-loader: ^3.1.2 svelte-loader: ^3.1.2
svelte-preprocess: ^4.7.4 svelte-preprocess: ^4.7.4
svgo-loader: ^3.0.0
ts-loader: ^9.2.5 ts-loader: ^9.2.5
typescript: ^4.3.5 typescript: ^4.3.5
webpack: ^5.48.0 webpack: ^5.48.0
@ -54,6 +57,8 @@ dependencies:
'@rush-temp/core': file:projects/core.tgz_6c259fadfeb3a4b20890aefe87070b8b '@rush-temp/core': file:projects/core.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/dev-server': file:projects/dev-server.tgz_6c259fadfeb3a4b20890aefe87070b8b '@rush-temp/dev-server': file:projects/dev-server.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/dev-storage': file:projects/dev-storage.tgz_6c259fadfeb3a4b20890aefe87070b8b '@rush-temp/dev-storage': file:projects/dev-storage.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/login': file:projects/login.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/login-resources': file:projects/login-resources.tgz_c38cf1a7a413db8918b0b4754c21e4c5
'@rush-temp/platform': file:projects/platform.tgz_6c259fadfeb3a4b20890aefe87070b8b '@rush-temp/platform': file:projects/platform.tgz_6c259fadfeb3a4b20890aefe87070b8b
'@rush-temp/platform-rig': file:projects/platform-rig.tgz_6ab28797e7a22071465f7d680ae81ae5 '@rush-temp/platform-rig': file:projects/platform-rig.tgz_6ab28797e7a22071465f7d680ae81ae5
'@rush-temp/prod': file:projects/prod.tgz_typescript@4.3.5 '@rush-temp/prod': file:projects/prod.tgz_typescript@4.3.5
@ -91,6 +96,7 @@ dependencies:
style-loader: 3.2.1_webpack@5.48.0 style-loader: 3.2.1_webpack@5.48.0
svelte-loader: 3.1.2 svelte-loader: 3.1.2
svelte-preprocess: 4.7.4_50400bf9937d80c38e5edf397791f1b6 svelte-preprocess: 4.7.4_50400bf9937d80c38e5edf397791f1b6
svgo-loader: 3.0.0
ts-loader: 9.2.5_typescript@4.3.5+webpack@5.48.0 ts-loader: 9.2.5_typescript@4.3.5+webpack@5.48.0
typescript: 4.3.5 typescript: 4.3.5
webpack: 5.48.0_webpack-cli@4.7.2 webpack: 5.48.0_webpack-cli@4.7.2
@ -797,6 +803,10 @@ packages:
fastq: 1.11.1 fastq: 1.11.1
dev: false dev: false
/@polka/url/1.0.0-next.15:
resolution: {integrity: sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA==}
dev: false
/@rushstack/heft-config-file/0.6.1: /@rushstack/heft-config-file/0.6.1:
resolution: {integrity: sha512-fdVFN8qvAdn4YeQr7k9zQ6jWAzwvnuLfiCOK/5gN+2o3iY8M02ntDmNEXuGfH7jBX6yhRga9UjHqKBh5bzoLpA==} resolution: {integrity: sha512-fdVFN8qvAdn4YeQr7k9zQ6jWAzwvnuLfiCOK/5gN+2o3iY8M02ntDmNEXuGfH7jBX6yhRga9UjHqKBh5bzoLpA==}
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
@ -894,6 +904,11 @@ packages:
type-detect: 4.0.8 type-detect: 4.0.8
dev: false dev: false
/@trysound/sax/0.1.1:
resolution: {integrity: sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==}
engines: {node: '>=10.13.0'}
dev: false
/@types/argparse/1.0.38: /@types/argparse/1.0.38:
resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
dev: false dev: false
@ -1347,6 +1362,11 @@ packages:
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
dev: false dev: false
/acorn-walk/8.1.1:
resolution: {integrity: sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==}
engines: {node: '>=0.4.0'}
dev: false
/acorn/6.4.2: /acorn/6.4.2:
resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
@ -1761,6 +1781,10 @@ packages:
multicast-dns-service-types: 1.1.0 multicast-dns-service-types: 1.1.0
dev: false dev: false
/boolbase/1.0.0:
resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=}
dev: false
/brace-expansion/1.1.11: /brace-expansion/1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies: dependencies:
@ -2045,6 +2069,11 @@ packages:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
dev: false dev: false
/commander/6.2.1:
resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
engines: {node: '>= 6'}
dev: false
/commander/7.2.0: /commander/7.2.0:
resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
engines: {node: '>= 10'} engines: {node: '>= 10'}
@ -2175,12 +2204,42 @@ packages:
webpack: 5.48.0_webpack-cli@4.7.2 webpack: 5.48.0_webpack-cli@4.7.2
dev: false dev: false
/css-select/4.1.3:
resolution: {integrity: sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==}
dependencies:
boolbase: 1.0.0
css-what: 5.0.1
domhandler: 4.2.0
domutils: 2.7.0
nth-check: 2.0.0
dev: false
/css-tree/1.1.3:
resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
engines: {node: '>=8.0.0'}
dependencies:
mdn-data: 2.0.14
source-map: 0.6.1
dev: false
/css-what/5.0.1:
resolution: {integrity: sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==}
engines: {node: '>= 6'}
dev: false
/cssesc/3.0.0: /cssesc/3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
engines: {node: '>=4'} engines: {node: '>=4'}
hasBin: true hasBin: true
dev: false dev: false
/csso/4.2.0:
resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
engines: {node: '>=8.0.0'}
dependencies:
css-tree: 1.1.3
dev: false
/cssom/0.3.8: /cssom/0.3.8:
resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
dev: false dev: false
@ -2404,12 +2463,39 @@ packages:
esutils: 2.0.3 esutils: 2.0.3
dev: false dev: false
/dom-serializer/1.3.2:
resolution: {integrity: sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==}
dependencies:
domelementtype: 2.2.0
domhandler: 4.2.0
entities: 2.2.0
dev: false
/domelementtype/2.2.0:
resolution: {integrity: sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==}
dev: false
/domexception/1.0.1: /domexception/1.0.1:
resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==}
dependencies: dependencies:
webidl-conversions: 4.0.2 webidl-conversions: 4.0.2
dev: false dev: false
/domhandler/4.2.0:
resolution: {integrity: sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==}
engines: {node: '>= 4'}
dependencies:
domelementtype: 2.2.0
dev: false
/domutils/2.7.0:
resolution: {integrity: sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==}
dependencies:
dom-serializer: 1.3.2
domelementtype: 2.2.0
domhandler: 4.2.0
dev: false
/dotenv-defaults/2.0.2: /dotenv-defaults/2.0.2:
resolution: {integrity: sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==} resolution: {integrity: sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg==}
dependencies: dependencies:
@ -2431,6 +2517,10 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
dev: false dev: false
/duplexer/0.1.2:
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
dev: false
/ecc-jsbn/0.1.2: /ecc-jsbn/0.1.2:
resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=} resolution: {integrity: sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=}
dependencies: dependencies:
@ -2485,6 +2575,10 @@ packages:
ansi-colors: 4.1.1 ansi-colors: 4.1.1
dev: false dev: false
/entities/2.2.0:
resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
dev: false
/envinfo/7.8.1: /envinfo/7.8.1:
resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -3358,6 +3452,13 @@ packages:
dev: false dev: false
optional: true optional: true
/gzip-size/6.0.0:
resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
engines: {node: '>=10'}
dependencies:
duplexer: 0.1.2
dev: false
/handle-thing/2.0.1: /handle-thing/2.0.1:
resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
dev: false dev: false
@ -4551,6 +4652,13 @@ packages:
resolution: {integrity: sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==} resolution: {integrity: sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==}
dev: false dev: false
/json5/1.0.1:
resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==}
hasBin: true
dependencies:
minimist: 1.2.5
dev: false
/json5/2.2.0: /json5/2.2.0:
resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -4663,6 +4771,15 @@ packages:
engines: {node: '>=6.11.5'} engines: {node: '>=6.11.5'}
dev: false dev: false
/loader-utils/1.4.0:
resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==}
engines: {node: '>=4.0.0'}
dependencies:
big.js: 5.2.2
emojis-list: 3.0.0
json5: 1.0.1
dev: false
/loader-utils/2.0.0: /loader-utils/2.0.0:
resolution: {integrity: sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==} resolution: {integrity: sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==}
engines: {node: '>=8.9.0'} engines: {node: '>=8.9.0'}
@ -4766,6 +4883,10 @@ packages:
object-visit: 1.0.1 object-visit: 1.0.1
dev: false dev: false
/mdn-data/2.0.14:
resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
dev: false
/media-typer/0.3.0: /media-typer/0.3.0:
resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=}
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
@ -5034,6 +5155,12 @@ packages:
path-key: 3.1.1 path-key: 3.1.1
dev: false dev: false
/nth-check/2.0.0:
resolution: {integrity: sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==}
dependencies:
boolbase: 1.0.0
dev: false
/nwsapi/2.2.0: /nwsapi/2.2.0:
resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==} resolution: {integrity: sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==}
dev: false dev: false
@ -5135,6 +5262,11 @@ packages:
mimic-fn: 2.1.0 mimic-fn: 2.1.0
dev: false dev: false
/opener/1.5.2:
resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
hasBin: true
dev: false
/opn/5.5.0: /opn/5.5.0:
resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==}
engines: {node: '>=4'} engines: {node: '>=4'}
@ -6182,6 +6314,15 @@ packages:
typescript: 4.3.5 typescript: 4.3.5
dev: false dev: false
/sirv/1.0.12:
resolution: {integrity: sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg==}
engines: {node: '>= 10'}
dependencies:
'@polka/url': 1.0.0-next.15
mime: 2.5.2
totalist: 1.1.0
dev: false
/slash/3.0.0: /slash/3.0.0:
resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -6361,6 +6502,10 @@ packages:
tweetnacl: 0.14.5 tweetnacl: 0.14.5
dev: false dev: false
/stable/0.1.8:
resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
dev: false
/stack-utils/1.0.5: /stack-utils/1.0.5:
resolution: {integrity: sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==} resolution: {integrity: sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -6688,6 +6833,27 @@ packages:
engines: {node: '>= 8'} engines: {node: '>= 8'}
dev: false dev: false
/svgo-loader/3.0.0:
resolution: {integrity: sha512-gwyFuzTxZ8hEWYKQ9GodudSKRHzW8CUqgdfsdNpu1U5Keow5dPIgxT4DoHUEVXQRolefgSCeBtW3y12CyhIGxw==}
dependencies:
loader-utils: 1.4.0
svgo: 2.3.1
dev: false
/svgo/2.3.1:
resolution: {integrity: sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw==}
engines: {node: '>=10.13.0'}
hasBin: true
dependencies:
'@trysound/sax': 0.1.1
chalk: 4.1.2
commander: 7.2.0
css-select: 4.1.3
css-tree: 1.1.3
csso: 4.2.0
stable: 0.1.8
dev: false
/symbol-tree/3.2.4: /symbol-tree/3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
dev: false dev: false
@ -6818,6 +6984,11 @@ packages:
engines: {node: '>=0.6'} engines: {node: '>=0.6'}
dev: false dev: false
/totalist/1.1.0:
resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==}
engines: {node: '>=6'}
dev: false
/tough-cookie/2.5.0: /tough-cookie/2.5.0:
resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
@ -7119,6 +7290,63 @@ packages:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
dev: false dev: false
/webpack-bundle-analyzer/4.4.2:
resolution: {integrity: sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==}
engines: {node: '>= 10.13.0'}
hasBin: true
dependencies:
acorn: 8.4.1
acorn-walk: 8.1.1
chalk: 4.1.2
commander: 6.2.1
gzip-size: 6.0.0
lodash: 4.17.21
opener: 1.5.2
sirv: 1.0.12
ws: 7.5.3
transitivePeerDependencies:
- bufferutil
- utf-8-validate
dev: false
/webpack-cli/4.7.2_954feff0479d53ccf5b533f71f40f1af:
resolution: {integrity: sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw==}
engines: {node: '>=10.13.0'}
hasBin: true
peerDependencies:
'@webpack-cli/generators': '*'
'@webpack-cli/migrate': '*'
webpack: 4.x.x || 5.x.x
webpack-bundle-analyzer: '*'
webpack-dev-server: '*'
peerDependenciesMeta:
'@webpack-cli/generators':
optional: true
'@webpack-cli/migrate':
optional: true
webpack-bundle-analyzer:
optional: true
webpack-dev-server:
optional: true
dependencies:
'@discoveryjs/json-ext': 0.5.3
'@webpack-cli/configtest': 1.0.4_webpack-cli@4.7.2+webpack@5.48.0
'@webpack-cli/info': 1.3.0_webpack-cli@4.7.2
'@webpack-cli/serve': 1.5.1_8f539f003d3f73da23f531c906cfc201
colorette: 1.2.2
commander: 7.2.0
execa: 5.1.1
fastest-levenshtein: 1.0.12
import-local: 3.0.2
interpret: 2.2.0
rechoir: 0.7.1
v8-compile-cache: 2.3.0
webpack: 5.48.0_webpack-cli@4.7.2
webpack-bundle-analyzer: 4.4.2
webpack-dev-server: 3.11.2_webpack-cli@4.7.2+webpack@5.48.0
webpack-merge: 5.8.0
dev: false
/webpack-cli/4.7.2_e6a3c038781d6207761c29e1aac8eed2: /webpack-cli/4.7.2_e6a3c038781d6207761c29e1aac8eed2:
resolution: {integrity: sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw==} resolution: {integrity: sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw==}
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
@ -7531,7 +7759,7 @@ packages:
dev: false dev: false
file:projects/dev-storage.tgz_6c259fadfeb3a4b20890aefe87070b8b: file:projects/dev-storage.tgz_6c259fadfeb3a4b20890aefe87070b8b:
resolution: {integrity: sha512-8aUE293xbOrDLOua1RsUMHGN5KMpU+FP0b6KRVBGnUMkbtvGZEghpU1lH3VkcNJgHbGKWFgdZsvhsZ+P1kohJg==, tarball: file:projects/dev-storage.tgz} resolution: {integrity: sha512-BH0Sx7BYFnR9Txy8IBwetWICRL7rMi8EXsiDCZsfdvtoxRMlYb9umorRv4yu5pJjIWtlgaTAGVID/1lSYHBvWg==, tarball: file:projects/dev-storage.tgz}
id: file:projects/dev-storage.tgz id: file:projects/dev-storage.tgz
name: '@rush-temp/dev-storage' name: '@rush-temp/dev-storage'
version: 0.0.0 version: 0.0.0
@ -7549,6 +7777,47 @@ packages:
- typescript - typescript
dev: false dev: false
file:projects/login-resources.tgz_c38cf1a7a413db8918b0b4754c21e4c5:
resolution: {integrity: sha512-/y0RdsR15OZIqLJx1mwd8oOB51lbw7kKHWmy+CS2qRZufQcUZLU0R3Eo0wnoRynXRby11E6A17LxMglB8R1Txw==, tarball: file:projects/login-resources.tgz}
id: file:projects/login-resources.tgz
name: '@rush-temp/login-resources'
version: 0.0.0
dependencies:
sass: 1.37.5
svelte: 3.42.1
svelte-loader: 3.1.2_svelte@3.42.1
svelte-preprocess: 4.7.4_c407529626dbb58d14a718f48c7fa84c
transitivePeerDependencies:
- '@babel/core'
- coffeescript
- less
- node-sass
- postcss
- postcss-load-config
- pug
- stylus
- sugarss
- typescript
dev: false
file:projects/login.tgz_6c259fadfeb3a4b20890aefe87070b8b:
resolution: {integrity: sha512-LgyU874vSC22wRS0SqlBwfpLqCnznqQ4RMbbLAaZ0gPXX3PTW+wG263nX1D26kgcq2JZtOuf8F3+1/hRAzICVA==, tarball: file:projects/login.tgz}
id: file:projects/login.tgz
name: '@rush-temp/login'
version: 0.0.0
dependencies:
'@types/heft-jest': 1.0.2
'@typescript-eslint/eslint-plugin': 4.28.5_a8e83fcad666e1ba86be4b2e27a20aea
eslint: 7.32.0
eslint-plugin-import: 2.23.4_eslint@7.32.0
eslint-plugin-node: 11.1.0_eslint@7.32.0
eslint-plugin-promise: 4.3.1
transitivePeerDependencies:
- '@typescript-eslint/parser'
- supports-color
- typescript
dev: false
file:projects/platform-rig.tgz_6ab28797e7a22071465f7d680ae81ae5: file:projects/platform-rig.tgz_6ab28797e7a22071465f7d680ae81ae5:
resolution: {integrity: sha512-VwGZVPcf2apIoa4sxQkIvW90B4otxf7ayw1jlTiZKQsQfwnLRKXvInMbIIAP0zCPRWIZdXXBYpUDm3dOJ/2bYQ==, tarball: file:projects/platform-rig.tgz} resolution: {integrity: sha512-VwGZVPcf2apIoa4sxQkIvW90B4otxf7ayw1jlTiZKQsQfwnLRKXvInMbIIAP0zCPRWIZdXXBYpUDm3dOJ/2bYQ==, tarball: file:projects/platform-rig.tgz}
id: file:projects/platform-rig.tgz id: file:projects/platform-rig.tgz
@ -7593,7 +7862,7 @@ packages:
dev: false dev: false
file:projects/prod.tgz_typescript@4.3.5: file:projects/prod.tgz_typescript@4.3.5:
resolution: {integrity: sha512-6UKxih/gCgl7bEmt5T/o96exvBJLr9Gzt430UaVS3WtqBdwsrJ8FunwOFVtvaJqWRvcD+FVSOx3ZLNXPTvF20w==, tarball: file:projects/prod.tgz} resolution: {integrity: sha512-ti6nz+pb0TRqhi0+pGET0k++WDa/DS+Crnfa0y9ZERFFNJMYFBKcspo5fpKKIUlwTx6O14layZ8h+fAHtKcj4Q==, tarball: file:projects/prod.tgz}
id: file:projects/prod.tgz id: file:projects/prod.tgz
name: '@rush-temp/prod' name: '@rush-temp/prod'
version: 0.0.0 version: 0.0.0
@ -7613,14 +7882,17 @@ packages:
svelte: 3.42.1 svelte: 3.42.1
svelte-loader: 3.1.2_svelte@3.42.1 svelte-loader: 3.1.2_svelte@3.42.1
svelte-preprocess: 4.7.4_c407529626dbb58d14a718f48c7fa84c svelte-preprocess: 4.7.4_c407529626dbb58d14a718f48c7fa84c
svgo-loader: 3.0.0
ts-loader: 9.2.5_typescript@4.3.5+webpack@5.48.0 ts-loader: 9.2.5_typescript@4.3.5+webpack@5.48.0
webpack: 5.48.0_webpack-cli@4.7.2 webpack: 5.48.0_webpack-cli@4.7.2
webpack-cli: 4.7.2_e6a3c038781d6207761c29e1aac8eed2 webpack-bundle-analyzer: 4.4.2
webpack-cli: 4.7.2_954feff0479d53ccf5b533f71f40f1af
webpack-dev-server: 3.11.2_webpack-cli@4.7.2+webpack@5.48.0 webpack-dev-server: 3.11.2_webpack-cli@4.7.2+webpack@5.48.0
transitivePeerDependencies: transitivePeerDependencies:
- '@babel/core' - '@babel/core'
- '@webpack-cli/generators' - '@webpack-cli/generators'
- '@webpack-cli/migrate' - '@webpack-cli/migrate'
- bufferutil
- coffeescript - coffeescript
- fibers - fibers
- less - less
@ -7630,7 +7902,7 @@ packages:
- sugarss - sugarss
- ts-node - ts-node
- typescript - typescript
- webpack-bundle-analyzer - utf-8-validate
dev: false dev: false
file:projects/server-core.tgz_6c259fadfeb3a4b20890aefe87070b8b: file:projects/server-core.tgz_6c259fadfeb3a4b20890aefe87070b8b:
@ -7678,7 +7950,7 @@ packages:
dev: false dev: false
file:projects/server.tgz_6c259fadfeb3a4b20890aefe87070b8b: file:projects/server.tgz_6c259fadfeb3a4b20890aefe87070b8b:
resolution: {integrity: sha512-DDKeiFrAHUr+H88vgiv9LFigEmlZyqSLez073wjTVT/WS1cbHQ4cSAxObaxl1w3jt2HZ7q0Twf0DK51NQXQZRA==, tarball: file:projects/server.tgz} resolution: {integrity: sha512-wXZNomG+cesEB6aWjMYwJ1yTfc7qHi8wnRm6eLEYiEuvvnMXasZqHRuX+yIDObELwtaAJr7piexxaRoSO7u7kw==, tarball: file:projects/server.tgz}
id: file:projects/server.tgz id: file:projects/server.tgz
name: '@rush-temp/server' name: '@rush-temp/server'
version: 0.0.0 version: 0.0.0

View File

@ -33,11 +33,16 @@
"file-loader":"^6.2.0", "file-loader":"^6.2.0",
"sass":"^1.37.5", "sass":"^1.37.5",
"webpack-dev-server":"^3.11.2", "webpack-dev-server":"^3.11.2",
"style-loader":"^3.2.1" "style-loader":"^3.2.1",
"svgo-loader":"^3.0.0",
"webpack-bundle-analyzer":"^4.4.2"
}, },
"dependencies": { "dependencies": {
"@anticrm/ui": "~0.6.0", "@anticrm/ui": "~0.6.0",
"@anticrm/theme": "~0.6.0", "@anticrm/theme": "~0.6.0",
"svelte": "^3.42.1" "svelte": "^3.42.1",
"@anticrm/login": "~0.6.0",
"@anticrm/login-resources": "~0.6.0",
"@anticrm/platform": "~0.6.3"
} }
} }

View File

@ -20,9 +20,9 @@ import { createApp } from '@anticrm/ui'
// import pluginCore from '@anticrm/plugin-core' // import pluginCore from '@anticrm/plugin-core'
// import meetingPlugin from '@anticrm/meeting' // import meetingPlugin from '@anticrm/meeting'
// import { configurePlatform } from './platform' import { configurePlatform } from './platform'
// configurePlatform() configurePlatform()
// const accountsUrl = process.env.APP_ACCOUNTS_URL // const accountsUrl = process.env.APP_ACCOUNTS_URL
// const appHost = process.env.APP_WSHOST // const appHost = process.env.APP_WSHOST

57
dev/prod/src/platform.ts Normal file
View File

@ -0,0 +1,57 @@
//
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { addLocation } from '@anticrm/platform'
import { loginId } from '@anticrm/login'
// import { clientId } from '@anticrm/client'
// import { workbenchId } from '@anticrm/workbench'
// import { chunterId } from '@anticrm/chunter'
// import { recruitId } from '@anticrm/recruit'
// import { tableId } from '@anticrm/table'
// import { viewId } from '@anticrm/view'
// import { taskId } from '@anticrm/task'
// import { contactId } from '@anticrm/contact'
// import { chunterServerId } from '@anticrm/chunter-server'
// import '@anticrm/login-assets'
// import '@anticrm/chunter-assets'
// import '@anticrm/recruit-assets'
// import '@anticrm/task-assets'
// import '@anticrm/view-assets'
export function configurePlatform() {
// platform.setMetadata(ui.metadata.LoginApplication, 'login')
// platform.setMetadata(ui.metadata.DefaultApplication, 'workbench')
// if (process.env.CLIENT === 'dev')
// addLocation(clientId, () => import(/* webpackChunkName: "client-dev" */ '@anticrm/plugin-client-dev'))
// else
// addLocation(core, () => import(/* webpackChunkName: "plugin-core" */ '@anticrm/plugin-core-impl'))
addLocation(loginId, () => import(/* webpackChunkName: "login" */ '@anticrm/login-resources'))
// addLocation(workbenchId, () => import(/* webpackChunkName: "workbench" */ '@anticrm/plugin-workbench'))
// addLocation(chunterId, () => import(/* webpackChunkName: "chunter" */ '@anticrm/plugin-chunter'))
// addLocation(recruitId, () => import(/* webpackChunkName: "recruit" */ '@anticrm/plugin-recruit'))
// addLocation(tableId, () => import(/* webpackChunkName: "table" */ '@anticrm/table-resources'))
// addLocation(viewId, () => import(/* webpackChunkName: "view" */ '@anticrm/view-resources'))
// addLocation(taskId, () => import(/* webpackChunkName: "task" */ '@anticrm/task-resources'))
// addLocation(contactId, () => import(/* webpackChunkName: "contact" */ '@anticrm/contact-resources'))
// addLocation(chunterServerId, () => import(/* webpackChunkName: "chunter-server" */ '@anticrm/chunter-server'))
}

View File

@ -1,57 +0,0 @@
//
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { addLocation } from '@anticrm/platform'
import { loginId } from '@anticrm/login'
import { clientId } from '@anticrm/client'
import { workbenchId } from '@anticrm/workbench'
import { chunterId } from '@anticrm/chunter'
import { recruitId } from '@anticrm/recruit'
import { tableId } from '@anticrm/table'
import { viewId } from '@anticrm/view'
import { taskId } from '@anticrm/task'
import { contactId } from '@anticrm/contact'
import { chunterServerId } from '@anticrm/chunter-server'
import '@anticrm/login-assets'
import '@anticrm/chunter-assets'
import '@anticrm/recruit-assets'
import '@anticrm/task-assets'
import '@anticrm/view-assets'
export function configurePlatform() {
// platform.setMetadata(ui.metadata.LoginApplication, 'login')
// platform.setMetadata(ui.metadata.DefaultApplication, 'workbench')
// if (process.env.CLIENT === 'dev')
addLocation(clientId, () => import(/* webpackChunkName: "client-dev" */ '@anticrm/plugin-client-dev'))
// else
// addLocation(core, () => import(/* webpackChunkName: "plugin-core" */ '@anticrm/plugin-core-impl'))
addLocation(loginId, () => import(/* webpackChunkName: "login" */ '@anticrm/plugin-login'))
addLocation(workbenchId, () => import(/* webpackChunkName: "workbench" */ '@anticrm/plugin-workbench'))
addLocation(chunterId, () => import(/* webpackChunkName: "chunter" */ '@anticrm/plugin-chunter'))
addLocation(recruitId, () => import(/* webpackChunkName: "recruit" */ '@anticrm/plugin-recruit'))
addLocation(tableId, () => import(/* webpackChunkName: "table" */ '@anticrm/table-resources'))
addLocation(viewId, () => import(/* webpackChunkName: "view" */ '@anticrm/view-resources'))
addLocation(taskId, () => import(/* webpackChunkName: "task" */ '@anticrm/task-resources'))
addLocation(contactId, () => import(/* webpackChunkName: "contact" */ '@anticrm/contact-resources'))
addLocation(chunterServerId, () => import(/* webpackChunkName: "chunter-server" */ '@anticrm/chunter-server'))
}

View File

@ -0,0 +1,3 @@
<svg width="63" height="79" viewBox="0 0 63 79" fill="#fff" xmlns="http://www.w3.org/2000/svg">
<path d="M34.8089 0.679932H0.378906V78.9999H15.2289V51.6099H34.8089C52.8489 51.6099 62.5289 41.2699 62.5289 26.1999C62.5289 11.0199 52.8489 0.679932 34.8089 0.679932ZM34.1489 38.8499H15.2289V13.4399H34.1489C42.8389 13.4399 47.5689 18.0599 47.5689 26.1999C47.5689 34.3399 42.8389 38.8499 34.1489 38.8499Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 423 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@ -0,0 +1,27 @@
{
"name": "@anticrm/login-resources",
"version": "0.6.0",
"main": "src/index.ts",
"author": "Anticrm Platform Contributors",
"license": "EPL-2.0",
"scripts": {
"build": "",
"build:docs": "api-extractor run --local",
"test": "jest",
"lint": "eslint src",
"lint:fix": "eslint --fix src",
"format": "prettier --write 'src/**/*.{ts*,js*,yml}' && eslint --fix src",
"svelte-check": "svelte-check"
},
"devDependencies": {
"svelte-loader":"^3.1.2",
"sass":"^1.37.5",
"svelte-preprocess":"^4.7.4"
},
"dependencies": {
"@anticrm/platform": "~0.6.0",
"svelte": "^3.37.0",
"@anticrm/login": "~0.6.0",
"@anticrm/ui": "~0.6.0"
}
}

View File

@ -0,0 +1,5 @@
module.exports = {
plugins: [
require('autoprefixer')
]
}

View File

@ -0,0 +1,172 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { EditBox, Label, Button, StatusControl } from '@anticrm/ui'
import { OK, Status, Severity } from '@anticrm/platform'
import type { IntlString } from '@anticrm/platform'
import { translate } from '@anticrm/platform'
import login from '../plugin'
interface Field {
name: string
i18n: IntlString
password?: boolean
optional?: boolean
short?: boolean
}
interface Action {
i18n: IntlString
func: () => Promise<void>
}
export let caption: IntlString
export let status: Status
export let fields: Field[]
export let action: Action
export let bottomCaption: IntlString
export let bottomActionLabel: IntlString
export let bottomActionFunc: () => void
export let object: any
async function validate () {
for (const field of fields) {
const v = object[field.name]
const f = field
if (!f.optional && (!v || v === '')) {
status = new Status(Severity.INFO, login.status.RequiredField, {field: await translate(field.i18n, {})})
return
}
}
status = OK
}
validate()
let inAction = false
function performAction(action: Action) {
inAction = true
action.func().finally(() => {inAction = false})
}
</script>
<form class="form-container">
<div class="grow-separator"/>
<div class="title"><Label label={caption}/></div>
<div class="status">
<StatusControl {status} width="100%"/>
</div>
<div class="form">
{#each fields as field (field.name)}
<div class={field.short ? 'form-col' : 'form-row'}>
<EditBox label={field.i18n} password={field.password} bind:value={object[field.name]} on:keyup={validate} on:focus={validate}/>
</div>
{/each}
<div class="form-row send">
<Button label={action.i18n} primary width="100%" loading={inAction}
disabled={status.severity !== Severity.OK && status.severity !== Severity.ERROR}
on:click={() => {performAction(action)}}/>
</div>
<!-- <div class="form-col"><EditBox label="First Name" bind:value={fname}/></div>
<div class="form-col"><EditBox label="Last Name" bind:value={lname}/></div>
<div class="form-row"><EditBox label="E-mail"/></div>
<div class="form-row"><EditBox label="Password" password/></div>
<div class="form-row"><EditBox label="Repeat password" password/></div> -->
</div>
<div class="grow-separator"/>
<div class="footer">
<span><Label label={bottomCaption}/></span>
<a href="." on:click|preventDefault={bottomActionFunc}><Label label={bottomActionLabel}/></a>
</div>
</form>
<!-- <div class="actions">
{#each actions as action, i}
<button class="button" class:separator={i !== 0} on:click|preventDefault={action.func}> {action.i18n} </button>
{/each}
</div> -->
<style lang="scss">
.form-container {
display: flex;
flex-direction: column;
justify-content: space-between;
overflow: hidden;
height: 100%;
padding: 80px 80px;
.title {
font-weight: 600;
font-size: 24px;
line-height: 29px;
color: #FFFFFF;
}
.status {
min-height: 120px;
max-height: 120px;
padding-top: 20px;
}
.form {
display: grid;
grid-template-columns: 1fr 1fr;
column-gap: 12px;
row-gap: 24px;
.form-row {
grid-column-start: 1;
grid-column-end: 3;
}
@media (max-width: 985px) {
.form-col {
grid-column-start: 1;
grid-column-end: 3;
}
}
.send {
margin-top: 36px;
}
}
.grow-separator {
flex-grow: 1;
}
.footer {
margin-top: 56px;
font-size: 13px;
line-height: 16px;
color: #FFFFFF;
span {
opacity: 0.3;
}
a {
color: #fff;
opacity: 0.8;
text-decoration: none;
:hover {
opacity: 1;
}
}
}
}
</style>

View File

@ -0,0 +1,131 @@
<!--
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import LoginForm from './LoginForm.svelte'
import SignupForm from './SignupForm.svelte'
let page = 'login'
</script>
<div class="container">
<div class="panel">
<div class="back-panel-dark"/>
<div class="back-panel-light">
<div class="bg-noise opacity-3"/>
</div>
{#if page === 'login'}
<LoginForm on:switch={(event) => page = event.detail}/>
{:else if page === 'signup'}
<SignupForm on:switch={(event) => page = event.detail}/>
{/if}
</div>
<div class="intro">
<div class="content">
<div class="logo"> </div>
</div>
<div class="slogan">
<p>A unique place to manage all of your work</p>
<p>Welcome to the Platform</p>
</div>
</div>
</div>
<style lang="scss">
@import "@anticrm/theme/styles/mixins.scss";
.bg-noise {
@include bg-fullsize;
background: url('../../img/noise.png');
z-index: -1;
}
.opacity-3 {
opacity: 0.03;
}
.container {
display: flex;
flex-direction: row;
height: 100%;
padding: 0px 20px 20px 20px;
.panel {
position: relative;
overflow: hidden;
margin-right: 20px;
width: 668px;
height: 100%;
border-radius: 20px;
.back-panel-light {
@include bg-layer(linear-gradient(158.74deg, rgba(205, 166, 255, 0.12) 5.62%, rgba(255, 255, 255, 0) 97.09%), 0.3);
z-index: -1;
}
.back-panel-dark {
@include bg-layer(#1D1D23, 0.5);
z-index: -1;
}
}
.intro {
display: flex;
flex-direction: column;
flex-grow: 1;
overflow: hidden;
min-width: 320px;
.content {
display: flex;
flex-direction: column;
flex-grow: 1;
justify-content: center;
align-items: center;
.logo {
position: relative;
&:after {
position: absolute;
content: "";
background: center url("../../img/logo.svg");
transform: translate(-50%, -50%);
width: 63px;
height: 79px;
}
&:before {
position: absolute;
content: "";
transform: translate(-50%, -50%);
width: 255px;
height: 255px;
border: 1.8px solid #FFFFFF;
border-radius: 50%;
opacity: 0.08;
}
}
}
.slogan {
margin-bottom: 60px;
p {
margin: 0;
font-weight: 400;
font-size: 13px;
line-height: 19px;
text-align: center;
color: #FFFFFF;
opacity: 0.8;
}
}
}
}
</style>

View File

@ -0,0 +1,68 @@
<!--
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { createEventDispatcher } from 'svelte'
import { OK, Status, Severity } from '@anticrm/platform'
import Form from './Form.svelte'
import { doLogin } from '../utils'
import login from '../plugin'
const dispatch = createEventDispatcher()
const fields = [
{ name: 'username', i18n: login.string.Email },
{
name: 'password',
i18n: login.string.Password,
password: true
},
{ name: 'workspace', i18n: login.string.Workspace }
]
const object = {
workspace: '',
username: '',
password: '',
}
let status = OK
const action = {
i18n: login.string.LogIn,
func: async () => {
status = new Status(Severity.INFO, login.status.ConnectingToServer, {})
const [loginStatus, result] = await doLogin(object.username, object.password, object.workspace)
return new Promise<void>((resolve, reject) => {
setTimeout(() => {
status = loginStatus
resolve()
}, 1000)
})
}
}
</script>
<Form caption={login.string.LogIn} {status} {fields} {object} {action}
bottomCaption={login.string.DoNotHaveAnAccount}
bottomActionLabel={login.string.SignUp}
bottomActionFunc={() => { dispatch('switch', 'signup') }}
/>

View File

@ -0,0 +1,146 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import type { Platform } from '@anticrm/plugin'
import { AuthStatusCodes } from '@anticrm/plugin'
import { Severity, Status } from '@anticrm/status'
import { getContext, onDestroy } from 'svelte'
import type { LoginService } from '@anticrm/plugin-login'
import login from '@anticrm/plugin-login'
import Form from './Form.svelte'
import { Button } from '@anticrm/ui'
import type { ApplicationRouter } from '@anticrm/plugin-ui'
// import { PlatformStatusCodes } from '@anticrm/foundation'
// export let router: ApplicationRouter<ApplicationRoute>
const object = { username: '', password: '', workspace: '', secondFactorCode: '' }
let status: Status
let loginActive = false
let needSecondFactor = false
const baseFields = [
{ name: 'username', i18n: 'Username' },
{
name: 'password',
i18n: 'Password',
password: true
},
{ name: 'workspace', i18n: 'Workspace' }
]
let fields: { [key: string]: any }
$: fields = needSecondFactor ? baseFields.concat({ name: 'secondFactorCode', i18n: 'Confirm code' }) : baseFields
const platform = getContext('platform') as Platform
const loginService = platform.getPlugin(login.id)
async function doLogin () {
status = new Status(Severity.INFO, 0, 'Соединяюсь с сервером...')
status = await (await loginService).doLogin(
object.username,
object.password,
object.workspace,
object.secondFactorCode
)
if (status.code === AuthStatusCodes.CLIENT_VALIDATE_REQUIRED) {
needSecondFactor = true
}
}
// eslint-disable-next-line @typescript-eslint/no-empty-function
async function doSignup () {}
async function checkLoginInfo (ls: LoginService) {
const info = await ls.getLoginInfo()
if (info) {
loginActive = true
object.username = info.email
object.workspace = info.workspace
}
}
let timer: number
// Auto forward to default application
const loginCheck = loginService.then(async (ls) => {
await checkLoginInfo(ls)
timer = setInterval(async () => {
await checkLoginInfo(ls)
}, 1000)
})
onDestroy(() => {
if (timer) {
clearInterval(timer)
}
})
async function navigateApp (): Promise<void> {
(await loginService).navigateApp()
}
async function logout (): Promise<void> {
(await loginService).doLogout()
loginActive = false
}
function navigateSetting (): void {
// router.navigate({ route: 'setting' })
}
</script>
{#await loginCheck then value}
{#if loginActive}
<div class="login-form-info">
<div class="field">
Logged in as: {object.username}
</div>
<div class="field">
Workspace: {object.workspace}
</div>
<div class="actions">
<Button width="100px" on:click={logout}>Logout</Button>
<Button width="100px" on:click={navigateSetting}>Settings</Button>
<Button width="100px" on:click={navigateApp}>Switch to Application</Button>
</div>
</div>
{:else}
<Form
actions={[
{ i18n: 'Create Space', func: doSignup },
{ i18n: 'Login', func: doLogin }
]}
{fields}
{object}
caption="Login into system"
{status} />
{/if}
{/await}
<style lang="scss">
.login-form-info {
margin: 20vh auto auto;
width: 30em;
padding: 2em;
border-radius: 1em;
border: 1px solid var(--theme-bg-accent-color);
.actions {
display: flex;
margin-top: 1.5em;
}
}
</style>

View File

@ -0,0 +1,45 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import login from '..'
import type { AnyComponent, ApplicationRoute } from '@anticrm/platform-ui'
import { newRouter } from '@anticrm/platform-ui'
import Component from '@anticrm/platform-ui/src/components/Component.svelte'
let form: ApplicationRoute
const forms: ApplicationRoute[] = [{ route: 'setting', component: login.component.SettingForm }]
let component: AnyComponent | undefined
function routeDefaults (): ApplicationRoute {
return {
route: '#undefined',
component: login.component.LoginForm
} as ApplicationRoute
}
const router = newRouter<ApplicationRoute>(
':route',
(info) => {
if (forms.length > 0) {
form = forms.find((a) => a.route === info.route) || routeDefaults()
component = form?.component
}
},
routeDefaults()
)
</script>
<Component is={component} props={{ router }} />

View File

@ -0,0 +1,189 @@
<!--
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import type { Platform } from '@anticrm/platform'
import { Severity, Status } from '@anticrm/platform'
import { getContext } from 'svelte'
import login from '..'
import { CheckBox } from '@anticrm/ui'
import type { ApplicationRoute, ApplicationRouter } from '@anticrm/platform-ui'
import twofactor from 'node-2fa'
import type { Options } from 'node-2fa/dist/interfaces'
export let router: ApplicationRouter<ApplicationRoute>
const object = { oldPassword: '', newPassword: '', newPasswordConfirm: '', clientSecret: '', secondFactorCode: '' }
let changePassword = false
let status = new Status(Severity.OK, 0, '')
const platform = getContext('platform') as Platform
const loginService = platform.getPlugin(login.id)
let secondFactorInitEnabled = false
let secondFactorEnabled = false
let secondFactorCurrentEnabled = false
let newSecret:
| {
secret: string
uri: string
qr: string
}
| false
let src: string
$: secondFactorCurrentEnabled = secondFactorEnabled && !secondFactorInitEnabled
$: newSecret = secondFactorCurrentEnabled && twofactor.generateSecret({ name: 'Anticrm' } as Options)
$: src = newSecret.qr
$: object.clientSecret = newSecret.secret
const secondFactorCheck = loginService.then((ls) => {
ls.getLoginInfo().then((li) => {
secondFactorInitEnabled = !!li?.secondFactorEnabled
secondFactorEnabled = secondFactorInitEnabled
})
})
function navigateLoginForm (): Promise<void> {
return Promise.resolve(router.navigate({ route: '' }))
}
let description: string
$: description = status.message
async function saveSetting (): Promise<void> {
if (!object.oldPassword) {
status = new Status(Severity.INFO, 0, 'Поле пароль обязательно к заполнению.')
return
}
if (changePassword && object.newPassword !== object.newPasswordConfirm) {
status = new Status(Severity.INFO, 0, 'Пароль и подтверждения пароля не совпадают')
return
}
if (secondFactorCurrentEnabled) {
if (object.clientSecret && !object.secondFactorCode) {
status = new Status(Severity.INFO, 0, 'Поле код подтверждения обязательно для заполнения')
return
}
if (!object.clientSecret && object.secondFactorCode) {
status = new Status(Severity.INFO, 0, 'Поле секретный код обязательно для заполнения')
return
}
}
status = new Status(Severity.INFO, 0, 'Соединяюсь с сервером...')
status = await (await loginService).saveSetting(
object.oldPassword,
changePassword ? object.newPassword : '',
secondFactorEnabled,
secondFactorCurrentEnabled ? object.clientSecret : '',
secondFactorCurrentEnabled ? object.secondFactorCode : ''
)
if (status.severity === Severity.OK) {
await navigateLoginForm()
}
}
</script>
<form class="form">
<div class="status">{description}</div>
<div class="field">
<input class="editbox" name="oldPassword" placeholder="Пароль" type="password" bind:value={object.oldPassword} />
</div>
<div class="field">
<CheckBox bind:checked={changePassword}>Изменить пароль</CheckBox>
</div>
{#if changePassword}
<div class="field">
<input
class="editbox"
name="newPassword"
placeholder="Новый пароль"
type="password"
bind:value={object.newPassword} />
</div>
<div class="field">
<input
class="editbox"
name="newPasswordConfirm"
placeholder="Подтверждение пароля"
type="password"
bind:value={object.newPasswordConfirm} />
</div>
{/if}
{#await secondFactorCheck then value}
<div class="field">
<CheckBox bind:checked={secondFactorEnabled}>Включить двухфакторную авторизацию</CheckBox>
</div>
{#if secondFactorCurrentEnabled}
<div class="field">
<input
class="editbox"
name="clientSecret"
placeholder="Секретный код"
type="text"
bind:value={object.clientSecret} />
</div>
{#if src}
<div>
<img {src} alt="qr code" />
</div>
{/if}
<div class="field">
<input
class="editbox"
name="secondFactorCode"
placeholder="Код подтверждения"
type="text"
bind:value={object.secondFactorCode} />
</div>
{/if}
{/await}
<div class="buttons">
<button class="button" on:click|preventDefault={navigateLoginForm}> Отменить</button>
<button class="button" on:click|preventDefault={saveSetting}> Сохранить</button>
</div>
</form>
<style lang="scss">
img {
display: block;
margin-left: auto;
margin-right: auto;
width: 50%;
border: 1px;
border-style: solid;
}
form {
margin: auto;
margin-top: 3vh;
width: 30em;
padding: 1em;
border-radius: 1em;
border: 1px solid var(--theme-bg-accent-color);
.status {
margin-top: 0.5em;
}
.field {
.editbox {
width: 100%;
}
margin: 1em 0;
}
}
</style>

View File

@ -0,0 +1,68 @@
<!--
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
-->
<script lang="ts">
import { getContext, createEventDispatcher } from 'svelte'
import { Status, Severity } from '@anticrm/platform'
import Form from './Form.svelte'
import { doLogin } from '../utils'
const dispatch = createEventDispatcher()
const fields = [
{ name: 'first', i18n: 'First name', short: true },
{ name: 'last', i18n: 'Last name', short: true },
{ name: 'username', i18n: 'Email' },
{ name: 'workspace', i18n: 'Workspace' },
{ name: 'password', i18n: 'Password', password: true },
{ name: 'password2', i18n: 'Repeat password', password: true },
]
const object = {
first: '',
last: '',
workspace: '',
username: '',
password: '',
password2: '',
}
let status = new Status(Severity.OK, 0, '')
const action = {
i18n: 'Sign Up',
func: async () => {
status = new Status(Severity.INFO, 0, 'Соединяюсь с сервером...')
const [loginStatus, result] = await doLogin(object.username, object.password, object.workspace)
return new Promise<void>((resolve, reject) => {
setTimeout(() => {
status = loginStatus
resolve()
}, 1000)
})
}
}
</script>
<Form caption="Sign Up" {status} {fields} {object} {action}
bottomCaption="Already have an account?"
bottomActionLabel="Log In"
bottomActionFunc={() => { dispatch('switch', 'login') }}
/>

View File

@ -0,0 +1,29 @@
//
// Copyright © 2020, 2021 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import LoginApp from './components/LoginApp.svelte'
/*!
* Anticrm Platform Login Plugin
* © 2020, 2021 Anticrm Platform Contributors.
* © 2021 Hardcore Engineering Inc. All Rights Reserved.
* Licensed under the Eclipse Public License, Version 2.0
*/
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
export default async () => ({
component: {
LoginApp
},
})

View File

@ -0,0 +1,38 @@
//
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import type { StatusCode, IntlString } from '@anticrm/platform'
import { mergeIds } from '@anticrm/platform'
import type { AnyComponent } from '@anticrm/ui'
import login, { loginId } from '@anticrm/login'
export default mergeIds(loginId, login, {
component: {
LoginApp: '' as AnyComponent
},
status: {
RequiredField: '' as StatusCode<{ field: string }>,
ConnectingToServer: '' as StatusCode
},
string: {
Email: '' as IntlString,
Password: '' as IntlString,
Workspace: '' as IntlString,
LogIn: '' as IntlString,
SignUp: '' as IntlString,
DoNotHaveAnAccount: '' as IntlString
}
})

View File

@ -0,0 +1,54 @@
//
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import { Status, OK, unknownError, getMetadata, serialize } from '@anticrm/platform'
import type { Request, Response } from '@anticrm/platform'
import login from '@anticrm/login'
/**
* Perform a login operation to required workspace with user credentials.
*/
export async function doLogin (
username: string,
password: string,
workspace: string
): Promise<[Status, any]> {
const accountsUrl = getMetadata(login.metadata.AccountsUrl)
if (accountsUrl === undefined) {
throw new Error('accounts url not specified')
}
const request: Request<[string, string, string]> = {
method: 'login',
params: [username, password, workspace]
}
try {
const response = await fetch(accountsUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: serialize(request)
})
const result: Response<any> = await response.json()
const status = result.error ?? OK
return [status, result.result]
} catch (err) {
return [unknownError(err), undefined]
}
}

View File

@ -0,0 +1,5 @@
const sveltePreprocess = require('svelte-preprocess')
module.exports = {
preprocess: sveltePreprocess()
};

View File

@ -0,0 +1,15 @@
{
"compilerOptions": {
"moduleResolution": "node",
"target": "esnext",
"module": "esnext",
"declaration": true,
"outDir": "./lib",
"strict": true,
"esModuleInterop": true,
"lib": [
"esnext",
"dom"
]
}
}

View File

@ -0,0 +1,6 @@
module.exports = {
extends: ['./node_modules/@anticrm/platform-rig/profiles/default/config/eslint.config.json'],
parserOptions: {
project: './tsconfig.json'
}
}

4
plugins/login/.npmignore Normal file
View File

@ -0,0 +1,4 @@
*
!/lib/**
!CHANGELOG.md
/lib/**/__tests__/

View File

@ -0,0 +1,18 @@
// The "rig.json" file directs tools to look for their config files in an external package.
// Documentation for this system: https://www.npmjs.com/package/@rushstack/rig-package
{
"$schema": "https://developer.microsoft.com/json-schemas/rig-package/rig.schema.json",
/**
* (Required) The name of the rig package to inherit from.
* It should be an NPM package name with the "-rig" suffix.
*/
"rigPackageName": "@anticrm/platform-rig"
/**
* (Optional) Selects a config profile from the rig package. The name must consist of
* lowercase alphanumeric words separated by hyphens, for example "sample-profile".
* If omitted, then the "default" profile will be used."
*/
// "rigProfile": "your-profile-name"
}

View File

@ -0,0 +1,22 @@
{
"name": "@anticrm/login",
"version": "0.6.0",
"main": "lib/index.js",
"author": "Anticrm Platform Contributors",
"license": "EPL-2.0",
"scripts": {
"build": "heft build",
"lint:fix": "eslint --fix src"
},
"devDependencies": {
"@anticrm/platform-rig":"~0.6.0",
"@types/heft-jest":"^1.0.2",
"@typescript-eslint/eslint-plugin":"4",
"eslint-plugin-import":"2",
"eslint-plugin-promise":"4",
"eslint-plugin-node":"11",
"eslint":"^7.32.0"
},
"dependencies": {"@anticrm/platform":"~0.6.3"
}
}

View File

@ -0,0 +1,53 @@
//
// Copyright © 2020 Anticrm Platform Contributors.
//
// Licensed under the Eclipse Public License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. You may
// obtain a copy of the License at https://www.eclipse.org/legal/epl-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//
// See the License for the specific language governing permissions and
// limitations under the License.
//
import type { Plugin, Asset } from '@anticrm/platform'
import { plugin } from '@anticrm/platform'
/**
* @public
*/
export interface LoginInfo {
email: string
workspace: string
server: string
port: string
token: string
secondFactorEnabled: boolean
}
/**
* @public
*/
export const ACCOUNT_KEY = 'anticrm-account'
/**
* @public
*/
export function currentAccount (): LoginInfo | null {
const account = localStorage.getItem(ACCOUNT_KEY)
return (account !== null) ? JSON.parse(account) : null
}
/**
* @public
*/
export const loginId = 'login' as Plugin
export default plugin(loginId, {
metadata: {
AccountsUrl: '' as Asset
}
})

View File

@ -0,0 +1,9 @@
{
"extends": "./node_modules/@anticrm/platform-rig/profiles/default/tsconfig.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./lib",
"lib": ["esnext", "dom"]
}
}

View File

@ -500,6 +500,16 @@
"packageName": "@anticrm/server", "packageName": "@anticrm/server",
"projectFolder": "server/server", "projectFolder": "server/server",
"shouldPublish": true "shouldPublish": true
},
{
"packageName": "@anticrm/login",
"projectFolder": "plugins/login",
"shouldPublish": true
},
{
"packageName": "@anticrm/login-resources",
"projectFolder": "plugins/login-resources",
"shouldPublish": true
} }
] ]