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 xmlDocument = parser.parseFromString(data);
 | 
			
		||||
 | 
			
		||||
    this._metadata = Object.create(null);
 | 
			
		||||
    this._metadataMap = new Map();
 | 
			
		||||
 | 
			
		||||
    if (xmlDocument) {
 | 
			
		||||
      this._parse(xmlDocument);
 | 
			
		||||
@ -107,23 +107,26 @@ class Metadata {
 | 
			
		||||
          const entry = desc.childNodes[j];
 | 
			
		||||
          const name = entry.nodeName.toLowerCase();
 | 
			
		||||
 | 
			
		||||
          this._metadata[name] = entry.textContent.trim();
 | 
			
		||||
          this._metadataMap.set(name, entry.textContent.trim());
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get(name) {
 | 
			
		||||
    const data = this._metadata[name];
 | 
			
		||||
    return typeof data !== "undefined" ? data : null;
 | 
			
		||||
    return this._metadataMap.has(name) ? this._metadataMap.get(name) : null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getAll() {
 | 
			
		||||
    return this._metadata;
 | 
			
		||||
    const obj = Object.create(null);
 | 
			
		||||
    for (const [key, value] of this._metadataMap) {
 | 
			
		||||
      obj[key] = value;
 | 
			
		||||
    }
 | 
			
		||||
    return obj;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  has(name) {
 | 
			
		||||
    return typeof this._metadata[name] !== "undefined";
 | 
			
		||||
    return this._metadataMap.has(name);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user