From 4d6d3eca9521734cccff4835c4b851f283d1d91a Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 16 Oct 2024 16:27:39 +0100 Subject: [PATCH 1/9] Add prettier and sort-package-json --- package.json | 2 + pnpm-lock.yaml | 182 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+) diff --git a/package.json b/package.json index 912dfe9..50ed030 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,8 @@ "http-proxy-middleware": "^2.0.6", "jest": "^28.1.0", "jest-environment-jsdom": "^29.7.0", + "prettier": "3.3.3", + "sort-package-json": "2.10.1", "ts-jest": "^28.0.3", "ts-loader": "^9.3.0", "typescript": "^4.7.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 160b4a5..c67e893 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,6 +87,12 @@ importers: jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 + prettier: + specifier: 3.3.3 + version: 3.3.3 + sort-package-json: + specifier: 2.10.1 + version: 2.10.1 ts-jest: specifier: ^28.0.3 version: 28.0.8(@babel/core@7.23.9)(@jest/types@28.1.3)(babel-jest@28.1.3(@babel/core@7.23.9))(jest@28.1.3(@types/node@17.0.45))(typescript@4.9.5) @@ -870,6 +876,18 @@ packages: '@jridgewell/trace-mapping@0.3.22': resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + '@sinclair/typebox@0.24.51': resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} @@ -1390,10 +1408,18 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + diff-sequences@27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -1402,6 +1428,10 @@ packages: resolution: {integrity: sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} @@ -1537,6 +1567,10 @@ packages: resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} engines: {node: '>=6.0.0'} + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -1544,6 +1578,9 @@ packages: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -1614,10 +1651,21 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + git-hooks-list@3.1.0: + resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -1628,6 +1676,10 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -1701,6 +1753,10 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + import-local@3.1.0: resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} engines: {node: '>=8'} @@ -1754,6 +1810,10 @@ packages: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -2068,6 +2128,10 @@ packages: merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -2199,6 +2263,10 @@ packages: path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -2217,6 +2285,11 @@ packages: pngparse@2.0.1: resolution: {integrity: sha512-RyB1P0BBwt3CNIZ5wT53lR1dT3CUtopnMOuP8xZdHjPhI/uXNNRnkx1yQb/3MMMyyMeo6p19fiIRHcLopWIkxA==} + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -2251,6 +2324,9 @@ packages: querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -2316,6 +2392,10 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -2324,6 +2404,9 @@ packages: resolution: {integrity: sha512-l3BOHqG99RHb73XROykj8o2rRaUqqYwN0E6C1EkH+R1GIfDjMaUGPaCNEoKKmsXT0Vu0EOyL1BudQtdVlMsgjA==} engines: {node: '>=0.10'} + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -2354,6 +2437,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -2397,6 +2485,10 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + socket.io-adapter@2.5.2: resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} @@ -2408,6 +2500,13 @@ packages: resolution: {integrity: sha512-DcotgfP1Zg9iP/dH9zvAQcWrE0TtbMVwXmlV4T4mqsvY+gw+LqUGPfx2AoVyRk0FLME+GQhufDMyacFmw7ksqw==} engines: {node: '>=10.2.0'} + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-package-json@2.10.1: + resolution: {integrity: sha512-d76wfhgUuGypKqY72Unm5LFnMpACbdxXsLPcL27pOsSrmVqH3PztFp1uq+Z22suk15h7vXmTesuh2aEjdCqb5w==} + hasBin: true + source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -3799,6 +3898,18 @@ snapshots: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + '@sinclair/typebox@0.24.51': {} '@sinclair/typebox@0.27.8': {} @@ -4361,12 +4472,20 @@ snapshots: destroy@1.2.0: {} + detect-indent@7.0.1: {} + detect-newline@3.1.0: {} + detect-newline@4.0.1: {} + diff-sequences@27.5.1: {} diff-sequences@28.1.1: {} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + domexception@4.0.0: dependencies: webidl-conversions: 7.0.0 @@ -4520,10 +4639,22 @@ snapshots: fast-equals@5.0.1: {} + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + fast-json-stable-stringify@2.1.0: {} fastest-levenshtein@1.0.16: {} + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + fb-watchman@2.0.2: dependencies: bser: 2.1.1 @@ -4589,8 +4720,16 @@ snapshots: get-package-type@0.1.0: {} + get-stdin@9.0.0: {} + get-stream@6.0.1: {} + git-hooks-list@3.1.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} glob@7.2.3: @@ -4604,6 +4743,14 @@ snapshots: globals@11.12.0: {} + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 4.0.0 + gopd@1.0.1: dependencies: get-intrinsic: 1.2.2 @@ -4683,6 +4830,8 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ignore@5.3.2: {} + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 @@ -4721,6 +4870,8 @@ snapshots: is-plain-obj@3.0.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -5242,6 +5393,8 @@ snapshots: merge-stream@2.0.0: {} + merge2@1.4.1: {} + methods@1.1.2: {} micromatch@4.0.5: @@ -5342,6 +5495,8 @@ snapshots: path-to-regexp@0.1.7: {} + path-type@4.0.0: {} + picocolors@1.0.0: {} picomatch@2.3.1: {} @@ -5354,6 +5509,8 @@ snapshots: pngparse@2.0.1: {} + prettier@3.3.3: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -5393,6 +5550,8 @@ snapshots: querystringify@2.2.0: {} + queue-microtask@1.2.3: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -5457,6 +5616,8 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + reusify@1.0.4: {} + rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -5477,6 +5638,10 @@ snapshots: - supports-color - utf-8-validate + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + rxjs@7.8.1: dependencies: tslib: 2.6.2 @@ -5507,6 +5672,8 @@ snapshots: dependencies: lru-cache: 6.0.0 + semver@7.6.3: {} + send@0.18.0: dependencies: debug: 2.6.9 @@ -5570,6 +5737,8 @@ snapshots: slash@3.0.0: {} + slash@4.0.0: {} + socket.io-adapter@2.5.2: dependencies: ws: 8.11.0 @@ -5598,6 +5767,19 @@ snapshots: - supports-color - utf-8-validate + sort-object-keys@1.1.3: {} + + sort-package-json@2.10.1: + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.1 + get-stdin: 9.0.0 + git-hooks-list: 3.1.0 + globby: 13.2.2 + is-plain-obj: 4.1.0 + semver: 7.6.3 + sort-object-keys: 1.1.3 + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 From 9900013cb05df2c02719a30332e323a40d6bc582 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 16 Oct 2024 16:30:00 +0100 Subject: [PATCH 2/9] Prettier config --- .prettierignore | 2 ++ .prettierrc.json | 5 +---- 2 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 .prettierignore diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..be2f144 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +package.json +pnpm-lock.yaml diff --git a/.prettierrc.json b/.prettierrc.json index 694ed4c..0967ef4 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -1,4 +1 @@ -{ - "trailingComma": "none", - "arrowParens": "avoid" -} +{} From 7192847da6a21adf95d284c5002f7301a40e6314 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 16 Oct 2024 16:31:27 +0100 Subject: [PATCH 3/9] Format all files using prettier --- .devcontainer/devcontainer.json | 6 +- .vscode/settings.json | 4 +- README.md | 117 ++++++++------- babel.config.js | 13 +- jest.config.js | 2 +- src/api/Acl/Acl.ts | 20 +-- src/api/AuthWebSocket/AuthWebSocket.js | 24 +-- src/api/Authentication/Authentication.test.ts | 16 +- src/api/Authentication/Authentication.ts | 43 +++--- src/api/BroadcastChannel/BroadcastChannel.js | 8 +- src/api/Database/Manager/DataManagerBase.js | 12 +- src/api/Database/Models/BaseModel.js | 34 ++--- src/api/Database/WSSub.js | 140 +++++++++--------- src/api/Document/Document.js | 6 +- src/api/Document/DocumentV1.js | 10 +- src/api/Document/DocumentV2.js | 8 +- src/api/Features/index.js | 14 +- src/api/Ldap/Ldap.ts | 28 ++-- src/api/LockManager/LockManager.ts | 10 +- src/api/ROSBridge/ROSBridge.ts | 16 +- src/api/Rest/RestBase.js | 12 +- src/api/Rest/WithAuth.js | 10 +- src/api/RobotManager/Robot.ts | 64 ++++---- src/api/RobotManager/RobotManager.ts | 40 ++--- src/api/RobotManager/Utils/Utils.ts | 10 +- src/api/Role/Role.ts | 6 +- src/api/Snapshot/Snapshot.js | 2 +- src/api/UndoManager/UndoManager.js | 2 +- src/api/UndoManager/UndoManager.md | 2 +- src/api/UndoManager/UndoManager.test.js | 12 +- src/api/User/BaseUser.ts | 6 +- src/api/User/InternalUser.ts | 16 +- src/api/User/User.ts | 6 +- src/api/User/UserV1.js | 12 +- src/api/Utils/Utils.js | 64 ++++---- src/api/Utils/Utils.test.js | 16 +- src/api/Utils/constants.js | 16 +- src/api/VariableManager/VariableManager.ts | 64 ++++---- src/api/WebSocket/index.js | 10 +- src/api/index.ts | 4 +- src/models/authentication.ts | 2 +- src/models/robot.ts | 4 +- src/models/variableManager.ts | 4 +- test/index.html | 107 +++++++------ test/server.js | 47 +++--- webpack.config.js | 18 +-- 46 files changed, 558 insertions(+), 529 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c9e29fd..7f974c2 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -19,12 +19,10 @@ }, "postCreateCommand": "bash -i -c 'nvm install $(cat .nvmrc) -y && nvm use && corepack enable && pnpm clean && pnpm install'", "remoteUser": "node", - "runArgs": [ - "--network=host" - ], + "runArgs": ["--network=host"], "mounts": [ "type=bind,src=${localEnv:HOME}/.npmrc,dst=/home/node/.npmrc", "type=bind,src=${localEnv:HOME}/.ssh,dst=/home/node/.ssh", "type=bind,src=${localEnv:HOME}/movai/src/feapps,dst=/workspaces/" ] -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 6f3a291..6b665aa 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "liveServer.settings.port": 5501 -} \ No newline at end of file + "liveServer.settings.port": 5501 +} diff --git a/README.md b/README.md index aea1c71..e234c44 100644 --- a/README.md +++ b/README.md @@ -9,29 +9,31 @@ Its main use will be to build Mov.AI applications. # Table of Content -* [MOV.AI Core](#movai-core) -* [Table of Content](#table-of-content) -* [Setting Up Your Development Environment](#setting-up-your-development-environment) - * [Common Configuration](#common-configuration) - * [Configure ~/.npmrc](#configure-npmrc) - * [Using a DevContainer (recommended)](#using-a-devcontainer-recommended) - * [Using a Local Setup](#using-a-local-setup) - * [Tools Required](#tools-required) - * [Install Node with NVM](#install-node-with-nvm) - * [Install PNPM](#install-pnpm) - * [Using a DevContainer Setup](#using-a-devcontainer-setup) - * [Tools Required](#tools-required-1) -* [Development](#development) - * [How to install this library to an app](#how-to-install-this-library-to-an-app) - * [How to Link this library locally to an App](#how-to-link-this-library-locally-to-an-app) -* [Testing](#testing) - * [Running tests](#running-tests) - * [Running test on html](#running-test-on-html) - + +- [MOV.AI Core](#movai-core) +- [Table of Content](#table-of-content) +- [Setting Up Your Development Environment](#setting-up-your-development-environment) + - [Common Configuration](#common-configuration) + - [Configure ~/.npmrc](#configure-npmrc) + - [Using a DevContainer (recommended)](#using-a-devcontainer-recommended) + - [Using a Local Setup](#using-a-local-setup) + - [Tools Required](#tools-required) + - [Install Node with NVM](#install-node-with-nvm) + - [Install PNPM](#install-pnpm) + - [Using a DevContainer Setup](#using-a-devcontainer-setup) + - [Tools Required](#tools-required-1) +- [Development](#development) + - [How to install this library to an app](#how-to-install-this-library-to-an-app) + - [How to Link this library locally to an App](#how-to-link-this-library-locally-to-an-app) +- [Testing](#testing) + - [Running tests](#running-tests) + - [Running test on html](#running-test-on-html) + # Setting Up Your Development Environment You can set up your development environment in two ways: + - In a DevContainer (recommended) - Locally @@ -76,58 +78,61 @@ To install Node.js using `nvm` (Node Version Manager), follow these steps: Open your terminal and run the following command to install `nvm`: - ```bash - curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash - ``` + ```bash + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.4/install.sh | bash + ``` 2. **Load `nvm`:** After installing `nvm`, you need to load it. Close and reopen your terminal, or run: - ```bash - source ~/.nvm/nvm.sh - ``` + ```bash + source ~/.nvm/nvm.sh + ``` 3. **Install the required Node.js version:** With `nvm` installed and loaded, run the following command to use the required Node.js version: - ```bash - nvm install && nvm use # uses the node version specify in the .nvmrc file - ``` + ```bash + nvm install && nvm use # uses the node version specify in the .nvmrc file + ``` 4. **Set the used Node.js as the default version:** - ```bash - nvm current # prints the node.js version being used - nvm alias default xx.xx.x # sets xx.xx.x as default - ``` + ```bash + nvm current # prints the node.js version being used + nvm alias default xx.xx.x # sets xx.xx.x as default + ``` 5. **Verify the installation:** - ```bash - node -v - ``` + ```bash + node -v + ``` This should output the node version specified in `.nvmrc` file. - #### Install PNPM To install `pnpm`, follow these steps: 1. Using the required pnpm version: - The pnpm version required is specify in the `package.json` file as: - ```json - { - "packageManager": "pnpm@x.x.x" - } - ``` + The pnpm version required is specify in the `package.json` file as: + + ```json + { + "packageManager": "pnpm@x.x.x" + } + ``` + In order to have Node.js use the specified version, run: - ```bash + + ```bash corepack enable - ``` + ``` + Upon first use, Corepack downloads the latest version from the network and uses it when running pnpm commands. ### Using a DevContainer Setup @@ -143,9 +148,9 @@ To install `pnpm`, follow these steps: ## How to install this library to an app 1. - Install package: - ```bash - "pnpm install @mov-ai/mov-fe-lib-core" - ``` + ```bash + "pnpm install @mov-ai/mov-fe-lib-core" + ``` ## How to Link this library locally to an App @@ -154,29 +159,29 @@ Here's how it can be done: 1. In the app, identify this library in the `package.json`: - ``` - "@mov-ai/mov-fe-lib-core": "^x.x.x-X", - ``` + ``` + "@mov-ai/mov-fe-lib-core": "^x.x.x-X", + ``` 2. Replace the library version with the path of this local library: - ``` + ``` "@mov-ai/mov-fe-lib-core": "file:/home/username/path/to/library/frontend-npm-lib-core" - ``` + ``` 3. Build this local library: - ```bash + ```bash pnpm install # installs dependencies pnpm buildDev # builds the app and watches for changes - ``` + ``` 4. Install and build the app: - ```bash + ```bash pnpm install # installs dependencies including the local library pnpm start # runs the app - ``` + ``` # Testing diff --git a/babel.config.js b/babel.config.js index 7ffbe19..bb120b4 100644 --- a/babel.config.js +++ b/babel.config.js @@ -8,9 +8,9 @@ module.exports = { chrome: "78", node: "12", }, - modules: "auto" + modules: "auto", }, - ] + ], ], plugins: [ "@babel/plugin-syntax-dynamic-import", @@ -18,10 +18,11 @@ module.exports = { "@babel/plugin-proposal-class-properties", "@babel/plugin-proposal-json-strings", [ - "@babel/plugin-transform-runtime", { + "@babel/plugin-transform-runtime", + { loose: true, useESModules: false, - } - ] - ] + }, + ], + ], }; diff --git a/jest.config.js b/jest.config.js index b166d86..a55dc32 100644 --- a/jest.config.js +++ b/jest.config.js @@ -6,7 +6,7 @@ module.exports = { moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], transform: { "^.+\\.(ts|tsx)?$": "ts-jest", - "^.+\\.(js|jsx)$": "babel-jest" + "^.+\\.(js|jsx)$": "babel-jest", }, moduleNameMapper: { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": diff --git a/src/api/Acl/Acl.ts b/src/api/Acl/Acl.ts index 015ce2e..cc200a8 100644 --- a/src/api/Acl/Acl.ts +++ b/src/api/Acl/Acl.ts @@ -5,7 +5,7 @@ import { AclPost, AclBatchResult, AclPut, - AclPutResult + AclPutResult, } from "../../models/acl"; import { HttpErrorResponse } from "../../models/http"; import { LdapResourceType } from "../../models/ldap"; @@ -17,12 +17,12 @@ export const ACL_API_ROUTE = "v2/Acl"; export default class Acl { static get = (domainName: string, accountName: string): Promise => Rest.get({ - path: `${ACL_API_ROUTE}/${domainName}/user/${accountName}/` + path: `${ACL_API_ROUTE}/${domainName}/user/${accountName}/`, }); static getUsersByDomain = (domainName: string): Promise => { return Rest.get({ - path: `${ACL_API_ROUTE}/${domainName}/user/` + path: `${ACL_API_ROUTE}/${domainName}/user/`, }).catch((err: HttpErrorResponse) => { if (err.status === REQUEST_STATUS.NOT_FOUND) return []; else throw err; @@ -31,7 +31,7 @@ export default class Acl { static getGroupsByDomain = (domainName: string): Promise => { return Rest.get({ - path: `${ACL_API_ROUTE}/${domainName}/group/` + path: `${ACL_API_ROUTE}/${domainName}/group/`, }).catch((err: HttpErrorResponse) => { if (err.status === REQUEST_STATUS.NOT_FOUND) return []; else throw err; @@ -41,11 +41,11 @@ export default class Acl { static addResourcesToAcl = ( domainName: string, resourceType: LdapResourceType, - postModel: AclPost[] + postModel: AclPost[], ): Promise => { return Rest.post({ path: `${ACL_API_ROUTE}/${domainName}/${resourceType}/`, - body: postModel + body: postModel, }).catch((err: HttpErrorResponse) => { console.warn(`Error saving ${resourceType}: `, err); throw err; @@ -55,11 +55,11 @@ export default class Acl { static updateResourceInACL = ( domainName: string, resourceType: LdapResourceType, - putModel: AclPut[] + putModel: AclPut[], ): Promise => { return Rest.put({ path: `${ACL_API_ROUTE}/${domainName}/${resourceType}/`, - body: putModel + body: putModel, }).catch((err: HttpErrorResponse) => { console.warn(`Error saving ${resourceType}: `, err); throw err; @@ -69,11 +69,11 @@ export default class Acl { static deleteResourceFromAcl = ( domainName: string, resourceType: LdapResourceType, - deleteModel: AclDeleteModel[] + deleteModel: AclDeleteModel[], ): Promise => { return Rest.delete({ path: `${ACL_API_ROUTE}/${domainName}/${resourceType}/`, - body: deleteModel + body: deleteModel, }).catch((err: HttpErrorResponse) => { console.log(`Error deleting ${resourceType}: `, err); throw err; diff --git a/src/api/AuthWebSocket/AuthWebSocket.js b/src/api/AuthWebSocket/AuthWebSocket.js index 012175b..4365ac0 100644 --- a/src/api/AuthWebSocket/AuthWebSocket.js +++ b/src/api/AuthWebSocket/AuthWebSocket.js @@ -1,5 +1,5 @@ import Authentication, { - AuthException + AuthException, } from "../Authentication/Authentication"; const { checkLogin, getToken } = Authentication; @@ -11,7 +11,7 @@ export default class AuthWebSocket { onClose = null, onError = null, onMessage = null, - connectionHandler = null + connectionHandler = null, }) { this.onOpen = onOpen === null ? this._onOpen : onOpen; this.onClose = onClose === null ? this._onClose : onClose; @@ -26,11 +26,11 @@ export default class AuthWebSocket { this.connected = false; } - _onOpen = evt => { + _onOpen = (evt) => { console.log("Socket Open: ", evt); }; - _onClose = evt => { + _onClose = (evt) => { console.log("Socket Close: ", evt); this.connected = false; @@ -45,16 +45,16 @@ export default class AuthWebSocket { }, 5000); }; - _onError = evt => { + _onError = (evt) => { this.connected = false; console.log("Socket Error: ", evt); }; - _onMessage = evt => { + _onMessage = (evt) => { console.log("Socket Message: ", evt); }; - _connectionHandler = value => { + _connectionHandler = (value) => { console.log("Invalid Token, no handler specified! ", value); }; @@ -62,7 +62,7 @@ export default class AuthWebSocket { let sock = false; checkLogin() - .then(res => { + .then((res) => { if (!res) { throw new AuthException("login error"); } @@ -82,7 +82,7 @@ export default class AuthWebSocket { this.socket = sock; }) - .catch(e => { + .catch((e) => { if (e.name === "AuthException") { this.connectionHandler(false); } @@ -91,14 +91,14 @@ export default class AuthWebSocket { send(data) { checkLogin() - .then(res => { + .then((res) => { if (!res) { throw new AuthException("login error"); } this.socket.send(data); }) - .catch(e => { + .catch((e) => { switch (e.name) { case "AuthException": this.connectionHandler(false); @@ -116,7 +116,7 @@ export default class AuthWebSocket { } }, 400, - sub_interval + sub_interval, ); break; } diff --git a/src/api/Authentication/Authentication.test.ts b/src/api/Authentication/Authentication.test.ts index 4b39631..1191d6d 100644 --- a/src/api/Authentication/Authentication.test.ts +++ b/src/api/Authentication/Authentication.test.ts @@ -6,7 +6,7 @@ const unmockedConsole = global.console; beforeAll(() => { global.console = { ...global.console, - warn: jest.fn() + warn: jest.fn(), }; }); @@ -24,9 +24,9 @@ test("Get Providers when fetch is successfull", () => { json: () => Promise.resolve({ domains: providers, - success: true - }) - }) + success: true, + }), + }), ) as jest.Mock; Authentication.getProviders().then(({ domains }) => { @@ -37,8 +37,8 @@ test("Get Providers when fetch is successfull", () => { test("Get Providers when fetch is not successfull", () => { global.fetch = jest.fn(() => Promise.resolve({ - ok: false - }) + ok: false, + }), ) as jest.Mock; expectProvidersToBeTheDefault(); @@ -52,7 +52,7 @@ test("Get Providers when API is down", () => { function expectProvidersToBeTheDefault() { Authentication.getProviders().then(({ domains }) => expect(domains).toEqual( - expect.arrayContaining([Authentication.DEFAULT_PROVIDER]) - ) + expect.arrayContaining([Authentication.DEFAULT_PROVIDER]), + ), ); } diff --git a/src/api/Authentication/Authentication.ts b/src/api/Authentication/Authentication.ts index 8c2a2d5..4e2647e 100644 --- a/src/api/Authentication/Authentication.ts +++ b/src/api/Authentication/Authentication.ts @@ -6,7 +6,7 @@ import { LoginResponse, NEW_TOKEN_VERSION_ID, STORAGE_KEYS, - Token + Token, } from "../../models/authentication"; export class AuthException { @@ -46,12 +46,13 @@ export default class Authentication { const tokenData: Token = { message: { name: decodedToken.message?.name ?? decodedToken.account_name, - superUser: decodedToken.message?.Superuser ?? decodedToken?.super_user + superUser: + decodedToken.message?.Superuser ?? decodedToken?.super_user, }, auth_token: false, refresh_token: Authentication.getRefreshToken(), error: false, - access_token: token + access_token: token, }; const isNewTokenVersion = !!decodedToken.domain_name; if (isNewTokenVersion) { @@ -65,7 +66,7 @@ export default class Authentication { auth_token: false, refresh_token: false, access_token: false, - error: true + error: true, }; } }; @@ -79,7 +80,7 @@ export default class Authentication { static storeTokens = ( data: LoginResponse, remember: boolean, - options = { storeRefreshToken: true } + options = { storeRefreshToken: true }, ) => { window.localStorage.setItem(STORAGE_KEYS.TOKEN, data["access_token"]); const refreshToken = data["refresh_token"]; @@ -101,7 +102,7 @@ export default class Authentication { username: string, password: string, remember = false, - domain = INTERNAL_AUTHENTICATION + domain = INTERNAL_AUTHENTICATION, ) => { try { Authentication.deleteTokens(); @@ -111,7 +112,7 @@ export default class Authentication { username: username, password: password, remember: remember, - domain + domain, }; const response = await Authentication.request({ url, body }); @@ -143,7 +144,7 @@ export default class Authentication { const token = this.getToken(); Authentication.request({ url: "/logout/", - headers: { Authorization: `bearer ${token}` } + headers: { Authorization: `bearer ${token}` }, }).finally(() => { // Clear Tokens from client side Authentication.deleteTokens(); @@ -182,26 +183,26 @@ export default class Authentication { static getProviders = (): Promise<{ domains: string[] }> => { const headers = { - "Content-Type": "application/json" + "Content-Type": "application/json", }; const url = `/domains/`; - return new Promise(resolve => + return new Promise((resolve) => fetch(url, { headers }) - .then(response => { + .then((response) => { if (!response.ok) { throw new Error(response.statusText); } return response .json() .then(resolve) - .catch(error => { + .catch((error) => { throw new Error(error.statusText); }); }) - .catch(error => { + .catch((error) => { console.warn("Error Fetching Providers: ", error); resolve({ domains: [INTERNAL_AUTHENTICATION] }); - }) + }), ); }; @@ -216,9 +217,9 @@ export default class Authentication { method: "POST", headers: { "Content-Type": "application/json", - ...headers + ...headers, }, - body: JSON.stringify(body) + body: JSON.stringify(body), }); }; @@ -227,23 +228,23 @@ export default class Authentication { const url = `/token-refresh/`; const body = { - token: refreshToken + token: refreshToken, }; return Authentication.request({ url, body }) - .then(response => { + .then((response) => { if (response.status != 200) { throw new Error("Not Allowed"); } return response.json(); }) - .then(data => { + .then((data) => { Authentication.storeTokens(data, remember, { - storeRefreshToken: false + storeRefreshToken: false, }); return true; }) - .catch(_error => { + .catch((_error) => { Authentication.deleteTokens(); return false; }); diff --git a/src/api/BroadcastChannel/BroadcastChannel.js b/src/api/BroadcastChannel/BroadcastChannel.js index 0226b8a..420bced 100644 --- a/src/api/BroadcastChannel/BroadcastChannel.js +++ b/src/api/BroadcastChannel/BroadcastChannel.js @@ -27,7 +27,7 @@ class BroadcastChannel { * * @param {String} event: event name -> should be a valid event name present in BROADCAST_EVENTS */ - unsubscribe = event => { + unsubscribe = (event) => { if (!this.subscribed_events.hasOwnProperty(event)) return; delete this.subscribed_events[event]; console.log("BroadcastChannel unsubscribe to", event); @@ -47,7 +47,7 @@ class BroadcastChannel { event: event, source: this.appName, target: target, - data: data || {} + data: data || {}, }); }; @@ -65,14 +65,14 @@ class BroadcastChannel { * * @param {Event} message: Message event containing origin and data passed from the postMessage */ - _onMessage = message => { + _onMessage = (message) => { const messageData = message.data; // Ignore message received if event is not subscribed if (!this.subscribed_events.hasOwnProperty(messageData.event)) return; // Ignore message if target is not appName if (messageData.target !== this.appName) return; // Call subscribed event callback - this.subscribed_events[messageData.event].forEach(callback => { + this.subscribed_events[messageData.event].forEach((callback) => { callback(messageData); }); console.log("BroadcastChannel _onMessage from", messageData.source); diff --git a/src/api/Database/Manager/DataManagerBase.js b/src/api/Database/Manager/DataManagerBase.js index d135df9..fc5b96a 100644 --- a/src/api/Database/Manager/DataManagerBase.js +++ b/src/api/Database/Manager/DataManagerBase.js @@ -14,26 +14,26 @@ export default class DataManagerBase { throw new Error("No models added"); } - Object.keys(this.models).forEach(key => { + Object.keys(this.models).forEach((key) => { const prop = key.charAt(0).toLowerCase() + key.slice(1); Object.defineProperty(this, prop, { get: () => { return this.models[key]; - } + }, }); }); return this._subscribeModelsReady(); }; _subscribeModelsReady = () => { - Object.keys(this.models).forEach(key => { + Object.keys(this.models).forEach((key) => { this.models[key].onReady(() => this._setModelReady(key)); }); return this; }; - _setModelReady = model => { + _setModelReady = (model) => { this.isReady += 1; if (this.isReady === Object.keys(this.models).length) { this._subject_state.complete(); @@ -50,12 +50,12 @@ export default class DataManagerBase { return subscribeTo.onUpdate(callback); }; - onReady = callback => { + onReady = (callback) => { if (this.db_state !== this.db_states.ready) { this._subject_state.subscribe( () => {}, () => {}, - () => callback() + () => callback(), ); } else { callback(); diff --git a/src/api/Database/Models/BaseModel.js b/src/api/Database/Models/BaseModel.js index d575d24..b261da5 100644 --- a/src/api/Database/Models/BaseModel.js +++ b/src/api/Database/Models/BaseModel.js @@ -26,20 +26,20 @@ export default class BaseModel { } _initialize = () => { - this.patterns.forEach(pattern => this._subscribe(pattern)); + this.patterns.forEach((pattern) => this._subscribe(pattern)); return this; }; - _subscribe = pattern => { + _subscribe = (pattern) => { this.db.subscribe( pattern, - data => this._onDataChange(data), - data => this._onDataLoad(data) + (data) => this._onDataChange(data), + (data) => this._onDataLoad(data), ); }; - _validatePatterns = patterns => { + _validatePatterns = (patterns) => { const default_pattern = { Scope: this.model, Name: "*" }; const _patterns = patterns ? patterns : default_pattern; return Array.isArray(_patterns) ? _patterns : [_patterns]; @@ -60,7 +60,7 @@ export default class BaseModel { } } - get = id => { + get = (id) => { return this._cache.get(id); }; @@ -68,13 +68,13 @@ export default class BaseModel { return this._cache.values(); }; - _get_or_create = key => { + _get_or_create = (key) => { return ( this.get(key) || this.add(key, { name: key, obj: {}, - id: key + id: key, }).get(key) ); }; @@ -83,12 +83,12 @@ export default class BaseModel { return this._cache.set(key, data); }; - remove = key => { + remove = (key) => { this._cache.delete(key); }; destroy = () => { - this.patterns.forEach(pattern => this.db.unsubscribe(pattern)); + this.patterns.forEach((pattern) => this.db.unsubscribe(pattern)); }; /** @@ -115,10 +115,10 @@ export default class BaseModel { * Events */ - _onDataChange = data => { + _onDataChange = (data) => { const obj = _get(data, `key.${this.model}`, {}); - Object.keys(obj).forEach(key => { + Object.keys(obj).forEach((key) => { const entry = this._get_or_create(key); if (data.event === WS_EVENT_TYPES.DEL) { @@ -140,10 +140,10 @@ export default class BaseModel { }); }; - _onDataLoad = data => { + _onDataLoad = (data) => { const obj = _get(data, `value.${this.model}`, {}); - Object.keys(obj).forEach(key => { + Object.keys(obj).forEach((key) => { const entry = this._get_or_create(key); _merge(entry.obj, obj[key]); }); @@ -153,17 +153,17 @@ export default class BaseModel { } }; - onReady = callback => { + onReady = (callback) => { if (this.db_state !== this.db_states.ready) { this._subject_state.subscribe(EMPTY_FUNCTION, EMPTY_FUNCTION, () => - callback() + callback(), ); } else { callback(); } }; - onUpdate = callback => { + onUpdate = (callback) => { this._subject.subscribe(callback); }; } diff --git a/src/api/Database/WSSub.js b/src/api/Database/WSSub.js index 21f070a..a49f5de 100644 --- a/src/api/Database/WSSub.js +++ b/src/api/Database/WSSub.js @@ -1,6 +1,6 @@ import AuthWebSocket from "../AuthWebSocket/AuthWebSocket"; import Authentication, { - AuthException + AuthException, } from "../Authentication/Authentication"; const { getToken, checkLogin } = Authentication; @@ -9,12 +9,12 @@ const WSSUB_STATES = { INIT: 1, CONNECTING: 2, OPEN: 3, - CLOSED: 4 + CLOSED: 4, }; const CONNECTION = { online: 0, - offline: 1 + offline: 1, }; const DEFAULT_METHOD = () => { @@ -35,13 +35,13 @@ class WSSub { this.RESEND_TIMEOUT = 1000; this.RETRIES = 3; this.NORMAL_CLOSE_EVT = 1000; - + // supported commands this.commands = { SUBSCRIBE: "subscribe", UNSUBSCRIBE: "unsubscribe", LIST: "list", - EXECUTE: "execute" + EXECUTE: "execute", }; this.onOnline = DEFAULT_METHOD; @@ -62,8 +62,8 @@ class WSSub { new Promise((_, reject) => setTimeout(() => { reject(new Error("Timeout")); - }, timeout) - ) + }, timeout), + ), ]); }; @@ -92,7 +92,7 @@ class WSSub { onClose, onError, onMessage, - connectionHandler: onAuthError + connectionHandler: onAuthError, }); this.connect(); @@ -199,7 +199,7 @@ class WSSub { const _map = is_command ? this.evt_callbacks : this.sub_callbacks; const _callbacks = _map.get(pattern) || []; - _callbacks.forEach(cb => { + _callbacks.forEach((cb) => { setTimeout(cb, 0, message); }); @@ -216,7 +216,7 @@ class WSSub { /** * triggered when the socket opens */ - onOpen = _evt => { + onOpen = (_evt) => { this.status = WSSUB_STATES.OPEN; // send current subscriptions to the server @@ -227,7 +227,7 @@ class WSSub { /** * triggered when the socket closes */ - onClose = evt => { + onClose = (evt) => { this.dispatch("onclose"); this.status = WSSUB_STATES.CLOSED; @@ -240,7 +240,7 @@ class WSSub { /** * triggered when the socket raises an error */ - onError = _evt => { + onError = (_evt) => { this.dispatch("onerror"); }; @@ -255,7 +255,7 @@ class WSSub { /** * triggered when the socket receives a message */ - onMessage = msg => { + onMessage = (msg) => { try { const data = JSON.parse(msg.data); if (data.error) throw new Error(data.error); @@ -268,7 +268,7 @@ class WSSub { ? [event] : data.patterns; - rcv_patterns.forEach(pattern => { + rcv_patterns.forEach((pattern) => { const _prefix = is_command ? `${event}/` : ""; const _pattern = `${_prefix}${JSON.stringify(pattern)}`; @@ -290,7 +290,7 @@ class WSSub { */ offlineValidation = ({ onOnline = this.onOnline, - onOffline = this.onOffline + onOffline = this.onOffline, }) => { this.onOnline = onOnline; this.onOffline = onOffline; @@ -298,7 +298,7 @@ class WSSub { clearInterval(this.connectionCheckTimeout); this.connectionCheckTimeout = setInterval( this.checkConnection, - this.RECONN_VALIDATION_TIMEOUT + this.RECONN_VALIDATION_TIMEOUT, ); // Return MasterDB instance return this; @@ -315,15 +315,16 @@ class WSSub { clearInterval(this.connectionCheckTimeout); this.connectionCheckTimeout = setInterval( this.checkConnection, - this.RECONN_VALIDATION_TIMEOUT + this.RECONN_VALIDATION_TIMEOUT, ); // Return promise return connectionPromise; }; handleFalseConnection = (statusText) => { - if(statusText === "Token must be a string!") return Authentication.logout(); - } + if (statusText === "Token must be a string!") + return Authentication.logout(); + }; /** * Check connection state by doing requests @@ -332,15 +333,16 @@ class WSSub { checkConnection = () => { return fetch(`/token-verify/`, { method: "POST", - body: JSON.stringify({ token: getToken() }) + body: JSON.stringify({ token: getToken() }), }) - .then(res => { - if (!res.ok && res.status !== 200) return this.handleFalseConnection(res.statusText); + .then((res) => { + if (!res.ok && res.status !== 200) + return this.handleFalseConnection(res.statusText); if (this.connectionState === CONNECTION.online) return; this.connectionState = CONNECTION.online; this.onOnline(); }) - .catch(_err => { + .catch((_err) => { console.warn(_err); if (this.connectionState === CONNECTION.offline) return; this.connectionState = CONNECTION.offline; @@ -375,7 +377,7 @@ class WSSub { reSubscribe = () => { const { SUBSCRIBE } = this.commands; - Array.from(this.sub_callbacks.keys()).forEach(key => { + Array.from(this.sub_callbacks.keys()).forEach((key) => { const message = this.fmtMessage(SUBSCRIBE, JSON.parse(key)); this.send(message); }); @@ -401,7 +403,7 @@ class WSSub { * get the list of the current pattern subscriptions * @param {function} evt_callback function to execute on event */ - list = evt_callback => { + list = (evt_callback) => { const { LIST } = this.commands; const message = this.fmtMessage(LIST); @@ -464,18 +466,18 @@ class WSSub { } const url = this.REST_API + "database/" + scope + "/" + key + "/"; - checkLogin().then(_res => { + checkLogin().then((_res) => { fetch(url) - .then(response => response.json()) + .then((response) => response.json()) - .then(data => { + .then((data) => { if (callback) { callback(data); } else { //NOTHING } }) - .catch(e => { + .catch((e) => { console.log(e); }); }); @@ -496,7 +498,7 @@ class WSSub { const data = { key: key, scope: scope, value: value }; const url = this.REST_API + "database/"; - checkLogin().then(res => { + checkLogin().then((res) => { if (!res) { throw new AuthException("login error"); } @@ -506,9 +508,9 @@ class WSSub { body: JSON.stringify(data), headers: { "Content-Type": "application/json", - Authorization: `Bearer ${getToken()}` - } - }).then(_res => { + Authorization: `Bearer ${getToken()}`, + }, + }).then((_res) => { if (callback) { callback(res); } @@ -525,10 +527,10 @@ class WSSub { if (callback) { response .json() - .then(data => { + .then((data) => { callback(data, response); }) - .catch(e => { + .catch((e) => { callback(undefined, e); if (sendAlert && process.env.NODE_ENV === "development") { @@ -538,7 +540,7 @@ class WSSub { response.status + "\n" + "Error: " + - response.statusText + response.statusText, ); } }); @@ -552,7 +554,7 @@ class WSSub { * @memberof Database */ get = async (url, callback = undefined) => { - checkLogin().then(async res => { + checkLogin().then(async (res) => { if (!res) { throw new AuthException("login error"); } @@ -560,13 +562,13 @@ class WSSub { method: "GET", headers: { "Content-Type": "application/json", - Authorization: `Bearer ${getToken()}` - } + Authorization: `Bearer ${getToken()}`, + }, }) - .then(response => { + .then((response) => { this._sendResponse(response, callback); }) - .catch(e => callback(undefined, e)); + .catch((e) => callback(undefined, e)); }); }; @@ -585,7 +587,7 @@ class WSSub { url = this.REST_API + scope + "/"; } - checkLogin().then(res => { + checkLogin().then((res) => { if (!res) { throw new AuthException("login error"); } @@ -595,9 +597,9 @@ class WSSub { body: JSON.stringify({ key: key, data: value }), headers: { "Content-Type": "application/json", - Authorization: `Bearer ${getToken()}` - } - }).then(response => { + Authorization: `Bearer ${getToken()}`, + }, + }).then((response) => { this._sendResponse(response, callback); }); }); @@ -612,10 +614,10 @@ class WSSub { method: "POST", body: formData, headers: { - Authorization: `Bearer ${getToken()}` - } + Authorization: `Bearer ${getToken()}`, + }, }) - .then(res => res.json()) + .then((res) => res.json()) .then(callback); }; @@ -634,7 +636,7 @@ class WSSub { url = this.REST_API + scope + "/"; } - checkLogin().then(res => { + checkLogin().then((res) => { if (!res) { throw new AuthException("login error"); } @@ -644,9 +646,9 @@ class WSSub { body: JSON.stringify(value), headers: { "Content-Type": "application/json", - Authorization: `Bearer ${getToken()}` - } - }).then(response => { + Authorization: `Bearer ${getToken()}`, + }, + }).then((response) => { this._sendResponse(response, callback, true); }); }); @@ -668,7 +670,7 @@ class WSSub { return; } - checkLogin().then(res => { + checkLogin().then((res) => { if (!res) { throw new AuthException("login error"); } @@ -678,9 +680,9 @@ class WSSub { body: JSON.stringify(data), headers: { "Content-Type": "application/json", - Authorization: `Bearer ${getToken()}` - } - }).then(response => { + Authorization: `Bearer ${getToken()}`, + }, + }).then((response) => { this._sendResponse(response, callback, true); }); }); @@ -698,9 +700,9 @@ class WSSub { cloudFunction, func = "", args = undefined, - callback = undefined + callback = undefined, ) => { - return checkLogin().then(res => { + return checkLogin().then((res) => { if (!res) { throw new AuthException("login error"); } @@ -711,14 +713,14 @@ class WSSub { body: JSON.stringify({ func: func, args: args }), headers: { "Content-Type": "application/json", - Authorization: `Bearer ${getToken()}` - } - }).then(response => { + Authorization: `Bearer ${getToken()}`, + }, + }).then((response) => { if (callback) { response .json() - .then(data => callback(data)) - .catch(e => { + .then((data) => callback(data)) + .catch((e) => { console.log("cloudFunction error", e); callback({ result: false, error: e }); }); @@ -743,22 +745,22 @@ class WSSub { url = this.REST_API + scope + "/"; return; } - let newValue = value.map(obj => { + let newValue = value.map((obj) => { return { componentName: obj.componentName, name: obj.name }; }); const key_workspace = { - Workspace: "*" + Workspace: "*", }; - checkLogin().then(_res => { + checkLogin().then((_res) => { fetch(url, { method: "POST", body: JSON.stringify({ key: key_workspace, data: newValue }), headers: { "Content-Type": "application/json", - Authorization: `Bearer ${getToken()}` - } - }).then(response => { + Authorization: `Bearer ${getToken()}`, + }, + }).then((response) => { this._sendResponse(response, callback, true); }); }); diff --git a/src/api/Document/Document.js b/src/api/Document/Document.js index 8e0d656..872f742 100644 --- a/src/api/Document/Document.js +++ b/src/api/Document/Document.js @@ -5,7 +5,7 @@ import Rest from "../Rest/Rest"; const withDocVersion = function (docVersion) { return { v1: DocumentV1, - v2: DocumentV2 + v2: DocumentV2, }[docVersion]; }; @@ -89,10 +89,10 @@ class Document { static exists({ name, scope, version, workspace = "global" }) { const path = `v2/db/${workspace}/${scope}/${name}/${version}`; return Rest.get({ path }) - .then(data => { + .then((data) => { return !!data[scope]; }) - .catch(err => { + .catch((err) => { return err.status === 500 ? false : true; }); } diff --git a/src/api/Document/DocumentV1.js b/src/api/Document/DocumentV1.js index ae23990..bdec5fa 100644 --- a/src/api/Document/DocumentV1.js +++ b/src/api/Document/DocumentV1.js @@ -78,7 +78,7 @@ class DocumentV1 { * Update the document using PUT request * @param {Object} body Request payload */ - update = body => { + update = (body) => { const { type, name } = this; const path = `v1/${type}/${name}/`; @@ -90,7 +90,7 @@ class DocumentV1 { * @param {Object} body : Request body * @returns Request promise */ - overwrite = body => { + overwrite = (body) => { const { type, name } = this; const path = `v1/${type}/${name}/`; @@ -103,7 +103,7 @@ class DocumentV1 { * Subscribe to document changes (notifications only available in the global workspace) * @param {Function} callback Callback to execute when the document is updated */ - subscribe = callback => { + subscribe = (callback) => { this.resubscribe(callback); }; @@ -111,13 +111,13 @@ class DocumentV1 { * Resubscribe to document changes (notifications only available in the global workspace) * @param {Function} callback Callback to execute when the document is updated */ - resubscribe = callback => { + resubscribe = (callback) => { if (this.readOnly) return; this.unsubscribe(); this.subscriber = new BaseModel({}, this.type, this.database, [ - { Scope: this.type, Name: this.name } + { Scope: this.type, Name: this.name }, ]); this.subscriber.onUpdate(() => { diff --git a/src/api/Document/DocumentV2.js b/src/api/Document/DocumentV2.js index 2017544..4d58923 100644 --- a/src/api/Document/DocumentV2.js +++ b/src/api/Document/DocumentV2.js @@ -12,7 +12,7 @@ class DocumentV2 extends DocumentV1 { const { workspace, type, name, version } = this; const path = `v2/db/${workspace}/${type}/${name}/${version}`; - return Rest.get({ path }).then(data => { + return Rest.get({ path }).then((data) => { this.data = data; return data; }); @@ -22,7 +22,7 @@ class DocumentV2 extends DocumentV1 { * Update the document using PUT request * @param {Object} body Request payload */ - update = body => { + update = (body) => { const { workspace, type, name, version } = this; const path = `v2/db/${workspace}/${type}/${name}/${version}`; @@ -44,7 +44,7 @@ class DocumentV2 extends DocumentV1 { srcWorkspace: workspace, type, name, - version + version, }); }; @@ -57,7 +57,7 @@ class DocumentV2 extends DocumentV1 { return Snapshot.getAll({ workspace, type, - name + name, }); }; diff --git a/src/api/Features/index.js b/src/api/Features/index.js index 9932588..f8535a5 100644 --- a/src/api/Features/index.js +++ b/src/api/Features/index.js @@ -5,7 +5,7 @@ let features = {}; if (!window.mock) { Document.factory({ type: "Configuration", name: "ee" }) .read() - .then(val => { + .then((val) => { let json = {}; try { @@ -20,22 +20,22 @@ if (!window.mock) { "EE: " + (json.Version ?? "2.4.0 (assumed)") + "\nFEATURES: " + - Object.keys(features).join(",") + Object.keys(features).join(","), ); }); } const Features = { - get: key => features[key], - set: key => { + get: (key) => features[key], + set: (key) => { features[key] = value; }, - enable: key => { + enable: (key) => { features[key] = true; }, - disable: key => { + disable: (key) => { features[key] = false; - } + }, }; export default Features; diff --git a/src/api/Ldap/Ldap.ts b/src/api/Ldap/Ldap.ts index fea14a5..b9c8ea4 100644 --- a/src/api/Ldap/Ldap.ts +++ b/src/api/Ldap/Ldap.ts @@ -8,7 +8,7 @@ import { LdapUpdateResult, LdapDomainPut, LdapResourceType, - LdapSearch + LdapSearch, } from "../../models/ldap"; const LDAP_API_ROUTE = "v2/LdapConfig"; @@ -16,14 +16,14 @@ const LDAP_API_ROUTE = "v2/LdapConfig"; class Ldap { static validate = async (domainName: string): Promise<{ success: boolean }> => Rest.get({ - path: `${LDAP_API_ROUTE}/${domainName}/validate` + path: `${LDAP_API_ROUTE}/${domainName}/validate`, }); static getAllDomains = async (): Promise => { const defaultDomains = [Authentication.DEFAULT_PROVIDER]; return Authentication.getProviders() - .then(response => response.domains) - .catch(e => { + .then((response) => response.domains) + .catch((e) => { console.warn("Error getting Ldap Domains:", e.statusText); return defaultDomains; }); @@ -31,7 +31,7 @@ class Ldap { static getExternalDomains = (): Promise => Rest.get({ - path: `${LDAP_API_ROUTE}/` + path: `${LDAP_API_ROUTE}/`, }).catch((e: HttpErrorResponse) => { console.warn("Error getting Ldap Domains:", e.statusText); throw e; @@ -39,43 +39,43 @@ class Ldap { static getDomain = (domainName: string): Promise => Rest.get({ - path: `${LDAP_API_ROUTE}/${domainName}/` + path: `${LDAP_API_ROUTE}/${domainName}/`, }).catch((e: HttpErrorResponse) => { console.warn("Error getting Ldap Data:", e.statusText); throw e; }); static createDomain = ( - postModel: LdapDomainPost + postModel: LdapDomainPost, ): Promise => Rest.post({ path: `${LDAP_API_ROUTE}/new`, - body: postModel + body: postModel, }); static updateDomain = ( domainName: string, - putModel: LdapDomainPut + putModel: LdapDomainPut, ): Promise => Rest.put({ path: `${LDAP_API_ROUTE}/${domainName}/`, - body: putModel + body: putModel, }); static deleteDomain = (domainName: string): Promise => Rest.delete({ - path: `${LDAP_API_ROUTE}/${domainName}/` + path: `${LDAP_API_ROUTE}/${domainName}/`, }); static search = ( domainName: string, resourceType: LdapResourceType, - queryText = "" + queryText = "", ): Promise => { if (!queryText) return Promise.resolve([]); return Rest.get({ path: `${ACL_API_ROUTE}/${domainName}/${resourceType}/search`, - search: { common_name: queryText } + search: { common_name: queryText }, }).catch((e: HttpErrorResponse) => { console.warn("Error searching Ldap Data:", e.statusText); throw e; @@ -88,7 +88,7 @@ class Ldap { 2: { id: 2, name: "PROTOCOL_SSLv3" }, 3: { id: 3, name: "PROTOCOL_TLSv1" }, 4: { id: 4, name: "PROTOCOL_TLSv1_1" }, - 5: { id: 5, name: "PROTOCOL_TLSv1_2" } + 5: { id: 5, name: "PROTOCOL_TLSv1_2" }, }); } diff --git a/src/api/LockManager/LockManager.ts b/src/api/LockManager/LockManager.ts index 85acd38..7e8873b 100644 --- a/src/api/LockManager/LockManager.ts +++ b/src/api/LockManager/LockManager.ts @@ -2,7 +2,7 @@ import { CachedLocks, LockVar, SubscriberCallbackHandler, - SubscriptionManager + SubscriptionManager, } from "../../models"; import MasterDB from "../Database/MasterDB"; import Rest from "../Rest/Rest"; @@ -65,10 +65,10 @@ class LockManager { this.applyChanges(locks, dataEventType); // Call subscribed onChange functions - Object.keys(this.subscribedOnDataChange).forEach(key => { + Object.keys(this.subscribedOnDataChange).forEach((key) => { this.subscribedOnDataChange[key].send( this.cachedLocks, - dataEventType + dataEventType, ); }); }, @@ -78,10 +78,10 @@ class LockManager { this.cachedLocks = data.value; } // Call subscribed onLoad functions - Object.keys(this.subscribedOnDataLoad).forEach(key => { + Object.keys(this.subscribedOnDataLoad).forEach((key) => { this.subscribedOnDataLoad[key].send(this.cachedLocks); }); - } + }, ); } catch (error) {} } diff --git a/src/api/ROSBridge/ROSBridge.ts b/src/api/ROSBridge/ROSBridge.ts index 2cede83..8116ec4 100644 --- a/src/api/ROSBridge/ROSBridge.ts +++ b/src/api/ROSBridge/ROSBridge.ts @@ -79,14 +79,14 @@ export class ROSBridge { }, (error: string) => { reject(error); - } + }, ); }); } callService( message: { [prop: string]: any }, - serviceID: { name: string; serviceType: string } + serviceID: { name: string; serviceType: string }, ): Promise { this.connect(); if (!this.ros.isConnected) { @@ -100,9 +100,9 @@ export class ROSBridge { (result: any) => { resolve(result); }, - error => { + (error) => { reject(error); - } + }, ); }); } @@ -114,15 +114,15 @@ export class ROSBridge { this.ros = new Ros({ url: this.url }); this.ros.on("connection", () => { console.debug("ROS Bridge connected!"); - this.onConnectSubs.forEach(f => f()); + this.onConnectSubs.forEach((f) => f()); }); - this.ros.on("error", error => { + this.ros.on("error", (error) => { console.debug("ROS Bridge error!"); - this.onErrorSubs.forEach(f => f(error)); + this.onErrorSubs.forEach((f) => f(error)); }); this.ros.on("close", () => { console.debug("ROS Bridge closed!"); - this.onCloseSubs.forEach(f => f()); + this.onCloseSubs.forEach((f) => f()); }); } } diff --git a/src/api/Rest/RestBase.js b/src/api/Rest/RestBase.js index 270e8b1..c5f09c3 100644 --- a/src/api/Rest/RestBase.js +++ b/src/api/Rest/RestBase.js @@ -6,7 +6,7 @@ const RestBase = {}; * Encodes the values of an object * @param {Object} data - Object to encode */ -RestBase.encodeURI = data => { +RestBase.encodeURI = (data) => { const output = {}; for (const [key, value] of Object.entries(data)) { output[key] = encodeURIComponent(value); @@ -40,7 +40,7 @@ RestBase._request = ({ method = "GET", body = {}, search, - customHeaders = {} + customHeaders = {}, }) => { const headers = customHeaders; const requestUrl = url ? url : RestBase.getUrl({ path, search }); @@ -48,12 +48,12 @@ RestBase._request = ({ const payload = { method, - headers + headers, }; if (!skipBody.includes(method)) payload.body = JSON.stringify(body); - return fetch(requestUrl, payload).then(response => { + return fetch(requestUrl, payload).then((response) => { if (!response.ok) { return Promise.reject(response); } @@ -119,7 +119,9 @@ RestBase.upload = ({ packageName, key, value, customHeaders = {} }) => { }; let currentApp = ""; -RestBase.setApp = ({ name }) => { currentApp = name; }; +RestBase.setApp = ({ name }) => { + currentApp = name; +}; /** * Execute remote procedure call diff --git a/src/api/Rest/WithAuth.js b/src/api/Rest/WithAuth.js index 21d9dfe..30b08ef 100644 --- a/src/api/Rest/WithAuth.js +++ b/src/api/Rest/WithAuth.js @@ -1,13 +1,13 @@ import Authentication, { - AuthException + AuthException, } from "../Authentication/Authentication"; const { checkLogin, getToken } = Authentication; const withAuth = (obj, props = {}) => { const handler = { __checkLogin: (target, prop) => { - return args => - checkLogin().then(res => { + return (args) => + checkLogin().then((res) => { // check login error if (!res) { throw new AuthException("Login error"); @@ -16,7 +16,7 @@ const withAuth = (obj, props = {}) => { // inject authorization headers const customHeaders = { "Content-Type": "application/json", - Authorization: `Bearer ${getToken()}` + Authorization: `Bearer ${getToken()}`, }; // return the original call with custom headers and original arguments @@ -26,7 +26,7 @@ const withAuth = (obj, props = {}) => { get: function (target, prop) { return this.__checkLogin(target, prop); - } + }, }; return new Proxy(Object.assign(obj, props), handler); diff --git a/src/api/RobotManager/Robot.ts b/src/api/RobotManager/Robot.ts index ba404bc..49e23ae 100644 --- a/src/api/RobotManager/Robot.ts +++ b/src/api/RobotManager/Robot.ts @@ -12,13 +12,13 @@ import { SubscriptionManager, UnsubscriberModel, Alert, - Alerts + Alerts, } from "../../models"; import { LOGGER_STATUS, EMPTY_FUNCTION, DEFAULT_ROBOT_TASKS, - TIME_TO_OFFLINE + TIME_TO_OFFLINE, } from "../Utils/constants"; import DocumentV2 from "../Document/DocumentV2"; import MasterDB from "../Database/MasterDB"; @@ -43,7 +43,7 @@ class Robot { constructor( id: string, - data: RobotModel = { IP: "", RobotName: "", Status: {}, Alerts: {} } + data: RobotModel = { IP: "", RobotName: "", Status: {}, Alerts: {} }, ) { this.id = id; this.ip = data.IP; @@ -55,7 +55,7 @@ class Robot { this.logs = []; this.logger = { status: LOGGER_STATUS.init, - time: 3000 + time: 3000, }; this.logSubscriptions = {}; this.dataSubscriptions = {}; @@ -65,9 +65,9 @@ class Robot { workspace: "global", type: Robot.SCOPE, name: this.id, - version: "-" + version: "-", }, - "v2" + "v2", ); } @@ -85,16 +85,16 @@ class Robot { property, propValue = "*", onLoad = EMPTY_FUNCTION, - onUpdate = EMPTY_FUNCTION + onUpdate = EMPTY_FUNCTION, } = params; MasterDB.subscribe( { Scope: Robot.SCOPE, Name: this.id, - [property]: propValue + [property]: propValue, }, (update: UpdateRobotParam) => onUpdate(update), - (data: LoadRobotParam) => onLoad(data) + (data: LoadRobotParam) => onLoad(data), ); } @@ -106,7 +106,7 @@ class Robot { const pattern = { Scope: Robot.SCOPE, Name: this.id, - [property]: propValue + [property]: propValue, }; MasterDB.unsubscribe(pattern, EMPTY_FUNCTION); } @@ -116,24 +116,27 @@ class Robot { * @returns {Promise} Get data request */ async getData(): Promise { - return this.api.read().then((data: RobotMap) => { - const robotData = data?.Robot?.[this.id]; - if (robotData) { - this.data = robotData; - this.ip = robotData.IP; - this.name = robotData.RobotName; - this.alerts = Object.entries(robotData.Alerts || {}).reduce( - (a: {}, item: [name: string, value: Alert]) => ({ - ...a, - [item[0]]: item[1] - }), - {} - ); - } - return robotData; - }).catch((e: Error) => { - console.error("Robot.getData", e); - }); + return this.api + .read() + .then((data: RobotMap) => { + const robotData = data?.Robot?.[this.id]; + if (robotData) { + this.data = robotData; + this.ip = robotData.IP; + this.name = robotData.RobotName; + this.alerts = Object.entries(robotData.Alerts || {}).reduce( + (a: {}, item: [name: string, value: Alert]) => ({ + ...a, + [item[0]]: item[1], + }), + {}, + ); + } + return robotData; + }) + .catch((e: Error) => { + console.error("Robot.getData", e); + }); } /** @@ -207,7 +210,7 @@ class Robot { * Send updated data to subscribed components */ sendUpdates(event: string) { - Object.keys(this.dataSubscriptions).forEach(key => { + Object.keys(this.dataSubscriptions).forEach((key) => { this.dataSubscriptions[key].send(this.data, event); }); } @@ -306,7 +309,8 @@ class Robot { // Return tasks return { currentTask: res.data[0]?.message || DEFAULT_ROBOT_TASKS.currentTask, - previousTask: res.data[1]?.message || DEFAULT_ROBOT_TASKS.previousTask + previousTask: + res.data[1]?.message || DEFAULT_ROBOT_TASKS.previousTask, }; }) .catch((error: Error) => { diff --git a/src/api/RobotManager/RobotManager.ts b/src/api/RobotManager/RobotManager.ts index e0ade4b..d93e246 100644 --- a/src/api/RobotManager/RobotManager.ts +++ b/src/api/RobotManager/RobotManager.ts @@ -6,7 +6,7 @@ import { EMPTY_FUNCTION, HEARTBEAT_TIMEOUT, SET_WS_EVENTS, - MAX_LOG_LIMIT + MAX_LOG_LIMIT, } from "../Utils/constants"; import Robot from "./Robot"; import Rest from "../Rest/Rest"; @@ -17,7 +17,7 @@ import { getRequestMessage, getRequestRobots, getRequestService, - getRequestTags + getRequestTags, } from "./Utils/Utils"; import { CachedRobots, @@ -25,7 +25,7 @@ import { LogQueryParam, RobotModel, SubscriptionManager, - UpdateRobotParam + UpdateRobotParam, } from "../../models"; // Constants @@ -89,7 +89,7 @@ class RobotManager { MasterDB.subscribe( SUBSCRIPTION_PATTERN, this.onDataChange, - this.onDataLoad + this.onDataLoad, ); } @@ -101,13 +101,13 @@ class RobotManager { this.isDataLoaded = true; if (data.value) { this.cachedRobots = data.value.Robot; - Object.keys(this.cachedRobots).forEach(id => { + Object.keys(this.cachedRobots).forEach((id) => { this.robots[id] = new ProtectedRobot(id, this.cachedRobots[id]); this.cachedRobots[id].Online = true; }); } // Call subscribed onLoad functions - Object.keys(this.subscribedOnDataLoad).forEach(key => { + Object.keys(this.subscribedOnDataLoad).forEach((key) => { this.subscribedOnDataLoad[key].send(this.cachedRobots); }); @@ -128,31 +128,31 @@ class RobotManager { // Set changed robots const changedRobots: CachedRobots = {}; - Object.keys(robots).forEach(robotId => { + Object.keys(robots).forEach((robotId) => { const robot = this.robots[robotId]; const changedKeys_ = robot.getChangedKeysAndResetData(); const changedKeys = changedKeys_ // until https://movai.atlassian.net/browse/BP-910 is not solved .filter( - key => + (key) => !( DEL_WS_EVENTS.includes(dataEventType) && KEYS_TO_DISCONSIDER_DEL_EVENT.includes(key) - ) + ), ) .filter( - key => + (key) => !( SET_WS_EVENTS.includes(dataEventType) && KEYS_TO_DISCONSIDER_SET_EVENT.includes(key) - ) + ), ); if (changedKeys.length) { changedRobots[robotId] = this.cachedRobots[robotId]; } }); // Call subscribed onChange functions - Object.keys(this.subscribedOnDataChange).forEach(key => { + Object.keys(this.subscribedOnDataChange).forEach((key) => { if (Object.keys(changedRobots).length) { this.subscribedOnDataChange[key].send(changedRobots, dataEventType); } @@ -250,7 +250,7 @@ class RobotManager { private heartbeatMonitor = () => { clearTimeout(this.heartbeatTimeout); const robotsWhichChangedOnlineStatus = []; - Object.values(this.robots).forEach(robot => { + Object.values(this.robots).forEach((robot) => { const previousOnlineStatus = this.cachedRobots[robot.id]?.Online; this.checkStatus(robot); if (this.cachedRobots[robot.id]?.Online !== previousOnlineStatus) { @@ -259,7 +259,7 @@ class RobotManager { }); // Call subscribed onChange functions - Object.keys(this.subscribedOnDataChange).forEach(key => { + Object.keys(this.subscribedOnDataChange).forEach((key) => { if (robotsWhichChangedOnlineStatus.length > 0) { this.subscribedOnDataChange[key].send(this.cachedRobots, HEART_BEAT); } @@ -267,7 +267,7 @@ class RobotManager { this.heartbeatTimeout = setTimeout( this.heartbeatMonitor, - HEARTBEAT_TIMEOUT + HEARTBEAT_TIMEOUT, ); }; @@ -289,7 +289,7 @@ class RobotManager { * @param {string} event : Event type ("set", "hset", "del", "hdel") */ private applyChanges = (robots: CachedRobots, event: string) => { - Object.keys(robots).forEach(robotId => { + Object.keys(robots).forEach((robotId) => { const obj: RobotModel = robots[robotId]; // Set robot object if not yet created if (!this.robots[robotId]) { @@ -299,7 +299,7 @@ class RobotManager { const robot = this.robots[robotId]; const cachedRobot = this.cachedRobots[robotId]; // Update cached and robot data attribute - Object.keys(obj).forEach(key => { + Object.keys(obj).forEach((key) => { const objKey = key as keyof RobotModel; const value: any = obj[objKey]; const prevCachedValue = cachedRobot[objKey]; @@ -313,7 +313,7 @@ class RobotManager { : value; robot.setData( objKey, - isObjectAndNotDel ? _merge(prevRobotValue, value) : value + isObjectAndNotDel ? _merge(prevRobotValue, value) : value, ); }); // Send updated data to subscribed components @@ -336,7 +336,7 @@ class RobotManager { const _limit = queryParam?.limit || MAX_LOG_LIMIT; const _levels = getRequestLevels( queryParam?.level?.selected || [], - queryParam?.level?.list + queryParam?.level?.list, ); const _services = getRequestService(queryParam?.service?.selected); const _tags = getRequestTags(queryParam?.tag?.selected); @@ -344,7 +344,7 @@ class RobotManager { const _dates = getRequestDate(queryParam?.date?.from, queryParam?.date?.to); const _robots = getRequestRobots(queryParam?.robot?.selected); return [_limit, _levels, _services, _dates, _tags, _message, _robots].join( - "" + "", ); } diff --git a/src/api/RobotManager/Utils/Utils.ts b/src/api/RobotManager/Utils/Utils.ts index b68edbb..709cf9b 100644 --- a/src/api/RobotManager/Utils/Utils.ts +++ b/src/api/RobotManager/Utils/Utils.ts @@ -32,7 +32,7 @@ function getDateWithoutSeconds(date: number): number { */ export function getRequestLevels( selectedLevels: Array, - levelsList: Array = [] + levelsList: Array = [], ): string { if ( Array.isArray(selectedLevels) && @@ -42,7 +42,7 @@ export function getRequestLevels( } try { - const level = selectedLevels.map(el => el.toLowerCase()).join(); + const level = selectedLevels.map((el) => el.toLowerCase()).join(); return `&level=${level}`; } catch (error) { console.warn("Error Requesting Level", error); @@ -65,7 +65,7 @@ export function getRequestService(selectedService: Array = []): string { } try { - const services = selectedService.map(el => el.toLowerCase()).join(); + const services = selectedService.map((el) => el.toLowerCase()).join(); return `&services=${services}`; } catch (error) { console.warn("Error Requesting Service", error); @@ -81,7 +81,7 @@ export function getRequestService(selectedService: Array = []): string { */ export function getRequestDate( selectedFromDate: TimestampQuery | undefined, - selectedToDate: TimestampQuery | undefined + selectedToDate: TimestampQuery | undefined, ): string { let res = ""; try { @@ -111,7 +111,7 @@ export function getRequestTags(selectedTags: Array = []): string { return ""; } // Format tags to URL parameter - const tags = selectedTags.map(el => el.label).join(); + const tags = selectedTags.map((el) => el.label).join(); return `&tags=${tags}`; } diff --git a/src/api/Role/Role.ts b/src/api/Role/Role.ts index 7036589..408e9e1 100644 --- a/src/api/Role/Role.ts +++ b/src/api/Role/Role.ts @@ -3,7 +3,7 @@ import { RoleModel, RolesMap, RoleUpdateModel, - RoleUpdateResult + RoleUpdateResult, } from "../../models/role"; const ROLE_API_ROUTE = "v2/Role/"; @@ -11,7 +11,7 @@ const ROLE_API_ROUTE = "v2/Role/"; class Role { static getAll = (): Promise => Rest.get({ - path: ROLE_API_ROUTE + path: ROLE_API_ROUTE, }); static get = (id: string): Promise => @@ -22,7 +22,7 @@ class Role { static update = ( roleName: string, - model: RoleUpdateModel + model: RoleUpdateModel, ): Promise => Rest.post({ path: `${ROLE_API_ROUTE}${roleName}/`, body: model }); diff --git a/src/api/Snapshot/Snapshot.js b/src/api/Snapshot/Snapshot.js index 9a9ac4f..0623abe 100644 --- a/src/api/Snapshot/Snapshot.js +++ b/src/api/Snapshot/Snapshot.js @@ -43,7 +43,7 @@ Snapshot.create = ({ target, body = {} }) => { */ Snapshot.createByRef = ({ target, source }) => { const body = { - src: `${source.workspace}/${source.type}/${source.name}/${source.version}` + src: `${source.workspace}/${source.type}/${source.name}/${source.version}`, }; return Snapshot._create({ target, source, body }); diff --git a/src/api/UndoManager/UndoManager.js b/src/api/UndoManager/UndoManager.js index 795d08a..a061916 100644 --- a/src/api/UndoManager/UndoManager.js +++ b/src/api/UndoManager/UndoManager.js @@ -54,7 +54,7 @@ class UndoAbleActionBuilder { } build() { - if ([this._undoAction, this._undoAction].some(x => x == null)) + if ([this._undoAction, this._undoAction].some((x) => x == null)) throw "Forgot to set doAction or undoAction"; return { doAction: this._doAction, undoAction: this._undoAction }; } diff --git a/src/api/UndoManager/UndoManager.md b/src/api/UndoManager/UndoManager.md index 4693ef3..8757763 100644 --- a/src/api/UndoManager/UndoManager.md +++ b/src/api/UndoManager/UndoManager.md @@ -16,7 +16,7 @@ const undoManagerWith100UndoOps = new UndoManager(100); ```javascript let state = 0; -const addAction = n => +const addAction = (n) => UndoManager.actionBuilder() // forward action .doAction(() => (state = state + n)) diff --git a/src/api/UndoManager/UndoManager.test.js b/src/api/UndoManager/UndoManager.test.js index 9d7d2d7..438ff15 100644 --- a/src/api/UndoManager/UndoManager.test.js +++ b/src/api/UndoManager/UndoManager.test.js @@ -1,7 +1,7 @@ import UndoManager from "./UndoManager"; let state = 0; -const addAction = n => +const addAction = (n) => UndoManager.actionBuilder() .doAction(() => (state = state + n)) .undoAction(() => (state = state - n)) @@ -23,7 +23,7 @@ test("Should do undo and redo", () => { actions.push({ action: () => undoManager.undo(), state: 0 }); actions.push({ action: () => undoManager.redo(), state: 1 }); actions.push({ action: () => undoManager.doIt(addFive), state: 6 }); - actions.forEach(a => { + actions.forEach((a) => { a.action(); expect(state).toBe(a.state); }); @@ -38,7 +38,7 @@ test("empty undo", () => { actions.push({ action: () => undoManager.undo(), state: 0 }); actions.push({ action: () => undoManager.undo(), state: 0 }); actions.push({ action: () => undoManager.undo(), state: 0 }); - actions.forEach(a => { + actions.forEach((a) => { a.action(); expect(state).toBe(a.state); }); @@ -54,7 +54,7 @@ test("empty redo", () => { actions.push({ action: () => undoManager.redo(), state: 1 }); actions.push({ action: () => undoManager.redo(), state: 4 }); actions.push({ action: () => undoManager.redo(), state: 4 }); - actions.forEach(a => { + actions.forEach((a) => { a.action(); expect(state).toBe(a.state); }); @@ -68,7 +68,7 @@ test("should addIt", () => { actions.push({ action: () => undoManager.addIt(addTree), state: 4 }); actions.push({ action: () => undoManager.undo(), state: 1 }); actions.push({ action: () => undoManager.undo(), state: 0 }); - actions.forEach(a => { + actions.forEach((a) => { a.action(); expect(state).toBe(a.state); }); @@ -83,7 +83,7 @@ test("test undo limit", () => { actions.push({ action: () => undoManager.undo(), state: 4 }); actions.push({ action: () => undoManager.undo(), state: 1 }); actions.push({ action: () => undoManager.undo(), state: 1 }); - actions.forEach(a => { + actions.forEach((a) => { a.action(); expect(state).toBe(a.state); }); diff --git a/src/api/User/BaseUser.ts b/src/api/User/BaseUser.ts index ba869e6..a678dd5 100644 --- a/src/api/User/BaseUser.ts +++ b/src/api/User/BaseUser.ts @@ -1,7 +1,7 @@ import Authentication from "../Authentication/Authentication"; import { APPLICATIONS_PERMISSION_SCOPE, - UserPermissions + UserPermissions, } from "../../models/permission"; import { ChangePassword, UserWithPermissions } from "../../models/user"; import Rest from "../Rest/Rest"; @@ -11,7 +11,7 @@ class BaseUser { public tokenData = Authentication.getTokenData(), public data = null, public timestamp = null, - public TIMEOUT_MS = 3000 + public TIMEOUT_MS = 3000, ) {} getUsername = (): string => { @@ -33,7 +33,7 @@ class BaseUser { Label: this.getUsername(), Resources: Permissions || {}, Superuser: SuperUser ?? this.isSuperUser(), - Roles + Roles, }; }; diff --git a/src/api/User/InternalUser.ts b/src/api/User/InternalUser.ts index 1c0acaf..8f7094a 100644 --- a/src/api/User/InternalUser.ts +++ b/src/api/User/InternalUser.ts @@ -5,7 +5,7 @@ import { InternalUserModel as InternalUserModel, UserUpdateResult, UserPut, - ResetPassword + ResetPassword, } from "../../models/user"; import Rest from "../Rest/Rest"; import { REQUEST_STATUS } from "../Utils/constants"; @@ -28,7 +28,7 @@ class InternalUser extends BaseUser { changePassword = (model: ChangePassword): Promise => Rest.post({ path: `${INTERNAL_USER_API_ROUTE}/change-password`, - body: model + body: model, }); //======================================================================================== @@ -39,7 +39,7 @@ class InternalUser extends BaseUser { static getAll = (): Promise<{ [accountName: string]: InternalUserModel }> => Rest.get({ - path: `${INTERNAL_USER_API_ROUTE}/` + path: `${INTERNAL_USER_API_ROUTE}/`, }).catch((err: HttpErrorResponse) => { if (err.status === REQUEST_STATUS.NOT_FOUND) return []; else throw err; @@ -47,7 +47,7 @@ class InternalUser extends BaseUser { static get = (accountName: string): Promise => Rest.get({ - path: `${INTERNAL_USER_API_ROUTE}/${accountName}/` + path: `${INTERNAL_USER_API_ROUTE}/${accountName}/`, }); static delete = (user: { name: string }): Promise => { @@ -57,22 +57,22 @@ class InternalUser extends BaseUser { static create = (model: UserPost): Promise => Rest.post({ path: `${INTERNAL_USER_API_ROUTE}/new/`, - body: model + body: model, }); static update = (userId: string, model: UserPut): Promise => Rest.put({ path: `${INTERNAL_USER_API_ROUTE}/${userId}/`, - body: model + body: model, }); static resetPassword = ( userId: string, - model: ResetPassword + model: ResetPassword, ): Promise => { return Rest.post({ path: `${INTERNAL_USER_API_ROUTE}/${userId}/reset-password`, - body: model + body: model, }); }; } diff --git a/src/api/User/User.ts b/src/api/User/User.ts index 59d5232..b7bf31b 100644 --- a/src/api/User/User.ts +++ b/src/api/User/User.ts @@ -10,14 +10,14 @@ import { PermissionType } from "../../models/permission"; import { INTERNAL_AUTHENTICATIONS, NEW_TOKEN_VERSION_ID, - Token + Token, } from "../../models/authentication"; import { ChangePassword, ResetPassword, UserModel as UserModel, UserPost, - UserPut + UserPut, } from "../../models/user"; type UserType = UserV1 | InternalUser | AclUser; @@ -150,7 +150,7 @@ export class User { static hasPermission = ( user: UserModel, resource: string, - operation: PermissionType + operation: PermissionType, ) => { if (user.Superuser) return true; return (user.Resources?.[resource] || []).includes(operation); diff --git a/src/api/User/UserV1.js b/src/api/User/UserV1.js index 3dce2e2..68cffe1 100644 --- a/src/api/User/UserV1.js +++ b/src/api/User/UserV1.js @@ -26,13 +26,13 @@ class UserV1 extends BaseUser { this.timestamp = currTime; return Rest.get({ - path: `${USER_API_ROUTE}/${this.tokenData.message.name}/` + path: `${USER_API_ROUTE}/${this.tokenData.message.name}/`, }) - .then(data => { + .then((data) => { this.data = data; resolve({ response: data }); }) - .catch(error => { + .catch((error) => { this.data = null; reject({ error }); }); @@ -45,7 +45,7 @@ class UserV1 extends BaseUser { ...user, Roles: (user.Role && [user.Role]) || [], Permissions: user.Resources, - SuperUser: user.Superuser + SuperUser: user.Superuser, }; }); }; @@ -56,7 +56,7 @@ class UserV1 extends BaseUser { return this.getData().then(({ response: user }) => user.Superuser); }; - changePassword = body => { + changePassword = (body) => { const model = mapToUserV1PasswordChangeModel(body); return Rest.post({ path: `v1/User/change-password/`, body: model }); }; @@ -71,7 +71,7 @@ class UserV1 extends BaseUser { const model = mapToUserV1PasswordChangeModel(body); return Rest.post({ path: `v1/User/${userId}/reset-password/`, - body: model + body: model, }); }; } diff --git a/src/api/Utils/Utils.js b/src/api/Utils/Utils.js index ae770d4..39dc93a 100644 --- a/src/api/Utils/Utils.js +++ b/src/api/Utils/Utils.js @@ -7,18 +7,17 @@ import _transform from "lodash/transform"; import { deepEqual as equal } from "fast-equals"; import Role from "../Role/Role"; +export const ofNull = (x) => Maybe.fromNull(x); -export const ofNull = x => Maybe.fromNull(x); +export const getter = (prop) => (obj) => obj[prop]; -export const getter = prop => obj => obj[prop]; +export const dot = (f) => (g) => (x) => f(g(x)); -export const dot = f => g => x => f(g(x)); - -export const maybeGet = prop => dot(ofNull)(getter(prop)); +export const maybeGet = (prop) => dot(ofNull)(getter(prop)); export const range = (init, end) => { const { i, e } = Maybe.fromNull(end) - .map(_x => ({ i: init, e: end })) + .map((_x) => ({ i: init, e: end })) .orSome({ i: 0, e: init }); const ans = []; for (let j = i; j < e; j++) ans.push(j); @@ -29,12 +28,12 @@ export const randomInt = (a, b) => Math.floor(random(a, b)); export const random = (a, b) => { const { init, end } = Maybe.fromNull(b) - .map(_x => ({ init: a, end: b })) + .map((_x) => ({ init: a, end: b })) .orSome({ init: 0, end: a }); return init + (end - init) * Math.random(); }; -export const normalizeStr = str => { +export const normalizeStr = (str) => { // from https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript return str .normalize("NFD") @@ -53,7 +52,7 @@ export const normalizeStr = str => { */ export const groupBy = (array, groupFunction) => { const ans = {}; - array.forEach(x => { + array.forEach((x) => { const key = groupFunction(x); if (!ans[key]) ans[key] = []; ans[key].push(x); @@ -62,7 +61,7 @@ export const groupBy = (array, groupFunction) => { }; // From https://flaviocopes.com/how-to-uppercase-first-letter-javascript/ -export const capitalize = s => { +export const capitalize = (s) => { if (typeof s !== "string") return ""; return s.charAt(0).toUpperCase() + s.slice(1); }; @@ -83,8 +82,8 @@ export const flattenObject = (obj, prefix = "") => if (typeof obj[k] === "object" && !_isEmpty(obj[k])) { Object.assign(acc, flattenObject(obj[k], pre + k)); } else { - acc[pre + k] = obj[k] - }; + acc[pre + k] = obj[k]; + } return acc; }, {}); @@ -113,7 +112,7 @@ export const randomGuid = () => { export const validateEntityName = ( entityName, notAllowedWords = ["__"], - regex = ALPHANUMERIC_REGEX + regex = ALPHANUMERIC_REGEX, ) => { const validExpression = entityName.search(regex) !== -1; return ( @@ -128,7 +127,7 @@ export const validateEntityName = ( * @param {object} user * @returns {[string]} List of roles */ -export const getUserRoles = user => { +export const getUserRoles = (user) => { let userRoles = user.Role || user.roles || user.Roles; if (!Array.isArray(userRoles)) userRoles = [userRoles]; return userRoles; @@ -140,20 +139,18 @@ export const getUserRoles = user => { * @param {object} user * @returns {[ResourcePermission]} List of permissions */ -export const parseUserData = async user => { +export const parseUserData = async (user) => { const resourcesParsedData = []; const userRoles = getUserRoles(user); - const permissionsByResourceType = await getPermissionsByScope( - userRoles - ); + const permissionsByResourceType = await getPermissionsByScope(userRoles); user.Resources = permissionsByResourceType; for (let [resourceType, resourcePermissions] of Object.entries( - user.allResourcesPermissions + user.allResourcesPermissions, )) { const hasUserResource = user?.Resources?.[resourceType] ?? false; const resource = { name: resourcePermissions.Label || resourceType, - permissions: resourcePermissions.map(perm => { + permissions: resourcePermissions.map((perm) => { const rolePermValue = permissionsByResourceType[resourceType]?.includes(perm); let permValue = rolePermValue; @@ -165,9 +162,9 @@ export const parseUserData = async user => { name: perm, roleDefault: rolePermValue, resourceType: resourceType, - value: permValue + value: permValue, }; - }) + }), }; resourcesParsedData.push(resource); } @@ -179,7 +176,7 @@ export const parseUserData = async user => { * @param {object} user * @returns {object} Dictionary with list of permissions by scope */ -export const getPermissionsByScope = async userRoles => { +export const getPermissionsByScope = async (userRoles) => { const allRoles = await Role.getAll(); return userRoles.reduce((prev, role) => { const selectedRoleResources = allRoles?.[role]?.Resources ?? {}; @@ -187,7 +184,7 @@ export const getPermissionsByScope = async userRoles => { ([resourceType, permissions]) => { if (!prev[resourceType]) prev[resourceType] = []; prev[resourceType] = [...prev[resourceType], ...permissions]; - } + }, ); return prev; }, {}); @@ -207,7 +204,7 @@ const SAME_TAB = "_self"; const loadLayout = (e, ctrlKey = false) => { window.open( `${window.location.origin}/${API_VERSION}/mov-fe-app-ide/?app_mode=1&layout_id=${e.URL}`, - ctrlKey ? NEW_TAB : SAME_TAB + ctrlKey ? NEW_TAB : SAME_TAB, ); }; @@ -219,7 +216,7 @@ const loadLayout = (e, ctrlKey = false) => { const loadApplication = (e, ctrlKey = false) => { window.open( `${window.location.origin}/${API_VERSION}/${e.URL}/`, - ctrlKey ? NEW_TAB : SAME_TAB + ctrlKey ? NEW_TAB : SAME_TAB, ); }; @@ -227,7 +224,7 @@ const loadApplication = (e, ctrlKey = false) => { * loads the requested external page * @param {object} e application's object */ -const loadUrl = e => { +const loadUrl = (e) => { window.open(`${e.URL}`); }; @@ -241,7 +238,7 @@ export const loadResources = (event, element) => { application: loadApplication, layout: loadLayout, external: loadUrl, - default: loadUrl + default: loadUrl, }; const openInNew = event?.ctrlKey || event?.button === 1; const loader = resourcesMap[element?.Type] || resourcesMap.default; @@ -253,19 +250,19 @@ export const loadResources = (event, element) => { * @param {object} body Object corresponding to either old or new password change model * @returns {object} Object corresponding to old model for V1 user */ -export const mapToUserV1PasswordChangeModel = body => { +export const mapToUserV1PasswordChangeModel = (body) => { const { current_password, CurrentPassword, new_password, NewPassword, confirm_password, - ConfirmPassword + ConfirmPassword, } = body; return { current_password: current_password ?? CurrentPassword ?? "", new_password: new_password ?? NewPassword, - confirm_password: confirm_password ?? ConfirmPassword + confirm_password: confirm_password ?? ConfirmPassword, }; }; @@ -358,11 +355,10 @@ export function buildDocPath(doc) { * @returns {String} Random ID in format : "1c76107c-146e-40bc-93fb-8148750cf50a" */ export const randomId = () => { - return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) => ( c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4))) - ).toString(16) + ).toString(16), ); }; - diff --git a/src/api/Utils/Utils.test.js b/src/api/Utils/Utils.test.js index 4b017b3..00ee394 100644 --- a/src/api/Utils/Utils.test.js +++ b/src/api/Utils/Utils.test.js @@ -6,7 +6,7 @@ import * as Utils from "./Utils"; const { groupBy, range, maybeGet, ofNull, difference, flattenObject } = Utils; test("group by", () => { const array = [1, 2, 3, 4, 5, 6, 7, 8, 9]; - const dict = groupBy(array, x => x % 3); + const dict = groupBy(array, (x) => x % 3); expect(dict).toStrictEqual({ 0: [3, 6, 9], 1: [1, 4, 7], 2: [2, 5, 8] }); }); @@ -40,7 +40,13 @@ test("Differences", () => { expect(difference(a, b)).toStrictEqual({}); const c = { b: { c: "alive", d: "d" } }; expect(difference(a, c)).toStrictEqual({ b: { d: "d" } }); - const d = JSON.parse('{"RobotName":"basic","IP":"127.0.0.1","Alerts":{"TestAlert2":{"action":"TestAlert2 action","callback":"","info":"TestAlert2 info","name":"TestAlert2"},"TestAlert3":{"name":"TestAlert3","info":"TestAlert3 info","action":"TestAlert3 action","callback":""}},"Status":"","Parameter":{"battery":{"Value":37.369418240236804},"started":{"Value":true},"status":{"Value":"PAUSED"},"tf":{"Value":{"name":"base_link","position":{"x":12.262415990293931,"y":-2.297913922626347,"z":0},"orientation":{"x":0,"y":0,"z":0.6355858957405935,"w":0.7720301607681058},"child":[]}}},"Online":true}'); - const e = JSON.parse('{"RobotName":"basic","IP":"127.0.0.1","Alerts":{"TestAlert2":{"name":"TestAlert2","info":"TestAlert2 info","action":"TestAlert2 action","callback":""}},"Status":"","Parameter":{"battery":{"Value":37.369418240236804},"started":{"Value":true},"status":{"Value":"PAUSED"},"tf":{"Value":{"name":"base_link","position":{"x":12.262415990293931,"y":-2.297913922626347,"z":0},"orientation":{"x":0,"y":0,"z":0.6355858957405935,"w":0.7720301607681058},"child":[]}}},"Online":true}'); - expect(Object.keys(flattenObject(difference(d, e)))).toStrictEqual(["Alerts"]) -}) + const d = JSON.parse( + '{"RobotName":"basic","IP":"127.0.0.1","Alerts":{"TestAlert2":{"action":"TestAlert2 action","callback":"","info":"TestAlert2 info","name":"TestAlert2"},"TestAlert3":{"name":"TestAlert3","info":"TestAlert3 info","action":"TestAlert3 action","callback":""}},"Status":"","Parameter":{"battery":{"Value":37.369418240236804},"started":{"Value":true},"status":{"Value":"PAUSED"},"tf":{"Value":{"name":"base_link","position":{"x":12.262415990293931,"y":-2.297913922626347,"z":0},"orientation":{"x":0,"y":0,"z":0.6355858957405935,"w":0.7720301607681058},"child":[]}}},"Online":true}', + ); + const e = JSON.parse( + '{"RobotName":"basic","IP":"127.0.0.1","Alerts":{"TestAlert2":{"name":"TestAlert2","info":"TestAlert2 info","action":"TestAlert2 action","callback":""}},"Status":"","Parameter":{"battery":{"Value":37.369418240236804},"started":{"Value":true},"status":{"Value":"PAUSED"},"tf":{"Value":{"name":"base_link","position":{"x":12.262415990293931,"y":-2.297913922626347,"z":0},"orientation":{"x":0,"y":0,"z":0.6355858957405935,"w":0.7720301607681058},"child":[]}}},"Online":true}', + ); + expect(Object.keys(flattenObject(difference(d, e)))).toStrictEqual([ + "Alerts", + ]); +}); diff --git a/src/api/Utils/constants.js b/src/api/Utils/constants.js index 3b139a7..176567f 100644 --- a/src/api/Utils/constants.js +++ b/src/api/Utils/constants.js @@ -6,7 +6,7 @@ export const BROADCAST_EVENTS = { ISOPEN: "ISOPEN", RPL_ISOPEN: "RPL-ISOPEN", OPENDOC: "OPENDOC", - RPL_OPENDOC: "RPL-OPENDOC" + RPL_OPENDOC: "RPL-OPENDOC", }; // Robot Logger enum @@ -14,18 +14,18 @@ export const LOGGER_STATUS = { init: 0, running: 1, paused: 2, - terminated: 3 + terminated: 3, }; export const ALPHANUMERIC_REGEX = /^[\w][0-9A-Za-z-]*(_[0-9A-Za-z-]+)*[_]?$/; export const REQUEST_STATUS = { SUCCESS: 200, - NOT_FOUND: 404 + NOT_FOUND: 404, }; export const REQUEST_ERROR_CODES = { - NOT_ALLOWED: "Method Not Allowed" + NOT_ALLOWED: "Method Not Allowed", }; export const EMPTY_FUNCTION = () => { @@ -37,7 +37,7 @@ export const SERVICE_LIST = [ { value: "spawner", label: "Spawner" }, { value: "redis", label: "Redis" }, { value: "ros", label: "Ros" }, - { value: "haproxy", label: "ha-proxy" } + { value: "haproxy", label: "ha-proxy" }, ]; export const SERVICE_LABEL = { @@ -50,19 +50,19 @@ export const SERVICE_LABEL = { export const VAR_SCOPES = { GLOBAL: "global", - FLEET: "fleet" + FLEET: "fleet", }; export const DEFAULT_ROBOT_TASKS = { currentTask: "N/A", - previousTask: "N/A" + previousTask: "N/A", }; export const WS_EVENT_TYPES = { SET: "set", HSET: "hset", DEL: "del", - HDEL: "hdel" + HDEL: "hdel", }; export const DEL_WS_EVENTS = [WS_EVENT_TYPES.DEL, WS_EVENT_TYPES.HDEL]; diff --git a/src/api/VariableManager/VariableManager.ts b/src/api/VariableManager/VariableManager.ts index c4e3b0f..2b1d014 100644 --- a/src/api/VariableManager/VariableManager.ts +++ b/src/api/VariableManager/VariableManager.ts @@ -5,12 +5,12 @@ import { SubscriptionManager, SubscriberMap, VarGetResult, - VarMap + VarMap, } from "../../models"; import MasterDB from "../Database/MasterDB"; import Rest from "../Rest/Rest"; import { EMPTY_FUNCTION, VAR_SCOPES, WS_EVENT_TYPES } from "../Utils/constants"; -import {Utils} from "../index"; +import { Utils } from "../index"; // Used as global variable to avoid creation multiple subscribers let instance: VariableManager | null = null; @@ -71,27 +71,29 @@ class VariableManager { const variables = data.key.Var; const dataEventType = data.event; - Object.keys(variables).forEach(scope => { - Object.keys(variables[scope].ID).forEach(keyVar => { + Object.keys(variables).forEach((scope) => { + Object.keys(variables[scope].ID).forEach((keyVar) => { // check if key changed exists in subscribedOnVarChange if (this.subscribedOnVarChange[keyVar]) { // Call subscribed Var onChange functions - Object.keys(this.subscribedOnVarChange[keyVar]).forEach(id => { - this.subscribedOnVarChange[keyVar][id].send( - variables[scope].ID[keyVar]?.Value ?? variables[scope].ID[keyVar] - ); - }); + Object.keys(this.subscribedOnVarChange[keyVar]).forEach( + (id) => { + this.subscribedOnVarChange[keyVar][id].send( + variables[scope].ID[keyVar]?.Value ?? + variables[scope].ID[keyVar], + ); + }, + ); } }); - }) - + }); this.applyChanges(variables, dataEventType); // Call subscribed onChange functions - Object.keys(this.subscribedOnDataChange).forEach(key => { + Object.keys(this.subscribedOnDataChange).forEach((key) => { this.subscribedOnDataChange[key].send( this.cachedVars, - dataEventType + dataEventType, ); }); }, @@ -101,10 +103,10 @@ class VariableManager { this.cachedVars = data.value; } // Call subscribed onLoad functions - Object.keys(this.subscribedOnDataLoad).forEach(key => { + Object.keys(this.subscribedOnDataLoad).forEach((key) => { this.subscribedOnDataLoad[key].send(this.cachedVars); }); - } + }, ); } catch (error) {} } @@ -144,10 +146,12 @@ class VariableManager { // varName = @recovery_state subscribeToVar(varName: string, callback: Function) { const subscriptionId = Utils.randomGuid(); - const subscription = {[subscriptionId]: { send: callback }} - if (!this.subscribedOnVarChange[varName]) this.subscribedOnVarChange[varName] = subscription; - else this.subscribedOnVarChange[varName][subscriptionId] = { send: callback } - + const subscription = { [subscriptionId]: { send: callback } }; + if (!this.subscribedOnVarChange[varName]) + this.subscribedOnVarChange[varName] = subscription; + else + this.subscribedOnVarChange[varName][subscriptionId] = { send: callback }; + return subscriptionId; } @@ -156,8 +160,8 @@ class VariableManager { */ unsubscribeToVar(varName: string, subscriptionId: string) { // delete subscriber - if (!subscriptionId || !this.subscribedOnVarChange[subscriptionId]) return; - delete this.subscribedOnVarChange[subscriptionId]; + if (!subscriptionId || !this.subscribedOnVarChange[subscriptionId]) return; + delete this.subscribedOnVarChange[subscriptionId]; } /** @@ -181,7 +185,7 @@ class VariableManager { setVar = async ({ key, value, - scope = VAR_SCOPES.GLOBAL + scope = VAR_SCOPES.GLOBAL, }: { scope: string; value: RedisVarType | object; @@ -229,7 +233,7 @@ class VariableManager { this.setVar({ value: res.value, key: CURRENT_DATE_KEY, - scope: VAR_SCOPES.GLOBAL + scope: VAR_SCOPES.GLOBAL, }).then(() => { return true; }); @@ -255,22 +259,22 @@ class VariableManager { if (!this.cachedVars.Var[scope]) { this.cachedVars.Var = Object.assign(this.cachedVars.Var, { - [scope]: { ID: {} } + [scope]: { ID: {} }, }); } this.cachedVars.Var[scope].ID = Object.assign( this.cachedVars.Var[scope].ID, - obj.ID + obj.ID, ); this.variables[scope].ID = Object.assign( this.variables[scope].ID, - obj.ID + obj.ID, ); // Update cached and variable data attribute - Object.keys(obj.ID).forEach(varName => { + Object.keys(obj.ID).forEach((varName) => { // Remove variable if (event === WS_EVENT_TYPES.DEL) { delete this.variables[scope].ID[varName]; @@ -293,10 +297,10 @@ class VariableManager { const validators = [ { fn: () => VariableManager.isValidScope(scope), - error: "Invalid scope" - } + error: "Invalid scope", + }, ]; - validators.forEach(obj => { + validators.forEach((obj) => { if (!obj.fn()) { throw new Error(obj.error); } diff --git a/src/api/WebSocket/index.js b/src/api/WebSocket/index.js index ca3914c..86b9ce7 100644 --- a/src/api/WebSocket/index.js +++ b/src/api/WebSocket/index.js @@ -3,20 +3,18 @@ const { getToken } = Authentication; const wsMap = {}; -export -function webSocketOpen(config) { +export function webSocketOpen(config) { const { path = "", host = window.location.hostname, port = window.location.port, proto = window.location.protocol === "https:" ? "wss" : "ws", params = new URLSearchParams(), - } = typeof config === "string" ? { path: config } : config ?? {}; + } = typeof config === "string" ? { path: config } : (config ?? {}); const url = proto + "://" + host + ":" + port + path; - if (wsMap[url]) - return wsMap[url]; + if (wsMap[url]) return wsMap[url]; let wsUrl = new URL(url); params.set("token", getToken()); wsUrl.search = params; - return wsMap[url] = new WebSocket(wsUrl.toString()); + return (wsMap[url] = new WebSocket(wsUrl.toString())); } diff --git a/src/api/index.ts b/src/api/index.ts index d939fa8..bad74df 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -1,4 +1,4 @@ -export { default as Features } from "./Features"; +export { default as Features } from "./Features"; import Acl from "./Acl/Acl"; import Authentication from "./Authentication/Authentication"; import InternalUser from "./User/InternalUser"; @@ -53,5 +53,5 @@ export { Snapshot, Rest, ROSBridge, - MainROSBridge + MainROSBridge, }; diff --git a/src/models/authentication.ts b/src/models/authentication.ts index 6f9dd74..b89098a 100644 --- a/src/models/authentication.ts +++ b/src/models/authentication.ts @@ -4,7 +4,7 @@ export const STORAGE_KEYS = { TOKEN: "movai.token", REFRESH_TOKEN: "movai.refreshToken", TOKEN_REMEMBER: "movai.tokenRemember", - SESSION: "movai.session" + SESSION: "movai.session", }; export const INTERNAL_AUTHENTICATION = "internal"; diff --git a/src/models/robot.ts b/src/models/robot.ts index e9c0e1c..55a36e8 100644 --- a/src/models/robot.ts +++ b/src/models/robot.ts @@ -22,7 +22,9 @@ export interface Alert { callback?: string; } -export interface Alerts { [name: string]: Alert } +export interface Alerts { + [name: string]: Alert; +} export interface RobotModel { IP?: string | null; diff --git a/src/models/variableManager.ts b/src/models/variableManager.ts index 3956f92..f05e3da 100644 --- a/src/models/variableManager.ts +++ b/src/models/variableManager.ts @@ -1,6 +1,6 @@ -import {SubscriptionManager} from "./common" +import { SubscriptionManager } from "./common"; -type VarValue = { Value: string | number | object | boolean }; +type VarValue = { Value: string | number | object | boolean }; export type RedisVarType = VarValue; export interface VarMap { diff --git a/test/index.html b/test/index.html index fb0a274..ca434c8 100644 --- a/test/index.html +++ b/test/index.html @@ -1,50 +1,61 @@ - + + + + + + Movai Lib Core Test + + - - - - - Movai Lib Core Test - - - - - - - - - \ No newline at end of file + + + + diff --git a/test/server.js b/test/server.js index 3f8a5e3..e6ac058 100644 --- a/test/server.js +++ b/test/server.js @@ -1,32 +1,31 @@ const express = require("express"); const path = require("path"); const { createProxyMiddleware } = require("http-proxy-middleware"); -const serveStatic = require('serve-static') +const serveStatic = require("serve-static"); const app = express(); - app.use(serveStatic(path.join(__dirname, "../"))); app.use( - createProxyMiddleware( - [ - "/token-auth/**", - "/api/**", - "/token-verify/**", - "/token-refresh/**", - "/domains/**", - "/ws/**", - "/logout/**", - "/static/maps/**", - "/static/meshes/**", - "/static/point_clouds/**" - ], - { - target: "https://localhost", - ws: true, - logLevel: "debug", - secure: false - } - ) - ); + createProxyMiddleware( + [ + "/token-auth/**", + "/api/**", + "/token-verify/**", + "/token-refresh/**", + "/domains/**", + "/ws/**", + "/logout/**", + "/static/maps/**", + "/static/meshes/**", + "/static/point_clouds/**", + ], + { + target: "https://localhost", + ws: true, + logLevel: "debug", + secure: false, + }, + ), +); -app.listen(3030); \ No newline at end of file +app.listen(3030); diff --git a/webpack.config.js b/webpack.config.js index 562f105..5ff7d2e 100755 --- a/webpack.config.js +++ b/webpack.config.js @@ -7,10 +7,10 @@ module.exports = { path: path.resolve("./"), filename: "dist/index.js", library: "Movai", - libraryTarget: "umd" + libraryTarget: "umd", }, resolve: { - extensions: [".tsx", ".ts", ".js"] + extensions: [".tsx", ".ts", ".js"], }, target: "web", devtool: "source-map", @@ -20,21 +20,21 @@ module.exports = { { test: /\.tsx?$/, use: "ts-loader", - exclude: /node_modules/ + exclude: /node_modules/, }, { test: /\.(js|mjs|jsx)$/, exclude: /(node_modules|bower_components)/, use: { loader: "babel-loader", - } + }, }, { test: /\.(woff|woff2)$/, use: { - loader: "url-loader" - } - } - ] - } + loader: "url-loader", + }, + }, + ], + }, }; From e5811e0f50781b15f63773957e41cd15f4f627eb Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 16 Oct 2024 16:32:25 +0100 Subject: [PATCH 4/9] Format package.json using sort-package-json --- package.json | 84 ++++++++++++++++++++++++++-------------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index 50ed030..f6ec19f 100644 --- a/package.json +++ b/package.json @@ -2,33 +2,54 @@ "name": "@mov-ai/mov-fe-lib-core", "version": "1.2.3-0", "description": "The Mov.AI's core frontend library.", - "publishConfig": { - "registry": "https://npm.pkg.github.com/mov-ai" + "keywords": [ + "frontend", + "core", + "common", + "utils" + ], + "homepage": "https://github.com/MOV-AI/frontend-npm-lib-core/blob/main/README.md", + "repository": { + "type": "git", + "url": "https://github.com/MOV-AI/frontend-npm-lib-core.git" }, + "license": "ISC", + "author": "MOV.AI", "main": "./dist/index.js", + "typesVersions": { + "*": { + "api": [ + "dist/src/api/index.d.ts" + ], + "models": [ + "dist/src/models/index.d.ts" + ] + } + }, + "files": [ + "dist", + "resources" + ], "scripts": { + "build": "webpack --mode=production", + "buildDev": "webpack --mode=development --watch", + "clean": "rm -rf node_modules", "lock": "mv ../../pnpm-workspace.yaml ../../pnpm-workspace.yaml.bak ; pnpm i ; mv ../../pnpm-workspace.yaml.bak ../../pnpm-workspace.yaml", "test": "jest --coverage", "testDev": "jest --watchAll", "testStatic": "webpack --mode=development && echo 'Open browser at http://localhost:3030/test/index.html' && node test/server.js", - "build": "webpack --mode=production", - "buildDev": "webpack --mode=development --watch", - "clean": "rm -rf node_modules", "ts": "tsc --noEmit" }, - "repository": { - "type": "git", - "url": "https://github.com/MOV-AI/frontend-npm-lib-core.git" + "dependencies": { + "@babel/runtime": "^7.15.4", + "fast-equals": "^5.0.1", + "js-yaml": "^4.1.0", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "monet": "^0.9.2", + "roslib": "^1.3.0", + "rxjs": "^7.3.0" }, - "keywords": [ - "frontend", - "core", - "common", - "utils" - ], - "author": "MOV.AI", - "license": "ISC", - "homepage": "https://github.com/MOV-AI/frontend-npm-lib-core/blob/main/README.md", "devDependencies": { "@babel/core": "^7.15.5", "@babel/plugin-proposal-class-properties": "^7.14.5", @@ -58,29 +79,8 @@ "webpack-cli": "^4.8.0", "webpack-node-externals": "^3.0.0" }, - "dependencies": { - "@babel/runtime": "^7.15.4", - "fast-equals": "^5.0.1", - "js-yaml": "^4.1.0", - "jwt-decode": "^3.1.2", - "lodash": "^4.17.21", - "monet": "^0.9.2", - "roslib": "^1.3.0", - "rxjs": "^7.3.0" - }, - "files": [ - "dist", - "resources" - ], - "typesVersions": { - "*": { - "api": [ - "dist/src/api/index.d.ts" - ], - "models": [ - "dist/src/models/index.d.ts" - ] - } - }, - "packageManager": "pnpm@9.11.0" + "packageManager": "pnpm@9.11.0", + "publishConfig": { + "registry": "https://npm.pkg.github.com/mov-ai" + } } From db0df1b0f5dd68273d09c3150dbeb50198db75a4 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 16 Oct 2024 16:33:53 +0100 Subject: [PATCH 5/9] Install husky and lint-staged --- .husky/pre-commit | 1 + package.json | 7 + pnpm-lock.yaml | 355 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 363 insertions(+) create mode 100644 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..5ee7abd --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm exec lint-staged diff --git a/package.json b/package.json index f6ec19f..dc5b85d 100644 --- a/package.json +++ b/package.json @@ -35,11 +35,16 @@ "buildDev": "webpack --mode=development --watch", "clean": "rm -rf node_modules", "lock": "mv ../../pnpm-workspace.yaml ../../pnpm-workspace.yaml.bak ; pnpm i ; mv ../../pnpm-workspace.yaml.bak ../../pnpm-workspace.yaml", + "prepare": "husky", "test": "jest --coverage", "testDev": "jest --watchAll", "testStatic": "webpack --mode=development && echo 'Open browser at http://localhost:3030/test/index.html' && node test/server.js", "ts": "tsc --noEmit" }, + "lint-staged": { + "**/*": "prettier --write --ignore-unknown", + "package.json": "sort-package-json" + }, "dependencies": { "@babel/runtime": "^7.15.4", "fast-equals": "^5.0.1", @@ -67,8 +72,10 @@ "babel-loader": "^8.2.2", "express": "^4.18.1", "http-proxy-middleware": "^2.0.6", + "husky": "^9.1.6", "jest": "^28.1.0", "jest-environment-jsdom": "^29.7.0", + "lint-staged": "^15.2.10", "prettier": "3.3.3", "sort-package-json": "2.10.1", "ts-jest": "^28.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c67e893..81fe447 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,12 +81,18 @@ importers: http-proxy-middleware: specifier: ^2.0.6 version: 2.0.6 + husky: + specifier: ^9.1.6 + version: 9.1.6 jest: specifier: ^28.1.0 version: 28.1.3(@types/node@17.0.45) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 + lint-staged: + specifier: ^15.2.10 + version: 15.2.10 prettier: specifier: 3.3.3 version: 3.3.3 @@ -1104,10 +1110,18 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -1120,6 +1134,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1204,6 +1222,10 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + browserslist@4.22.3: resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -1252,6 +1274,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -1267,6 +1293,14 @@ packages: cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1302,6 +1336,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -1382,6 +1420,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -1447,6 +1494,9 @@ packages: resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} engines: {node: '>=12'} + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1479,6 +1529,10 @@ packages: engines: {node: '>=4'} hasBin: true + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -1540,6 +1594,9 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -1548,6 +1605,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -1588,6 +1649,10 @@ packages: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} @@ -1644,6 +1709,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} @@ -1659,6 +1728,10 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + git-hooks-list@3.1.0: resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} @@ -1745,6 +1818,15 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.6: + resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} + engines: {node: '>=18'} + hasBin: true + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -1794,6 +1876,14 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} @@ -1825,6 +1915,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2073,9 +2167,22 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lint-staged@15.2.10: + resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -2097,6 +2204,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2140,6 +2251,10 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -2157,6 +2272,14 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2197,6 +2320,10 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + nwsapi@2.2.7: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} @@ -2218,6 +2345,14 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -2257,6 +2392,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -2274,6 +2413,11 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -2392,10 +2536,17 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -2478,6 +2629,10 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -2489,6 +2644,14 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + socket.io-adapter@2.5.2: resolution: {integrity: sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==} @@ -2532,6 +2695,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -2540,10 +2707,18 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} @@ -2552,6 +2727,10 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2828,6 +3007,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -2876,6 +3059,11 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.5.1: + resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} + engines: {node: '>= 14'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -4161,8 +4349,14 @@ snapshots: dependencies: type-fest: 0.21.3 + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} + ansi-regex@6.1.0: {} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -4173,6 +4367,8 @@ snapshots: ansi-styles@5.2.0: {} + ansi-styles@6.2.1: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -4305,6 +4501,10 @@ snapshots: dependencies: fill-range: 7.0.1 + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + browserslist@4.22.3: dependencies: caniuse-lite: 1.0.30001582 @@ -4351,6 +4551,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.3.0: {} + char-regex@1.0.2: {} chrome-trace-event@1.0.3: {} @@ -4359,6 +4561,15 @@ snapshots: cjs-module-lexer@1.2.3: {} + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -4393,6 +4604,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@12.1.0: {} + commander@2.20.3: {} commander@7.2.0: {} @@ -4454,6 +4667,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + decimal.js@10.4.3: {} dedent@0.7.0: {} @@ -4496,6 +4713,8 @@ snapshots: emittery@0.10.2: {} + emoji-regex@10.4.0: {} + emoji-regex@8.0.0: {} emojis-list@3.0.0: {} @@ -4530,6 +4749,8 @@ snapshots: envinfo@7.11.0: {} + environment@1.1.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -4575,6 +4796,8 @@ snapshots: eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} + events@3.3.0: {} execa@5.1.1: @@ -4589,6 +4812,18 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + exit@0.1.2: {} expect@28.1.3: @@ -4663,6 +4898,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + finalhandler@1.2.0: dependencies: debug: 2.6.9 @@ -4711,6 +4950,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.3.0: {} + get-intrinsic@1.2.2: dependencies: function-bind: 1.1.2 @@ -4724,6 +4965,8 @@ snapshots: get-stream@6.0.1: {} + get-stream@8.0.1: {} + git-hooks-list@3.1.0: {} glob-parent@5.1.2: @@ -4822,6 +5065,10 @@ snapshots: human-signals@2.1.0: {} + human-signals@5.0.0: {} + + husky@9.1.6: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -4860,6 +5107,12 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + is-generator-fn@2.1.0: {} is-glob@4.0.3: @@ -4880,6 +5133,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@3.0.0: {} + isexe@2.0.0: {} isobject@3.0.1: {} @@ -5345,8 +5600,34 @@ snapshots: leven@3.1.0: {} + lilconfig@3.1.2: {} + lines-and-columns@1.2.4: {} + lint-staged@15.2.10: + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.7 + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.5 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.5.1 + transitivePeerDependencies: + - supports-color + + listr2@8.2.5: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + loader-runner@4.3.0: {} loader-utils@2.0.4: @@ -5365,6 +5646,14 @@ snapshots: lodash@4.17.21: {} + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -5402,6 +5691,11 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mime-db@1.52.0: {} mime-types@2.1.35: @@ -5412,6 +5706,10 @@ snapshots: mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -5440,6 +5738,10 @@ snapshots: dependencies: path-key: 3.1.1 + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + nwsapi@2.2.7: {} object-assign@4.1.1: {} @@ -5458,6 +5760,14 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -5491,6 +5801,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-to-regexp@0.1.7: {} @@ -5501,6 +5813,8 @@ snapshots: picomatch@2.3.1: {} + pidtree@0.6.0: {} + pirates@4.0.6: {} pkg-dir@4.2.0: @@ -5616,8 +5930,15 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + reusify@1.0.4: {} + rfdc@1.4.1: {} + rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -5733,12 +6054,24 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + sisteransi@1.0.5: {} slash@3.0.0: {} slash@4.0.0: {} + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + socket.io-adapter@2.5.2: dependencies: ws: 8.11.0 @@ -5802,6 +6135,8 @@ snapshots: statuses@2.0.1: {} + string-argv@0.3.2: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -5813,14 +6148,26 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + strip-bom@4.0.0: {} strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} + strip-json-comments@3.1.1: {} supports-color@5.5.0: @@ -6082,6 +6429,12 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} write-file-atomic@4.0.2: @@ -6103,6 +6456,8 @@ snapshots: yallist@4.0.0: {} + yaml@2.5.1: {} + yargs-parser@21.1.1: {} yargs@17.7.2: From 738765906b4ab2373abe84c0e1bd5b48a0123b58 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 16 Oct 2024 16:35:22 +0100 Subject: [PATCH 6/9] Run lint-staged --- .github/workflows/TestOnPR.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/TestOnPR.yml b/.github/workflows/TestOnPR.yml index 23a8791..0bff2e2 100644 --- a/.github/workflows/TestOnPR.yml +++ b/.github/workflows/TestOnPR.yml @@ -15,6 +15,7 @@ jobs: uses: MOV-AI/.github/.github/workflows/npm-workflow.yml@v2.1 with: deploy: "false" + run_lint_staged: "true" run_tests: "true" use_nvmrc: "true" pm: "pnpm" From 32928895dc7f14c198f617e966ecd02de2f7e420 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 16 Oct 2024 16:41:34 +0100 Subject: [PATCH 7/9] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2154ade..7d5c9be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# TBD + +- [FP-2916](https://movai.atlassian.net/browse/FP-2916): Configure husky, lint-staged and prettier for lib-core + # 1.2.3 - [FP-2926](https://movai.atlassian.net/browse/FP-2926): Clear console and app errors From 6fb1a2f7c41bce4ec39b6e72cb8d07e1c7bc8689 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 16 Oct 2024 16:57:10 +0100 Subject: [PATCH 8/9] Add vscode config --- .vscode/extensions.json | 3 +++ .vscode/settings.json | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..c83e263 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["esbenp.prettier-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 6b665aa..296511d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "liveServer.settings.port": 5501 + "prettier.configPath": ".prettierrc.json", + "editor.formatOnSave": true } From 2c7a17b2ad488bb8ffd59c5127fc3f251c0fefad Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 16 Oct 2024 17:04:41 +0100 Subject: [PATCH 9/9] Document git hook --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index e234c44..72ee538 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,13 @@ Here's how it can be done: pnpm start # runs the app ``` +## How to setup linting git hook + +1. Install husky git hook: + ```bash + "pnpm prepare" + ``` + # Testing ## Running tests