@@ -2653,7 +2653,7 @@ function validateProp(key, propOptions, propsData, vm) {
26532653 var absent = ! hasOwn ( propsData , key ) ;
26542654 var value = propsData [ key ] ;
26552655 // handle boolean props
2656- if ( prop . type === Boolean ) {
2656+ if ( getType ( prop . type ) === ' Boolean' ) {
26572657 if ( absent && ! hasOwn ( prop , 'default' ) ) {
26582658 value = false ;
26592659 } else if ( value === '' || value === hyphenate ( key ) ) {
@@ -2734,27 +2734,20 @@ function assertProp(prop, name, value, vm, absent) {
27342734 */
27352735function assertType ( value , type ) {
27362736 var valid = void 0 ;
2737- var expectedType = void 0 ;
2738- if ( type === String ) {
2739- expectedType = 'string' ;
2740- valid = typeof value === expectedType ;
2741- } else if ( type === Number ) {
2742- expectedType = 'number' ;
2743- valid = typeof value === expectedType ;
2744- } else if ( type === Boolean ) {
2745- expectedType = 'boolean' ;
2746- valid = typeof value === expectedType ;
2747- } else if ( type === Function ) {
2748- expectedType = 'function' ;
2749- valid = typeof value === expectedType ;
2750- } else if ( type === Object ) {
2751- expectedType = 'Object' ;
2737+ var expectedType = getType ( type ) ;
2738+ if ( expectedType === 'String' ) {
2739+ valid = typeof value === ( expectedType = 'string' ) ;
2740+ } else if ( expectedType === 'Number' ) {
2741+ valid = typeof value === ( expectedType = 'number' ) ;
2742+ } else if ( expectedType === 'Boolean' ) {
2743+ valid = typeof value === ( expectedType = 'boolean' ) ;
2744+ } else if ( expectedType === 'Function' ) {
2745+ valid = typeof value === ( expectedType = 'function' ) ;
2746+ } else if ( expectedType === 'Object' ) {
27522747 valid = isPlainObject ( value ) ;
2753- } else if ( type === Array ) {
2754- expectedType = 'Array' ;
2748+ } else if ( expectedType === 'Array' ) {
27552749 valid = Array . isArray ( value ) ;
27562750 } else {
2757- expectedType = type . name || type . toString ( ) ;
27582751 valid = value instanceof type ;
27592752 }
27602753 return {
@@ -2763,6 +2756,16 @@ function assertType(value, type) {
27632756 } ;
27642757}
27652758
2759+ /**
2760+ * Use function string name to check built-in types,
2761+ * because a simple equality check will fail when running
2762+ * across different vms / iframes.
2763+ */
2764+ function getType ( fn ) {
2765+ var match = fn && fn . toString ( ) . match ( / ^ \s * f u n c t i o n ( \w + ) / ) ;
2766+ return match && match [ 1 ] ;
2767+ }
2768+
27662769// attributes that should be using props for binding
27672770var mustUseProp = makeMap ( 'value,selected,checked,muted' ) ;
27682771
@@ -4484,6 +4487,14 @@ function makeFunction(code) {
44844487 }
44854488}
44864489
4490+ var warned = Object . create ( null ) ;
4491+ var warnOnce = function warnOnce ( msg ) {
4492+ if ( ! warned [ msg ] ) {
4493+ warned [ msg ] = true ;
4494+ console . warn ( '\n\u001b[31m' + msg + '\u001b[39m\n' ) ;
4495+ }
4496+ } ;
4497+
44874498var normalizeAsync = function normalizeAsync ( cache , method ) {
44884499 var fn = cache [ method ] ;
44894500 if ( ! fn ) {
@@ -4531,9 +4542,10 @@ function createRenderFunction(modules, directives, isUnaryTag, cache) {
45314542 // check cache hit
45324543 var Ctor = node . componentOptions . Ctor ;
45334544 var getKey = Ctor . options . serverCacheKey ;
4534- if ( getKey && cache ) {
4545+ var name = Ctor . options . name ;
4546+ if ( getKey && cache && name ) {
45354547 ( function ( ) {
4536- var key = Ctor . cid + '::' + getKey ( node . componentOptions . propsData ) ;
4548+ var key = name + '::' + getKey ( node . componentOptions . propsData ) ;
45374549 if ( has ) {
45384550 has ( key , function ( hit ) {
45394551 if ( hit ) {
@@ -4555,8 +4567,11 @@ function createRenderFunction(modules, directives, isUnaryTag, cache) {
45554567 }
45564568 } ) ( ) ;
45574569 } else {
4558- if ( getKey ) {
4559- console . error ( '[vue-server-renderer] Component ' + ( Ctor . options . name || '(anonymous)' ) + ' implemented serverCacheKey, ' + 'but no cache was provided to the renderer.' ) ;
4570+ if ( getKey && ! cache ) {
4571+ warnOnce ( '[vue-server-renderer] Component ' + ( Ctor . options . name || '(anonymous)' ) + ' implemented serverCacheKey, ' + 'but no cache was provided to the renderer.' ) ;
4572+ }
4573+ if ( getKey && ! name ) {
4574+ warnOnce ( '[vue-server-renderer] Components that implement "serverCacheKey" ' + 'must also define a unique "name" option.' ) ;
45604575 }
45614576 renderComponent ( node , write , next , isRoot ) ;
45624577 }
@@ -4678,6 +4693,7 @@ function createRenderFunction(modules, directives, isUnaryTag, cache) {
46784693 }
46794694
46804695 return function render ( component , write , done ) {
4696+ warned = Object . create ( null ) ;
46814697 activeInstance = component ;
46824698 normalizeRender ( component ) ;
46834699 renderNode ( component . _render ( ) , write , done , true ) ;
0 commit comments