From a84d659e5c84ab3d47f7c041d0d5cf91e9bf3d0f Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 16 Feb 2023 15:05:52 +0100 Subject: [PATCH] feat!: allow set operations on meta BREAKING CHANGE: if you were setting directly `route.meta` within `extendRoute()`, you know need to use `route.addToMeta()` instead to have the same merging behavior. Directly setting `route.meta` now replaces the `meta` property completely. --- src/core/extendRoutes.ts | 17 +++++++++++++---- src/core/treeNodeValue.ts | 13 +++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/core/extendRoutes.ts b/src/core/extendRoutes.ts index 38f1d3f3c..8cdf3308c 100644 --- a/src/core/extendRoutes.ts +++ b/src/core/extendRoutes.ts @@ -93,16 +93,25 @@ export class EditableTreeNode { /** * Meta property of the route as an object. Note this property is readonly and will be serialized as JSON. It won't contain the meta properties defined with `definePage()` as it could contain expressions **but it does contain the meta properties defined with `` blocks**. */ - get meta() { + get meta(): Readonly { return this.node.metaAsObject } /** - * Override the meta property of the route. The passed object will be deeply merged with the existing meta object if any. - * Note that the meta property is later on serialized as JSON so you can't pass functions or any other - * non-serializable value. + * Override the meta property of the route. This will discard any other meta property defined with `` blocks or + * through other means. */ set meta(meta: RouteMeta) { + this.node.value.removeOverride('meta') + this.node.value.setEditOverride('meta', meta) + } + + /** + * Add meta properties to the route keeping the existing ones. The passed object will be deeply merged with the + * existing meta object if any. Note that the meta property is later on serialized as JSON so you can't pass functions + * or any other non-serializable value. + */ + addToMeta(meta: Partial) { this.node.value.addEditOverride({ meta }) } diff --git a/src/core/treeNodeValue.ts b/src/core/treeNodeValue.ts index 71ac5f19e..1ecb9a4da 100644 --- a/src/core/treeNodeValue.ts +++ b/src/core/treeNodeValue.ts @@ -129,6 +129,19 @@ class _TreeNodeValueBase { addEditOverride(routeBlock: CustomRouteBlock) { return this.mergeOverride(EDITS_OVERRIDE_NAME, routeBlock) } + + setEditOverride( + key: K, + value: RouteRecordOverride[K] + ) { + // return this.mergeOverride(EDITS_OVERRIDE_NAME, routeBlock) + if (!this._overrides.has(EDITS_OVERRIDE_NAME)) { + this._overrides.set(EDITS_OVERRIDE_NAME, {}) + } + + const existing = this._overrides.get(EDITS_OVERRIDE_NAME)! + existing[key] = value + } } export class TreeNodeValueStatic extends _TreeNodeValueBase {