| // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env` |
| var Map = require('../modules/es.map'); |
| var WeakMap = require('../modules/es.weak-map'); |
| var shared = require('../internals/shared'); |
| |
| var metadata = shared('metadata'); |
| var store = metadata.store || (metadata.store = new WeakMap()); |
| |
| var getOrCreateMetadataMap = function (target, targetKey, create) { |
| var targetMetadata = store.get(target); |
| if (!targetMetadata) { |
| if (!create) return; |
| store.set(target, targetMetadata = new Map()); |
| } |
| var keyMetadata = targetMetadata.get(targetKey); |
| if (!keyMetadata) { |
| if (!create) return; |
| targetMetadata.set(targetKey, keyMetadata = new Map()); |
| } return keyMetadata; |
| }; |
| |
| var ordinaryHasOwnMetadata = function (MetadataKey, O, P) { |
| var metadataMap = getOrCreateMetadataMap(O, P, false); |
| return metadataMap === undefined ? false : metadataMap.has(MetadataKey); |
| }; |
| |
| var ordinaryGetOwnMetadata = function (MetadataKey, O, P) { |
| var metadataMap = getOrCreateMetadataMap(O, P, false); |
| return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey); |
| }; |
| |
| var ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) { |
| getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue); |
| }; |
| |
| var ordinaryOwnMetadataKeys = function (target, targetKey) { |
| var metadataMap = getOrCreateMetadataMap(target, targetKey, false); |
| var keys = []; |
| if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); }); |
| return keys; |
| }; |
| |
| var toMetadataKey = function (it) { |
| return it === undefined || typeof it == 'symbol' ? it : String(it); |
| }; |
| |
| module.exports = { |
| store: store, |
| getMap: getOrCreateMetadataMap, |
| has: ordinaryHasOwnMetadata, |
| get: ordinaryGetOwnMetadata, |
| set: ordinaryDefineOwnMetadata, |
| keys: ordinaryOwnMetadataKeys, |
| toKey: toMetadataKey |
| }; |