@vue/compat 3.2.38 → 3.2.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1897,7 +1897,9 @@ function queuePostFlushCb(cb) {
1897
1897
  }
1898
1898
  queueFlush();
1899
1899
  }
1900
- function flushPreFlushCbs(seen, i = flushIndex) {
1900
+ function flushPreFlushCbs(seen,
1901
+ // if currently flushing, skip the current job itself
1902
+ i = isFlushing ? flushIndex + 1 : 0) {
1901
1903
  if ((process.env.NODE_ENV !== 'production')) {
1902
1904
  seen = seen || new Map();
1903
1905
  }
@@ -4871,7 +4873,7 @@ function injectHook(type, hook, target = currentInstance, prepend = false) {
4871
4873
  const createHook = (lifecycle) => (hook, target = currentInstance) =>
4872
4874
  // post-create lifecycle registrations are noops during SSR (except for serverPrefetch)
4873
4875
  (!isInSSRComponentSetup || lifecycle === "sp" /* LifecycleHooks.SERVER_PREFETCH */) &&
4874
- injectHook(lifecycle, hook, target);
4876
+ injectHook(lifecycle, (...args) => hook(...args), target);
4875
4877
  const onBeforeMount = createHook("bm" /* LifecycleHooks.BEFORE_MOUNT */);
4876
4878
  const onMounted = createHook("m" /* LifecycleHooks.MOUNTED */);
4877
4879
  const onBeforeUpdate = createHook("bu" /* LifecycleHooks.BEFORE_UPDATE */);
@@ -5423,7 +5425,10 @@ function createSlots(slots, dynamicSlots) {
5423
5425
  slots[slot.name] = slot.key
5424
5426
  ? (...args) => {
5425
5427
  const res = slot.fn(...args);
5426
- res.key = slot.key;
5428
+ // attach branch key so each conditional branch is considered a
5429
+ // different fragment
5430
+ if (res)
5431
+ res.key = slot.key;
5427
5432
  return res;
5428
5433
  }
5429
5434
  : slot.fn;
@@ -7203,7 +7208,7 @@ function createCompatVue(createApp, createSingletonApp) {
7203
7208
  return vm;
7204
7209
  }
7205
7210
  }
7206
- Vue.version = `2.6.14-compat:${"3.2.38"}`;
7211
+ Vue.version = `2.6.14-compat:${"3.2.40"}`;
7207
7212
  Vue.config = singletonApp.config;
7208
7213
  Vue.use = (p, ...options) => {
7209
7214
  if (p && isFunction(p.install)) {
@@ -7920,7 +7925,7 @@ function createHydrationFunctions(rendererInternals) {
7920
7925
  const isFragmentStart = isComment(node) && node.data === '[';
7921
7926
  const onMismatch = () => handleMismatch(node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragmentStart);
7922
7927
  const { type, ref, shapeFlag, patchFlag } = vnode;
7923
- const domType = node.nodeType;
7928
+ let domType = node.nodeType;
7924
7929
  vnode.el = node;
7925
7930
  if (patchFlag === -2 /* PatchFlags.BAIL */) {
7926
7931
  optimized = false;
@@ -7961,10 +7966,12 @@ function createHydrationFunctions(rendererInternals) {
7961
7966
  }
7962
7967
  break;
7963
7968
  case Static:
7964
- if (domType !== 1 /* DOMNodeTypes.ELEMENT */ && domType !== 3 /* DOMNodeTypes.TEXT */) {
7965
- nextNode = onMismatch();
7969
+ if (isFragmentStart) {
7970
+ // entire template is static but SSRed as a fragment
7971
+ node = nextSibling(node);
7972
+ domType = node.nodeType;
7966
7973
  }
7967
- else {
7974
+ if (domType === 1 /* DOMNodeTypes.ELEMENT */ || domType === 3 /* DOMNodeTypes.TEXT */) {
7968
7975
  // determine anchor, adopt content
7969
7976
  nextNode = node;
7970
7977
  // if the static vnode has its content stripped during build,
@@ -7981,7 +7988,10 @@ function createHydrationFunctions(rendererInternals) {
7981
7988
  }
7982
7989
  nextNode = nextSibling(nextNode);
7983
7990
  }
7984
- return nextNode;
7991
+ return isFragmentStart ? nextSibling(nextNode) : nextNode;
7992
+ }
7993
+ else {
7994
+ onMismatch();
7985
7995
  }
7986
7996
  break;
7987
7997
  case Fragment:
@@ -8339,7 +8349,7 @@ function baseCreateRenderer(options, createHydrationFns) {
8339
8349
  if ((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) {
8340
8350
  setDevtoolsHook(target.__VUE_DEVTOOLS_GLOBAL_HOOK__, target);
8341
8351
  }
8342
- const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, setScopeId: hostSetScopeId = NOOP, cloneNode: hostCloneNode, insertStaticContent: hostInsertStaticContent } = options;
8352
+ const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, setScopeId: hostSetScopeId = NOOP, insertStaticContent: hostInsertStaticContent } = options;
8343
8353
  // Note: functions inside this closure should use `const xxx = () => {}`
8344
8354
  // style in order to prevent being inlined by minifiers.
8345
8355
  const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, isSVG = false, slotScopeIds = null, optimized = (process.env.NODE_ENV !== 'production') && isHmrUpdating ? false : !!n2.dynamicChildren) => {
@@ -8466,56 +8476,44 @@ function baseCreateRenderer(options, createHydrationFns) {
8466
8476
  const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, isSVG, slotScopeIds, optimized) => {
8467
8477
  let el;
8468
8478
  let vnodeHook;
8469
- const { type, props, shapeFlag, transition, patchFlag, dirs } = vnode;
8470
- if (!(process.env.NODE_ENV !== 'production') &&
8471
- vnode.el &&
8472
- hostCloneNode !== undefined &&
8473
- patchFlag === -1 /* PatchFlags.HOISTED */) {
8474
- // If a vnode has non-null el, it means it's being reused.
8475
- // Only static vnodes can be reused, so its mounted DOM nodes should be
8476
- // exactly the same, and we can simply do a clone here.
8477
- // only do this in production since cloned trees cannot be HMR updated.
8478
- el = vnode.el = hostCloneNode(vnode.el);
8479
+ const { type, props, shapeFlag, transition, dirs } = vnode;
8480
+ el = vnode.el = hostCreateElement(vnode.type, isSVG, props && props.is, props);
8481
+ // mount children first, since some props may rely on child content
8482
+ // being already rendered, e.g. `<select value>`
8483
+ if (shapeFlag & 8 /* ShapeFlags.TEXT_CHILDREN */) {
8484
+ hostSetElementText(el, vnode.children);
8479
8485
  }
8480
- else {
8481
- el = vnode.el = hostCreateElement(vnode.type, isSVG, props && props.is, props);
8482
- // mount children first, since some props may rely on child content
8483
- // being already rendered, e.g. `<select value>`
8484
- if (shapeFlag & 8 /* ShapeFlags.TEXT_CHILDREN */) {
8485
- hostSetElementText(el, vnode.children);
8486
- }
8487
- else if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {
8488
- mountChildren(vnode.children, el, null, parentComponent, parentSuspense, isSVG && type !== 'foreignObject', slotScopeIds, optimized);
8489
- }
8490
- if (dirs) {
8491
- invokeDirectiveHook(vnode, null, parentComponent, 'created');
8492
- }
8493
- // props
8494
- if (props) {
8495
- for (const key in props) {
8496
- if (key !== 'value' && !isReservedProp(key)) {
8497
- hostPatchProp(el, key, null, props[key], isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
8498
- }
8499
- }
8500
- /**
8501
- * Special case for setting value on DOM elements:
8502
- * - it can be order-sensitive (e.g. should be set *after* min/max, #2325, #4024)
8503
- * - it needs to be forced (#1471)
8504
- * #2353 proposes adding another renderer option to configure this, but
8505
- * the properties affects are so finite it is worth special casing it
8506
- * here to reduce the complexity. (Special casing it also should not
8507
- * affect non-DOM renderers)
8508
- */
8509
- if ('value' in props) {
8510
- hostPatchProp(el, 'value', null, props.value);
8511
- }
8512
- if ((vnodeHook = props.onVnodeBeforeMount)) {
8513
- invokeVNodeHook(vnodeHook, parentComponent, vnode);
8514
- }
8515
- }
8516
- // scopeId
8517
- setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);
8486
+ else if (shapeFlag & 16 /* ShapeFlags.ARRAY_CHILDREN */) {
8487
+ mountChildren(vnode.children, el, null, parentComponent, parentSuspense, isSVG && type !== 'foreignObject', slotScopeIds, optimized);
8518
8488
  }
8489
+ if (dirs) {
8490
+ invokeDirectiveHook(vnode, null, parentComponent, 'created');
8491
+ }
8492
+ // props
8493
+ if (props) {
8494
+ for (const key in props) {
8495
+ if (key !== 'value' && !isReservedProp(key)) {
8496
+ hostPatchProp(el, key, null, props[key], isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
8497
+ }
8498
+ }
8499
+ /**
8500
+ * Special case for setting value on DOM elements:
8501
+ * - it can be order-sensitive (e.g. should be set *after* min/max, #2325, #4024)
8502
+ * - it needs to be forced (#1471)
8503
+ * #2353 proposes adding another renderer option to configure this, but
8504
+ * the properties affects are so finite it is worth special casing it
8505
+ * here to reduce the complexity. (Special casing it also should not
8506
+ * affect non-DOM renderers)
8507
+ */
8508
+ if ('value' in props) {
8509
+ hostPatchProp(el, 'value', null, props.value);
8510
+ }
8511
+ if ((vnodeHook = props.onVnodeBeforeMount)) {
8512
+ invokeVNodeHook(vnodeHook, parentComponent, vnode);
8513
+ }
8514
+ }
8515
+ // scopeId
8516
+ setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent);
8519
8517
  if ((process.env.NODE_ENV !== 'production') || __VUE_PROD_DEVTOOLS__) {
8520
8518
  Object.defineProperty(el, '__vnode', {
8521
8519
  value: vnode,
@@ -8702,6 +8700,13 @@ function baseCreateRenderer(options, createHydrationFns) {
8702
8700
  };
8703
8701
  const patchProps = (el, vnode, oldProps, newProps, parentComponent, parentSuspense, isSVG) => {
8704
8702
  if (oldProps !== newProps) {
8703
+ if (oldProps !== EMPTY_OBJ) {
8704
+ for (const key in oldProps) {
8705
+ if (!isReservedProp(key) && !(key in newProps)) {
8706
+ hostPatchProp(el, key, oldProps[key], null, isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
8707
+ }
8708
+ }
8709
+ }
8705
8710
  for (const key in newProps) {
8706
8711
  // empty string is not valid prop
8707
8712
  if (isReservedProp(key))
@@ -8713,13 +8718,6 @@ function baseCreateRenderer(options, createHydrationFns) {
8713
8718
  hostPatchProp(el, key, prev, next, isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
8714
8719
  }
8715
8720
  }
8716
- if (oldProps !== EMPTY_OBJ) {
8717
- for (const key in oldProps) {
8718
- if (!isReservedProp(key) && !(key in newProps)) {
8719
- hostPatchProp(el, key, oldProps[key], null, isSVG, vnode.children, parentComponent, parentSuspense, unmountChildren);
8720
- }
8721
- }
8722
- }
8723
8721
  if ('value' in newProps) {
8724
8722
  hostPatchProp(el, 'value', oldProps.value, newProps.value);
8725
8723
  }
@@ -10346,7 +10344,10 @@ function normalizeVNode(child) {
10346
10344
  }
10347
10345
  // optimized normalization for template-compiled render fns
10348
10346
  function cloneIfMounted(child) {
10349
- return child.el === null || child.memo ? child : cloneVNode(child);
10347
+ return (child.el === null && child.patchFlag !== -1 /* PatchFlags.HOISTED */) ||
10348
+ child.memo
10349
+ ? child
10350
+ : cloneVNode(child);
10350
10351
  }
10351
10352
  function normalizeChildren(vnode, children) {
10352
10353
  let type = 0;
@@ -10704,7 +10705,8 @@ function finishComponentSetup(instance, isSSR, skipOptions) {
10704
10705
  if (!isSSR && compile && !Component.render) {
10705
10706
  const template = (instance.vnode.props &&
10706
10707
  instance.vnode.props['inline-template']) ||
10707
- Component.template;
10708
+ Component.template ||
10709
+ resolveMergedOptions(instance).template;
10708
10710
  if (template) {
10709
10711
  if ((process.env.NODE_ENV !== 'production')) {
10710
10712
  startMeasure(instance, `compile`);
@@ -11283,7 +11285,7 @@ function isMemoSame(cached, memo) {
11283
11285
  }
11284
11286
 
11285
11287
  // Core API ------------------------------------------------------------------
11286
- const version = "3.2.38";
11288
+ const version = "3.2.40";
11287
11289
  const _ssrUtils = {
11288
11290
  createComponentInstance,
11289
11291
  setupComponent,
@@ -11349,22 +11351,6 @@ const nodeOps = {
11349
11351
  setScopeId(el, id) {
11350
11352
  el.setAttribute(id, '');
11351
11353
  },
11352
- cloneNode(el) {
11353
- const cloned = el.cloneNode(true);
11354
- // #3072
11355
- // - in `patchDOMProp`, we store the actual value in the `el._value` property.
11356
- // - normally, elements using `:value` bindings will not be hoisted, but if
11357
- // the bound value is a constant, e.g. `:value="true"` - they do get
11358
- // hoisted.
11359
- // - in production, hoisted nodes are cloned when subsequent inserts, but
11360
- // cloneNode() does not copy the custom property we attached.
11361
- // - This may need to account for other custom DOM properties we attach to
11362
- // elements in addition to `_value` in the future.
11363
- if (`_value` in el) {
11364
- cloned._value = el._value;
11365
- }
11366
- return cloned;
11367
- },
11368
11354
  // __UNSAFE__
11369
11355
  // Reason: innerHTML.
11370
11356
  // Static content here can only come from compiled templates.
@@ -11535,14 +11521,14 @@ const isEnumeratedAttr = /*#__PURE__*/ makeMap('contenteditable,draggable,spellc
11535
11521
  ;
11536
11522
  function compatCoerceAttr(el, key, value, instance = null) {
11537
11523
  if (isEnumeratedAttr(key)) {
11538
- const v2CocercedValue = value === null
11524
+ const v2CoercedValue = value === null
11539
11525
  ? 'false'
11540
11526
  : typeof value !== 'boolean' && value !== undefined
11541
11527
  ? 'true'
11542
11528
  : null;
11543
- if (v2CocercedValue &&
11544
- compatUtils.softAssertCompatEnabled("ATTR_ENUMERATED_COERCION" /* DeprecationTypes.ATTR_ENUMERATED_COERCION */, instance, key, value, v2CocercedValue)) {
11545
- el.setAttribute(key, v2CocercedValue);
11529
+ if (v2CoercedValue &&
11530
+ compatUtils.softAssertCompatEnabled("ATTR_ENUMERATED_COERCION" /* DeprecationTypes.ATTR_ENUMERATED_COERCION */, instance, key, value, v2CoercedValue)) {
11531
+ el.setAttribute(key, v2CoercedValue);
11546
11532
  return true;
11547
11533
  }
11548
11534
  }
@@ -11603,7 +11589,6 @@ prevChildren, parentComponent, parentSuspense, unmountChildren) {
11603
11589
  }
11604
11590
  else if (type === 'number') {
11605
11591
  // e.g. <img :width="null">
11606
- // the value of some IDL attr must be greater than 0, e.g. input.size = 0 -> error
11607
11592
  value = 0;
11608
11593
  needRemove = true;
11609
11594
  }
@@ -11627,7 +11612,8 @@ prevChildren, parentComponent, parentSuspense, unmountChildren) {
11627
11612
  el[key] = value;
11628
11613
  }
11629
11614
  catch (e) {
11630
- if ((process.env.NODE_ENV !== 'production')) {
11615
+ // do not warn if value is auto-coerced from nullish values
11616
+ if ((process.env.NODE_ENV !== 'production') && !needRemove) {
11631
11617
  warn$1(`Failed setting prop "${key}" on <${el.tagName.toLowerCase()}>: ` +
11632
11618
  `value ${value} is invalid.`, e);
11633
11619
  }
@@ -14174,34 +14160,42 @@ function parseChildren(context, mode, ancestors) {
14174
14160
  const shouldCondense = context.options.whitespace !== 'preserve';
14175
14161
  for (let i = 0; i < nodes.length; i++) {
14176
14162
  const node = nodes[i];
14177
- if (!context.inPre && node.type === 2 /* NodeTypes.TEXT */) {
14178
- if (!/[^\t\r\n\f ]/.test(node.content)) {
14179
- const prev = nodes[i - 1];
14180
- const next = nodes[i + 1];
14181
- // Remove if:
14182
- // - the whitespace is the first or last node, or:
14183
- // - (condense mode) the whitespace is adjacent to a comment, or:
14184
- // - (condense mode) the whitespace is between two elements AND contains newline
14185
- if (!prev ||
14186
- !next ||
14187
- (shouldCondense &&
14188
- (prev.type === 3 /* NodeTypes.COMMENT */ ||
14189
- next.type === 3 /* NodeTypes.COMMENT */ ||
14190
- (prev.type === 1 /* NodeTypes.ELEMENT */ &&
14191
- next.type === 1 /* NodeTypes.ELEMENT */ &&
14192
- /[\r\n]/.test(node.content))))) {
14193
- removedWhitespace = true;
14194
- nodes[i] = null;
14163
+ if (node.type === 2 /* NodeTypes.TEXT */) {
14164
+ if (!context.inPre) {
14165
+ if (!/[^\t\r\n\f ]/.test(node.content)) {
14166
+ const prev = nodes[i - 1];
14167
+ const next = nodes[i + 1];
14168
+ // Remove if:
14169
+ // - the whitespace is the first or last node, or:
14170
+ // - (condense mode) the whitespace is adjacent to a comment, or:
14171
+ // - (condense mode) the whitespace is between two elements AND contains newline
14172
+ if (!prev ||
14173
+ !next ||
14174
+ (shouldCondense &&
14175
+ (prev.type === 3 /* NodeTypes.COMMENT */ ||
14176
+ next.type === 3 /* NodeTypes.COMMENT */ ||
14177
+ (prev.type === 1 /* NodeTypes.ELEMENT */ &&
14178
+ next.type === 1 /* NodeTypes.ELEMENT */ &&
14179
+ /[\r\n]/.test(node.content))))) {
14180
+ removedWhitespace = true;
14181
+ nodes[i] = null;
14182
+ }
14183
+ else {
14184
+ // Otherwise, the whitespace is condensed into a single space
14185
+ node.content = ' ';
14186
+ }
14195
14187
  }
14196
- else {
14197
- // Otherwise, the whitespace is condensed into a single space
14198
- node.content = ' ';
14188
+ else if (shouldCondense) {
14189
+ // in condense mode, consecutive whitespaces in text are condensed
14190
+ // down to a single space.
14191
+ node.content = node.content.replace(/[\t\r\n\f ]+/g, ' ');
14199
14192
  }
14200
14193
  }
14201
- else if (shouldCondense) {
14202
- // in condense mode, consecutive whitespaces in text are condensed
14203
- // down to a single space.
14204
- node.content = node.content.replace(/[\t\r\n\f ]+/g, ' ');
14194
+ else {
14195
+ // #6410 normalize windows newlines in <pre>:
14196
+ // in SSR, browsers normalize server-rendered \r\n into a single \n
14197
+ // in the DOM
14198
+ node.content = node.content.replace(/\r\n/g, '\n');
14205
14199
  }
14206
14200
  }
14207
14201
  // Remove comment nodes if desired by configuration.
@@ -14890,11 +14884,6 @@ function walk$1(node, context, doNotHoistNode = false) {
14890
14884
  }
14891
14885
  }
14892
14886
  }
14893
- else if (child.type === 12 /* NodeTypes.TEXT_CALL */ &&
14894
- getConstantType(child.content, context) >= 2 /* ConstantTypes.CAN_HOIST */) {
14895
- child.codegenNode = context.hoist(child.codegenNode);
14896
- hoistedCount++;
14897
- }
14898
14887
  // walk further
14899
14888
  if (child.type === 1 /* NodeTypes.ELEMENT */) {
14900
14889
  const isComponent = child.tagType === 1 /* ElementTypes.COMPONENT */;
@@ -16934,6 +16923,14 @@ function buildProps(node, context, props = node.props, isComponent, isDynamicCom
16934
16923
  let hasDynamicKeys = false;
16935
16924
  let hasVnodeHook = false;
16936
16925
  const dynamicPropNames = [];
16926
+ const pushMergeArg = (arg) => {
16927
+ if (properties.length) {
16928
+ mergeArgs.push(createObjectExpression(dedupeProperties(properties), elementLoc));
16929
+ properties = [];
16930
+ }
16931
+ if (arg)
16932
+ mergeArgs.push(arg);
16933
+ };
16937
16934
  const analyzePatchFlag = ({ key, value }) => {
16938
16935
  if (isStaticExp(key)) {
16939
16936
  const name = key.content;
@@ -17046,11 +17043,9 @@ function buildProps(node, context, props = node.props, isComponent, isDynamicCom
17046
17043
  if (!arg && (isVBind || isVOn)) {
17047
17044
  hasDynamicKeys = true;
17048
17045
  if (exp) {
17049
- if (properties.length) {
17050
- mergeArgs.push(createObjectExpression(dedupeProperties(properties), elementLoc));
17051
- properties = [];
17052
- }
17053
17046
  if (isVBind) {
17047
+ // have to merge early for compat build check
17048
+ pushMergeArg();
17054
17049
  {
17055
17050
  // 2.x v-bind object order compat
17056
17051
  if ((process.env.NODE_ENV !== 'production')) {
@@ -17084,7 +17079,7 @@ function buildProps(node, context, props = node.props, isComponent, isDynamicCom
17084
17079
  }
17085
17080
  else {
17086
17081
  // v-on="obj" -> toHandlers(obj)
17087
- mergeArgs.push({
17082
+ pushMergeArg({
17088
17083
  type: 14 /* NodeTypes.JS_CALL_EXPRESSION */,
17089
17084
  loc,
17090
17085
  callee: context.helper(TO_HANDLERS),
@@ -17104,7 +17099,12 @@ function buildProps(node, context, props = node.props, isComponent, isDynamicCom
17104
17099
  // has built-in directive transform.
17105
17100
  const { props, needRuntime } = directiveTransform(prop, node, context);
17106
17101
  !ssr && props.forEach(analyzePatchFlag);
17107
- properties.push(...props);
17102
+ if (isVOn && arg && !isStaticExp(arg)) {
17103
+ pushMergeArg(createObjectExpression(props, elementLoc));
17104
+ }
17105
+ else {
17106
+ properties.push(...props);
17107
+ }
17108
17108
  if (needRuntime) {
17109
17109
  runtimeDirectives.push(prop);
17110
17110
  if (isSymbol(needRuntime)) {
@@ -17126,9 +17126,8 @@ function buildProps(node, context, props = node.props, isComponent, isDynamicCom
17126
17126
  let propsExpression = undefined;
17127
17127
  // has v-bind="object" or v-on="object", wrap with mergeProps
17128
17128
  if (mergeArgs.length) {
17129
- if (properties.length) {
17130
- mergeArgs.push(createObjectExpression(dedupeProperties(properties), elementLoc));
17131
- }
17129
+ // close up any not-yet-merged props
17130
+ pushMergeArg();
17132
17131
  if (mergeArgs.length > 1) {
17133
17132
  propsExpression = createCallExpression(context.helper(MERGE_PROPS), mergeArgs, elementLoc);
17134
17133
  }