@@ -30,7 +30,6 @@ namespace Reflect {
30
30
declare const globalThis : any ;
31
31
declare const crypto : Crypto ;
32
32
declare const msCrypto : Crypto ;
33
- declare const process : any ;
34
33
35
34
/**
36
35
* Applies a set of decorators to a target object.
@@ -563,20 +562,19 @@ namespace Reflect {
563
562
sloppyModeThis ( ) ;
564
563
565
564
let exporter = makeExporter ( Reflect ) ;
566
- if ( typeof root . Reflect === "undefined" ) {
567
- root . Reflect = Reflect ;
568
- }
569
- else {
565
+ if ( typeof root . Reflect !== "undefined" ) {
570
566
exporter = makeExporter ( root . Reflect , exporter ) ;
571
567
}
572
568
573
569
factory ( exporter , root ) ;
574
570
571
+ if ( typeof root . Reflect === "undefined" ) {
572
+ root . Reflect = Reflect ;
573
+ }
574
+
575
575
function makeExporter ( target : typeof Reflect , previous ?: < K extends keyof typeof Reflect > ( key : K , value : typeof Reflect [ K ] ) => void ) {
576
576
return < K extends keyof typeof Reflect > ( key : K , value : typeof Reflect [ K ] ) => {
577
- if ( typeof target [ key ] !== "function" ) {
578
- Object . defineProperty ( target , key , { configurable : true , writable : true , value } ) ;
579
- }
577
+ Object . defineProperty ( target , key , { configurable : true , writable : true , value } ) ;
580
578
if ( previous ) previous ( key , value ) ;
581
579
} ;
582
580
}
@@ -623,10 +621,12 @@ namespace Reflect {
623
621
624
622
// Load global or shim versions of Map, Set, and WeakMap
625
623
const functionPrototype = Object . getPrototypeOf ( Function ) ;
626
- const usePolyfill = typeof process === "object" && process [ "env" + "" ] && process [ "env" + "" ] [ "REFLECT_METADATA_USE_MAP_POLYFILL" ] === "true" ;
627
- const _Map : typeof Map = ! usePolyfill && typeof Map === "function" && typeof Map . prototype . entries === "function" ? Map : CreateMapPolyfill ( ) ;
628
- const _Set : typeof Set = ! usePolyfill && typeof Set === "function" && typeof Set . prototype . entries === "function" ? Set : CreateSetPolyfill ( ) ;
629
- const _WeakMap : typeof WeakMap = ! usePolyfill && typeof WeakMap === "function" ? WeakMap : CreateWeakMapPolyfill ( ) ;
624
+ const _Map : typeof Map = typeof Map === "function" && typeof Map . prototype . entries === "function" ? Map : CreateMapPolyfill ( ) ;
625
+ const _Set : typeof Set = typeof Set === "function" && typeof Set . prototype . entries === "function" ? Set : CreateSetPolyfill ( ) ;
626
+ const _WeakMap : typeof WeakMap = typeof WeakMap === "function" ? WeakMap : CreateWeakMapPolyfill ( ) ;
627
+ const registrySymbol = supportsSymbol ? Symbol . for ( "@reflect-metadata:registry" ) : undefined ;
628
+ const metadataRegistry = GetOrCreateMetadataRegistry ( ) ;
629
+ const metadataProvider = CreateMetadataProvider ( metadataRegistry ) ;
630
630
631
631
function decorate ( decorators : ClassDecorator [ ] , target : Function ) : Function ;
632
632
function decorate ( decorators : ( PropertyDecorator | MethodDecorator ) [ ] , target : any , propertyKey : string | symbol , attributes ?: PropertyDescriptor | null ) : PropertyDescriptor | undefined ;
@@ -1489,14 +1489,19 @@ namespace Reflect {
1489
1489
// - Allows `import "reflect-metadata"` and `import "reflect-metadata/no-conflict"` to interoperate.
1490
1490
// - Uses isolated metadata if `Reflect` is frozen before the registry can be installed.
1491
1491
1492
- const registrySymbol = supportsSymbol ? Symbol . for ( "@reflect-metadata:registry" ) : undefined ;
1493
- const metadataRegistry = GetOrCreateMetadataRegistry ( ) ;
1494
- const metadataProvider = CreateMetadataProvider ( metadataRegistry ) ;
1495
-
1496
1492
/**
1497
1493
* Creates a registry used to allow multiple `reflect-metadata` providers.
1498
1494
*/
1499
1495
function CreateMetadataRegistry ( ) : MetadataRegistry {
1496
+ let fallback : MetadataProvider | undefined ;
1497
+ if ( ! IsUndefined ( registrySymbol ) &&
1498
+ typeof root . Reflect !== "undefined" &&
1499
+ ! ( registrySymbol in root . Reflect ) &&
1500
+ typeof root . Reflect . defineMetadata === "function" ) {
1501
+ // interoperate with older version of `reflect-metadata` that did not support a registry.
1502
+ fallback = CreateFallbackProvider ( root . Reflect ) ;
1503
+ }
1504
+
1500
1505
let first : MetadataProvider | undefined ;
1501
1506
let second : MetadataProvider | undefined ;
1502
1507
let rest : Set < MetadataProvider > | undefined ;
@@ -1513,6 +1518,7 @@ namespace Reflect {
1513
1518
throw new Error ( "Cannot add provider to a frozen registry." ) ;
1514
1519
}
1515
1520
switch ( true ) {
1521
+ case fallback === provider : break ;
1516
1522
case IsUndefined ( first ) : first = provider ; break ;
1517
1523
case first === provider : break ;
1518
1524
case IsUndefined ( second ) : second = provider ; break ;
@@ -1525,23 +1531,30 @@ namespace Reflect {
1525
1531
}
1526
1532
1527
1533
function getProviderNoCache ( O : object , P : string | symbol | undefined ) {
1528
- if ( IsUndefined ( first ) ) return undefined ;
1529
- if ( first . isProviderFor ( O , P ) ) return first ;
1530
- if ( IsUndefined ( second ) ) return undefined ;
1531
- if ( second . isProviderFor ( O , P ) ) return first ;
1532
- if ( IsUndefined ( rest ) ) return undefined ;
1533
- const iterator = GetIterator ( rest ) ;
1534
- while ( true ) {
1535
- const next = IteratorStep ( iterator ) ;
1536
- if ( ! next ) {
1537
- return undefined ;
1538
- }
1539
- const provider = IteratorValue ( next ) ;
1540
- if ( provider . isProviderFor ( O , P ) ) {
1541
- IteratorClose ( iterator ) ;
1542
- return provider ;
1534
+ if ( ! IsUndefined ( first ) ) {
1535
+ if ( first . isProviderFor ( O , P ) ) return first ;
1536
+ if ( ! IsUndefined ( second ) ) {
1537
+ if ( second . isProviderFor ( O , P ) ) return first ;
1538
+ if ( ! IsUndefined ( rest ) ) {
1539
+ const iterator = GetIterator ( rest ) ;
1540
+ while ( true ) {
1541
+ const next = IteratorStep ( iterator ) ;
1542
+ if ( ! next ) {
1543
+ return undefined ;
1544
+ }
1545
+ const provider = IteratorValue ( next ) ;
1546
+ if ( provider . isProviderFor ( O , P ) ) {
1547
+ IteratorClose ( iterator ) ;
1548
+ return provider ;
1549
+ }
1550
+ }
1551
+ }
1543
1552
}
1544
1553
}
1554
+ if ( ! IsUndefined ( fallback ) && fallback . isProviderFor ( O , P ) ) {
1555
+ return fallback ;
1556
+ }
1557
+ return undefined ;
1545
1558
}
1546
1559
1547
1560
function getProvider ( O : object , P : string | symbol | undefined ) {
@@ -1566,6 +1579,7 @@ namespace Reflect {
1566
1579
}
1567
1580
1568
1581
function hasProvider ( provider : MetadataProvider ) {
1582
+ if ( IsUndefined ( provider ) ) throw new TypeError ( ) ;
1569
1583
return first === provider || second === provider || ! IsUndefined ( rest ) && rest . has ( provider ) ;
1570
1584
}
1571
1585
@@ -1730,6 +1744,33 @@ namespace Reflect {
1730
1744
}
1731
1745
}
1732
1746
1747
+ function CreateFallbackProvider ( reflect : typeof Reflect ) : MetadataProvider {
1748
+ const metadataOwner = new _WeakMap < object , Set < string | symbol | undefined > > ( ) ;
1749
+ const provider : MetadataProvider = {
1750
+ isProviderFor ( O , P ) {
1751
+ let metadataPropertySet = metadataOwner . get ( O ) ;
1752
+ if ( ! IsUndefined ( metadataPropertySet ) ) {
1753
+ return metadataPropertySet . has ( P ) ;
1754
+ }
1755
+ if ( reflect . getOwnMetadataKeys ( O , P ! ) . length ) {
1756
+ if ( IsUndefined ( metadataPropertySet ) ) {
1757
+ metadataPropertySet = new _Set ( ) ;
1758
+ metadataOwner . set ( O , metadataPropertySet ) ;
1759
+ }
1760
+ metadataPropertySet . add ( P ) ;
1761
+ return true ;
1762
+ }
1763
+ return false ;
1764
+ } ,
1765
+ OrdinaryDefineOwnMetadata : reflect . defineMetadata ,
1766
+ OrdinaryHasOwnMetadata : reflect . hasOwnMetadata ,
1767
+ OrdinaryGetOwnMetadata : reflect . getOwnMetadata ,
1768
+ OrdinaryOwnMetadataKeys : reflect . getOwnMetadataKeys ,
1769
+ OrdinaryDeleteMetadata : reflect . deleteMetadata ,
1770
+ } ;
1771
+ return provider ;
1772
+ }
1773
+
1733
1774
function GetMetadataProvider ( O : object , P : string | symbol | undefined , Create : true ) : MetadataProvider ;
1734
1775
function GetMetadataProvider ( O : object , P : string | symbol | undefined , Create : false ) : MetadataProvider | undefined ;
1735
1776
/**
0 commit comments