quasar 2.8.3 → 2.9.0
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.
- package/dist/api/QBreadcrumbsEl.json +52 -0
- package/dist/api/QBtn.json +41 -6
- package/dist/api/QBtnDropdown.json +9 -0
- package/dist/api/QChip.json +9 -0
- package/dist/api/QCircularProgress.json +6 -0
- package/dist/api/QEditor.json +7 -0
- package/dist/api/QExpansionItem.json +59 -0
- package/dist/api/QItem.json +52 -0
- package/dist/api/QRating.json +13 -0
- package/dist/api/QRouteTab.json +42 -6
- package/dist/api/QTable.json +2 -2
- package/dist/icon-set/bootstrap-icons.umd.prod.js +1 -1
- package/dist/icon-set/eva-icons.umd.prod.js +1 -1
- package/dist/icon-set/fontawesome-v5-pro.umd.prod.js +1 -1
- package/dist/icon-set/fontawesome-v5.umd.prod.js +1 -1
- package/dist/icon-set/fontawesome-v6-pro.umd.prod.js +1 -1
- package/dist/icon-set/fontawesome-v6.umd.prod.js +1 -1
- package/dist/icon-set/ionicons-v4.umd.prod.js +1 -1
- package/dist/icon-set/line-awesome.umd.prod.js +1 -1
- package/dist/icon-set/material-icons-outlined.umd.prod.js +1 -1
- package/dist/icon-set/material-icons-round.umd.prod.js +1 -1
- package/dist/icon-set/material-icons-sharp.umd.prod.js +1 -1
- package/dist/icon-set/material-icons.umd.prod.js +1 -1
- package/dist/icon-set/material-symbols-outlined.umd.prod.js +1 -1
- package/dist/icon-set/material-symbols-rounded.umd.prod.js +1 -1
- package/dist/icon-set/material-symbols-sharp.umd.prod.js +1 -1
- package/dist/icon-set/mdi-v3.umd.prod.js +1 -1
- package/dist/icon-set/mdi-v4.umd.prod.js +1 -1
- package/dist/icon-set/mdi-v5.umd.prod.js +1 -1
- package/dist/icon-set/mdi-v6.umd.prod.js +1 -1
- package/dist/icon-set/svg-bootstrap-icons.umd.prod.js +1 -1
- package/dist/icon-set/svg-eva-icons.umd.prod.js +1 -1
- package/dist/icon-set/svg-fontawesome-v5.umd.prod.js +1 -1
- package/dist/icon-set/svg-fontawesome-v6.umd.prod.js +1 -1
- package/dist/icon-set/svg-ionicons-v4.umd.prod.js +1 -1
- package/dist/icon-set/svg-ionicons-v5.umd.prod.js +1 -1
- package/dist/icon-set/svg-ionicons-v6.umd.prod.js +1 -1
- package/dist/icon-set/svg-line-awesome.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-icons-outlined.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-icons-round.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-icons-sharp.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-icons.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-symbols-outlined.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-symbols-rounded.umd.prod.js +1 -1
- package/dist/icon-set/svg-material-symbols-sharp.umd.prod.js +1 -1
- package/dist/icon-set/svg-mdi-v6.umd.prod.js +1 -1
- package/dist/icon-set/svg-themify.umd.prod.js +1 -1
- package/dist/icon-set/themify.umd.prod.js +1 -1
- package/dist/lang/ar-TN.umd.prod.js +2 -2
- package/dist/lang/ar.umd.prod.js +2 -2
- package/dist/lang/az-Latn.umd.prod.js +2 -2
- package/dist/lang/bg.umd.prod.js +2 -2
- package/dist/lang/bn.umd.prod.js +2 -2
- package/dist/lang/ca.umd.prod.js +2 -2
- package/dist/lang/cs.umd.prod.js +2 -2
- package/dist/lang/da.umd.prod.js +2 -2
- package/dist/lang/de.umd.prod.js +2 -2
- package/dist/lang/el.umd.prod.js +2 -2
- package/dist/lang/en-GB.umd.prod.js +2 -2
- package/dist/lang/en-US.umd.prod.js +2 -2
- package/dist/lang/eo.umd.prod.js +2 -2
- package/dist/lang/es.umd.prod.js +2 -2
- package/dist/lang/et.umd.prod.js +2 -2
- package/dist/lang/eu.umd.prod.js +2 -2
- package/dist/lang/fa-IR.umd.prod.js +2 -2
- package/dist/lang/fa.umd.prod.js +2 -2
- package/dist/lang/fi.umd.prod.js +2 -2
- package/dist/lang/fr.umd.prod.js +2 -2
- package/dist/lang/gn.umd.prod.js +2 -2
- package/dist/lang/he.umd.prod.js +2 -2
- package/dist/lang/hr.umd.prod.js +2 -2
- package/dist/lang/hu.umd.prod.js +2 -2
- package/dist/lang/id.umd.prod.js +2 -2
- package/dist/lang/is.umd.prod.js +2 -2
- package/dist/lang/it.umd.prod.js +2 -2
- package/dist/lang/ja.umd.prod.js +2 -2
- package/dist/lang/km.umd.prod.js +2 -2
- package/dist/lang/ko-KR.umd.prod.js +2 -2
- package/dist/lang/kur-CKB.umd.prod.js +2 -2
- package/dist/lang/kz.umd.prod.js +2 -2
- package/dist/lang/lt.umd.prod.js +2 -2
- package/dist/lang/lu.umd.prod.js +2 -2
- package/dist/lang/lv.umd.prod.js +2 -2
- package/dist/lang/ml.umd.prod.js +2 -2
- package/dist/lang/mm.umd.prod.js +2 -2
- package/dist/lang/ms.umd.prod.js +2 -2
- package/dist/lang/my.umd.prod.js +2 -2
- package/dist/lang/nb-NO.umd.prod.js +2 -2
- package/dist/lang/nl.umd.prod.js +2 -2
- package/dist/lang/pl.umd.prod.js +2 -2
- package/dist/lang/pt-BR.umd.prod.js +2 -2
- package/dist/lang/pt.umd.prod.js +2 -2
- package/dist/lang/ro.umd.prod.js +2 -2
- package/dist/lang/ru.umd.prod.js +2 -2
- package/dist/lang/sk.umd.prod.js +2 -2
- package/dist/lang/sl.umd.prod.js +2 -2
- package/dist/lang/sm.umd.prod.js +2 -2
- package/dist/lang/sr-CYR.umd.prod.js +2 -2
- package/dist/lang/sr.umd.prod.js +2 -2
- package/dist/lang/sv.umd.prod.js +2 -2
- package/dist/lang/ta.umd.prod.js +2 -2
- package/dist/lang/th.umd.prod.js +2 -2
- package/dist/lang/tr.umd.prod.js +2 -2
- package/dist/lang/ug.umd.prod.js +2 -2
- package/dist/lang/uk.umd.prod.js +2 -2
- package/dist/lang/uz-Cyrl.umd.prod.js +2 -2
- package/dist/lang/uz-Latn.umd.prod.js +2 -2
- package/dist/lang/vi.umd.prod.js +2 -2
- package/dist/lang/zh-CN.umd.prod.js +2 -2
- package/dist/lang/zh-TW.umd.prod.js +2 -2
- package/dist/quasar.cjs.prod.js +2 -2
- package/dist/quasar.esm.js +16157 -15723
- package/dist/quasar.esm.prod.js +2 -2
- package/dist/quasar.sass +1 -1
- package/dist/quasar.umd.js +16290 -15854
- package/dist/quasar.umd.prod.js +2 -2
- package/dist/transforms/import-map.json +2 -0
- package/dist/types/api/qeditor.d.ts +17 -0
- package/dist/types/api/qloading.d.ts +5 -0
- package/dist/types/api.d.ts +2 -0
- package/dist/types/index.d.ts +133 -9
- package/dist/types/utils/is.d.ts +67 -0
- package/dist/types/utils/run-sequential-promises.d.ts +119 -0
- package/dist/types/utils.d.ts +9 -0
- package/dist/vetur/quasar-attributes.json +25 -1
- package/dist/vetur/quasar-tags.json +7 -1
- package/dist/web-types/web-types.json +108 -10
- package/lang/ar-TN.js +3 -1
- package/lang/ar-TN.mjs +3 -1
- package/lang/ar.js +3 -1
- package/lang/ar.mjs +3 -1
- package/lang/az-Latn.js +3 -1
- package/lang/az-Latn.mjs +3 -1
- package/lang/bg.js +3 -1
- package/lang/bg.mjs +3 -1
- package/lang/bn.js +3 -1
- package/lang/bn.mjs +3 -1
- package/lang/ca.js +3 -1
- package/lang/ca.mjs +3 -1
- package/lang/cs.js +3 -1
- package/lang/cs.mjs +3 -1
- package/lang/da.js +3 -1
- package/lang/da.mjs +3 -1
- package/lang/de.js +3 -1
- package/lang/de.mjs +3 -1
- package/lang/el.js +3 -1
- package/lang/el.mjs +3 -1
- package/lang/en-GB.js +3 -1
- package/lang/en-GB.mjs +3 -1
- package/lang/en-US.js +3 -1
- package/lang/en-US.mjs +3 -1
- package/lang/eo.js +3 -1
- package/lang/eo.mjs +3 -1
- package/lang/es.js +3 -1
- package/lang/es.mjs +3 -1
- package/lang/et.js +3 -1
- package/lang/et.mjs +3 -1
- package/lang/eu.js +3 -1
- package/lang/eu.mjs +3 -1
- package/lang/fa-IR.js +5 -3
- package/lang/fa-IR.mjs +5 -3
- package/lang/fa.js +5 -3
- package/lang/fa.mjs +5 -3
- package/lang/fi.js +3 -1
- package/lang/fi.mjs +3 -1
- package/lang/fr.js +3 -1
- package/lang/fr.mjs +3 -1
- package/lang/gn.js +3 -1
- package/lang/gn.mjs +3 -1
- package/lang/he.js +3 -1
- package/lang/he.mjs +3 -1
- package/lang/hr.js +3 -1
- package/lang/hr.mjs +3 -1
- package/lang/hu.js +3 -1
- package/lang/hu.mjs +3 -1
- package/lang/id.js +3 -1
- package/lang/id.mjs +3 -1
- package/lang/is.js +3 -1
- package/lang/is.mjs +3 -1
- package/lang/it.js +3 -1
- package/lang/it.mjs +3 -1
- package/lang/ja.js +3 -1
- package/lang/ja.mjs +3 -1
- package/lang/km.js +3 -1
- package/lang/km.mjs +3 -1
- package/lang/ko-KR.js +3 -1
- package/lang/ko-KR.mjs +3 -1
- package/lang/kur-CKB.js +3 -1
- package/lang/kur-CKB.mjs +3 -1
- package/lang/kz.js +3 -1
- package/lang/kz.mjs +3 -1
- package/lang/lt.js +3 -1
- package/lang/lt.mjs +3 -1
- package/lang/lu.js +3 -1
- package/lang/lu.mjs +3 -1
- package/lang/lv.js +3 -1
- package/lang/lv.mjs +3 -1
- package/lang/ml.js +3 -1
- package/lang/ml.mjs +3 -1
- package/lang/mm.js +4 -1
- package/lang/mm.mjs +4 -1
- package/lang/ms.js +3 -1
- package/lang/ms.mjs +3 -1
- package/lang/my.js +3 -1
- package/lang/my.mjs +3 -1
- package/lang/nb-NO.js +3 -1
- package/lang/nb-NO.mjs +3 -1
- package/lang/nl.js +3 -1
- package/lang/nl.mjs +3 -1
- package/lang/pl.js +3 -1
- package/lang/pl.mjs +3 -1
- package/lang/pt-BR.js +3 -1
- package/lang/pt-BR.mjs +3 -1
- package/lang/pt.js +3 -1
- package/lang/pt.mjs +3 -1
- package/lang/ro.js +3 -1
- package/lang/ro.mjs +3 -1
- package/lang/ru.js +3 -1
- package/lang/ru.mjs +3 -1
- package/lang/sk.js +3 -1
- package/lang/sk.mjs +3 -1
- package/lang/sl.js +3 -1
- package/lang/sl.mjs +3 -1
- package/lang/sm.js +3 -1
- package/lang/sm.mjs +3 -1
- package/lang/sr-CYR.js +3 -1
- package/lang/sr-CYR.mjs +3 -1
- package/lang/sr.js +3 -1
- package/lang/sr.mjs +3 -1
- package/lang/sv.js +3 -1
- package/lang/sv.mjs +3 -1
- package/lang/ta.js +3 -1
- package/lang/ta.mjs +3 -1
- package/lang/th.js +3 -1
- package/lang/th.mjs +3 -1
- package/lang/tr.js +3 -1
- package/lang/tr.mjs +3 -1
- package/lang/ug.js +5 -3
- package/lang/ug.mjs +5 -3
- package/lang/uk.js +3 -1
- package/lang/uk.mjs +3 -1
- package/lang/uz-Cyrl.js +3 -1
- package/lang/uz-Cyrl.mjs +3 -1
- package/lang/uz-Latn.js +3 -1
- package/lang/uz-Latn.mjs +3 -1
- package/lang/vi.js +3 -1
- package/lang/vi.mjs +3 -1
- package/lang/zh-CN.js +3 -1
- package/lang/zh-CN.mjs +3 -1
- package/lang/zh-TW.js +3 -1
- package/lang/zh-TW.mjs +3 -1
- package/package.json +6 -5
- package/src/components/breadcrumbs/QBreadcrumbsEl.js +6 -7
- package/src/components/breadcrumbs/QBreadcrumbsEl.json +53 -0
- package/src/components/btn/QBtn.js +19 -19
- package/src/components/btn/QBtn.json +41 -6
- package/src/components/btn/use-btn.js +6 -4
- package/src/components/btn-dropdown/QBtnDropdown.js +10 -2
- package/src/components/btn-dropdown/QBtnDropdown.json +8 -0
- package/src/components/checkbox/QCheckbox.js +1 -2
- package/src/components/checkbox/use-checkbox.js +2 -1
- package/src/components/chip/QChip.js +9 -2
- package/src/components/chip/QChip.json +8 -0
- package/src/components/chip/__tests__/QChip.spec.js +359 -46
- package/src/components/circular-progress/QCircularProgress.js +4 -2
- package/src/components/circular-progress/QCircularProgress.json +7 -0
- package/src/components/circular-progress/use-circular-progress.js +1 -0
- package/src/components/dialog/QDialog.js +7 -4
- package/src/components/drawer/QDrawer.js +7 -4
- package/src/components/editor/QEditor.json +9 -0
- package/src/components/expansion-item/QExpansionItem.js +37 -8
- package/src/components/expansion-item/QExpansionItem.json +67 -0
- package/src/components/fab/QFab.js +20 -1
- package/src/components/form/QForm.js +35 -40
- package/src/components/form/QFormChildMixin.js +3 -1
- package/src/components/item/QItem.js +4 -5
- package/src/components/item/QItem.json +53 -0
- package/src/components/menu/QMenu.js +5 -5
- package/src/components/menu/__tests__/QMenu.spec.js +7 -0
- package/src/components/page/QPage.js +1 -1
- package/src/components/popup-edit/QPopupEdit.js +2 -5
- package/src/components/radio/QRadio.js +3 -3
- package/src/components/rating/QRating.js +48 -10
- package/src/components/rating/QRating.json +11 -0
- package/src/components/select/QSelect.js +1 -4
- package/src/components/stepper/QStep.js +5 -3
- package/src/components/table/QTable.js +4 -6
- package/src/components/table/QTable.json +2 -2
- package/src/components/tabs/QRouteTab.js +6 -4
- package/src/components/tabs/QRouteTab.json +42 -6
- package/src/components/tabs/QTabs.js +188 -107
- package/src/components/tabs/use-tab.js +62 -38
- package/src/components/time/QTime.js +2 -2
- package/src/components/tooltip/QTooltip.js +7 -13
- package/src/components/tree/QTree.js +1 -1
- package/src/components/uploader/uploader-core.js +2 -3
- package/src/composables/private/__tests__/use-model-toggle.spec.js +2 -0
- package/src/composables/private/__tests__/use-transition.spec.js +4 -0
- package/src/composables/private/use-file.js +1 -1
- package/src/composables/private/use-router-link.js +80 -43
- package/src/composables/private/use-tick.js +15 -9
- package/src/composables/private/use-timeout.js +20 -7
- package/src/composables/private/use-validate.js +7 -13
- package/src/composables/use-form-child.js +6 -4
- package/src/directives/TouchPan.js +1 -1
- package/src/directives/TouchRepeat.js +1 -1
- package/src/directives/TouchSwipe.js +1 -1
- package/src/utils/EventBus.js +64 -0
- package/src/utils/extend.js +19 -19
- package/src/utils/private/inject-obj-prop.js +2 -0
- package/src/utils/private/rtl.js +10 -7
- package/src/utils/private/vm.js +4 -0
- package/src/utils/run-sequential-promises.js +115 -0
- package/src/utils.js +4 -0
|
@@ -93,7 +93,7 @@ export default createComponent({
|
|
|
93
93
|
const hideOnRouteChange = computed(() => props.persistent !== true)
|
|
94
94
|
|
|
95
95
|
const { registerTick, removeTick } = useTick()
|
|
96
|
-
const { registerTimeout
|
|
96
|
+
const { registerTimeout } = useTimeout()
|
|
97
97
|
const { transition, transitionStyle } = useTransition(props, showing)
|
|
98
98
|
const { localScrollTarget, changeScrollEvent, unconfigureScrollTarget } = useScrollTarget(props, configureScrollTarget)
|
|
99
99
|
|
|
@@ -147,11 +147,9 @@ export default createComponent({
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
function handleShow (evt) {
|
|
150
|
-
removeTick()
|
|
151
|
-
removeTimeout()
|
|
152
|
-
|
|
153
150
|
showPortal()
|
|
154
151
|
|
|
152
|
+
// should removeTick() if this gets removed
|
|
155
153
|
registerTick(() => {
|
|
156
154
|
observer = new MutationObserver(() => updatePosition())
|
|
157
155
|
observer.observe(innerRef.value, { attributes: false, childList: true, characterData: true, subtree: true })
|
|
@@ -166,6 +164,7 @@ export default createComponent({
|
|
|
166
164
|
)
|
|
167
165
|
}
|
|
168
166
|
|
|
167
|
+
// should removeTimeout() if this gets removed
|
|
169
168
|
registerTimeout(() => {
|
|
170
169
|
showPortal(true) // done showing portal
|
|
171
170
|
emit('show', evt)
|
|
@@ -174,11 +173,11 @@ export default createComponent({
|
|
|
174
173
|
|
|
175
174
|
function handleHide (evt) {
|
|
176
175
|
removeTick()
|
|
177
|
-
removeTimeout()
|
|
178
176
|
hidePortal()
|
|
179
177
|
|
|
180
178
|
anchorCleanup()
|
|
181
179
|
|
|
180
|
+
// should removeTimeout() if this gets removed
|
|
182
181
|
registerTimeout(() => {
|
|
183
182
|
hidePortal(true) // done hiding, now destroy
|
|
184
183
|
emit('hide', evt)
|
|
@@ -230,14 +229,10 @@ export default createComponent({
|
|
|
230
229
|
addEvt(anchorEvents, 'tooltipTemp', evts)
|
|
231
230
|
}
|
|
232
231
|
|
|
233
|
-
registerTimeout(() => {
|
|
234
|
-
show(evt)
|
|
235
|
-
}, props.delay)
|
|
232
|
+
registerTimeout(() => { show(evt) }, props.delay)
|
|
236
233
|
}
|
|
237
234
|
|
|
238
235
|
function delayHide (evt) {
|
|
239
|
-
removeTimeout()
|
|
240
|
-
|
|
241
236
|
if ($q.platform.is.mobile === true) {
|
|
242
237
|
cleanEvt(anchorEvents, 'tooltipTemp')
|
|
243
238
|
clearSelection()
|
|
@@ -247,9 +242,8 @@ export default createComponent({
|
|
|
247
242
|
}, 10)
|
|
248
243
|
}
|
|
249
244
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
}, props.hideDelay)
|
|
245
|
+
// should removeTimeout() if this gets removed
|
|
246
|
+
registerTimeout(() => { hide(evt) }, props.hideDelay)
|
|
253
247
|
}
|
|
254
248
|
|
|
255
249
|
function configureAnchorEl () {
|
|
@@ -620,7 +620,7 @@ export default createComponent({
|
|
|
620
620
|
emit('update:selected', meta.key !== props.selected ? meta.key : null)
|
|
621
621
|
}
|
|
622
622
|
else if (meta.key !== props.selected) {
|
|
623
|
-
emit('update:selected', meta.key
|
|
623
|
+
emit('update:selected', meta.key === void 0 ? null : meta.key)
|
|
624
624
|
}
|
|
625
625
|
}
|
|
626
626
|
else {
|
|
@@ -12,6 +12,7 @@ import { stop } from '../../utils/event.js'
|
|
|
12
12
|
import { humanStorageSize } from '../../utils/format.js'
|
|
13
13
|
import { uploaderKey } from '../../utils/private/symbols.js'
|
|
14
14
|
import { injectProp, injectMultipleProps } from '../../utils/private/inject-obj-prop.js'
|
|
15
|
+
import { vmIsDestroyed } from '../../utils/private/vm.js'
|
|
15
16
|
|
|
16
17
|
function getProgressLabel (p) {
|
|
17
18
|
return (p * 100).toFixed(2) + '%'
|
|
@@ -90,9 +91,7 @@ export function getRenderer (getPlugin) {
|
|
|
90
91
|
uploadedSize: ref(0),
|
|
91
92
|
|
|
92
93
|
updateFileStatus,
|
|
93
|
-
isAlive ()
|
|
94
|
-
return vm.isDeactivated !== true && vm.isUnmounted !== true
|
|
95
|
-
}
|
|
94
|
+
isAlive: () => vmIsDestroyed(vm) === false
|
|
96
95
|
}
|
|
97
96
|
|
|
98
97
|
const {
|
|
@@ -79,6 +79,7 @@ describe('use-model-toggle API', () => {
|
|
|
79
79
|
expect(fn).not.to.be.called
|
|
80
80
|
cy.dataCy('wrapper')
|
|
81
81
|
.click()
|
|
82
|
+
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
|
82
83
|
cy.dataCy('menu')
|
|
83
84
|
.should('exist')
|
|
84
85
|
.wait(300) // Await menu animation
|
|
@@ -99,6 +100,7 @@ describe('use-model-toggle API', () => {
|
|
|
99
100
|
cy.dataCy('wrapper')
|
|
100
101
|
cy.dataCy('method-show')
|
|
101
102
|
.click({ force: true }) // Element is hidden to prevent clogging the window
|
|
103
|
+
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
|
102
104
|
cy.dataCy('menu')
|
|
103
105
|
.should('exist')
|
|
104
106
|
.wait(300) // Await menu animation
|
|
@@ -61,6 +61,7 @@ describe('use-transition API', () => {
|
|
|
61
61
|
describe('(prop): transition-duration', () => {
|
|
62
62
|
it('should be done with transitioning after 300ms passed', () => {
|
|
63
63
|
mount(WrapperOne)
|
|
64
|
+
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
|
64
65
|
cy.dataCy('wrapper')
|
|
65
66
|
.click()
|
|
66
67
|
.wait(300)
|
|
@@ -70,6 +71,7 @@ describe('use-transition API', () => {
|
|
|
70
71
|
|
|
71
72
|
it('should not be done with transitioning before 300ms passed', () => {
|
|
72
73
|
mount(WrapperOne)
|
|
74
|
+
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
|
73
75
|
cy.dataCy('wrapper')
|
|
74
76
|
.click()
|
|
75
77
|
.wait(200) // Commands take some time so a high value can fail, just take a decent margin
|
|
@@ -83,6 +85,7 @@ describe('use-transition API', () => {
|
|
|
83
85
|
transitionDuration: 1000
|
|
84
86
|
}
|
|
85
87
|
})
|
|
88
|
+
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
|
86
89
|
cy.dataCy('wrapper')
|
|
87
90
|
.click()
|
|
88
91
|
.wait(1000)
|
|
@@ -96,6 +99,7 @@ describe('use-transition API', () => {
|
|
|
96
99
|
transitionDuration: 1000
|
|
97
100
|
}
|
|
98
101
|
})
|
|
102
|
+
// eslint-disable-next-line cypress/no-unnecessary-waiting
|
|
99
103
|
cy.dataCy('wrapper')
|
|
100
104
|
.click()
|
|
101
105
|
.wait(900)
|
|
@@ -129,7 +129,7 @@ export default function ({
|
|
|
129
129
|
file.__key = file.webkitRelativePath + file.lastModified + file.name + file.size
|
|
130
130
|
})
|
|
131
131
|
|
|
132
|
-
if (append
|
|
132
|
+
if (append === true) {
|
|
133
133
|
// Avoid duplicate files
|
|
134
134
|
const filenameMap = currentFileList.map(entry => entry.__key)
|
|
135
135
|
files = filterFiles(files, rejectedFiles, 'duplicate', file => {
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
|
|
6
6
|
import { computed, getCurrentInstance } from 'vue'
|
|
7
7
|
|
|
8
|
-
import { prevent } from '../../utils/event.js'
|
|
9
8
|
import { vmHasRouter } from '../../utils/private/vm.js'
|
|
10
9
|
|
|
11
10
|
// Get the original path value of a record by following its aliasOf
|
|
@@ -102,30 +101,34 @@ export const useRouterLinkProps = {
|
|
|
102
101
|
|
|
103
102
|
// external props: type, tag
|
|
104
103
|
|
|
105
|
-
export default function (fallbackTag) {
|
|
104
|
+
export default function ({ fallbackTag, useDisableForRouterLinkProps = true } = {}) {
|
|
106
105
|
const vm = getCurrentInstance()
|
|
107
|
-
const { props, proxy } = vm
|
|
106
|
+
const { props, proxy, emit } = vm
|
|
108
107
|
|
|
109
108
|
const hasRouter = vmHasRouter(vm)
|
|
110
109
|
const hasHrefLink = computed(() => props.disable !== true && props.href !== void 0)
|
|
111
110
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
111
|
+
// for perf reasons, we use minimum amount of runtime work
|
|
112
|
+
const hasRouterLinkProps = useDisableForRouterLinkProps === true
|
|
113
|
+
? computed(() =>
|
|
114
|
+
hasRouter === true
|
|
115
|
+
&& props.disable !== true
|
|
116
|
+
&& hasHrefLink.value !== true
|
|
117
|
+
&& props.to !== void 0 && props.to !== null && props.to !== ''
|
|
118
|
+
)
|
|
119
|
+
: computed(() =>
|
|
120
|
+
hasRouter === true
|
|
121
|
+
&& hasHrefLink.value !== true
|
|
122
|
+
&& props.to !== void 0 && props.to !== null && props.to !== ''
|
|
123
|
+
)
|
|
124
124
|
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
const resolvedLink = computed(() => (
|
|
126
|
+
hasRouterLinkProps.value === true
|
|
127
|
+
? getLink(props.to)
|
|
128
|
+
: null
|
|
129
|
+
))
|
|
127
130
|
|
|
128
|
-
const hasRouterLink = computed(() =>
|
|
131
|
+
const hasRouterLink = computed(() => resolvedLink.value !== null)
|
|
129
132
|
const hasLink = computed(() => hasHrefLink.value === true || hasRouterLink.value === true)
|
|
130
133
|
|
|
131
134
|
const linkTag = computed(() => (
|
|
@@ -134,7 +137,7 @@ export default function (fallbackTag) {
|
|
|
134
137
|
: (props.tag || fallbackTag || 'div')
|
|
135
138
|
))
|
|
136
139
|
|
|
137
|
-
const
|
|
140
|
+
const linkAttrs = computed(() => (
|
|
138
141
|
hasHrefLink.value === true
|
|
139
142
|
? {
|
|
140
143
|
href: props.href,
|
|
@@ -143,7 +146,7 @@ export default function (fallbackTag) {
|
|
|
143
146
|
: (
|
|
144
147
|
hasRouterLink.value === true
|
|
145
148
|
? {
|
|
146
|
-
href:
|
|
149
|
+
href: resolvedLink.value.href,
|
|
147
150
|
target: props.target
|
|
148
151
|
}
|
|
149
152
|
: {}
|
|
@@ -152,11 +155,11 @@ export default function (fallbackTag) {
|
|
|
152
155
|
|
|
153
156
|
const linkActiveIndex = computed(() => {
|
|
154
157
|
if (hasRouterLink.value === false) {
|
|
155
|
-
return
|
|
158
|
+
return -1
|
|
156
159
|
}
|
|
157
160
|
|
|
158
161
|
const
|
|
159
|
-
{ matched } =
|
|
162
|
+
{ matched } = resolvedLink.value,
|
|
160
163
|
{ length } = matched,
|
|
161
164
|
routeMatched = matched[ length - 1 ]
|
|
162
165
|
|
|
@@ -199,14 +202,14 @@ export default function (fallbackTag) {
|
|
|
199
202
|
|
|
200
203
|
const linkIsActive = computed(() =>
|
|
201
204
|
hasRouterLink.value === true
|
|
202
|
-
&& linkActiveIndex.value
|
|
203
|
-
&& includesParams(proxy.$route.params,
|
|
205
|
+
&& linkActiveIndex.value !== -1
|
|
206
|
+
&& includesParams(proxy.$route.params, resolvedLink.value.params)
|
|
204
207
|
)
|
|
205
208
|
|
|
206
209
|
const linkIsExactActive = computed(() =>
|
|
207
210
|
linkIsActive.value === true
|
|
208
211
|
&& linkActiveIndex.value === proxy.$route.matched.length - 1
|
|
209
|
-
&& isSameRouteLocationParams(proxy.$route.params,
|
|
212
|
+
&& isSameRouteLocationParams(proxy.$route.params, resolvedLink.value.params)
|
|
210
213
|
)
|
|
211
214
|
|
|
212
215
|
const linkClass = computed(() => (
|
|
@@ -223,32 +226,64 @@ export default function (fallbackTag) {
|
|
|
223
226
|
: ''
|
|
224
227
|
))
|
|
225
228
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
229
|
+
function getLink (to) {
|
|
230
|
+
try { return proxy.$router.resolve(to) }
|
|
231
|
+
catch (_) {}
|
|
232
|
+
|
|
233
|
+
return null
|
|
234
|
+
}
|
|
231
235
|
|
|
232
|
-
|
|
233
|
-
|
|
236
|
+
/**
|
|
237
|
+
* @returns Promise<RouterError | false | undefined>
|
|
238
|
+
*/
|
|
239
|
+
function navigateToRouterLink (
|
|
240
|
+
e,
|
|
241
|
+
{ returnRouterError, to = props.to, replace = props.replace } = {}
|
|
242
|
+
) {
|
|
243
|
+
if (props.disable === true) {
|
|
244
|
+
// ensure native navigation is prevented in all cases,
|
|
245
|
+
// like when useDisableForRouterLinkProps === false (QRouteTab)
|
|
246
|
+
e.preventDefault()
|
|
247
|
+
return Promise.resolve(false)
|
|
248
|
+
}
|
|
234
249
|
|
|
235
|
-
|
|
236
|
-
//
|
|
237
|
-
|
|
250
|
+
if (
|
|
251
|
+
// don't redirect with control keys;
|
|
252
|
+
// should match RouterLink from Vue Router
|
|
253
|
+
e.metaKey || e.altKey || e.ctrlKey || e.shiftKey
|
|
238
254
|
|
|
239
255
|
// don't redirect on right click
|
|
240
|
-
|| (e.button !==
|
|
256
|
+
|| (e.button !== void 0 && e.button !== 0)
|
|
241
257
|
|
|
242
258
|
// don't redirect if it should open in a new window
|
|
243
259
|
|| props.target === '_blank'
|
|
244
260
|
) {
|
|
245
|
-
return false
|
|
261
|
+
return Promise.resolve(false)
|
|
246
262
|
}
|
|
247
263
|
|
|
248
|
-
|
|
264
|
+
// hinder the native navigation
|
|
265
|
+
e.preventDefault()
|
|
266
|
+
|
|
267
|
+
// then() can also return a "soft" router error (Vue Router behavior)
|
|
268
|
+
const promise = proxy.$router[ replace === true ? 'replace' : 'push' ](to)
|
|
249
269
|
|
|
250
|
-
return
|
|
251
|
-
|
|
270
|
+
return returnRouterError === true
|
|
271
|
+
? promise
|
|
272
|
+
// else catching hard errors and also "soft" ones - then(err => ...)
|
|
273
|
+
: promise.then(() => {}).catch(() => {})
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// warning! ensure that the component using it has 'click' included in its 'emits' definition prop
|
|
277
|
+
function navigateOnClick (e) {
|
|
278
|
+
if (hasRouterLink.value === true) {
|
|
279
|
+
const go = opts => navigateToRouterLink(e, opts)
|
|
280
|
+
|
|
281
|
+
emit('click', e, go)
|
|
282
|
+
e.defaultPrevented !== true && go()
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
emit('click', e)
|
|
286
|
+
}
|
|
252
287
|
}
|
|
253
288
|
|
|
254
289
|
return {
|
|
@@ -257,12 +292,14 @@ export default function (fallbackTag) {
|
|
|
257
292
|
hasLink,
|
|
258
293
|
|
|
259
294
|
linkTag,
|
|
260
|
-
|
|
295
|
+
resolvedLink,
|
|
261
296
|
linkIsActive,
|
|
262
297
|
linkIsExactActive,
|
|
263
298
|
linkClass,
|
|
264
|
-
|
|
299
|
+
linkAttrs,
|
|
265
300
|
|
|
266
|
-
|
|
301
|
+
getLink,
|
|
302
|
+
navigateToRouterLink,
|
|
303
|
+
navigateOnClick
|
|
267
304
|
}
|
|
268
305
|
}
|
|
@@ -1,32 +1,38 @@
|
|
|
1
|
-
import { nextTick, onBeforeUnmount } from 'vue'
|
|
1
|
+
import { nextTick, onDeactivated, onBeforeUnmount, getCurrentInstance } from 'vue'
|
|
2
|
+
|
|
3
|
+
import { vmIsDestroyed } from '../../utils/private/vm'
|
|
2
4
|
|
|
3
5
|
/*
|
|
4
6
|
* Usage:
|
|
5
7
|
* registerTick(fn)
|
|
6
|
-
*
|
|
8
|
+
* removeTick()
|
|
7
9
|
*/
|
|
8
10
|
|
|
9
11
|
export default function () {
|
|
10
12
|
let tickFn
|
|
13
|
+
const vm = getCurrentInstance()
|
|
11
14
|
|
|
12
|
-
|
|
15
|
+
function removeTick () {
|
|
13
16
|
tickFn = void 0
|
|
14
|
-
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
onDeactivated(removeTick)
|
|
20
|
+
onBeforeUnmount(removeTick)
|
|
15
21
|
|
|
16
22
|
return {
|
|
23
|
+
removeTick,
|
|
24
|
+
|
|
17
25
|
registerTick (fn) {
|
|
18
26
|
tickFn = fn
|
|
19
27
|
|
|
20
28
|
nextTick(() => {
|
|
21
29
|
if (tickFn === fn) {
|
|
22
|
-
|
|
30
|
+
// we also check if VM is destroyed, since if it
|
|
31
|
+
// got to trigger one nextTick() we cannot stop it
|
|
32
|
+
vmIsDestroyed(vm) === false && tickFn()
|
|
23
33
|
tickFn = void 0
|
|
24
34
|
}
|
|
25
35
|
})
|
|
26
|
-
},
|
|
27
|
-
|
|
28
|
-
removeTick () {
|
|
29
|
-
tickFn = void 0
|
|
30
36
|
}
|
|
31
37
|
}
|
|
32
38
|
}
|
|
@@ -1,20 +1,33 @@
|
|
|
1
|
-
import { onBeforeUnmount } from 'vue'
|
|
1
|
+
import { onDeactivated, onBeforeUnmount, getCurrentInstance } from 'vue'
|
|
2
|
+
|
|
3
|
+
import { vmIsDestroyed } from '../../utils/private/vm'
|
|
4
|
+
|
|
5
|
+
/*
|
|
6
|
+
* Usage:
|
|
7
|
+
* registerTimeout(fn[, delay])
|
|
8
|
+
* removeTimeout()
|
|
9
|
+
*/
|
|
2
10
|
|
|
3
11
|
export default function () {
|
|
4
12
|
let timer
|
|
13
|
+
const vm = getCurrentInstance()
|
|
5
14
|
|
|
6
|
-
|
|
15
|
+
function removeTimeout () {
|
|
7
16
|
clearTimeout(timer)
|
|
8
|
-
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
onDeactivated(removeTimeout)
|
|
20
|
+
onBeforeUnmount(removeTimeout)
|
|
9
21
|
|
|
10
22
|
return {
|
|
23
|
+
removeTimeout,
|
|
24
|
+
|
|
11
25
|
registerTimeout (fn, delay) {
|
|
12
26
|
clearTimeout(timer)
|
|
13
|
-
timer = setTimeout(fn, delay)
|
|
14
|
-
},
|
|
15
27
|
|
|
16
|
-
|
|
17
|
-
|
|
28
|
+
if (vmIsDestroyed(vm) === false) {
|
|
29
|
+
timer = setTimeout(fn, delay)
|
|
30
|
+
}
|
|
18
31
|
}
|
|
19
32
|
}
|
|
20
33
|
}
|
|
@@ -2,7 +2,7 @@ import { ref, computed, watch, onBeforeUnmount, getCurrentInstance } from 'vue'
|
|
|
2
2
|
|
|
3
3
|
import useFormChild from '../use-form-child.js'
|
|
4
4
|
import { testPattern } from '../../utils/patterns.js'
|
|
5
|
-
import
|
|
5
|
+
import debounce from '../../utils/debounce.js'
|
|
6
6
|
import { injectProp } from '../../utils/private/inject-obj-prop.js'
|
|
7
7
|
|
|
8
8
|
const lazyRulesValues = [ true, false, 'ondemand' ]
|
|
@@ -119,21 +119,15 @@ export default function (focused, innerLoading) {
|
|
|
119
119
|
|
|
120
120
|
const index = ++validateIndex
|
|
121
121
|
|
|
122
|
-
|
|
123
|
-
isDirtyModel.value = true
|
|
124
|
-
|
|
122
|
+
const setDirty = innerLoading.value !== true
|
|
123
|
+
? () => { isDirtyModel.value = true }
|
|
124
|
+
: () => {}
|
|
125
125
|
|
|
126
126
|
const update = (err, msg) => {
|
|
127
|
-
|
|
128
|
-
innerError.value = err
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
const m = msg || void 0
|
|
132
|
-
|
|
133
|
-
if (innerErrorMessage.value !== m) {
|
|
134
|
-
innerErrorMessage.value = m
|
|
135
|
-
}
|
|
127
|
+
err === true && setDirty()
|
|
136
128
|
|
|
129
|
+
innerError.value = err
|
|
130
|
+
innerErrorMessage.value = msg || null
|
|
137
131
|
innerLoading.value = false
|
|
138
132
|
}
|
|
139
133
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { inject, watch,
|
|
1
|
+
import { inject, watch, getCurrentInstance, onMounted, onBeforeUnmount } from 'vue'
|
|
2
2
|
|
|
3
3
|
import { formKey } from '../utils/private/symbols.js'
|
|
4
4
|
|
|
@@ -21,11 +21,13 @@ export default function ({ validate, resetValidation, requiresQForm }) {
|
|
|
21
21
|
}
|
|
22
22
|
})
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
onMounted(() => {
|
|
25
|
+
// register to parent QForm
|
|
26
|
+
props.disable !== true && $form.bindComponent(proxy)
|
|
27
|
+
})
|
|
26
28
|
|
|
27
29
|
onBeforeUnmount(() => {
|
|
28
|
-
//
|
|
30
|
+
// un-register from parent QForm
|
|
29
31
|
props.disable !== true && $form.unbindComponent(proxy)
|
|
30
32
|
})
|
|
31
33
|
}
|
|
@@ -388,7 +388,7 @@ export default createDirective(__QUASAR_SSR_SERVER__
|
|
|
388
388
|
|
|
389
389
|
client.has.touch === true && addEvt(ctx, 'main', [
|
|
390
390
|
[ el, 'touchstart', 'touchStart', `passive${ modifiers.capture === true ? 'Capture' : '' }` ],
|
|
391
|
-
[ el, 'touchmove', 'noop', 'notPassiveCapture' ]
|
|
391
|
+
[ el, 'touchmove', 'noop', 'notPassiveCapture' ] // cannot be passive (ex: iOS scroll)
|
|
392
392
|
])
|
|
393
393
|
},
|
|
394
394
|
|
|
@@ -209,7 +209,7 @@ export default createDirective(__QUASAR_SSR_SERVER__
|
|
|
209
209
|
|
|
210
210
|
client.has.touch === true && addEvt(ctx, 'main', [
|
|
211
211
|
[ el, 'touchstart', 'touchStart', `passive${ modifiers.capture === true ? 'Capture' : '' }` ],
|
|
212
|
-
[ el, 'touchend', 'noop', '
|
|
212
|
+
[ el, 'touchend', 'noop', 'passiveCapture' ]
|
|
213
213
|
])
|
|
214
214
|
|
|
215
215
|
keyboard.length > 0 && addEvt(ctx, 'main', [
|
|
@@ -234,7 +234,7 @@ export default createDirective(__QUASAR_SSR_SERVER__
|
|
|
234
234
|
|
|
235
235
|
client.has.touch === true && addEvt(ctx, 'main', [
|
|
236
236
|
[ el, 'touchstart', 'touchStart', `passive${ modifiers.capture === true ? 'Capture' : '' }` ],
|
|
237
|
-
[ el, 'touchmove', 'noop', 'notPassiveCapture' ]
|
|
237
|
+
[ el, 'touchmove', 'noop', 'notPassiveCapture' ] // cannot be passive (ex: iOS scroll)
|
|
238
238
|
])
|
|
239
239
|
},
|
|
240
240
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Forked from tiny-emitter
|
|
3
|
+
* Copyright (c) 2017 Scott Corgan
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export default class EventBus {
|
|
7
|
+
constructor () {
|
|
8
|
+
this.__stack = {}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
on (name, callback, ctx) {
|
|
12
|
+
(this.__stack[ name ] || (this.__stack[ name ] = [])).push({
|
|
13
|
+
fn: callback,
|
|
14
|
+
ctx
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
return this // chainable
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
once (name, callback, ctx) {
|
|
21
|
+
const listener = () => {
|
|
22
|
+
this.off(name, listener)
|
|
23
|
+
callback.apply(ctx, arguments)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
listener.__callback = callback
|
|
27
|
+
return this.on(name, listener, ctx) // chainable
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
emit (name) {
|
|
31
|
+
const list = this.__stack[ name ]
|
|
32
|
+
|
|
33
|
+
if (list !== void 0) {
|
|
34
|
+
const params = [].slice.call(arguments, 1)
|
|
35
|
+
list.forEach(entry => {
|
|
36
|
+
entry.fn.apply(entry.ctx, params)
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return this // chainable
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
off (name, callback) {
|
|
44
|
+
const list = this.__stack[ name ]
|
|
45
|
+
const liveEvents = []
|
|
46
|
+
|
|
47
|
+
if (list !== void 0 && callback) {
|
|
48
|
+
list.forEach(entry => {
|
|
49
|
+
if (entry.fn !== callback && entry.fn.__callback !== callback) {
|
|
50
|
+
liveEvents.push(entry)
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
if (liveEvents.length !== 0) {
|
|
55
|
+
this.__stack[ name ] = liveEvents
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
delete this.__stack[ name ]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return this // chainable
|
|
63
|
+
}
|
|
64
|
+
}
|
package/src/utils/extend.js
CHANGED
|
@@ -1,24 +1,21 @@
|
|
|
1
1
|
const
|
|
2
2
|
toString = Object.prototype.toString,
|
|
3
3
|
hasOwn = Object.prototype.hasOwnProperty,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
function type (obj) {
|
|
11
|
-
return obj === null ? String(obj) : class2type[ toString.call(obj) ] || 'object'
|
|
12
|
-
}
|
|
4
|
+
notPlainObject = new Set(
|
|
5
|
+
[ 'Boolean', 'Number', 'String', 'Function', 'Array', 'Date', 'RegExp', 'Object' ]
|
|
6
|
+
.map(name => '[object ' + name + ']')
|
|
7
|
+
)
|
|
13
8
|
|
|
14
9
|
function isPlainObject (obj) {
|
|
15
|
-
if (
|
|
10
|
+
if (obj !== Object(obj) || notPlainObject.has(toString.call(obj)) === true) {
|
|
16
11
|
return false
|
|
17
12
|
}
|
|
18
13
|
|
|
19
|
-
if (
|
|
20
|
-
|
|
21
|
-
&&
|
|
14
|
+
if (
|
|
15
|
+
obj.constructor
|
|
16
|
+
&& hasOwn.call(obj, 'constructor') === false
|
|
17
|
+
&& !hasOwn.call(obj.constructor.prototype, 'isPrototypeOf') === false
|
|
18
|
+
) {
|
|
22
19
|
return false
|
|
23
20
|
}
|
|
24
21
|
|
|
@@ -42,7 +39,7 @@ export default function extend () {
|
|
|
42
39
|
i = 2
|
|
43
40
|
}
|
|
44
41
|
|
|
45
|
-
if (Object(target) !== target &&
|
|
42
|
+
if (Object(target) !== target && typeof target !== 'function') {
|
|
46
43
|
target = {}
|
|
47
44
|
}
|
|
48
45
|
|
|
@@ -61,13 +58,16 @@ export default function extend () {
|
|
|
61
58
|
continue
|
|
62
59
|
}
|
|
63
60
|
|
|
64
|
-
if (
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
if (
|
|
62
|
+
deep === true
|
|
63
|
+
&& copy
|
|
64
|
+
&& ((copyIsArray = Array.isArray(copy)) || isPlainObject(copy) === true)
|
|
65
|
+
) {
|
|
66
|
+
if (copyIsArray === true) {
|
|
67
|
+
clone = Array.isArray(src) === true ? src : []
|
|
68
68
|
}
|
|
69
69
|
else {
|
|
70
|
-
clone =
|
|
70
|
+
clone = isPlainObject(src) === true ? src : {}
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
target[ name ] = extend(deep, clone, copy)
|