From 56a62e700804c225a59369d081364a09864737ac Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Tue, 26 May 2026 09:54:26 +0000 Subject: [PATCH] feat(images): improve image operations UI and record archive metadata --- changelog.md | 11 + package.json | 2 +- pnpm-lock.yaml | 511 ++------------------- ts/manager.image/classes.image.ts | 7 +- ts/manager.image/classes.imagemanager.ts | 16 +- ts_web/appstate.ts | 2 +- ts_web/elements/views/deployments/index.ts | 56 +++ ts_web/elements/views/images/index.ts | 289 +++++++++--- ts_web/elements/views/services/index.ts | 52 ++- 9 files changed, 398 insertions(+), 548 deletions(-) diff --git a/changelog.md b/changelog.md index 43e58a3..2deef8e 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,17 @@ ## Pending +### Features + +- improve Cloudly image operations UI + - Adds operational image list metadata, image detail drilldown, version tables, and service usage context + - Uses table details actions as the safe double-click behavior while keeping mutating actions row/context only + - Records uploaded image archive size and digest metadata after image storage completes +- improve image operations UI and record archive metadata (images) + - Add image list metadata, detail drilldown, version tables, and service usage context. + - Record uploaded image archive size and SHA-256 digest after storage completes. + - Add deployment detail modals and safe double-click Details actions in deployment and service views. + - Initialize default location metadata when creating images. ## 2026-05-25 - 6.0.0 diff --git a/package.json b/package.json index 6ea7d48..fd662d6 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "@git.zone/tstest": "^3.6.6", "@git.zone/tswatch": "^3.3.5", "@push.rocks/smartnetwork": "^4.7.1", - "@types/node": "^25.8.0" + "@types/node": "^25.9.0" }, "dependencies": { "@api.global/typedrequest": "3.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd2b4e4..8c0105c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,16 +170,16 @@ importers: version: 1.11.7 '@git.zone/tstest': specifier: ^3.6.6 - version: 3.6.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(socks@2.8.8)(typescript@6.0.3) + version: 3.6.6(socks@2.8.8)(typescript@6.0.3) '@git.zone/tswatch': specifier: ^3.3.5 - version: 3.3.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@tiptap/pm@2.27.2) + version: 3.3.5(@tiptap/pm@2.27.2) '@push.rocks/smartnetwork': specifier: ^4.7.1 version: 4.7.1 '@types/node': - specifier: ^25.8.0 - version: 25.8.0 + specifier: ^25.9.0 + version: 25.9.0 packages: @@ -838,10 +838,6 @@ packages: resolution: {integrity: sha512-usxx8BBQsAypxjFOfd1GEV9pL9EUshRKktXtRWHMDByb6ps83+PdUIb3D7O+nkkBp4C9PXo3cfbsR4Asvo33CA==} hasBin: true - '@git.zone/tsbundle@2.10.1': - resolution: {integrity: sha512-bCoDoHsT9oIQRFZbItkjPu/lTiyCKxzhA+XSEc1L2jV8S717faaLWHJEbbmrX/pZXG2OkIr2At1xpsicE/6I7g==} - hasBin: true - '@git.zone/tsbundle@2.10.4': resolution: {integrity: sha512-/xWOGrnuMaJ/Xo/EasaF9N3N9w1J9LDywZaRTa0UTtzbEtfJP7F2NJ9l4tWCwS+vTKpnqApX7ZueRh1h5MrwPQ==} hasBin: true @@ -854,10 +850,6 @@ packages: resolution: {integrity: sha512-im2hD3Fu7vSb6qM+WMg2tbvLbFfEpX8qVmjy491R5iELky4Pw9cqRMkwzmxW92etn8v+f53ODUQDOoc9DufX2A==} hasBin: true - '@git.zone/tspublish@1.11.6': - resolution: {integrity: sha512-0HmIS4rs5fgbxnNWAm0aZ4wKjSMX9nsHx1Gy90iK9uXFUVmzx/4SibE9UmSgNfmGAGSXiSh8TW6M1gOmLODNNw==} - hasBin: true - '@git.zone/tspublish@1.11.7': resolution: {integrity: sha512-6vXXOQ7mPQu72q/Trr8bHwYLrAX1Y1okX/KoKTXlnx0adtqJKw1V5p9cimGrkq40rX5ivh1rPg+7fTlbXgjyew==} hasBin: true @@ -1208,24 +1200,6 @@ packages: '@mixmark-io/domino@2.2.0': resolution: {integrity: sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==} - '@module-federation/error-codes@0.22.0': - resolution: {integrity: sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug==} - - '@module-federation/runtime-core@0.22.0': - resolution: {integrity: sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA==} - - '@module-federation/runtime-tools@0.22.0': - resolution: {integrity: sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA==} - - '@module-federation/runtime@0.22.0': - resolution: {integrity: sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA==} - - '@module-federation/sdk@0.22.0': - resolution: {integrity: sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g==} - - '@module-federation/webpack-bundler-runtime@0.22.0': - resolution: {integrity: sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA==} - '@mongodb-js/saslprep@1.4.11': resolution: {integrity: sha512-o9rAHc0IpIjuPSxRutWpE1F62x7n+4mVS4rCNHkzhIUMQcc18bb6xEq5wd2NdN0WjepIyXIppRshYI2kQDOZVA==} @@ -1304,9 +1278,6 @@ packages: resolution: {integrity: sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.0.7': - resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} - '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: @@ -1320,9 +1291,6 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} - '@oxc-project/types@0.129.0': resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} @@ -1405,9 +1373,6 @@ packages: '@push.rocks/levelcache@3.2.2': resolution: {integrity: sha512-g44xp3XmtSPlcTHQ8qoaNV0AK7w4cuLd6h7sGXXxldN3NLgjOUpUqnnyDBU9i5hpIIxqssxe8WRQz10bi9W+tA==} - '@push.rocks/lik@6.2.2': - resolution: {integrity: sha512-j64FFPPyMXeeUorjKJVF6PWaJUfiIrF3pc41iJH4lOh0UUpBAHpcNzHVxTR58orwbVA/h3Hz+DQd4b1Rq0dFDQ==} - '@push.rocks/lik@6.4.1': resolution: {integrity: sha512-W5M2zoJWUxYnCVqUB7jaxMB4W1kfhs1P6SXvWGqwDpJAjMjCnZeAXD+w0akECgSBY1zCCT2qMj7YK4Gza0t25g==} @@ -1701,60 +1666,30 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.0.0-rc.11': - resolution: {integrity: sha512-SJ+/g+xNnOh6NqYxD0V3uVN4W3VfnrGsC9/hoglicgTNfABFG9JjISvkkU0dNY84MNHLWyOgxP9v9Y9pX4S7+A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - '@rolldown/binding-darwin-arm64@1.0.0': resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-rc.11': - resolution: {integrity: sha512-7WQgR8SfOPwmDZGFkThUvsmd/nwAWv91oCO4I5LS7RKrssPZmOt7jONN0cW17ydGC1n/+puol1IpoieKqQidmg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0': resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.11': - resolution: {integrity: sha512-39Ks6UvIHq4rEogIfQBoBRusj0Q0nPVWIvqmwBLaT6aqQGIakHdESBVOPRRLacy4WwUPIx4ZKzfZ9PMW+IeyUQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0': resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-rc.11': - resolution: {integrity: sha512-jfsm0ZHfhiqrvWjJAmzsqiIFPz5e7mAoCOPBNTcNgkiid/LaFKiq92+0ojH+nmJmKYkre4t71BWXUZDNp7vsag==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0': resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.11': - resolution: {integrity: sha512-zjQaUtSyq1nVe3nxmlSCuR96T1LPlpvmJ0SZy0WJFEsV4kFbXcq2u68L4E6O0XeFj4aex9bEauqjW8UQBeAvfQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0': resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1762,13 +1697,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-WMW1yE6IOnehTcFE9eipFkm3XN63zypWlrJQ2iF7NrQ9b2LDRjumFoOGJE8RJJTJCTBAdmLMnJ8uVitACUUo1Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0': resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1776,13 +1704,6 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.11': - resolution: {integrity: sha512-jfndI9tsfm4APzjNt6QdBkYwre5lRPUgHeDHoI7ydKUuJvz3lZeCfMsI56BZj+7BYqiKsJm7cfd/6KYV7ubrBg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0': resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1790,13 +1711,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-ZlFgw46NOAGMgcdvdYwAGu2Q+SLFA9LzbJLW+iyMOJyhj5wk6P3KEE9Gct4xWwSzFoPI7JCdYmYMzVtlgQ+zfw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0': resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1804,13 +1718,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-hIOYmuT6ofM4K04XAZd3OzMySEO4K0/nc9+jmNcxNAxRi6c5UWpqfw3KMFV4MVFWL+jQsSh+bGw2VqmaPMTLyw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0': resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1818,13 +1725,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.11': - resolution: {integrity: sha512-qXBQQO9OvkjjQPLdUVr7Nr2t3QTZI7s4KZtfw7HzBgjbmAPSFwSv4rmET9lLSgq3rH/ndA3ngv3Qb8l2njoPNA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0': resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1832,186 +1732,88 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.11': - resolution: {integrity: sha512-/tpFfoSTzUkH9LPY+cYbqZBDyyX62w5fICq9qzsHLL8uTI6BHip3Q9Uzft0wylk/i8OOwKik8OxW+QAhDmzwmg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0': resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.11': - resolution: {integrity: sha512-mcp3Rio2w72IvdZG0oQ4bM2c2oumtwHfUfKncUM6zGgz0KgPz4YmDPQfnXEiY5t3+KD/i8HG2rOB/LxdmieK2g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0': resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.11': - resolution: {integrity: sha512-LXk5Hii1Ph9asuGRjBuz8TUxdc1lWzB7nyfdoRgI0WGPZKmCxvlKk8KfYysqtr4MfGElu/f/pEQRh8fcEgkrWw==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0': resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.11': - resolution: {integrity: sha512-dDwf5otnx0XgRY1yqxOC4ITizcdzS/8cQ3goOWv3jFAo4F+xQYni+hnMuO6+LssHHdJW7+OCVL3CoU4ycnh35Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0': resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.11': - resolution: {integrity: sha512-LN4/skhSggybX71ews7dAj6r2geaMJfm3kMbK2KhFMg9B10AZXnKoLCVVgzhMHL0S+aKtr4p8QbAW8k+w95bAA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@rolldown/pluginutils@1.0.0': resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} - '@rolldown/pluginutils@1.0.0-rc.11': - resolution: {integrity: sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==} - - '@rspack/binding-darwin-arm64@1.7.11': - resolution: {integrity: sha512-oduECiZVqbO5zlVw+q7Vy65sJFth99fWPTyucwvLJJtJkPL5n17Uiql2cYP6Ijn0pkqtf1SXgK8WjiKLG5bIig==} - cpu: [arm64] - os: [darwin] - '@rspack/binding-darwin-arm64@2.0.3': resolution: {integrity: sha512-4UyCjLJwU/WxR6K1/gG4u3+jUsoaRHJ5rNu9fto/UbvrItwdlVNULChAApqZFw6mcSetMddSjSICeuj5pSB6sA==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.7.11': - resolution: {integrity: sha512-a1+TtTE9ap6RalgFi7FGIgkJP6O4Vy6ctv+9WGJy53E4kuqHR0RygzaiVxCI/GMc/vBT9vY23hyrpWb3d1vtXA==} - cpu: [x64] - os: [darwin] - '@rspack/binding-darwin-x64@2.0.3': resolution: {integrity: sha512-K3evrbTgZNa8emEqk+AjDtbuoXZp5tPZz3pcEgETxuu3KanW8Zu+Fb+TUp1DEUcL0xOmHPPox8H2cZ3pF4Zmug==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.7.11': - resolution: {integrity: sha512-P0QrGRPbTWu6RKWfN0bDtbnEps3rXH0MWIMreZABoUrVmNQKtXR6e73J3ub6a+di5s2+K0M2LJ9Bh2/H4UsDUA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rspack/binding-linux-arm64-gnu@2.0.3': resolution: {integrity: sha512-aPLDaaTtX1wqjLYAIHc2MGDQZtv1Hbjx47oaaefbWz5GbAnSA4P8jdYIeeGRyrqvQ0WqJXIWXgT0d/iXtes00A==} cpu: [arm64] os: [linux] libc: [glibc] - '@rspack/binding-linux-arm64-musl@1.7.11': - resolution: {integrity: sha512-6ky7R43VMjWwmx3Yx7Jl7faLBBMAgMDt+/bN35RgwjiPgsIByz65EwytUVuW9rikB43BGHvA/eqlnjLrUzNBqw==} - cpu: [arm64] - os: [linux] - libc: [musl] - '@rspack/binding-linux-arm64-musl@2.0.3': resolution: {integrity: sha512-0WulUQPop6vmSDfrTxghmVlm+6crU8/XqD2f0dOWbEniZVuDZJ5/Y/cBqTRyk3rjl0vrmUv3lc87/t7UgQJQSw==} cpu: [arm64] os: [linux] libc: [musl] - '@rspack/binding-linux-x64-gnu@1.7.11': - resolution: {integrity: sha512-cuOJMfCOvb2Wgsry5enXJ3iT1FGUjdPqtGUBVupQlEG4ntSYsQ2PtF4wIDVasR3wdxC5nQbipOrDiN/u6fYsdQ==} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rspack/binding-linux-x64-gnu@2.0.3': resolution: {integrity: sha512-fAhiMuV5omT53YMft+f3Y9euAFgspuyBAk9ZpeW2buL2TkuUMwP07adhhvQfKdQ5gpELfzmjQaRDGqaIT8UWiA==} cpu: [x64] os: [linux] libc: [glibc] - '@rspack/binding-linux-x64-musl@1.7.11': - resolution: {integrity: sha512-CoK37hva4AmHGh3VCsQXmGr40L36m1/AdnN5LEjUX6kx5rEH7/1nEBN6Ii72pejqDVvk9anEROmPDiPw10tpFg==} - cpu: [x64] - os: [linux] - libc: [musl] - '@rspack/binding-linux-x64-musl@2.0.3': resolution: {integrity: sha512-0kcuFoZ8vy2iNWoISFOZt+/Ujo7LRLrzE7h07AV5r+oN/mv+/v14Sd/8NUtDIScCkrYOszYq/QS31e6t0UrVfw==} cpu: [x64] os: [linux] libc: [musl] - '@rspack/binding-wasm32-wasi@1.7.11': - resolution: {integrity: sha512-OtrmnPUVJMxjNa3eDMfHyPdtlLRmmp/aIm0fQHlAOATbZvlGm12q7rhPW5BXTu1yh+1rQ1/uqvz+SzKEZXuJaQ==} - cpu: [wasm32] - '@rspack/binding-wasm32-wasi@2.0.3': resolution: {integrity: sha512-x2fsw7GzNZEnw444ikj4/b8kVjM0Y0TllxmizHpYZ9gmaQrOk5OXo9RQdz+l4zzoGors0l2IZP5Cc4GJNCaSoQ==} cpu: [wasm32] - '@rspack/binding-win32-arm64-msvc@1.7.11': - resolution: {integrity: sha512-lObFW6e5lCWNgTBNwT//yiEDbsxm9QG4BYUojqeXxothuzJ/L6ibXz6+gLMvbOvLGV3nKgkXmx8GvT9WDKR0mA==} - cpu: [arm64] - os: [win32] - '@rspack/binding-win32-arm64-msvc@2.0.3': resolution: {integrity: sha512-jqlxuVPdrgMuwj/HEjSkC/jmhl4fAuKyob36zJXq2uAusn2FRJ4kClGe1fLFpfxRXFVQAWwlAOwLJg8T0suuaA==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.7.11': - resolution: {integrity: sha512-0pYGnZd8PPqNR68zQ8skamqNAXEA1sUfXuAdYcknIIRq2wsbiwFzIc0Pov1cIfHYab37G7sSIPBiOUdOWF5Ivw==} - cpu: [ia32] - os: [win32] - '@rspack/binding-win32-ia32-msvc@2.0.3': resolution: {integrity: sha512-QM4JEuyk5QaZ5gnvnAIaCwVQzCkrD2E4Sud77kx/MVGDsRkcOlMx3blMC5QNHPDamRmWGk+7314YOQvRhKuWyg==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.7.11': - resolution: {integrity: sha512-EeQXayoQk/uBkI3pdoXfQBXNIUrADq56L3s/DFyM2pJeUDrWmhfIw2UFIGkYPTMSCo8F2JcdcGM32FGJrSnU0Q==} - cpu: [x64] - os: [win32] - '@rspack/binding-win32-x64-msvc@2.0.3': resolution: {integrity: sha512-vSQNnAy0wswG6AfNRuArTHQBiXOXl+A9ddQxBFup4PMHUzXxKtsBLQzw7BgFC0EgrPeHbt+30j7sXVZKYukj4A==} cpu: [x64] os: [win32] - '@rspack/binding@1.7.11': - resolution: {integrity: sha512-2MGdy2s2HimsDT444Bp5XnALzNRxuBNc7y0JzyuqKbHBywd4x2NeXyhWXXoxufaCFu5PBc9Qq9jyfjW2Aeh06Q==} - '@rspack/binding@2.0.3': resolution: {integrity: sha512-4exVNhGhW5RFHjK87XeTKbkA/qAgI5NHJlT1jNqiJv0gcUXLqTOEU3w7f8+f9zUo4JMFvPc0c9veOi4M19YYTg==} - '@rspack/core@1.7.11': - resolution: {integrity: sha512-rsD9b+Khmot5DwCMiB3cqTQo53ioPG3M/A7BySu8+0+RS7GCxKm+Z+mtsjtG/vsu4Tn2tcqCdZtA3pgLoJB+ew==} - engines: {node: '>=18.12.0'} - peerDependencies: - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@swc/helpers': - optional: true - '@rspack/core@2.0.3': resolution: {integrity: sha512-2ufO/8FHIA/lX6UOgSsKPhpDvHr0sh9lYq/n/LsIZsTwu3973BGbu2fg1Akvuu3rEnskPqXjsqH2EPBzEA42uA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2024,9 +1826,6 @@ packages: '@swc/helpers': optional: true - '@rspack/lite-tapable@1.1.0': - resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} - '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -2491,9 +2290,6 @@ packages: '@types/mime-types@2.1.4': resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -2515,11 +2311,8 @@ packages: '@types/node@22.19.18': resolution: {integrity: sha512-9v00a+dn2yWVsYDEunWC4g/TcRKVq3r8N5FuZp7u0SGrPvdN9c2yXI9bBuf5Fl0hNCb+QTIePTn5pJs2pwBOQQ==} - '@types/node@25.6.2': - resolution: {integrity: sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==} - - '@types/node@25.8.0': - resolution: {integrity: sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ==} + '@types/node@25.9.0': + resolution: {integrity: sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ==} '@types/randomatic@3.1.5': resolution: {integrity: sha512-VCwCTw6qh1pRRw+5rNTAwqPmf6A+hdrkdM7dBpZVmhl7g+em3ONXlYK/bWPVKqVGMWgP0d1bog8Vc/X6zRwRRQ==} @@ -4274,11 +4067,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.0.0-rc.11: - resolution: {integrity: sha512-NRjoKMusSjfRbSYiH3VSumlkgFe7kYAa3pzVOsVYVFY3zb5d7nS+a3KGQ7hJKXuYWbzJKPVQ9Wxq2UvyK+ENpw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - rope-sequence@1.3.4: resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} @@ -4570,11 +4358,6 @@ packages: peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -4598,9 +4381,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.19.2: - resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} - undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} @@ -5766,34 +5546,6 @@ snapshots: - supports-color - vue - '@git.zone/tsbundle@2.10.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@push.rocks/early': 4.0.4 - '@push.rocks/smartcli': 4.0.21 - '@push.rocks/smartconfig': 6.1.1 - '@push.rocks/smartdelay': 3.1.0 - '@push.rocks/smartfs': 1.5.1 - '@push.rocks/smartinteract': 2.0.16 - '@push.rocks/smartlog': 3.2.2 - '@push.rocks/smartlog-destination-local': 9.0.2 - '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartpromise': 4.2.4 - '@push.rocks/smartspawn': 3.0.4 - '@rspack/core': 1.7.11 - '@types/html-minifier': 4.0.6 - esbuild: 0.27.7 - html-minifier: 4.0.0 - rolldown: 1.0.0-rc.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - typescript: 6.0.2 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - - '@nuxt/kit' - - '@swc/helpers' - - react - - supports-color - - vue - '@git.zone/tsbundle@2.10.4': dependencies: '@push.rocks/early': 4.0.4 @@ -5823,7 +5575,7 @@ snapshots: '@git.zone/tsdoc@2.0.5(ws@8.20.0)(zod@4.4.3)': dependencies: - '@git.zone/tspublish': 1.11.6 + '@git.zone/tspublish': 1.11.7 '@push.rocks/early': 4.0.4 '@push.rocks/qenv': 6.1.4 '@push.rocks/smartagent': 3.1.0(typescript@6.0.3)(ws@8.20.0) @@ -5874,29 +5626,6 @@ snapshots: - supports-color - vue - '@git.zone/tspublish@1.11.6': - dependencies: - '@push.rocks/consolecolor': 2.0.4 - '@push.rocks/smartcli': 4.0.21 - '@push.rocks/smartconfig': 6.1.1 - '@push.rocks/smartdelay': 3.1.0 - '@push.rocks/smartfile': 13.1.3 - '@push.rocks/smartfs': 1.5.1 - '@push.rocks/smartlog': 3.2.2 - '@push.rocks/smartnpm': 2.1.0 - '@push.rocks/smartpath': 6.0.0 - '@push.rocks/smartrequest': 5.0.3 - '@push.rocks/smartshell': 3.3.8 - transitivePeerDependencies: - - '@nuxt/kit' - - aws-crt - - bare-abort-controller - - bare-buffer - - react - - react-native-b4a - - supports-color - - vue - '@git.zone/tspublish@1.11.7': dependencies: '@push.rocks/consolecolor': 2.0.4 @@ -5926,9 +5655,9 @@ snapshots: '@push.rocks/smartshell': 3.3.8 tsx: 4.21.0 - '@git.zone/tstest@3.6.6(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(socks@2.8.8)(typescript@6.0.3)': + '@git.zone/tstest@3.6.6(socks@2.8.8)(typescript@6.0.3)': dependencies: - '@git.zone/tsbundle': 2.10.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@git.zone/tsbundle': 2.10.4 '@git.zone/tsrun': 2.0.4 '@push.rocks/consolecolor': 2.0.4 '@push.rocks/qenv': 6.1.4 @@ -5956,8 +5685,7 @@ snapshots: ws: 8.20.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' - - '@emnapi/core' - - '@emnapi/runtime' + - '@module-federation/runtime-tools' - '@mongodb-js/zstd' - '@nuxt/kit' - '@swc/helpers' @@ -5977,10 +5705,10 @@ snapshots: - utf-8-validate - vue - '@git.zone/tswatch@3.3.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@tiptap/pm@2.27.2)': + '@git.zone/tswatch@3.3.5(@tiptap/pm@2.27.2)': dependencies: '@api.global/typedserver': 8.4.6(@tiptap/pm@2.27.2) - '@git.zone/tsbundle': 2.10.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@git.zone/tsbundle': 2.10.4 '@git.zone/tsrun': 2.0.4 '@push.rocks/early': 4.0.4 '@push.rocks/lik': 6.4.1 @@ -5995,8 +5723,7 @@ snapshots: '@push.rocks/smartshell': 3.3.8 '@push.rocks/smartwatch': 6.4.0 transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' + - '@module-federation/runtime-tools' - '@nuxt/kit' - '@swc/helpers' - '@tiptap/pm' @@ -6008,7 +5735,7 @@ snapshots: '@happy-dom/global-registrator@20.9.0': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 happy-dom: 20.9.0 transitivePeerDependencies: - bufferutil @@ -6437,31 +6164,6 @@ snapshots: '@mixmark-io/domino@2.2.0': {} - '@module-federation/error-codes@0.22.0': {} - - '@module-federation/runtime-core@0.22.0': - dependencies: - '@module-federation/error-codes': 0.22.0 - '@module-federation/sdk': 0.22.0 - - '@module-federation/runtime-tools@0.22.0': - dependencies: - '@module-federation/runtime': 0.22.0 - '@module-federation/webpack-bundler-runtime': 0.22.0 - - '@module-federation/runtime@0.22.0': - dependencies: - '@module-federation/error-codes': 0.22.0 - '@module-federation/runtime-core': 0.22.0 - '@module-federation/sdk': 0.22.0 - - '@module-federation/sdk@0.22.0': {} - - '@module-federation/webpack-bundler-runtime@0.22.0': - dependencies: - '@module-federation/runtime': 0.22.0 - '@module-federation/sdk': 0.22.0 - '@mongodb-js/saslprep@1.4.11': dependencies: sparse-bitfield: 3.0.3 @@ -6514,13 +6216,6 @@ snapshots: '@napi-rs/canvas-win32-x64-msvc': 0.1.100 optional: true - '@napi-rs/wasm-runtime@1.0.7': - dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 - optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -6532,8 +6227,6 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@oxc-project/types@0.122.0': {} - '@oxc-project/types@0.129.0': {} '@pdf-lib/standard-fonts@1.0.0': @@ -6706,17 +6399,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@push.rocks/lik@6.2.2': - dependencies: - '@push.rocks/smartdelay': 3.1.0 - '@push.rocks/smartmatch': 2.0.0 - '@push.rocks/smartpromise': 4.2.4 - '@push.rocks/smartrx': 3.0.10 - '@push.rocks/smarttime': 4.2.3 - '@types/minimatch': 5.1.2 - '@types/symbol-tree': 3.2.5 - symbol-tree: 3.2.4 - '@push.rocks/lik@6.4.1': dependencies: '@push.rocks/smartdelay': 3.1.0 @@ -6990,7 +6672,7 @@ snapshots: '@push.rocks/smartexit@2.0.3': dependencies: - '@push.rocks/lik': 6.2.2 + '@push.rocks/lik': 6.4.1 '@push.rocks/smartpromise': 4.2.4 '@push.rocks/smartexpect@2.5.0': @@ -7565,75 +7247,39 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0': optional: true - '@rolldown/binding-android-arm64@1.0.0-rc.11': - optional: true - '@rolldown/binding-darwin-arm64@1.0.0': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.11': - optional: true - '@rolldown/binding-darwin-x64@1.0.0': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.11': - optional: true - '@rolldown/binding-freebsd-x64@1.0.0': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.11': - optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.11': - optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.11': - optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.11': - optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.11': - optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.11': - optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.11': - optional: true - '@rolldown/binding-linux-x64-musl@1.0.0': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.11': - optional: true - '@rolldown/binding-openharmony-arm64@1.0.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.11': - optional: true - '@rolldown/binding-wasm32-wasi@1.0.0': dependencies: '@emnapi/core': 1.10.0 @@ -7641,71 +7287,32 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': - dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.11': - optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.11': - optional: true - '@rolldown/pluginutils@1.0.0': {} - '@rolldown/pluginutils@1.0.0-rc.11': {} - - '@rspack/binding-darwin-arm64@1.7.11': - optional: true - '@rspack/binding-darwin-arm64@2.0.3': optional: true - '@rspack/binding-darwin-x64@1.7.11': - optional: true - '@rspack/binding-darwin-x64@2.0.3': optional: true - '@rspack/binding-linux-arm64-gnu@1.7.11': - optional: true - '@rspack/binding-linux-arm64-gnu@2.0.3': optional: true - '@rspack/binding-linux-arm64-musl@1.7.11': - optional: true - '@rspack/binding-linux-arm64-musl@2.0.3': optional: true - '@rspack/binding-linux-x64-gnu@1.7.11': - optional: true - '@rspack/binding-linux-x64-gnu@2.0.3': optional: true - '@rspack/binding-linux-x64-musl@1.7.11': - optional: true - '@rspack/binding-linux-x64-musl@2.0.3': optional: true - '@rspack/binding-wasm32-wasi@1.7.11': - dependencies: - '@napi-rs/wasm-runtime': 1.0.7 - optional: true - '@rspack/binding-wasm32-wasi@2.0.3': dependencies: '@emnapi/core': 1.10.0 @@ -7713,37 +7320,15 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rspack/binding-win32-arm64-msvc@1.7.11': - optional: true - '@rspack/binding-win32-arm64-msvc@2.0.3': optional: true - '@rspack/binding-win32-ia32-msvc@1.7.11': - optional: true - '@rspack/binding-win32-ia32-msvc@2.0.3': optional: true - '@rspack/binding-win32-x64-msvc@1.7.11': - optional: true - '@rspack/binding-win32-x64-msvc@2.0.3': optional: true - '@rspack/binding@1.7.11': - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.7.11 - '@rspack/binding-darwin-x64': 1.7.11 - '@rspack/binding-linux-arm64-gnu': 1.7.11 - '@rspack/binding-linux-arm64-musl': 1.7.11 - '@rspack/binding-linux-x64-gnu': 1.7.11 - '@rspack/binding-linux-x64-musl': 1.7.11 - '@rspack/binding-wasm32-wasi': 1.7.11 - '@rspack/binding-win32-arm64-msvc': 1.7.11 - '@rspack/binding-win32-ia32-msvc': 1.7.11 - '@rspack/binding-win32-x64-msvc': 1.7.11 - '@rspack/binding@2.0.3': optionalDependencies: '@rspack/binding-darwin-arm64': 2.0.3 @@ -7757,18 +7342,10 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 2.0.3 '@rspack/binding-win32-x64-msvc': 2.0.3 - '@rspack/core@1.7.11': - dependencies: - '@module-federation/runtime-tools': 0.22.0 - '@rspack/binding': 1.7.11 - '@rspack/lite-tapable': 1.1.0 - '@rspack/core@2.0.3': dependencies: '@rspack/binding': 2.0.3 - '@rspack/lite-tapable@1.1.0': {} - '@sec-ant/readable-stream@0.4.1': {} '@serve.zone/api@5.3.8(@push.rocks/smartserve@2.0.4)': @@ -8338,7 +7915,7 @@ snapshots: '@types/clean-css@4.2.11': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 source-map: 0.6.1 '@types/debug@4.1.13': @@ -8354,7 +7931,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 25.6.2 + '@types/node': 25.9.0 '@types/hast@3.0.4': dependencies: @@ -8370,12 +7947,12 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 25.6.2 + '@types/node': 25.9.0 '@types/linkify-it@5.0.0': {} @@ -8392,22 +7969,20 @@ snapshots: '@types/mime-types@2.1.4': {} - '@types/minimatch@5.1.2': {} - '@types/ms@2.1.0': {} '@types/mute-stream@0.0.4': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 '@types/node-fetch@2.6.13': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 form-data: 4.0.5 '@types/node-forge@1.3.14': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 '@types/node@16.9.1': {} @@ -8419,11 +7994,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@25.6.2': - dependencies: - undici-types: 7.19.2 - - '@types/node@25.8.0': + '@types/node@25.9.0': dependencies: undici-types: 7.24.6 @@ -8441,7 +8012,7 @@ snapshots: '@types/through2@2.0.41': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 '@types/trusted-types@2.0.7': {} @@ -8469,11 +8040,11 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 optional: true '@ungap/structured-clone@1.3.1': {} @@ -9209,7 +8780,7 @@ snapshots: happy-dom@20.9.0: dependencies: - '@types/node': 25.6.2 + '@types/node': 25.9.0 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 7.0.1 @@ -10514,30 +10085,6 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0 '@rolldown/binding-win32-x64-msvc': 1.0.0 - rolldown@1.0.0-rc.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): - dependencies: - '@oxc-project/types': 0.122.0 - '@rolldown/pluginutils': 1.0.0-rc.11 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.11 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.11 - '@rolldown/binding-darwin-x64': 1.0.0-rc.11 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.11 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.11 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.11 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.11 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.11 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.11 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.11 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.11 - transitivePeerDependencies: - - '@emnapi/core' - - '@emnapi/runtime' - rope-sequence@1.3.4: {} run-async@3.0.0: {} @@ -10896,8 +10443,6 @@ snapshots: typescript: 6.0.3 yaml: 2.8.4 - typescript@6.0.2: {} - typescript@6.0.3: {} uc.micro@2.1.0: {} @@ -10910,8 +10455,6 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.19.2: {} - undici-types@7.24.6: {} unified@11.0.5: diff --git a/ts/manager.image/classes.image.ts b/ts/manager.image/classes.image.ts index 09626a3..b521be7 100644 --- a/ts/manager.image/classes.image.ts +++ b/ts/manager.image/classes.image.ts @@ -12,15 +12,18 @@ export class Image extends plugins.smartdata.SmartDataDbDoc< ) { const image = new Image(); image.id = await this.getNewId(); - console.log(imageDataArg); Object.assign(image, { data: { name: imageDataArg.name, description: imageDataArg.description, + location: imageDataArg.location || { + internal: true, + externalRegistryId: '', + externalImageTag: '', + }, versions: [], }, }); - console.log((Image as any).saveableProperties); await image.save(); return image; } diff --git a/ts/manager.image/classes.imagemanager.ts b/ts/manager.image/classes.imagemanager.ts index 4cc5545..7f2baee 100644 --- a/ts/manager.image/classes.imagemanager.ts +++ b/ts/manager.image/classes.imagemanager.ts @@ -116,12 +116,15 @@ export class ImageManager { await refImage.save(); const imagePushStream = reqArg.imageStream; (async () => { + const archiveHash = plugins.crypto.createHash('sha256'); + let archiveSize = 0; const smartWebDuplex = new plugins.smartstream.webstream.WebDuplexStream< Uint8Array, Uint8Array >({ writeFunction: async (chunkArg, toolsArg) => { - console.log(chunkArg); + archiveSize += chunkArg.byteLength; + archiveHash.update(chunkArg); return chunkArg; }, }); @@ -130,6 +133,17 @@ export class ImageManager { storagePath, plugins.smartstream.SmartDuplex.fromWebReadableStream(smartWebDuplex.readable), ); + refImage.data.versions = refImage.data.versions.map((versionArg) => { + if (versionArg.versionString !== imageVersion) { + return versionArg; + } + return { + ...versionArg, + size: archiveSize, + digest: `sha256:${archiveHash.digest('hex')}`, + }; + }); + await refImage.save(); })().catch((error) => { console.error(`failed to store image ${refImage.id}:${imageVersion}`, error); }); diff --git a/ts_web/appstate.ts b/ts_web/appstate.ts index 2ece1be..aba9c13 100644 --- a/ts_web/appstate.ts +++ b/ts_web/appstate.ts @@ -21,7 +21,7 @@ export interface IDataState { secretBundles?: plugins.interfaces.data.ISecretBundle[]; clusters?: plugins.interfaces.data.ICluster[]; externalRegistries?: plugins.interfaces.data.IExternalRegistry[]; - images?: any[]; + images?: plugins.interfaces.data.IImage[]; services?: plugins.interfaces.data.IService[]; deployments?: plugins.interfaces.data.IDeployment[]; domains?: plugins.interfaces.data.IDomain[]; diff --git a/ts_web/elements/views/deployments/index.ts b/ts_web/elements/views/deployments/index.ts index dbab289..7c4edb2 100644 --- a/ts_web/elements/views/deployments/index.ts +++ b/ts_web/elements/views/deployments/index.ts @@ -8,6 +8,7 @@ import { state, css, cssManager, + type TemplateResult, } from '@design.estate/dees-element'; import * as appstate from '../../../appstate.js'; @@ -42,6 +43,10 @@ export class CloudlyViewDeployments extends DeesElement { .health-unknown { background: #f5f5f5; color: #666; } .resource-usage { display: flex; gap: 12px; font-size: 0.9em; color: #888; } .resource-item { display: flex; align-items: center; gap: 4px; } + .kv-list { display: grid; gap: 8px; min-width: 520px; } + .kv-row { display: grid; grid-template-columns: 150px 1fr; gap: 10px; font-size: 13px; } + .kv-key { color: var(--ci-shade-4, #71717a); } + .kv-value { color: var(--ci-shade-7, #e4e4e7); overflow-wrap: anywhere; } `, ]; @@ -105,6 +110,14 @@ export class CloudlyViewDeployments extends DeesElement { }; }} .dataActions=${[ + { + name: 'Details', + iconName: 'lucide:Eye', + type: ['contextmenu', 'inRow', 'doubleClick'], + actionFunc: async (actionDataArg: any) => { + await this.showDeploymentDetailsModal(actionDataArg.item as plugins.interfaces.data.IDeployment); + }, + }, { name: 'Deploy Service', iconName: 'plus', @@ -212,6 +225,49 @@ export class CloudlyViewDeployments extends DeesElement { > `; } + + private formatDate(timestampArg?: number): string { + return timestampArg ? new Date(timestampArg).toLocaleString() : '-'; + } + + private formatResourceUsage(deploymentArg: plugins.interfaces.data.IDeployment): string { + if (!deploymentArg.resourceUsage) { + return '-'; + } + return `${deploymentArg.resourceUsage.cpuUsagePercent.toFixed(1)}% CPU / ${deploymentArg.resourceUsage.memoryUsedMB} MB`; + } + + private renderDeploymentDetails(deploymentArg: plugins.interfaces.data.IDeployment): TemplateResult { + return html` +
+
Deployment ID${deploymentArg.id}
+
Service${this.getServiceName(deploymentArg.serviceId)}
+
Status${deploymentArg.status}
+
Health${deploymentArg.healthStatus || '-'}
+
Node${deploymentArg.nodeName || deploymentArg.nodeId || '-'}
+
Slot${deploymentArg.slot || '-'}
+
Desired State${deploymentArg.desiredState || '-'}
+
Container ID${deploymentArg.containerId || '-'}
+
Task ID${deploymentArg.taskId || '-'}
+
Docker Service ID${deploymentArg.dockerServiceId || '-'}
+
Version${deploymentArg.version || '-'}
+
Image${deploymentArg.usedImageId || '-'}
+
Resources${this.formatResourceUsage(deploymentArg)}
+
Deployed At${this.formatDate(deploymentArg.deployedAt)}
+
Updated At${this.formatDate(deploymentArg.updatedAt)}
+
+ `; + } + + private async showDeploymentDetailsModal(deploymentArg: plugins.interfaces.data.IDeployment) { + await plugins.deesCatalog.DeesModal.createAndShow({ + heading: 'Deployment Details', + content: this.renderDeploymentDetails(deploymentArg), + menuOptions: [ + { name: 'Close', action: async (modalArg: any) => { await modalArg.destroy(); } }, + ], + }); + } } declare global { diff --git a/ts_web/elements/views/images/index.ts b/ts_web/elements/views/images/index.ts index 3825d1d..1d62ed7 100644 --- a/ts_web/elements/views/images/index.ts +++ b/ts_web/elements/views/images/index.ts @@ -1,7 +1,15 @@ import * as plugins from '../../../plugins.js'; import * as shared from '../../shared/index.js'; -import { DeesElement, customElement, html, state, css, cssManager } from '@design.estate/dees-element'; +import { + DeesElement, + customElement, + html, + state, + css, + cssManager, + type TemplateResult, +} from '@design.estate/dees-element'; import * as appstate from '../../../appstate.js'; @@ -10,39 +18,84 @@ export class CloudlyViewImages extends DeesElement { @state() private accessor data: appstate.IDataState = {} as any; + @state() + private accessor currentView: 'list' | 'detail' = 'list'; + + @state() + private accessor selectedImage: plugins.interfaces.data.IImage | null = null; + constructor() { super(); - appstate.dataState + const subscription = appstate.dataState .select((stateArg) => stateArg) .subscribe((dataArg) => { this.data = dataArg; }); + this.rxSubscriptions.push(subscription); } public static styles = [ cssManager.defaultStyles, shared.viewHostCss, - css``, + css` + .detail-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 18px; } + .detail-title { margin: 0; font-size: 26px; font-weight: 700; color: var(--ci-shade-7, #e4e4e7); } + .detail-subtitle { margin-top: 6px; color: var(--ci-shade-4, #71717a); font-size: 14px; overflow-wrap: anywhere; } + .back-button { border: 1px solid var(--ci-shade-2, #27272a); border-radius: 7px; padding: 9px 13px; font-size: 13px; cursor: pointer; background: var(--ci-shade-1, #09090b); color: var(--ci-shade-7, #e4e4e7); } + .summary-card, .detail-card { background: var(--ci-shade-1, #09090b); border: 1px solid var(--ci-shade-2, #27272a); border-radius: 9px; padding: 16px; } + .spaced-card { margin-top: 14px; } + .details-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 14px; } + .section-title { font-size: 14px; font-weight: 700; color: var(--ci-shade-7, #e4e4e7); margin-bottom: 10px; } + .kv-list { display: grid; gap: 8px; } + .kv-row { display: grid; grid-template-columns: 150px 1fr; gap: 10px; font-size: 13px; } + .kv-key { color: var(--ci-shade-4, #71717a); } + .kv-value { color: var(--ci-shade-7, #e4e4e7); overflow-wrap: anywhere; } + .image-name { font-weight: 700; color: var(--ci-shade-7, #e4e4e7); } + .empty-state { color: var(--ci-shade-4, #71717a); font-size: 13px; padding: 12px 0; } + .source-badge { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 999px; font-size: 12px; font-weight: 600; } + .source-upload { background: rgba(59, 130, 246, 0.16); color: #60a5fa; } + .source-registry { background: rgba(34, 197, 94, 0.16); color: #22c55e; } + .source-unknown { background: rgba(161, 161, 170, 0.16); color: #a1a1aa; } + dees-statsgrid { margin-bottom: 18px; } + @media (max-width: 900px) { .details-grid { grid-template-columns: 1fr; } .detail-header { flex-direction: column; } } + `, ]; - public render() { + public render(): TemplateResult { + if (this.currentView === 'detail') { + return this.renderDetailView(); + } + return this.renderListView(); + } + + private renderListView(): TemplateResult { return html` Images { - return { id: image.id, name: image.data.name, description: image.data.description, versions: image.data.versions.length }; + const latestVersion = this.getLatestImageVersion(image); + return { + Name: html`${image.data.name}`, + Description: image.data.description, + Location: this.getLocationLabel(image), + Versions: image.data.versions?.length || 0, + 'Total Size': this.formatBytes(this.getImageTotalSize(image)), + Latest: latestVersion?.versionString || '-', + 'Last Push': this.formatDate(image.data.lastPushEvent?.pushedAt), + 'Used By': this.getServicesUsingImage(image).length, + }; }} .dataActions=${[ { - name: 'create Image', + name: 'Create Image', type: ['header', 'footer'], iconName: 'plus', actionFunc: async () => { - plugins.deesCatalog.DeesModal.createAndShow({ - heading: 'create new Image', + await plugins.deesCatalog.DeesModal.createAndShow({ + heading: 'Create Image', content: html` @@ -62,60 +115,19 @@ export class CloudlyViewImages extends DeesElement { }, }, { - name: 'edit', + name: 'Details', type: ['contextmenu', 'inRow', 'doubleClick'], - iconName: 'lucide:SquarePen', - actionFunc: async (dataArg: plugins.deesCatalog.ITableActionDataArg) => { - const environmentsArray: Array = []; - for (const environmentName of Object.keys(dataArg.item.data.environments)) { - environmentsArray.push({ environment: environmentName, ...dataArg.item.data.environments[environmentName] }); - } - await plugins.deesCatalog.DeesModal.createAndShow({ - heading: 'Edit Secret', - content: html` - - - - - - ({ environment: itemArg.environment, value: itemArg.value }))} - .editableFields=${['environment', 'value']} - .dataActions=${[{ name: 'delete', iconName: 'trash', type: ['inRow'], actionFunc: async (actionDataArg: any) => { actionDataArg.table.data.splice(actionDataArg.table.data.indexOf(actionDataArg.item), 1); } }] as plugins.deesCatalog.ITableAction[]}> - - - `, - menuOptions: [ - { name: 'Cancel', iconName: undefined, action: async (modalArg: any) => { await modalArg.destroy(); } }, - { name: 'Save', iconName: undefined, action: async (modalArg: any) => { const data = await modalArg.shadowRoot.querySelector('dees-form').collectFormData(); console.log(data); } }, - ], - }); + iconName: 'lucide:Eye', + actionFunc: async (dataArg: plugins.deesCatalog.ITableActionDataArg) => { + this.openImageDetail(dataArg.item); }, }, { - name: 'history', - iconName: 'lucide:History', - type: ['contextmenu', 'inRow'], - actionFunc: async (dataArg: plugins.deesCatalog.ITableActionDataArg) => { - const historyArray: Array<{ environment: string; value: string; }> = []; - for (const environment of Object.keys(dataArg.item.data.environments)) { - for (const historyItem of dataArg.item.data.environments[environment].history) { - historyArray.push({ environment, value: historyItem.value }); - } - } - await plugins.deesCatalog.DeesModal.createAndShow({ - heading: `history for ${dataArg.item.data.key}`, - content: html`) => { console.log('delete', itemArg); }, }] as plugins.deesCatalog.ITableAction[]}>`, - menuOptions: [ { name: 'close', action: async (modalArg: any) => { await modalArg.destroy(); } } ], - }); - }, - }, - { - name: 'delete', + name: 'Delete', iconName: 'trash', type: ['contextmenu', 'inRow'], actionFunc: async (itemArg: plugins.deesCatalog.ITableActionDataArg) => { - plugins.deesCatalog.DeesModal.createAndShow({ + await plugins.deesCatalog.DeesModal.createAndShow({ heading: `Delete Image "${itemArg.item.data.name}"`, content: html`
Do you really want to delete the image?
@@ -132,6 +144,171 @@ export class CloudlyViewImages extends DeesElement { >
`; } + + private renderDetailView(): TemplateResult { + const image = this.getActiveImage(); + if (!image) { + return html` + Image Details + + `; + } + + const versions = this.getSortedImageVersions(image); + const latestVersion = this.getLatestImageVersion(image); + const lastPushEvent = image.data.lastPushEvent; + const location = image.data.location; + const servicesUsingImage = this.getServicesUsingImage(image); + + return html` + Image Details +
+
+

${image.data.name}

+
${image.data.description || 'No description configured'}
+
+ +
+ + + +
+
Versions
+ ({ + Version: versionArg.versionString, + Source: this.renderSourceBadge(versionArg.source), + Size: this.formatBytes(versionArg.size), + Digest: versionArg.digest || '-', + Repository: versionArg.registryRepository || '-', + Tag: versionArg.registryTag || '-', + Storage: versionArg.storagePath || '-', + Created: this.formatDate(versionArg.createdAt), + })} + > +
+ +
+
Services Using This Image
+ ${servicesUsingImage.length ? html` + ({ + Name: serviceArg.data.name, + Version: serviceArg.data.imageVersion || '-', + Category: serviceArg.data.serviceCategory || 'workload', + Strategy: serviceArg.data.deploymentStrategy || 'custom', + Domains: serviceArg.data.domains?.map((domainArg) => domainArg.name).join(', ') || '-', + Deployments: serviceArg.data.deploymentIds?.length || 0, + })} + > + ` : html`
No services currently reference this image.
`} +
+ +
+
+
Registry Source
+
+
Image ID${image.id}
+
Name${image.data.name}
+
Description${image.data.description || '-'}
+
Internal${location?.internal === false ? 'no' : 'yes'}
+
External Registry${location?.externalRegistryId || '-'}
+
External Tag${location?.externalImageTag || '-'}
+
External Ref${location?.externalImageRef || '-'}
+
Latest Created${this.formatDate(latestVersion?.createdAt)}
+
+
+
+
Last Push
+
+
Repository${lastPushEvent?.repository || '-'}
+
Tag${lastPushEvent?.tag || '-'}
+
Digest${lastPushEvent?.digest || '-'}
+
Image URL${lastPushEvent?.imageUrl || '-'}
+
Pushed At${this.formatDate(lastPushEvent?.pushedAt)}
+
Actor${lastPushEvent?.actorUserId || '-'}
+
+
+
+ `; + } + + private getActiveImage(): plugins.interfaces.data.IImage | null { + if (!this.selectedImage) { + return null; + } + return this.data.images?.find((imageArg) => imageArg.id === this.selectedImage!.id) || this.selectedImage; + } + + private openImageDetail(imageArg: plugins.interfaces.data.IImage) { + this.selectedImage = imageArg; + this.currentView = 'detail'; + } + + private getImageTotalSize(imageArg: plugins.interfaces.data.IImage): number { + return (imageArg.data.versions || []).reduce((sumArg, versionArg) => sumArg + (versionArg.size || 0), 0); + } + + private getSortedImageVersions(imageArg: plugins.interfaces.data.IImage): plugins.interfaces.data.IImage['data']['versions'] { + return [...(imageArg.data.versions || [])].sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0)); + } + + private getLatestImageVersion(imageArg: plugins.interfaces.data.IImage): plugins.interfaces.data.IImage['data']['versions'][number] | undefined { + return this.getSortedImageVersions(imageArg)[0]; + } + + private getServicesUsingImage(imageArg: plugins.interfaces.data.IImage): plugins.interfaces.data.IService[] { + return (this.data.services || []).filter((serviceArg) => serviceArg.data.imageId === imageArg.id); + } + + private getImageStatsTiles(imageArg: plugins.interfaces.data.IImage) { + const latestVersion = this.getLatestImageVersion(imageArg); + const totalSize = this.getImageTotalSize(imageArg); + const servicesUsingImage = this.getServicesUsingImage(imageArg); + return [ + { id: 'versions', title: 'Versions', value: imageArg.data.versions?.length || 0, type: 'number' as const, icon: 'lucide:Tags', description: 'Recorded image versions' }, + { id: 'size', title: 'Total Size', value: this.formatBytes(totalSize), type: 'text' as const, icon: 'lucide:HardDrive', description: 'Stored archive size' }, + { id: 'latest', title: 'Latest Version', value: latestVersion?.versionString || '-', type: 'text' as const, icon: 'lucide:GitBranch', description: this.formatDate(latestVersion?.createdAt) }, + { id: 'usage', title: 'Used By', value: servicesUsingImage.length, type: 'number' as const, icon: 'lucide:Layers', description: 'Configured services' }, + ]; + } + + private getLocationLabel(imageArg: plugins.interfaces.data.IImage): string { + const location = imageArg.data.location; + if (!location || location.internal) { + return 'Internal registry'; + } + return location.externalImageRef || location.externalImageTag || 'External registry'; + } + + private formatBytes(sizeArg?: number): string { + if (!sizeArg) { + return sizeArg === 0 ? '0 B' : '-'; + } + const units = ['B', 'KB', 'MB', 'GB', 'TB']; + let size = sizeArg; + let unitIndex = 0; + while (size >= 1024 && unitIndex < units.length - 1) { + size = size / 1024; + unitIndex++; + } + return `${size.toFixed(unitIndex === 0 ? 0 : 1)} ${units[unitIndex]}`; + } + + private formatDate(timestampArg?: number): string { + return timestampArg ? new Date(timestampArg).toLocaleString() : '-'; + } + + private renderSourceBadge(sourceArg?: 'upload' | 'registry'): TemplateResult { + const source = sourceArg || 'unknown'; + return html`${source}`; + } } declare global { diff --git a/ts_web/elements/views/services/index.ts b/ts_web/elements/views/services/index.ts index 5172758..7deade1 100644 --- a/ts_web/elements/views/services/index.ts +++ b/ts_web/elements/views/services/index.ts @@ -59,7 +59,6 @@ export class CloudlyViewServices extends DeesElement { .category-distributed { background: #9c27b0; color: white; } .category-workload { background: #4caf50; color: white; } .strategy-badge { padding: 2px 8px; border-radius: 4px; font-size: 0.85em; background: #444; color: #ccc; margin-left: 4px; } - .link-button { border: none; background: transparent; color: var(--ci-color-primary, #60a5fa); cursor: pointer; padding: 0; font: inherit; } .detail-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 18px; } .detail-title { margin: 0; font-size: 26px; font-weight: 700; color: var(--ci-shade-7, #e4e4e7); } .detail-subtitle { margin-top: 6px; color: var(--ci-shade-4, #71717a); font-size: 14px; } @@ -126,7 +125,7 @@ export class CloudlyViewServices extends DeesElement { .data=${this.data.services || []} .displayFunction=${(itemArg: plugins.interfaces.data.IService) => { return { - Name: html``, + Name: itemArg.data.name, Description: itemArg.data.description, Category: this.getCategoryBadgeHtml(itemArg.data.serviceCategory || 'workload'), 'Deployment Strategy': html` @@ -144,7 +143,7 @@ export class CloudlyViewServices extends DeesElement { { name: 'Details', iconName: 'eye', - type: ['contextmenu', 'inRow'], + type: ['contextmenu', 'inRow', 'doubleClick'], actionFunc: async (actionDataArg: any) => { await this.openServiceDetail(actionDataArg.item as plugins.interfaces.data.IService); }, @@ -366,6 +365,14 @@ export class CloudlyViewServices extends DeesElement { Updated: deploymentArg.updatedAt ? new Date(deploymentArg.updatedAt).toLocaleString() : '-', })} .dataActions=${[ + { + name: 'Details', + iconName: 'lucide:Eye', + type: ['contextmenu', 'inRow', 'doubleClick'], + actionFunc: async (actionDataArg: any) => { + await this.showDeploymentDetailsModal(actionDataArg.item); + }, + }, { name: 'Open IDE', iconName: 'terminal', @@ -444,6 +451,45 @@ export class CloudlyViewServices extends DeesElement { return html`${statusArg || 'scheduled'}`; } + private formatDate(timestampArg?: number): string { + return timestampArg ? new Date(timestampArg).toLocaleString() : '-'; + } + + private formatResourceUsage(deploymentArg: plugins.interfaces.data.IDeployment): string { + if (!deploymentArg.resourceUsage) { + return '-'; + } + return `${deploymentArg.resourceUsage.cpuUsagePercent.toFixed(1)}% CPU / ${deploymentArg.resourceUsage.memoryUsedMB} MB`; + } + + private async showDeploymentDetailsModal(deploymentArg: plugins.interfaces.data.IDeployment) { + await plugins.deesCatalog.DeesModal.createAndShow({ + heading: 'Deployment Details', + content: html` +
+
Deployment ID${deploymentArg.id}
+
Service${deploymentArg.serviceName || this.selectedService?.data.name || deploymentArg.serviceId}
+
Status${deploymentArg.status}
+
Health${deploymentArg.healthStatus || '-'}
+
Node${deploymentArg.nodeName || deploymentArg.nodeId || '-'}
+
Slot${deploymentArg.slot || '-'}
+
Desired State${deploymentArg.desiredState || '-'}
+
Container ID${deploymentArg.containerId || '-'}
+
Task ID${deploymentArg.taskId || '-'}
+
Docker Service ID${deploymentArg.dockerServiceId || '-'}
+
Version${deploymentArg.version || '-'}
+
Image${deploymentArg.usedImageId || '-'}
+
Resources${this.formatResourceUsage(deploymentArg)}
+
Deployed At${this.formatDate(deploymentArg.deployedAt)}
+
Updated At${this.formatDate(deploymentArg.updatedAt)}
+
+ `, + menuOptions: [ + { name: 'Close', action: async (modalArg: any) => modalArg.destroy() }, + ], + }); + } + private async openServiceDetail(serviceArg: plugins.interfaces.data.IService) { this.selectedService = serviceArg; this.serviceDeployments = [];