diff --git a/Reflect.ts b/Reflect.ts index b3468b8..dea1eb1 100644 --- a/Reflect.ts +++ b/Reflect.ts @@ -1497,7 +1497,11 @@ namespace Reflect { if (!IsUndefined(registrySymbol) && typeof root.Reflect !== "undefined" && !(registrySymbol in root.Reflect) && - typeof root.Reflect.defineMetadata === "function") { + typeof root.Reflect.defineMetadata === "function" && + typeof root.Reflect.hasOwnMetadata === "function" && + typeof root.Reflect.getOwnMetadata === "function" && + typeof root.Reflect.getOwnMetadataKeys === "function" && + typeof root.Reflect.deleteMetadata === "function") { // interoperate with older version of `reflect-metadata` that did not support a registry. fallback = CreateFallbackProvider(root.Reflect); } diff --git a/ReflectLite.ts b/ReflectLite.ts index 858da75..5e523e2 100644 --- a/ReflectLite.ts +++ b/ReflectLite.ts @@ -1457,7 +1457,11 @@ namespace Reflect { if (!IsUndefined(registrySymbol) && typeof root.Reflect !== "undefined" && !(registrySymbol in root.Reflect) && - typeof root.Reflect.defineMetadata === "function") { + typeof root.Reflect.defineMetadata === "function" && + typeof root.Reflect.hasOwnMetadata === "function" && + typeof root.Reflect.getOwnMetadata === "function" && + typeof root.Reflect.getOwnMetadataKeys === "function" && + typeof root.Reflect.deleteMetadata === "function") { // interoperate with older version of `reflect-metadata` that did not support a registry. fallback = CreateFallbackProvider(root.Reflect); } diff --git a/ReflectNoConflict.ts b/ReflectNoConflict.ts index f7707fd..0d50e76 100644 --- a/ReflectNoConflict.ts +++ b/ReflectNoConflict.ts @@ -1334,7 +1334,11 @@ function CreateMetadataRegistry(): MetadataRegistry { if (!IsUndefined(registrySymbol) && typeof Reflect !== "undefined" && !(registrySymbol in Reflect) && - typeof Reflect.defineMetadata === "function") { + typeof Reflect.defineMetadata === "function" && + typeof Reflect.hasOwnMetadata === "function" && + typeof Reflect.getOwnMetadata === "function" && + typeof Reflect.getOwnMetadataKeys === "function" && + typeof Reflect.deleteMetadata === "function") { // interoperate with older version of `reflect-metadata` that did not support a registry. fallback = CreateFallbackProvider(Reflect); } diff --git a/test/registry.ts b/test/registry.ts index 43ca659..8b9645e 100644 --- a/test/registry.ts +++ b/test/registry.ts @@ -115,5 +115,21 @@ for (const { name, header, context } of suites) { assert.isDefined(provider2); assert.strictEqual(provider1, provider2); }); + it("ignores incomplete implementation", () => { + const { missing, value } = script({ ...context })` + Reflect.defineMetadata = function() {}; + + { + ${header} + + const obj = {}; + exports.missing = Reflect.getOwnMetadata("a", obj); + Reflect.defineMetadata("a", 1, obj); + exports.value = Reflect.getOwnMetadata("a", obj); + } + `; + assert.isUndefined(missing); + assert.strictEqual(value, 1); + }); }); } \ No newline at end of file