Re-factor how Metadata
class instances store its data internally
Please note that these changes do *not* affect the *public* interface of the `Metadata` class, but only touches internal structures.[1] These changes were prompted by looking at the `getAll` method, which simply returns the "private" metadata object to the consumer. This seems wrong conceptually, since it allows way too easy/accidental changes to the internal parsed metadata. As part of fixing this, the internal metadata was changed to use a `Map` rather than a plain Object. --- [1] Basically, we shouldn't need to worry about someone depending on internal implementation details.
This commit is contained in:
parent
3f1568b51a
commit
5cdfff4a47
@ -27,7 +27,7 @@ class Metadata {
|
|||||||
const parser = new SimpleXMLParser();
|
const parser = new SimpleXMLParser();
|
||||||
const xmlDocument = parser.parseFromString(data);
|
const xmlDocument = parser.parseFromString(data);
|
||||||
|
|
||||||
this._metadata = Object.create(null);
|
this._metadataMap = new Map();
|
||||||
|
|
||||||
if (xmlDocument) {
|
if (xmlDocument) {
|
||||||
this._parse(xmlDocument);
|
this._parse(xmlDocument);
|
||||||
@ -107,23 +107,26 @@ class Metadata {
|
|||||||
const entry = desc.childNodes[j];
|
const entry = desc.childNodes[j];
|
||||||
const name = entry.nodeName.toLowerCase();
|
const name = entry.nodeName.toLowerCase();
|
||||||
|
|
||||||
this._metadata[name] = entry.textContent.trim();
|
this._metadataMap.set(name, entry.textContent.trim());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
get(name) {
|
get(name) {
|
||||||
const data = this._metadata[name];
|
return this._metadataMap.has(name) ? this._metadataMap.get(name) : null;
|
||||||
return typeof data !== "undefined" ? data : null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getAll() {
|
getAll() {
|
||||||
return this._metadata;
|
const obj = Object.create(null);
|
||||||
|
for (const [key, value] of this._metadataMap) {
|
||||||
|
obj[key] = value;
|
||||||
|
}
|
||||||
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
has(name) {
|
has(name) {
|
||||||
return typeof this._metadata[name] !== "undefined";
|
return this._metadataMap.has(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user