diff --git a/blocks/edit/utils/helpers.js b/blocks/edit/utils/helpers.js
index eac62dd3a..47f822200 100644
--- a/blocks/edit/utils/helpers.js
+++ b/blocks/edit/utils/helpers.js
@@ -329,9 +329,18 @@ export function setDaMetadata(key, value) {
if (!daMdMap) return;
if (value === null || value === undefined) {
daMdMap.delete(key);
- } else {
- daMdMap.set(key, value);
+ return;
+ }
+ // The Y.Map serializes to a
block where values are
+ // interpolated as text. Non-strings (objects, Y types) would render as
+ // "[object Object]" in the saved HTML, so coerce at the boundary.
+ let stringValue = value;
+ if (typeof stringValue !== 'string') {
+ // eslint-disable-next-line no-console
+ console.warn(`setDaMetadata: non-string value for "${key}"`, value);
+ stringValue = typeof value === 'object' ? JSON.stringify(value) : String(value);
}
+ daMdMap.set(key, stringValue);
}
export function getDiffLabels() {
diff --git a/test/unit/blocks/edit/utils/helpers.test.js b/test/unit/blocks/edit/utils/helpers.test.js
index 0bf831849..a98a853af 100644
--- a/test/unit/blocks/edit/utils/helpers.test.js
+++ b/test/unit/blocks/edit/utils/helpers.test.js
@@ -632,6 +632,31 @@ describe('daMetadata functions', () => {
expect(getDaMetadata('key2')).to.be.null;
expect(getDaMetadata('key3')).to.equal('value3');
});
+
+ it('Coerces object values to JSON strings to avoid "[object Object]"', () => {
+ const originalWarn = console.warn;
+ console.warn = () => {};
+ try {
+ setDaMetadata('obj-key', { a: 1, b: 'two' });
+ expect(getDaMetadata('obj-key')).to.equal('{"a":1,"b":"two"}');
+ } finally {
+ console.warn = originalWarn;
+ }
+ });
+
+ it('Coerces non-string primitive values to strings', () => {
+ const originalWarn = console.warn;
+ console.warn = () => {};
+ try {
+ setDaMetadata('num-key', 42);
+ expect(getDaMetadata('num-key')).to.equal('42');
+
+ setDaMetadata('bool-key', true);
+ expect(getDaMetadata('bool-key')).to.equal('true');
+ } finally {
+ console.warn = originalWarn;
+ }
+ });
});
});