From 173c244a52ac8a76addc2f8765c45f408ff7b5ee Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 May 2025 12:21:56 +0200 Subject: [PATCH 1/9] add signal r dependency --- src/Umbraco.Web.UI.Client/package-lock.json | 108 ++++++++++++++++-- .../src/packages/core/package.json | 1 + 2 files changed, 102 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 645ae75e91bf..542a117e4b90 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1297,6 +1297,18 @@ "react": ">=16" } }, + "node_modules/@microsoft/signalr": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-8.0.7.tgz", + "integrity": "sha512-PHcdMv8v5hJlBkRHAuKG5trGViQEkPYee36LnJQx4xHOQ5LL4X0nEWIxOp5cCtZ7tu+30quz5V3k0b1YNuc6lw==", + "dependencies": { + "abort-controller": "^3.0.0", + "eventsource": "^2.0.2", + "fetch-cookie": "^2.0.3", + "node-fetch": "^2.6.7", + "ws": "^7.4.5" + } + }, "node_modules/@mswjs/cookies": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.2.tgz", @@ -5906,6 +5918,17 @@ "license": "(Unlicense OR Apache-2.0)", "optional": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -8783,6 +8806,14 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -8793,6 +8824,14 @@ "node": ">=0.8.x" } }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -8983,6 +9022,15 @@ } } }, + "node_modules/fetch-cookie": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz", + "integrity": "sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==", + "dependencies": { + "set-cookie-parser": "^2.4.8", + "tough-cookie": "^4.0.0" + } + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -12739,7 +12787,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -12767,21 +12814,18 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -14157,6 +14201,17 @@ "dev": true, "license": "MIT" }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -14172,7 +14227,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -14243,6 +14297,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/queue-lit": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", @@ -14612,6 +14671,11 @@ "node": ">=10.13.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -14983,7 +15047,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "dev": true, "license": "MIT" }, "node_modules/set-function-length": { @@ -15811,6 +15874,28 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", @@ -16654,6 +16739,15 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -17278,7 +17372,6 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.3.0" @@ -17480,6 +17573,7 @@ "src/packages/core": { "name": "@umbraco-backoffice/core", "dependencies": { + "@microsoft/signalr": "^8.0.7", "@types/diff": "^7.0.2", "diff": "^7.0.0", "uuid": "^11.1.0" diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/package.json b/src/Umbraco.Web.UI.Client/src/packages/core/package.json index 4b957ca96194..ea1a95cc0061 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/package.json +++ b/src/Umbraco.Web.UI.Client/src/packages/core/package.json @@ -7,6 +7,7 @@ "generate:server-api": "openapi-ts --file openapi-ts.config.js" }, "dependencies": { + "@microsoft/signalr": "^8.0.7", "@types/diff": "^7.0.2", "diff": "^7.0.0", "uuid": "^11.1.0" From 39faa8e6fc87a3a835ce9da914e5e109e566747b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 May 2025 12:28:56 +0200 Subject: [PATCH 2/9] wip server event context --- .../src/packages/core/entry-point.ts | 3 + .../core/server/event-context/constants.ts | 1 + .../core/server/event-context/index.ts | 1 + .../server-event.context.token.ts | 4 + .../event-context/server-event.context.ts | 80 +++++++++++++++++++ .../core/server/event-context/types.ts | 2 + .../src/packages/core/server/index.ts | 1 + 7 files changed, 92 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entry-point.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entry-point.ts index 0a23247e5ac7..8299342f7ccd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entry-point.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entry-point.ts @@ -10,6 +10,7 @@ import './property-action/components/index.js'; import './menu/components/index.js'; import './extension-registry/components/index.js'; import './entity-item/global-components.js'; +import { UmbServerEventContext } from './server/index.js'; export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { new UmbExtensionsApiInitializer(host, extensionRegistry, 'globalContext', [host]); @@ -17,6 +18,8 @@ export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { new UmbExtensionsApiInitializer(host, extensionRegistry, 'treeStore', [host]); new UmbExtensionsApiInitializer(host, extensionRegistry, 'itemStore', [host]); + new UmbServerEventContext(host); + extensionRegistry.registerMany(coreManifests); const notificationContainerElement = new UmbBackofficeNotificationContainerElement(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/constants.ts new file mode 100644 index 000000000000..6cfd031852e4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/constants.ts @@ -0,0 +1 @@ +export { UMB_SERVER_EVENT_CONTEXT } from './server-event.context.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/index.ts new file mode 100644 index 000000000000..fccbb49dfc41 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/index.ts @@ -0,0 +1 @@ +export * from './server-event.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.token.ts new file mode 100644 index 000000000000..973de2c703eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.token.ts @@ -0,0 +1,4 @@ +import type { UmbServerEventContext } from './server-event.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_SERVER_EVENT_CONTEXT = new UmbContextToken('UmbServerEventContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts new file mode 100644 index 000000000000..a3b448246344 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts @@ -0,0 +1,80 @@ +import { UMB_SERVER_EVENT_CONTEXT } from './server-event.context.token.js'; +import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +// eslint-disable-next-line local-rules/enforce-umbraco-external-imports +import type { HubConnection } from '@microsoft/signalr'; +// eslint-disable-next-line local-rules/enforce-umbraco-external-imports +import { HubConnectionBuilder } from '@microsoft/signalr'; +import { Subject } from '@umbraco-cms/backoffice/external/rxjs'; +import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; + +export interface UmbServerEventModel { + type: string; + user: UmbReferenceByUnique; + data: DataType; +} + +export class UmbServerEventContext extends UmbContextBase { + //public readonly hub = new Subject(); + + #connection?: HubConnection; + #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; + + constructor(host: UmbControllerHost) { + super(host, UMB_SERVER_EVENT_CONTEXT); + + this.consumeContext(UMB_AUTH_CONTEXT, (context) => { + this.#authContext = context; + this.#observeIsAuthorized(); + }); + } + + #observeIsAuthorized() { + this.observe(this.#authContext?.isAuthorized, async (isAuthorized) => { + if (isAuthorized) { + const token = await this.#authContext?.getLatestToken(); + if (token) { + this.#initHubConnection(token); + } else { + throw new Error('No auth token found'); + } + } else { + this.#connection?.stop(); + this.#connection = undefined; + } + }); + } + + #initHubConnection(token: string) { + this.#connection = new HubConnectionBuilder() + .withUrl('https://localhost:44339/umbraco/serverEventHub', { + accessTokenFactory: () => token, + }) + .build(); + + this.#connection.on('notify', (payload: unknown) => { + console.log('payloadReceived', payload); + //this.hub.next(payload); + }); + + this.#connection + .start() + .then(function () { + console.log('Connected!'); + }) + .catch(function (err) { + console.log(err); + }); + + this.#connection.onclose((err?: Error) => { + if (err) { + this.hub.error(err); + } else { + this.hub.complete(); + } + }); + } +} + +export { UmbServerEventContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/types.ts new file mode 100644 index 000000000000..cb18e3d660e3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/types.ts @@ -0,0 +1,2 @@ +export type * from './server-event.context.js'; +export type * from './server-event.context.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/index.ts index 22bc53a8f59c..3a8e6557290f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/server/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/index.ts @@ -1,3 +1,4 @@ +export * from './event-context/index.js'; export * from './server-connection.js'; export * from './server.context-token.js'; export * from './server.context.js'; From f292eb88cf85960ae7b8305e4a73991d675b7cec Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 May 2025 12:54:48 +0200 Subject: [PATCH 3/9] align entity events --- .../entity-action/{ => event}/entity-action.event.ts | 0 .../core/entity-action/event/entity-created.event.ts | 10 ++++++++++ .../entity-action/{ => event}/entity-deleted.event.ts | 0 .../entity-action/{ => event}/entity-updated.event.ts | 0 .../src/packages/core/entity-action/event/index.ts | 7 +++++++ .../request-reload-children-of-entity.event.ts | 0 .../request-reload-structure-for-entity.event.ts | 4 ++-- .../src/packages/core/entity-action/index.ts | 6 +----- 8 files changed, 20 insertions(+), 7 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/entity-action/{ => event}/entity-action.event.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-created.event.ts rename src/Umbraco.Web.UI.Client/src/packages/core/entity-action/{ => event}/entity-deleted.event.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/entity-action/{ => event}/entity-updated.event.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/index.ts rename src/Umbraco.Web.UI.Client/src/packages/core/entity-action/{ => event}/request-reload-children-of-entity.event.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/entity-action/{ => event}/request-reload-structure-for-entity.event.ts (63%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-action.event.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-action.event.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-action.event.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-created.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-created.event.ts new file mode 100644 index 000000000000..156fd038be7f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-created.event.ts @@ -0,0 +1,10 @@ +import type { UmbEntityActionEventArgs } from './entity-action.event.js'; +import { UmbEntityActionEvent } from './entity-action.event.js'; + +export class UmbEntityCreatedEvent extends UmbEntityActionEvent { + static readonly TYPE = 'entity-created'; + + constructor(args: UmbEntityActionEventArgs) { + super(UmbEntityCreatedEvent.TYPE, args); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-deleted.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-deleted.event.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-deleted.event.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-deleted.event.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-updated.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-updated.event.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/entity-updated.event.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity-updated.event.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/index.ts new file mode 100644 index 000000000000..24ec3d1754d0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/index.ts @@ -0,0 +1,7 @@ +export * from './entity-action.event.js'; +export * from './entity-created.event.js'; +export * from './entity-deleted.event.js'; +export * from './entity-updated.event.js'; + +export * from './request-reload-structure-for-entity.event.js'; +export * from './request-reload-children-of-entity.event.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/request-reload-children-of-entity.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/request-reload-children-of-entity.event.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/request-reload-children-of-entity.event.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/request-reload-children-of-entity.event.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/request-reload-structure-for-entity.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/request-reload-structure-for-entity.event.ts similarity index 63% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/request-reload-structure-for-entity.event.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/request-reload-structure-for-entity.event.ts index 730fa4900752..7c09cbd52f14 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/request-reload-structure-for-entity.event.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/request-reload-structure-for-entity.event.ts @@ -1,5 +1,5 @@ -import type { UmbEntityActionEventArgs } from './entity-action.event.js'; -import { UmbEntityActionEvent } from './entity-action.event.js'; +import type { UmbEntityActionEventArgs } from './event/entity-action.event.js'; +import { UmbEntityActionEvent } from './event/entity-action.event.js'; export class UmbRequestReloadStructureForEntityEvent extends UmbEntityActionEvent { static readonly TYPE = 'request-reload-structure-for-entity'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts index 2104b5fe36f4..c1f8a4d4cb59 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/index.ts @@ -4,13 +4,9 @@ export * from './common/index.js'; export * from './constants.js'; export * from './entity-action-base.js'; export * from './entity-action-list.element.js'; -export * from './entity-action.event.js'; export * from './has-children/index.js'; -export * from './entity-updated.event.js'; -export * from './entity-deleted.event.js'; +export * from './event/index.js'; export type * from './types.js'; -export { UmbRequestReloadStructureForEntityEvent } from './request-reload-structure-for-entity.event.js'; -export { UmbRequestReloadChildrenOfEntityEvent } from './request-reload-children-of-entity.event.js'; export { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from './default/default.action.kind.js'; From 6b1650c937d095db692ad1c3c5d0e82ead6a57a2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 May 2025 13:02:54 +0200 Subject: [PATCH 4/9] fix imports --- .../packages/core/entity-action/common/delete/delete.action.ts | 2 +- .../core/entity-action/common/duplicate/duplicate.action.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts index e4c1342c6ce4..f0243a0e24ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.ts @@ -1,11 +1,11 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; -import { UmbRequestReloadStructureForEntityEvent } from '../../request-reload-structure-for-entity.event.js'; import type { MetaEntityActionDeleteKind } from './types.js'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import type { UmbDetailRepository, UmbItemRepository } from '@umbraco-cms/backoffice/repository'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api'; +import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; export class UmbDeleteEntityAction< MetaKind extends MetaEntityActionDeleteKind = MetaEntityActionDeleteKind, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.ts index 720fc9251d13..acf847431ddd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.ts @@ -1,8 +1,8 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; -import { UmbRequestReloadStructureForEntityEvent } from '../../request-reload-structure-for-entity.event.js'; import type { UmbDuplicateRepository } from './duplicate-repository.interface.js'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; export class UmbDuplicateEntityAction extends UmbEntityActionBase { override async execute() { From 157155f55f7bf4478a9278af198510965266af7d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 May 2025 13:03:13 +0200 Subject: [PATCH 5/9] generic entity event --- .../core/entity-action/event/entity.event.ts | 12 ++++++++++++ .../src/packages/core/entity-action/event/index.ts | 1 + .../request-reload-structure-for-entity.event.ts | 4 ++-- 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity.event.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity.event.ts new file mode 100644 index 000000000000..15938b5c2586 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/entity.event.ts @@ -0,0 +1,12 @@ +import type { UmbEntityActionEventArgs } from './entity-action.event.js'; +import { UmbEntityActionEvent } from './entity-action.event.js'; + +interface UmbGenericEntityActionEventArgs extends UmbEntityActionEventArgs { + type: string; +} + +export class UmbEntityEvent extends UmbEntityActionEvent { + constructor(args: UmbGenericEntityActionEventArgs) { + super(args.type, args); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/index.ts index 24ec3d1754d0..f2f2effc20a1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/index.ts @@ -2,6 +2,7 @@ export * from './entity-action.event.js'; export * from './entity-created.event.js'; export * from './entity-deleted.event.js'; export * from './entity-updated.event.js'; +export * from './entity.event.js'; export * from './request-reload-structure-for-entity.event.js'; export * from './request-reload-children-of-entity.event.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/request-reload-structure-for-entity.event.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/request-reload-structure-for-entity.event.ts index 7c09cbd52f14..730fa4900752 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/request-reload-structure-for-entity.event.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/event/request-reload-structure-for-entity.event.ts @@ -1,5 +1,5 @@ -import type { UmbEntityActionEventArgs } from './event/entity-action.event.js'; -import { UmbEntityActionEvent } from './event/entity-action.event.js'; +import type { UmbEntityActionEventArgs } from './entity-action.event.js'; +import { UmbEntityActionEvent } from './entity-action.event.js'; export class UmbRequestReloadStructureForEntityEvent extends UmbEntityActionEvent { static readonly TYPE = 'request-reload-structure-for-entity'; From 3588615bc12d5729211ebc6adf6aeddc8e3f93aa Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 May 2025 13:14:55 +0200 Subject: [PATCH 6/9] dispatch entity events events --- .../event-context/server-event.context.ts | 49 ++++++++++++++++--- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts index a3b448246344..1479df2f8cf9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts @@ -7,19 +7,21 @@ import type { HubConnection } from '@microsoft/signalr'; import { HubConnectionBuilder } from '@microsoft/signalr'; import { Subject } from '@umbraco-cms/backoffice/external/rxjs'; import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; -import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import { UmbEntityEvent } from '@umbraco-cms/backoffice/entity-action'; -export interface UmbServerEventModel { - type: string; - user: UmbReferenceByUnique; - data: DataType; +export interface UmbServerEventModel { + eventSource: string; + eventType: string; + key: string; } export class UmbServerEventContext extends UmbContextBase { - //public readonly hub = new Subject(); + public readonly hub = new Subject(); #connection?: HubConnection; #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; + #actionEventContext?: typeof UMB_ACTION_EVENT_CONTEXT.TYPE; constructor(host: UmbControllerHost) { super(host, UMB_SERVER_EVENT_CONTEXT); @@ -28,6 +30,10 @@ export class UmbServerEventContext extends UmbContextBase { this.#authContext = context; this.#observeIsAuthorized(); }); + + this.consumeContext(UMB_ACTION_EVENT_CONTEXT, (context) => { + this.#actionEventContext = context; + }); } #observeIsAuthorized() { @@ -53,9 +59,36 @@ export class UmbServerEventContext extends UmbContextBase { }) .build(); - this.#connection.on('notify', (payload: unknown) => { + this.#connection.on('notify', (payload: UmbServerEventModel) => { console.log('payloadReceived', payload); - //this.hub.next(payload); + + // TODO: Only for POC purposes, replace with a proper mapping + const eventSourceToEntity: Record = { + 'Umbraco:CMS:Document': 'document', + 'Umbraco:CMS:DocumentType': 'document-type', + 'Umbraco:CMS:Media': 'media', + 'Umbraco:CMS:MediaType': 'media-type', + 'Umbraco:CMS:Member': 'member', + 'Umbraco:CMS:MemberType': 'member-type', + 'Umbraco:CMS:MemberGroup': 'member-group', + 'Umbraco:CMS:DataType': 'data-type', + }; + + // TODO: Only for POC purposes, replace with a proper mapping + const eventTypeToAction: Record = { + Created: 'entity-created', + Updated: 'entity-updated', + Deleted: 'entity-deleted', + Trashed: 'entity-trashed', + }; + + const event = new UmbEntityEvent({ + type: eventTypeToAction[payload.eventType], + entityType: eventSourceToEntity[payload.eventSource], + unique: payload.key, + }); + + this.#actionEventContext?.dispatchEvent(event); }); this.#connection From b7157b1e12be1e83de35c8be7e0d6b27eeaa144b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 May 2025 13:17:47 +0200 Subject: [PATCH 7/9] listen to updated events from tree --- .../tree-item-base/tree-item-context-base.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index ed019eec8b7b..fd4ca1edbc4f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -12,6 +12,8 @@ import { UMB_SECTION_CONTEXT, UMB_SECTION_SIDEBAR_CONTEXT } from '@umbraco-cms/b import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { + UmbEntityCreatedEvent, + UmbEntityUpdatedEvent, UmbHasChildrenEntityContext, UmbRequestReloadChildrenOfEntityEvent, UmbRequestReloadStructureForEntityEvent, @@ -314,6 +316,11 @@ export abstract class UmbTreeItemContextBase< UmbRequestReloadStructureForEntityEvent.TYPE, this.#onReloadStructureRequest as unknown as EventListener, ); + + this.#actionEventContext?.addEventListener( + UmbEntityUpdatedEvent.TYPE, + this.#onReloadStructureRequest as unknown as EventListener, + ); }); } @@ -468,6 +475,11 @@ export abstract class UmbTreeItemContextBase< UmbRequestReloadStructureForEntityEvent.TYPE, this.#onReloadStructureRequest as unknown as EventListener, ); + + this.#actionEventContext?.removeEventListener( + UmbEntityUpdatedEvent.TYPE, + this.#onReloadStructureRequest as unknown as EventListener, + ); }; override destroy(): void { From 377e3db51bdb186ffe84be650b548c080136c259 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 20 May 2025 13:49:27 +0200 Subject: [PATCH 8/9] do not provide --- .../src/packages/core/entry-point.ts | 4 ++-- .../core/server/event-context/index.ts | 1 - .../server-event.context.token.ts | 4 ---- .../core/server/event-context/types.ts | 2 -- .../{event-context => event}/constants.ts | 0 .../src/packages/core/server/event/index.ts | 1 + .../server-event.manager.ts} | 18 +++++------------- .../src/packages/core/server/event/types.ts | 1 + .../src/packages/core/server/index.ts | 2 +- 9 files changed, 10 insertions(+), 23 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.token.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/types.ts rename src/Umbraco.Web.UI.Client/src/packages/core/server/{event-context => event}/constants.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event/index.ts rename src/Umbraco.Web.UI.Client/src/packages/core/server/{event-context/server-event.context.ts => event/server-event.manager.ts} (84%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/server/event/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entry-point.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entry-point.ts index 8299342f7ccd..6962fffae413 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entry-point.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entry-point.ts @@ -2,6 +2,7 @@ import { UMB_AUTH_CONTEXT } from './auth/auth.context.token.js'; import { UmbBackofficeNotificationContainerElement, UmbBackofficeModalContainerElement } from './components/index.js'; import { UmbActionEventContext } from './action/action-event.context.js'; import { manifests as coreManifests } from './manifests.js'; +import { UmbServerEventManager } from './server/index.js'; import { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; import { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; import { UmbExtensionsApiInitializer, type UmbEntryPointOnInit } from '@umbraco-cms/backoffice/extension-api'; @@ -10,7 +11,6 @@ import './property-action/components/index.js'; import './menu/components/index.js'; import './extension-registry/components/index.js'; import './entity-item/global-components.js'; -import { UmbServerEventContext } from './server/index.js'; export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { new UmbExtensionsApiInitializer(host, extensionRegistry, 'globalContext', [host]); @@ -18,7 +18,7 @@ export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { new UmbExtensionsApiInitializer(host, extensionRegistry, 'treeStore', [host]); new UmbExtensionsApiInitializer(host, extensionRegistry, 'itemStore', [host]); - new UmbServerEventContext(host); + new UmbServerEventManager(host); extensionRegistry.registerMany(coreManifests); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/index.ts deleted file mode 100644 index fccbb49dfc41..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './server-event.context.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.token.ts deleted file mode 100644 index 973de2c703eb..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.token.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { UmbServerEventContext } from './server-event.context.js'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; - -export const UMB_SERVER_EVENT_CONTEXT = new UmbContextToken('UmbServerEventContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/types.ts deleted file mode 100644 index cb18e3d660e3..000000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/types.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type * from './server-event.context.js'; -export type * from './server-event.context.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event/constants.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/constants.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/server/event/constants.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event/index.ts new file mode 100644 index 000000000000..0abb8475e9cc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/event/index.ts @@ -0,0 +1 @@ +export * from './server-event.manager.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event/server-event.manager.ts similarity index 84% rename from src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/server/event/server-event.manager.ts index 1479df2f8cf9..96e4525cde18 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/server/event-context/server-event.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/event/server-event.manager.ts @@ -1,30 +1,26 @@ -import { UMB_SERVER_EVENT_CONTEXT } from './server-event.context.token.js'; -import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; // eslint-disable-next-line local-rules/enforce-umbraco-external-imports import type { HubConnection } from '@microsoft/signalr'; // eslint-disable-next-line local-rules/enforce-umbraco-external-imports import { HubConnectionBuilder } from '@microsoft/signalr'; -import { Subject } from '@umbraco-cms/backoffice/external/rxjs'; import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbEntityEvent } from '@umbraco-cms/backoffice/entity-action'; -export interface UmbServerEventModel { +interface UmbServerEventModel { eventSource: string; eventType: string; key: string; } -export class UmbServerEventContext extends UmbContextBase { - public readonly hub = new Subject(); - +export class UmbServerEventManager extends UmbControllerBase { #connection?: HubConnection; #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; #actionEventContext?: typeof UMB_ACTION_EVENT_CONTEXT.TYPE; constructor(host: UmbControllerHost) { - super(host, UMB_SERVER_EVENT_CONTEXT); + super(host); this.consumeContext(UMB_AUTH_CONTEXT, (context) => { this.#authContext = context; @@ -102,12 +98,8 @@ export class UmbServerEventContext extends UmbContextBase { this.#connection.onclose((err?: Error) => { if (err) { - this.hub.error(err); - } else { - this.hub.complete(); + console.error('Connection closed with error: ', err); } }); } } - -export { UmbServerEventContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/event/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/event/types.ts new file mode 100644 index 000000000000..03a219188ebd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/event/types.ts @@ -0,0 +1 @@ +export type * from './server-event.manager.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server/index.ts index 3a8e6557290f..981f44b8ff0a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/server/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server/index.ts @@ -1,4 +1,4 @@ -export * from './event-context/index.js'; +export * from './event/index.js'; export * from './server-connection.js'; export * from './server.context-token.js'; export * from './server.context.js'; From 66c15e9cce85c537c0e79a93e76260920ade0d23 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 11 Aug 2025 15:46:37 +0200 Subject: [PATCH 9/9] Update package-lock.json --- src/Umbraco.Web.UI.Client/package-lock.json | 119 ++++++++++++++++++-- 1 file changed, 112 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 2886a3bcef1d..44e4197f1c95 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -1237,6 +1237,19 @@ "react": ">=16" } }, + "node_modules/@microsoft/signalr": { + "version": "8.0.17", + "resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-8.0.17.tgz", + "integrity": "sha512-5pM6xPtKZNJLO0Tq5nQasVyPFwi/WBY3QB5uc/v3dIPTpS1JXQbaXAQAPxFoQ5rTBFE094w8bbqkp17F9ReQvA==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "eventsource": "^2.0.2", + "fetch-cookie": "^2.0.3", + "node-fetch": "^2.6.7", + "ws": "^7.5.10" + } + }, "node_modules/@mswjs/cookies": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@mswjs/cookies/-/cookies-0.2.2.tgz", @@ -5448,6 +5461,18 @@ "license": "(Unlicense OR Apache-2.0)", "optional": true }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -8402,6 +8427,15 @@ "node": ">= 0.6" } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -8412,6 +8446,15 @@ "node": ">=0.8.x" } }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -8602,6 +8645,16 @@ } } }, + "node_modules/fetch-cookie": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz", + "integrity": "sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==", + "license": "Unlicense", + "dependencies": { + "set-cookie-parser": "^2.4.8", + "tough-cookie": "^4.0.0" + } + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -12175,7 +12228,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -12203,21 +12255,18 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, "license": "MIT" }, "node_modules/node-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/node-fetch/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", @@ -14137,6 +14186,18 @@ "dev": true, "license": "MIT" }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -14152,7 +14213,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -14223,6 +14283,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, "node_modules/queue-lit": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", @@ -14588,6 +14654,12 @@ "node": ">=10.13.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -14923,7 +14995,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "dev": true, "license": "MIT" }, "node_modules/set-function-length": { @@ -15742,6 +15813,30 @@ "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", @@ -16544,6 +16639,16 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -17091,7 +17196,6 @@ "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.3.0" @@ -17318,6 +17422,7 @@ "name": "@umbraco-backoffice/core", "dependencies": { "@hey-api/client-fetch": "^0.12.0", + "@microsoft/signalr": "^8.0.7", "@types/diff": "^7.0.2", "diff": "^7.0.0", "uuid": "^11.1.0"