diff --git a/changelog.md b/changelog.md index 6f2df57..f2b97fd 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,12 @@ # Changelog +## 2026-04-03 - 12.6.0 - feat(certificates) +add confirmation before force renewing valid certificates from the certificate actions menu + +- Expose the Reprovision action in the certificate context menu +- Prompt for confirmation when reprovisioning a certificate that is still valid +- Update dees-catalog and @types/node dependencies + ## 2026-04-03 - 12.5.2 - fix(repo) no changes to commit diff --git a/package.json b/package.json index c65d884..475cad9 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@git.zone/tsrun": "^2.0.2", "@git.zone/tstest": "^3.6.3", "@git.zone/tswatch": "^3.3.2", - "@types/node": "^25.5.0" + "@types/node": "^25.5.1" }, "dependencies": { "@api.global/typedrequest": "^3.3.0", @@ -35,7 +35,7 @@ "@api.global/typedserver": "^8.4.6", "@api.global/typedsocket": "^4.1.2", "@apiclient.xyz/cloudflare": "^7.1.0", - "@design.estate/dees-catalog": "^3.50.2", + "@design.estate/dees-catalog": "^3.51.0", "@design.estate/dees-element": "^2.2.4", "@push.rocks/lik": "^6.4.0", "@push.rocks/projectinfo": "^5.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5561d02..4934ebb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^7.1.0 version: 7.1.0 '@design.estate/dees-catalog': - specifier: ^3.50.2 - version: 3.50.2(@tiptap/pm@2.27.2) + specifier: ^3.51.0 + version: 3.51.0(@tiptap/pm@2.27.2) '@design.estate/dees-element': specifier: ^2.2.4 version: 2.2.4 @@ -142,8 +142,8 @@ importers: specifier: ^3.3.2 version: 3.3.2(@tiptap/pm@2.27.2) '@types/node': - specifier: ^25.5.0 - version: 25.5.0 + specifier: ^25.5.1 + version: 25.5.1 packages: @@ -350,8 +350,8 @@ packages: '@configvault.io/interfaces@1.0.17': resolution: {integrity: sha512-bEcCUR2VBDJsTin8HQh8Uw/mlYl2v8A3jMIaQ+MTB9Hrqd6CZL2dL7iJdWyFl/3EIX+LDxWFR+Oq7liIq7w+1Q==} - '@design.estate/dees-catalog@3.50.2': - resolution: {integrity: sha512-oxB1kB3IxEwHgf+DjytTBilkDVVb8hryq465OhhzgBiJiHaNLPyBASAQaNTVp6eaORQGzyCmy/ac/GdQglZiIg==} + '@design.estate/dees-catalog@3.51.0': + resolution: {integrity: sha512-2SHWXNni802RgilzWBM9WUkoexguT1HjKWErswzj6oecnJpD6MXomJ5/tvdKVRDd4oA+l6IqtgiVIewdFVPfUg==} '@design.estate/dees-comms@1.0.30': resolution: {integrity: sha512-KchMlklJfKAjQiJiR0xmofXtQ27VgZtBIxcMwPE9d+h3jJRv+lPZxzBQVOM0eyM0uS44S5vJMZ11IeV4uDXSHg==} @@ -2050,11 +2050,11 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@22.19.15': - resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} + '@types/node@22.19.16': + resolution: {integrity: sha512-K6csxIjY+9RoDxdP6/wzaJzXaCf4znBz0/y0rrQDsbqmzQ5QFsOjubbsYWZhj6ZCgz3mjlyDZS+EJkhA9jWl9Q==} - '@types/node@25.5.0': - resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + '@types/node@25.5.1': + resolution: {integrity: sha512-lgrR3HRNQdTEeeXBnLURFO4JIIbpcVcMlLM9IG0jsNRTRNSbMkm9S2hyhxhnokke1NM25Dr9QghgeB5PQKolrw==} '@types/qrcode@1.5.6': resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} @@ -2151,9 +2151,6 @@ packages: any-base@1.1.0: resolution: {integrity: sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==} - apexcharts@5.10.4: - resolution: {integrity: sha512-gt0VUqZ2+mr25ScbUcKZgJr96jKYm4vjOcxEWCEh/E5F4dWqhyo3dBhPRvNNnkKiWxkMd2cBwj3ZYH3rK39fkA==} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2628,6 +2625,9 @@ packages: resolution: {integrity: sha512-CGnyrvbhPlWYMngksqrSSUT1BAVP49dZocrHuK0SvtR0D5TMs5wP0o3j7jexDJW01KSadjBp1M/71o/KR3nD1w==} engines: {node: '>=18'} + fancy-canvas@2.1.0: + resolution: {integrity: sha512-nifxXJ95JNLFR2NgRV4/MxVP45G9909wJTEKz5fg/TZS20JJZA6hfgRVh/bC9bwl2zBtBNcYPjiBE4njQHVBwQ==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3025,6 +3025,9 @@ packages: libqp@2.1.1: resolution: {integrity: sha512-0Wd+GPz1O134cP62YU2GTOPNA7Qgl09XwCqM5zpBv87ERCXdfDtyKXvV7c9U22yWJh44QZqBocFnXN11K96qow==} + lightweight-charts@5.1.0: + resolution: {integrity: sha512-jEAYR4ODYeyNZcWUigsoLTl52rbPmgXnvd5FLIv/ZoA/2sSDw63YKnef8n4yhzum7W926yHeFwlm7ididKb7YQ==} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -3694,11 +3697,11 @@ packages: prosemirror-state: ^1.4.2 prosemirror-view: ^1.33.8 - prosemirror-transform@1.11.0: - resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} + prosemirror-transform@1.12.0: + resolution: {integrity: sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==} - prosemirror-view@1.41.7: - resolution: {integrity: sha512-jUwKNCEIGiqdvhlS91/2QAg21e4dfU5bH2iwmSDQeosXJgKF7smG0YSplOWK0cjSNgIqXe7VXqo7EIfUFJdt3w==} + prosemirror-view@1.41.8: + resolution: {integrity: sha512-TnKDdohEatgyZNGCDWIdccOHXhYloJwbwU+phw/a23KBvJIR9lWQWW7WHHK3vBdOLDNuF7TaX98GObUZOWkOnA==} proto-list@1.2.4: resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=} @@ -4339,7 +4342,7 @@ snapshots: '@api.global/typedrequest-interfaces': 3.0.19 '@api.global/typedsocket': 4.1.2(@push.rocks/smartserve@2.0.3) '@cloudflare/workers-types': 4.20260317.1 - '@design.estate/dees-catalog': 3.50.2(@tiptap/pm@2.27.2) + '@design.estate/dees-catalog': 3.51.0(@tiptap/pm@2.27.2) '@design.estate/dees-comms': 1.0.30 '@push.rocks/lik': 6.4.0 '@push.rocks/smartdelay': 3.0.5 @@ -4868,7 +4871,7 @@ snapshots: dependencies: '@api.global/typedrequest-interfaces': 3.0.19 - '@design.estate/dees-catalog@3.50.2(@tiptap/pm@2.27.2)': + '@design.estate/dees-catalog@3.51.0(@tiptap/pm@2.27.2)': dependencies: '@design.estate/dees-domtools': 2.5.4 '@design.estate/dees-element': 2.2.4 @@ -4888,9 +4891,9 @@ snapshots: '@tiptap/extension-underline': 2.27.2(@tiptap/core@2.27.2(@tiptap/pm@2.27.2)) '@tiptap/starter-kit': 2.27.2 '@tsclass/tsclass': 9.5.0 - apexcharts: 5.10.4 highlight.js: 11.11.1 ibantools: 4.5.1 + lightweight-charts: 5.1.0 lucide: 0.577.0 monaco-editor: 0.55.1 pdfjs-dist: 4.10.38 @@ -5369,7 +5372,7 @@ snapshots: '@inquirer/figures': 1.0.15 '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.19.15 + '@types/node': 22.19.16 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -6906,7 +6909,7 @@ snapshots: '@serve.zone/catalog@2.11.0(@tiptap/pm@2.27.2)': dependencies: - '@design.estate/dees-catalog': 3.50.2(@tiptap/pm@2.27.2) + '@design.estate/dees-catalog': 3.51.0(@tiptap/pm@2.27.2) '@design.estate/dees-domtools': 2.5.4 '@design.estate/dees-element': 2.2.4 '@design.estate/dees-wcctools': 3.8.0 @@ -7398,9 +7401,9 @@ snapshots: prosemirror-schema-list: 1.5.1 prosemirror-state: 1.4.4 prosemirror-tables: 1.8.5 - prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.7) - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.7 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8) + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 '@tiptap/starter-kit@2.27.2': dependencies: @@ -7454,7 +7457,7 @@ snapshots: '@types/clean-css@4.2.11': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 source-map: 0.6.1 '@types/debug@4.1.13': @@ -7464,7 +7467,7 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 25.5.0 + '@types/node': 25.5.1 '@types/hast@3.0.4': dependencies: @@ -7484,12 +7487,12 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 25.5.0 + '@types/node': 25.5.1 '@types/linkify-it@5.0.0': {} @@ -7510,16 +7513,16 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 '@types/node-fetch@2.6.13': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 form-data: 4.0.5 '@types/node-forge@1.3.14': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 '@types/node@16.9.1': {} @@ -7527,17 +7530,17 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.19.15': + '@types/node@22.19.16': dependencies: undici-types: 6.21.0 - '@types/node@25.5.0': + '@types/node@25.5.1': dependencies: undici-types: 7.18.2 '@types/qrcode@1.5.6': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 '@types/randomatic@3.1.5': {} @@ -7547,11 +7550,11 @@ snapshots: '@types/tar-stream@3.1.4': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 '@types/through2@2.0.41': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 '@types/trusted-types@2.0.7': {} @@ -7581,11 +7584,11 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.5.1 optional: true '@ungap/structured-clone@1.3.0': {} @@ -7630,8 +7633,6 @@ snapshots: any-base@1.1.0: {} - apexcharts@5.10.4: {} - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -8093,6 +8094,8 @@ snapshots: fake-indexeddb@6.2.5: {} + fancy-canvas@2.1.0: {} + fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -8589,6 +8592,10 @@ snapshots: libqp@2.1.1: {} + lightweight-charts@5.1.0: + dependencies: + fancy-canvas: 2.1.0 + lines-and-columns@1.2.4: {} linkify-it@5.0.0: @@ -9341,7 +9348,7 @@ snapshots: prosemirror-changeset@2.4.0: dependencies: - prosemirror-transform: 1.11.0 + prosemirror-transform: 1.12.0 prosemirror-collab@1.3.1: dependencies: @@ -9351,32 +9358,32 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 + prosemirror-transform: 1.12.0 prosemirror-dropcursor@1.8.2: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.7 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 prosemirror-gapcursor@1.4.1: dependencies: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.7 + prosemirror-view: 1.41.8 prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.7 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 + prosemirror-transform: 1.12.0 prosemirror-keymap@1.2.3: dependencies: @@ -9408,39 +9415,39 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 + prosemirror-transform: 1.12.0 prosemirror-state@1.4.4: dependencies: prosemirror-model: 1.25.4 - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.7 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 prosemirror-tables@1.8.5: dependencies: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 - prosemirror-view: 1.41.7 + prosemirror-transform: 1.12.0 + prosemirror-view: 1.41.8 - prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.7): + prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.8): dependencies: '@remirror/core-constants': 3.0.0 escape-string-regexp: 4.0.0 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.7 + prosemirror-view: 1.41.8 - prosemirror-transform@1.11.0: + prosemirror-transform@1.12.0: dependencies: prosemirror-model: 1.25.4 - prosemirror-view@1.41.7: + prosemirror-view@1.41.8: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.11.0 + prosemirror-transform: 1.12.0 proto-list@1.2.4: {} diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 5478c8a..a1fda88 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@serve.zone/dcrouter', - version: '12.5.2', + version: '12.6.0', description: 'A multifaceted routing service handling mail and SMS delivery functions.' } diff --git a/ts_web/00_commitinfo_data.ts b/ts_web/00_commitinfo_data.ts index 5478c8a..a1fda88 100644 --- a/ts_web/00_commitinfo_data.ts +++ b/ts_web/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@serve.zone/dcrouter', - version: '12.5.2', + version: '12.6.0', description: 'A multifaceted routing service handling mail and SMS delivery functions.' } diff --git a/ts_web/elements/ops-view-certificates.ts b/ts_web/elements/ops-view-certificates.ts index fbd2b43..2819d3b 100644 --- a/ts_web/elements/ops-view-certificates.ts +++ b/ts_web/elements/ops-view-certificates.ts @@ -299,7 +299,7 @@ export class OpsViewCertificates extends DeesElement { { name: 'Reprovision', iconName: 'lucide:RefreshCw', - type: ['inRow'], + type: ['inRow', 'contextmenu'], actionFunc: async (actionData: { item: interfaces.requests.ICertificateInfo }) => { const cert = actionData.item; if (!cert.canReprovision) { @@ -311,16 +311,39 @@ export class OpsViewCertificates extends DeesElement { }); return; } - await appstate.certificateStatePart.dispatchAction( - appstate.reprovisionCertificateAction, - cert.domain, - ); - const { DeesToast } = await import('@design.estate/dees-catalog'); - DeesToast.show({ - message: `Reprovisioning triggered for ${cert.domain}`, - type: 'success', - duration: 3000, - }); + + const doReprovision = async () => { + await appstate.certificateStatePart.dispatchAction( + appstate.reprovisionCertificateAction, + cert.domain, + ); + const { DeesToast } = await import('@design.estate/dees-catalog'); + DeesToast.show({ + message: `Reprovisioning triggered for ${cert.domain}`, + type: 'success', + duration: 3000, + }); + }; + + if (cert.status === 'valid') { + const { DeesModal } = await import('@design.estate/dees-catalog'); + DeesModal.createAndShow({ + heading: 'Certificate Still Valid', + content: html`
The certificate for ${cert.domain} is still valid${cert.expiryDate ? ` until ${new Date(cert.expiryDate).toLocaleDateString()}` : ''}. Do you want to force renew it now?
`, + menuOptions: [ + { name: 'Cancel', action: async (modalArg: any) => modalArg.destroy() }, + { + name: 'Force Renew', + action: async (modalArg: any) => { + await modalArg.destroy(); + await doReprovision(); + }, + }, + ], + }); + } else { + await doReprovision(); + } }, }, {