From ab90dfb8ccf0a83dbba1bbe31a6290db50691322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?LAPTOP-S9HJSOEB=5C=E6=98=8A=E5=A4=A9?= Date: Thu, 21 Aug 2025 11:19:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E5=85=A8=E9=83=A8=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.vue | 17 + .../ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js | 8225 +++++++++++++++++ .../ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js.map | 1 + index.html | 20 + main.js | 26 + manifest.json | 74 + node_modules/.package-lock.json | 45 + node_modules/clipboard/.babelrc.json | 11 + node_modules/clipboard/.editorconfig | 22 + node_modules/clipboard/.eslintignore | 12 + node_modules/clipboard/.eslintrc.json | 24 + .../.github/ISSUE_TEMPLATE/bug_report.md | 57 + .../.github/ISSUE_TEMPLATE/documentation.md | 13 + .../.github/ISSUE_TEMPLATE/proposal.md | 26 + .../.github/PULL_REQUEST_TEMPLATE.md | 35 + node_modules/clipboard/.github/stale.yml | 21 + .../clipboard/.github/workflows/publish.yml | 47 + .../clipboard/.github/workflows/test.js.yml | 34 + node_modules/clipboard/.husky/pre-commit | 4 + node_modules/clipboard/.nvmrc | 1 + node_modules/clipboard/.prettierignore | 9 + node_modules/clipboard/.prettierrc.json | 9 + node_modules/clipboard/LICENSE | 21 + node_modules/clipboard/bower.json | 18 + node_modules/clipboard/composer.json | 25 + node_modules/clipboard/contributing.md | 29 + .../clipboard/demo/constructor-node.html | 35 + .../clipboard/demo/constructor-nodelist.html | 35 + .../clipboard/demo/constructor-selector.html | 34 + .../clipboard/demo/function-target.html | 37 + .../clipboard/demo/function-text.html | 36 + node_modules/clipboard/demo/target-div.html | 39 + .../clipboard/demo/target-input-number.html | 37 + node_modules/clipboard/demo/target-input.html | 37 + .../demo/target-programmatic-copy.html | 28 + .../demo/target-programmatic-cut.html | 28 + .../clipboard/demo/target-textarea.html | 39 + .../demo/text-programmatic-copy.html | 27 + node_modules/clipboard/dist/clipboard.js | 890 ++ node_modules/clipboard/dist/clipboard.min.js | 7 + node_modules/clipboard/karma.conf.js | 36 + node_modules/clipboard/package.js | 12 + node_modules/clipboard/package.json | 63 + node_modules/clipboard/readme.md | 192 + node_modules/clipboard/src/actions/copy.js | 47 + node_modules/clipboard/src/actions/cut.js | 15 + node_modules/clipboard/src/actions/default.js | 53 + node_modules/clipboard/src/clipboard.d.ts | 91 + node_modules/clipboard/src/clipboard.js | 165 + .../clipboard/src/clipboard.test-d.ts | 4 + node_modules/clipboard/src/common/command.js | 12 + .../src/common/create-fake-element.js | 26 + node_modules/clipboard/test/actions/copy.js | 69 + node_modules/clipboard/test/actions/cut.js | 32 + .../clipboard/test/actions/default.js | 80 + node_modules/clipboard/test/clipboard.js | 192 + node_modules/clipboard/test/common/command.js | 49 + .../test/common/create-fake-element.js | 13 + node_modules/clipboard/webpack.config.js | 46 + node_modules/dayjs/.editorconfig | 7 + node_modules/dayjs/CHANGELOG.md | 947 ++ node_modules/dayjs/LICENSE | 21 + node_modules/dayjs/README.md | 172 + node_modules/dayjs/dayjs.min.js | 1 + node_modules/dayjs/esm/constant.js | 25 + node_modules/dayjs/esm/index.d.ts | 429 + node_modules/dayjs/esm/index.js | 541 ++ node_modules/dayjs/esm/locale/af.js | 39 + node_modules/dayjs/esm/locale/am.js | 40 + node_modules/dayjs/esm/locale/ar-dz.js | 41 + node_modules/dayjs/esm/locale/ar-iq.js | 42 + node_modules/dayjs/esm/locale/ar-kw.js | 41 + node_modules/dayjs/esm/locale/ar-ly.js | 27 + node_modules/dayjs/esm/locale/ar-ma.js | 42 + node_modules/dayjs/esm/locale/ar-sa.js | 41 + node_modules/dayjs/esm/locale/ar-tn.js | 42 + node_modules/dayjs/esm/locale/ar.js | 77 + node_modules/dayjs/esm/locale/az.js | 39 + node_modules/dayjs/esm/locale/be.js | 24 + node_modules/dayjs/esm/locale/bg.js | 55 + node_modules/dayjs/esm/locale/bi.js | 39 + node_modules/dayjs/esm/locale/bm.js | 39 + node_modules/dayjs/esm/locale/bn-bd.js | 81 + node_modules/dayjs/esm/locale/bn.js | 72 + node_modules/dayjs/esm/locale/bo.js | 38 + node_modules/dayjs/esm/locale/br.js | 93 + node_modules/dayjs/esm/locale/bs.js | 24 + node_modules/dayjs/esm/locale/ca.js | 44 + node_modules/dayjs/esm/locale/cs.js | 120 + node_modules/dayjs/esm/locale/cv.js | 24 + node_modules/dayjs/esm/locale/cy.js | 39 + node_modules/dayjs/esm/locale/da.js | 40 + node_modules/dayjs/esm/locale/de-at.js | 63 + node_modules/dayjs/esm/locale/de-ch.js | 63 + node_modules/dayjs/esm/locale/de.js | 64 + node_modules/dayjs/esm/locale/dv.js | 39 + node_modules/dayjs/esm/locale/el.js | 39 + node_modules/dayjs/esm/locale/en-au.js | 39 + node_modules/dayjs/esm/locale/en-ca.js | 38 + node_modules/dayjs/esm/locale/en-gb.js | 42 + node_modules/dayjs/esm/locale/en-ie.js | 39 + node_modules/dayjs/esm/locale/en-il.js | 38 + node_modules/dayjs/esm/locale/en-in.js | 42 + node_modules/dayjs/esm/locale/en-nz.js | 41 + node_modules/dayjs/esm/locale/en-sg.js | 39 + node_modules/dayjs/esm/locale/en-tt.js | 42 + node_modules/dayjs/esm/locale/en.js | 12 + node_modules/dayjs/esm/locale/eo.js | 39 + node_modules/dayjs/esm/locale/es-do.js | 39 + node_modules/dayjs/esm/locale/es-mx.js | 38 + node_modules/dayjs/esm/locale/es-pr.js | 39 + node_modules/dayjs/esm/locale/es-us.js | 38 + node_modules/dayjs/esm/locale/es.js | 39 + node_modules/dayjs/esm/locale/et.js | 65 + node_modules/dayjs/esm/locale/eu.js | 43 + node_modules/dayjs/esm/locale/fa.js | 39 + node_modules/dayjs/esm/locale/fi.js | 88 + node_modules/dayjs/esm/locale/fo.js | 39 + node_modules/dayjs/esm/locale/fr-ca.js | 38 + node_modules/dayjs/esm/locale/fr-ch.js | 39 + node_modules/dayjs/esm/locale/fr.js | 41 + node_modules/dayjs/esm/locale/fy.js | 39 + node_modules/dayjs/esm/locale/ga.js | 39 + node_modules/dayjs/esm/locale/gd.js | 39 + node_modules/dayjs/esm/locale/gl.js | 39 + node_modules/dayjs/esm/locale/gom-latn.js | 25 + node_modules/dayjs/esm/locale/gu.js | 38 + node_modules/dayjs/esm/locale/he.js | 78 + node_modules/dayjs/esm/locale/hi.js | 38 + node_modules/dayjs/esm/locale/hr.js | 53 + node_modules/dayjs/esm/locale/ht.js | 38 + node_modules/dayjs/esm/locale/hu.js | 61 + node_modules/dayjs/esm/locale/hy-am.js | 39 + node_modules/dayjs/esm/locale/id.js | 39 + node_modules/dayjs/esm/locale/index.d.ts | 11 + node_modules/dayjs/esm/locale/is.js | 68 + node_modules/dayjs/esm/locale/it-ch.js | 39 + node_modules/dayjs/esm/locale/it.js | 39 + node_modules/dayjs/esm/locale/ja.js | 45 + node_modules/dayjs/esm/locale/jv.js | 39 + node_modules/dayjs/esm/locale/ka.js | 39 + node_modules/dayjs/esm/locale/kk.js | 39 + node_modules/dayjs/esm/locale/km.js | 39 + node_modules/dayjs/esm/locale/kn.js | 38 + node_modules/dayjs/esm/locale/ko.js | 45 + node_modules/dayjs/esm/locale/ku.js | 77 + node_modules/dayjs/esm/locale/ky.js | 39 + node_modules/dayjs/esm/locale/lb.js | 24 + node_modules/dayjs/esm/locale/lo.js | 38 + node_modules/dayjs/esm/locale/lt.js | 70 + node_modules/dayjs/esm/locale/lv.js | 39 + node_modules/dayjs/esm/locale/me.js | 24 + node_modules/dayjs/esm/locale/mi.js | 39 + node_modules/dayjs/esm/locale/mk.js | 39 + node_modules/dayjs/esm/locale/ml.js | 38 + node_modules/dayjs/esm/locale/mn.js | 38 + node_modules/dayjs/esm/locale/mr.js | 23 + node_modules/dayjs/esm/locale/ms-my.js | 39 + node_modules/dayjs/esm/locale/ms.js | 39 + node_modules/dayjs/esm/locale/mt.js | 39 + node_modules/dayjs/esm/locale/my.js | 39 + node_modules/dayjs/esm/locale/nb.js | 40 + node_modules/dayjs/esm/locale/ne.js | 40 + node_modules/dayjs/esm/locale/nl-be.js | 39 + node_modules/dayjs/esm/locale/nl.js | 40 + node_modules/dayjs/esm/locale/nn.js | 39 + node_modules/dayjs/esm/locale/oc-lnc.js | 39 + node_modules/dayjs/esm/locale/pa-in.js | 38 + node_modules/dayjs/esm/locale/pl.js | 87 + node_modules/dayjs/esm/locale/pt-br.js | 38 + node_modules/dayjs/esm/locale/pt.js | 40 + node_modules/dayjs/esm/locale/rn.js | 39 + node_modules/dayjs/esm/locale/ro.js | 39 + node_modules/dayjs/esm/locale/ru.js | 99 + node_modules/dayjs/esm/locale/rw.js | 35 + node_modules/dayjs/esm/locale/sd.js | 39 + node_modules/dayjs/esm/locale/se.js | 39 + node_modules/dayjs/esm/locale/si.js | 38 + node_modules/dayjs/esm/locale/sk.js | 121 + node_modules/dayjs/esm/locale/sl.js | 141 + node_modules/dayjs/esm/locale/sq.js | 39 + node_modules/dayjs/esm/locale/sr-cyrl.js | 74 + node_modules/dayjs/esm/locale/sr.js | 74 + node_modules/dayjs/esm/locale/ss.js | 39 + node_modules/dayjs/esm/locale/sv-fi.js | 46 + node_modules/dayjs/esm/locale/sv.js | 44 + node_modules/dayjs/esm/locale/sw.js | 39 + node_modules/dayjs/esm/locale/ta.js | 38 + node_modules/dayjs/esm/locale/te.js | 38 + node_modules/dayjs/esm/locale/tet.js | 39 + node_modules/dayjs/esm/locale/tg.js | 39 + node_modules/dayjs/esm/locale/th.js | 38 + node_modules/dayjs/esm/locale/tk.js | 39 + node_modules/dayjs/esm/locale/tl-ph.js | 39 + node_modules/dayjs/esm/locale/tlh.js | 24 + node_modules/dayjs/esm/locale/tr.js | 39 + node_modules/dayjs/esm/locale/types.d.ts | 33 + node_modules/dayjs/esm/locale/tzl.js | 24 + node_modules/dayjs/esm/locale/tzm-latn.js | 39 + node_modules/dayjs/esm/locale/tzm.js | 39 + node_modules/dayjs/esm/locale/ug-cn.js | 39 + node_modules/dayjs/esm/locale/uk.js | 77 + node_modules/dayjs/esm/locale/ur.js | 39 + node_modules/dayjs/esm/locale/uz-latn.js | 39 + node_modules/dayjs/esm/locale/uz.js | 39 + node_modules/dayjs/esm/locale/vi.js | 43 + node_modules/dayjs/esm/locale/x-pseudo.js | 39 + node_modules/dayjs/esm/locale/yo.js | 39 + node_modules/dayjs/esm/locale/zh-cn.js | 67 + node_modules/dayjs/esm/locale/zh-hk.js | 65 + node_modules/dayjs/esm/locale/zh-tw.js | 65 + node_modules/dayjs/esm/locale/zh.js | 67 + .../esm/plugin/advancedFormat/index.d.ts | 4 + .../dayjs/esm/plugin/advancedFormat/index.js | 66 + .../dayjs/esm/plugin/arraySupport/index.d.ts | 10 + .../dayjs/esm/plugin/arraySupport/index.js | 33 + .../dayjs/esm/plugin/badMutable/index.d.ts | 4 + .../dayjs/esm/plugin/badMutable/index.js | 61 + .../dayjs/esm/plugin/bigIntSupport/index.d.ts | 11 + .../dayjs/esm/plugin/bigIntSupport/index.js | 32 + .../dayjs/esm/plugin/buddhistEra/index.d.ts | 4 + .../dayjs/esm/plugin/buddhistEra/index.js | 21 + .../dayjs/esm/plugin/calendar/index.d.ts | 10 + .../dayjs/esm/plugin/calendar/index.js | 32 + .../esm/plugin/customParseFormat/index.d.ts | 8 + .../esm/plugin/customParseFormat/index.js | 333 + .../dayjs/esm/plugin/dayOfYear/index.d.ts | 11 + .../dayjs/esm/plugin/dayOfYear/index.js | 9 + .../dayjs/esm/plugin/devHelper/index.d.ts | 4 + .../dayjs/esm/plugin/devHelper/index.js | 38 + .../dayjs/esm/plugin/duration/index.d.ts | 88 + .../dayjs/esm/plugin/duration/index.js | 356 + .../dayjs/esm/plugin/isBetween/index.d.ts | 10 + .../dayjs/esm/plugin/isBetween/index.js | 10 + .../dayjs/esm/plugin/isLeapYear/index.d.ts | 10 + .../dayjs/esm/plugin/isLeapYear/index.js | 7 + .../dayjs/esm/plugin/isMoment/index.d.ts | 10 + .../dayjs/esm/plugin/isMoment/index.js | 5 + .../dayjs/esm/plugin/isSameOrAfter/index.d.ts | 10 + .../dayjs/esm/plugin/isSameOrAfter/index.js | 5 + .../esm/plugin/isSameOrBefore/index.d.ts | 10 + .../dayjs/esm/plugin/isSameOrBefore/index.js | 5 + .../dayjs/esm/plugin/isToday/index.d.ts | 10 + .../dayjs/esm/plugin/isToday/index.js | 9 + .../dayjs/esm/plugin/isTomorrow/index.d.ts | 10 + .../dayjs/esm/plugin/isTomorrow/index.js | 9 + .../dayjs/esm/plugin/isYesterday/index.d.ts | 10 + .../dayjs/esm/plugin/isYesterday/index.js | 9 + .../dayjs/esm/plugin/isoWeek/index.d.ts | 27 + .../dayjs/esm/plugin/isoWeek/index.js | 57 + .../esm/plugin/isoWeeksInYear/index.d.ts | 10 + .../dayjs/esm/plugin/isoWeeksInYear/index.js | 15 + .../dayjs/esm/plugin/localeData/index.d.ts | 44 + .../dayjs/esm/plugin/localeData/index.js | 114 + .../esm/plugin/localizedFormat/index.d.ts | 4 + .../dayjs/esm/plugin/localizedFormat/index.js | 20 + .../dayjs/esm/plugin/localizedFormat/utils.js | 20 + .../dayjs/esm/plugin/minMax/index.d.ts | 22 + node_modules/dayjs/esm/plugin/minMax/index.js | 39 + .../dayjs/esm/plugin/negativeYear/index.d.ts | 4 + .../dayjs/esm/plugin/negativeYear/index.js | 36 + .../dayjs/esm/plugin/objectSupport/index.d.ts | 48 + .../dayjs/esm/plugin/objectSupport/index.js | 97 + .../dayjs/esm/plugin/pluralGetSet/index.d.ts | 44 + .../dayjs/esm/plugin/pluralGetSet/index.js | 7 + .../esm/plugin/preParsePostFormat/index.d.ts | 4 + .../esm/plugin/preParsePostFormat/index.js | 40 + .../dayjs/esm/plugin/quarterOfYear/index.d.ts | 26 + .../dayjs/esm/plugin/quarterOfYear/index.js | 41 + .../dayjs/esm/plugin/relativeTime/index.d.ts | 24 + .../dayjs/esm/plugin/relativeTime/index.js | 130 + .../dayjs/esm/plugin/timezone/index.d.ts | 20 + .../dayjs/esm/plugin/timezone/index.js | 198 + .../dayjs/esm/plugin/toArray/index.d.ts | 10 + .../dayjs/esm/plugin/toArray/index.js | 7 + .../dayjs/esm/plugin/toObject/index.d.ts | 20 + .../dayjs/esm/plugin/toObject/index.js | 15 + .../dayjs/esm/plugin/updateLocale/index.d.ts | 8 + .../dayjs/esm/plugin/updateLocale/index.js | 12 + node_modules/dayjs/esm/plugin/utc/index.d.ts | 19 + node_modules/dayjs/esm/plugin/utc/index.js | 188 + .../dayjs/esm/plugin/weekOfYear/index.d.ts | 12 + .../dayjs/esm/plugin/weekOfYear/index.js | 44 + .../dayjs/esm/plugin/weekYear/index.d.ts | 10 + .../dayjs/esm/plugin/weekYear/index.js | 19 + .../dayjs/esm/plugin/weekday/index.d.ts | 12 + .../dayjs/esm/plugin/weekday/index.js | 15 + node_modules/dayjs/esm/utils.js | 58 + node_modules/dayjs/index.d.ts | 429 + node_modules/dayjs/locale.json | 1 + node_modules/dayjs/locale/af.js | 1 + node_modules/dayjs/locale/am.js | 1 + node_modules/dayjs/locale/ar-dz.js | 1 + node_modules/dayjs/locale/ar-iq.js | 1 + node_modules/dayjs/locale/ar-kw.js | 1 + node_modules/dayjs/locale/ar-ly.js | 1 + node_modules/dayjs/locale/ar-ma.js | 1 + node_modules/dayjs/locale/ar-sa.js | 1 + node_modules/dayjs/locale/ar-tn.js | 1 + node_modules/dayjs/locale/ar.js | 1 + node_modules/dayjs/locale/az.js | 1 + node_modules/dayjs/locale/be.js | 1 + node_modules/dayjs/locale/bg.js | 1 + node_modules/dayjs/locale/bi.js | 1 + node_modules/dayjs/locale/bm.js | 1 + node_modules/dayjs/locale/bn-bd.js | 1 + node_modules/dayjs/locale/bn.js | 1 + node_modules/dayjs/locale/bo.js | 1 + node_modules/dayjs/locale/br.js | 1 + node_modules/dayjs/locale/bs.js | 1 + node_modules/dayjs/locale/ca.js | 1 + node_modules/dayjs/locale/cs.js | 1 + node_modules/dayjs/locale/cv.js | 1 + node_modules/dayjs/locale/cy.js | 1 + node_modules/dayjs/locale/da.js | 1 + node_modules/dayjs/locale/de-at.js | 1 + node_modules/dayjs/locale/de-ch.js | 1 + node_modules/dayjs/locale/de.js | 1 + node_modules/dayjs/locale/dv.js | 1 + node_modules/dayjs/locale/el.js | 1 + node_modules/dayjs/locale/en-au.js | 1 + node_modules/dayjs/locale/en-ca.js | 1 + node_modules/dayjs/locale/en-gb.js | 1 + node_modules/dayjs/locale/en-ie.js | 1 + node_modules/dayjs/locale/en-il.js | 1 + node_modules/dayjs/locale/en-in.js | 1 + node_modules/dayjs/locale/en-nz.js | 1 + node_modules/dayjs/locale/en-sg.js | 1 + node_modules/dayjs/locale/en-tt.js | 1 + node_modules/dayjs/locale/en.js | 1 + node_modules/dayjs/locale/eo.js | 1 + node_modules/dayjs/locale/es-do.js | 1 + node_modules/dayjs/locale/es-mx.js | 1 + node_modules/dayjs/locale/es-pr.js | 1 + node_modules/dayjs/locale/es-us.js | 1 + node_modules/dayjs/locale/es.js | 1 + node_modules/dayjs/locale/et.js | 1 + node_modules/dayjs/locale/eu.js | 1 + node_modules/dayjs/locale/fa.js | 1 + node_modules/dayjs/locale/fi.js | 1 + node_modules/dayjs/locale/fo.js | 1 + node_modules/dayjs/locale/fr-ca.js | 1 + node_modules/dayjs/locale/fr-ch.js | 1 + node_modules/dayjs/locale/fr.js | 1 + node_modules/dayjs/locale/fy.js | 1 + node_modules/dayjs/locale/ga.js | 1 + node_modules/dayjs/locale/gd.js | 1 + node_modules/dayjs/locale/gl.js | 1 + node_modules/dayjs/locale/gom-latn.js | 1 + node_modules/dayjs/locale/gu.js | 1 + node_modules/dayjs/locale/he.js | 1 + node_modules/dayjs/locale/hi.js | 1 + node_modules/dayjs/locale/hr.js | 1 + node_modules/dayjs/locale/ht.js | 1 + node_modules/dayjs/locale/hu.js | 1 + node_modules/dayjs/locale/hy-am.js | 1 + node_modules/dayjs/locale/id.js | 1 + node_modules/dayjs/locale/index.d.ts | 11 + node_modules/dayjs/locale/is.js | 1 + node_modules/dayjs/locale/it-ch.js | 1 + node_modules/dayjs/locale/it.js | 1 + node_modules/dayjs/locale/ja.js | 1 + node_modules/dayjs/locale/jv.js | 1 + node_modules/dayjs/locale/ka.js | 1 + node_modules/dayjs/locale/kk.js | 1 + node_modules/dayjs/locale/km.js | 1 + node_modules/dayjs/locale/kn.js | 1 + node_modules/dayjs/locale/ko.js | 1 + node_modules/dayjs/locale/ku.js | 1 + node_modules/dayjs/locale/ky.js | 1 + node_modules/dayjs/locale/lb.js | 1 + node_modules/dayjs/locale/lo.js | 1 + node_modules/dayjs/locale/lt.js | 1 + node_modules/dayjs/locale/lv.js | 1 + node_modules/dayjs/locale/me.js | 1 + node_modules/dayjs/locale/mi.js | 1 + node_modules/dayjs/locale/mk.js | 1 + node_modules/dayjs/locale/ml.js | 1 + node_modules/dayjs/locale/mn.js | 1 + node_modules/dayjs/locale/mr.js | 1 + node_modules/dayjs/locale/ms-my.js | 1 + node_modules/dayjs/locale/ms.js | 1 + node_modules/dayjs/locale/mt.js | 1 + node_modules/dayjs/locale/my.js | 1 + node_modules/dayjs/locale/nb.js | 1 + node_modules/dayjs/locale/ne.js | 1 + node_modules/dayjs/locale/nl-be.js | 1 + node_modules/dayjs/locale/nl.js | 1 + node_modules/dayjs/locale/nn.js | 1 + node_modules/dayjs/locale/oc-lnc.js | 1 + node_modules/dayjs/locale/pa-in.js | 1 + node_modules/dayjs/locale/pl.js | 1 + node_modules/dayjs/locale/pt-br.js | 1 + node_modules/dayjs/locale/pt.js | 1 + node_modules/dayjs/locale/rn.js | 1 + node_modules/dayjs/locale/ro.js | 1 + node_modules/dayjs/locale/ru.js | 1 + node_modules/dayjs/locale/rw.js | 1 + node_modules/dayjs/locale/sd.js | 1 + node_modules/dayjs/locale/se.js | 1 + node_modules/dayjs/locale/si.js | 1 + node_modules/dayjs/locale/sk.js | 1 + node_modules/dayjs/locale/sl.js | 1 + node_modules/dayjs/locale/sq.js | 1 + node_modules/dayjs/locale/sr-cyrl.js | 1 + node_modules/dayjs/locale/sr.js | 1 + node_modules/dayjs/locale/ss.js | 1 + node_modules/dayjs/locale/sv-fi.js | 1 + node_modules/dayjs/locale/sv.js | 1 + node_modules/dayjs/locale/sw.js | 1 + node_modules/dayjs/locale/ta.js | 1 + node_modules/dayjs/locale/te.js | 1 + node_modules/dayjs/locale/tet.js | 1 + node_modules/dayjs/locale/tg.js | 1 + node_modules/dayjs/locale/th.js | 1 + node_modules/dayjs/locale/tk.js | 1 + node_modules/dayjs/locale/tl-ph.js | 1 + node_modules/dayjs/locale/tlh.js | 1 + node_modules/dayjs/locale/tr.js | 1 + node_modules/dayjs/locale/types.d.ts | 33 + node_modules/dayjs/locale/tzl.js | 1 + node_modules/dayjs/locale/tzm-latn.js | 1 + node_modules/dayjs/locale/tzm.js | 1 + node_modules/dayjs/locale/ug-cn.js | 1 + node_modules/dayjs/locale/uk.js | 1 + node_modules/dayjs/locale/ur.js | 1 + node_modules/dayjs/locale/uz-latn.js | 1 + node_modules/dayjs/locale/uz.js | 1 + node_modules/dayjs/locale/vi.js | 1 + node_modules/dayjs/locale/x-pseudo.js | 1 + node_modules/dayjs/locale/yo.js | 1 + node_modules/dayjs/locale/zh-cn.js | 1 + node_modules/dayjs/locale/zh-hk.js | 1 + node_modules/dayjs/locale/zh-tw.js | 1 + node_modules/dayjs/locale/zh.js | 1 + node_modules/dayjs/package.json | 84 + node_modules/dayjs/plugin/advancedFormat.d.ts | 4 + node_modules/dayjs/plugin/advancedFormat.js | 1 + node_modules/dayjs/plugin/arraySupport.d.ts | 10 + node_modules/dayjs/plugin/arraySupport.js | 1 + node_modules/dayjs/plugin/badMutable.d.ts | 4 + node_modules/dayjs/plugin/badMutable.js | 1 + node_modules/dayjs/plugin/bigIntSupport.d.ts | 11 + node_modules/dayjs/plugin/bigIntSupport.js | 1 + node_modules/dayjs/plugin/buddhistEra.d.ts | 4 + node_modules/dayjs/plugin/buddhistEra.js | 1 + node_modules/dayjs/plugin/calendar.d.ts | 10 + node_modules/dayjs/plugin/calendar.js | 1 + .../dayjs/plugin/customParseFormat.d.ts | 8 + .../dayjs/plugin/customParseFormat.js | 1 + node_modules/dayjs/plugin/dayOfYear.d.ts | 11 + node_modules/dayjs/plugin/dayOfYear.js | 1 + node_modules/dayjs/plugin/devHelper.d.ts | 4 + node_modules/dayjs/plugin/devHelper.js | 1 + node_modules/dayjs/plugin/duration.d.ts | 88 + node_modules/dayjs/plugin/duration.js | 1 + node_modules/dayjs/plugin/isBetween.d.ts | 10 + node_modules/dayjs/plugin/isBetween.js | 1 + node_modules/dayjs/plugin/isLeapYear.d.ts | 10 + node_modules/dayjs/plugin/isLeapYear.js | 1 + node_modules/dayjs/plugin/isMoment.d.ts | 10 + node_modules/dayjs/plugin/isMoment.js | 1 + node_modules/dayjs/plugin/isSameOrAfter.d.ts | 10 + node_modules/dayjs/plugin/isSameOrAfter.js | 1 + node_modules/dayjs/plugin/isSameOrBefore.d.ts | 10 + node_modules/dayjs/plugin/isSameOrBefore.js | 1 + node_modules/dayjs/plugin/isToday.d.ts | 10 + node_modules/dayjs/plugin/isToday.js | 1 + node_modules/dayjs/plugin/isTomorrow.d.ts | 10 + node_modules/dayjs/plugin/isTomorrow.js | 1 + node_modules/dayjs/plugin/isYesterday.d.ts | 10 + node_modules/dayjs/plugin/isYesterday.js | 1 + node_modules/dayjs/plugin/isoWeek.d.ts | 27 + node_modules/dayjs/plugin/isoWeek.js | 1 + node_modules/dayjs/plugin/isoWeeksInYear.d.ts | 10 + node_modules/dayjs/plugin/isoWeeksInYear.js | 1 + node_modules/dayjs/plugin/localeData.d.ts | 44 + node_modules/dayjs/plugin/localeData.js | 1 + .../dayjs/plugin/localizedFormat.d.ts | 4 + node_modules/dayjs/plugin/localizedFormat.js | 1 + node_modules/dayjs/plugin/minMax.d.ts | 22 + node_modules/dayjs/plugin/minMax.js | 1 + node_modules/dayjs/plugin/negativeYear.d.ts | 4 + node_modules/dayjs/plugin/negativeYear.js | 1 + node_modules/dayjs/plugin/objectSupport.d.ts | 48 + node_modules/dayjs/plugin/objectSupport.js | 1 + node_modules/dayjs/plugin/pluralGetSet.d.ts | 44 + node_modules/dayjs/plugin/pluralGetSet.js | 1 + .../dayjs/plugin/preParsePostFormat.d.ts | 4 + .../dayjs/plugin/preParsePostFormat.js | 1 + node_modules/dayjs/plugin/quarterOfYear.d.ts | 26 + node_modules/dayjs/plugin/quarterOfYear.js | 1 + node_modules/dayjs/plugin/relativeTime.d.ts | 24 + node_modules/dayjs/plugin/relativeTime.js | 1 + node_modules/dayjs/plugin/timezone.d.ts | 20 + node_modules/dayjs/plugin/timezone.js | 1 + node_modules/dayjs/plugin/toArray.d.ts | 10 + node_modules/dayjs/plugin/toArray.js | 1 + node_modules/dayjs/plugin/toObject.d.ts | 20 + node_modules/dayjs/plugin/toObject.js | 1 + node_modules/dayjs/plugin/updateLocale.d.ts | 8 + node_modules/dayjs/plugin/updateLocale.js | 1 + node_modules/dayjs/plugin/utc.d.ts | 19 + node_modules/dayjs/plugin/utc.js | 1 + node_modules/dayjs/plugin/weekOfYear.d.ts | 12 + node_modules/dayjs/plugin/weekOfYear.js | 1 + node_modules/dayjs/plugin/weekYear.d.ts | 10 + node_modules/dayjs/plugin/weekYear.js | 1 + node_modules/dayjs/plugin/weekday.d.ts | 12 + node_modules/dayjs/plugin/weekday.js | 1 + node_modules/delegate/.editorconfig | 22 + node_modules/delegate/.travis.yml | 3 + node_modules/delegate/demo/delegate.html | 29 + node_modules/delegate/demo/multiple.html | 37 + node_modules/delegate/demo/undelegate.html | 31 + node_modules/delegate/dist/delegate.js | 80 + node_modules/delegate/karma.conf.js | 24 + node_modules/delegate/package.json | 31 + node_modules/delegate/readme.md | 99 + node_modules/delegate/src/closest.js | 33 + node_modules/delegate/src/delegate.js | 78 + node_modules/delegate/test/closest.js | 45 + node_modules/delegate/test/delegate.js | 116 + node_modules/good-listener/.editorconfig | 22 + node_modules/good-listener/.npmignore | 1 + node_modules/good-listener/.travis.yml | 3 + node_modules/good-listener/bower.json | 11 + node_modules/good-listener/demo/destroy.html | 25 + node_modules/good-listener/demo/multiple.html | 30 + node_modules/good-listener/demo/node.html | 23 + node_modules/good-listener/demo/nodelist.html | 25 + node_modules/good-listener/demo/selector.html | 23 + .../good-listener/dist/good-listener.js | 228 + node_modules/good-listener/karma.conf.js | 24 + node_modules/good-listener/package.json | 35 + node_modules/good-listener/readme.md | 91 + node_modules/good-listener/src/is.js | 49 + node_modules/good-listener/src/listen.js | 95 + node_modules/good-listener/test/is.js | 111 + node_modules/good-listener/test/listen.js | 135 + node_modules/select/.editorconfig | 22 + node_modules/select/.npmignore | 1 + node_modules/select/.travis.yml | 3 + node_modules/select/bower.json | 13 + node_modules/select/demo/contenteditable.html | 26 + node_modules/select/demo/dropdown.html | 30 + node_modules/select/demo/editable.html | 26 + node_modules/select/demo/multiple.html | 28 + node_modules/select/demo/nested.html | 34 + node_modules/select/demo/non-editable.html | 26 + node_modules/select/dist/select.js | 47 + node_modules/select/karma.conf.js | 23 + node_modules/select/package.json | 29 + node_modules/select/readme.md | 49 + node_modules/select/src/select.js | 43 + node_modules/select/test/select.js | 93 + node_modules/tiny-emitter/LICENSE | 22 + node_modules/tiny-emitter/README.md | 88 + node_modules/tiny-emitter/dist/tinyemitter.js | 71 + .../tiny-emitter/dist/tinyemitter.min.js | 1 + node_modules/tiny-emitter/index.d.ts | 6 + node_modules/tiny-emitter/index.js | 67 + node_modules/tiny-emitter/instance.js | 2 + node_modules/tiny-emitter/package.json | 53 + node_modules/tiny-emitter/test/index.js | 217 + node_modules/tiny-emitter/yarn.lock | 1857 ++++ package-lock.json | 51 + package.json | 6 + pages.json | 68 + pages/index/index.vue | 137 + pages/live/player.vue | 97 + pages/login/login.vue | 146 + pages/tabbar/order/order.vue | 175 + pages/tabbar/stock/detail.vue | 128 + pages/tabbar/stock/stock.vue | 238 + pages/tabbar/video/video.spec.js | 65 + pages/tabbar/video/video.vue | 176 + static/login.png | Bin 0 -> 17262 bytes static/logo.png | Bin 0 -> 4023 bytes static/pic02.jpg | Bin 0 -> 462326 bytes static/tabbar/icon/order.png | Bin 0 -> 2873 bytes static/tabbar/icon/order2.png | Bin 0 -> 3116 bytes static/tabbar/icon/stock.png | Bin 0 -> 3582 bytes static/tabbar/icon/stock2.png | Bin 0 -> 3878 bytes static/tabbar/icon/video.png | Bin 0 -> 3964 bytes static/tabbar/icon/video2.png | Bin 0 -> 4351 bytes static/tabbar/icon/箭头_右上.png | Bin 0 -> 7922 bytes static/tabbar/icon/箭头_右下.png | Bin 0 -> 7873 bytes static/tabbar/icon/箭头_左上.png | Bin 0 -> 7695 bytes static/tabbar/icon/箭头_左下.png | Bin 0 -> 7955 bytes uni.promisify.adaptor.js | 13 + uni.scss | 77 + uni_modules/uni-data-select/changelog.md | 51 + .../uni-data-select/uni-data-select.vue | 837 ++ uni_modules/uni-data-select/package.json | 106 + uni_modules/uni-data-select/readme.md | 8 + uni_modules/uni-load-more/changelog.md | 23 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 404 + uni_modules/uni-load-more/package.json | 105 + uni_modules/uni-load-more/readme.md | 14 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 + .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 + .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + uni_modules/uview-plus/LICENSE | 21 + uni_modules/uview-plus/README.md | 74 + uni_modules/uview-plus/changelog.md | 1094 +++ .../u-action-sheet-data.vue | 109 + .../components/u-action-sheet/actionSheet.js | 26 + .../components/u-action-sheet/props.js | 70 + .../u-action-sheet/u-action-sheet.vue | 291 + .../components/u-agreement/u-agreement.vue | 76 + .../uview-plus/components/u-album/album.js | 28 + .../uview-plus/components/u-album/props.js | 95 + .../uview-plus/components/u-album/u-album.vue | 344 + .../uview-plus/components/u-alert/alert.js | 26 + .../uview-plus/components/u-alert/props.js | 75 + .../uview-plus/components/u-alert/u-alert.vue | 293 + .../components/u-avatar-group/avatarGroup.js | 23 + .../components/u-avatar-group/props.js | 54 + .../u-avatar-group/u-avatar-group.vue | 109 + .../uview-plus/components/u-avatar/avatar.js | 28 + .../uview-plus/components/u-avatar/props.js | 81 + .../components/u-avatar/u-avatar.vue | 179 + .../components/u-back-top/backtop.js | 27 + .../uview-plus/components/u-back-top/props.js | 56 + .../components/u-back-top/u-back-top.vue | 132 + .../uview-plus/components/u-badge/badge.js | 27 + .../uview-plus/components/u-badge/props.js | 79 + .../uview-plus/components/u-badge/u-badge.vue | 176 + .../components/u-barcode/u-barcode.vue | 1048 +++ .../uview-plus/components/u-box/props.js | 27 + .../uview-plus/components/u-box/u-box.vue | 91 + .../uview-plus/components/u-button/button.js | 43 + .../uview-plus/components/u-button/nvue.scss | 46 + .../uview-plus/components/u-button/props.js | 159 + .../components/u-button/u-button.vue | 503 + .../uview-plus/components/u-button/vue.scss | 81 + .../components/u-calendar/calendar.js | 45 + .../components/u-calendar/header.vue | 109 + .../components/u-calendar/month.vue | 608 ++ .../uview-plus/components/u-calendar/props.js | 160 + .../components/u-calendar/u-calendar.vue | 411 + .../uview-plus/components/u-calendar/util.js | 86 + .../components/u-car-keyboard/carKeyboard.js | 15 + .../components/u-car-keyboard/props.js | 17 + .../u-car-keyboard/u-car-keyboard.vue | 314 + .../uview-plus/components/u-card/card.js | 40 + .../uview-plus/components/u-card/props.js | 134 + .../uview-plus/components/u-card/u-card.vue | 184 + .../components/u-cate-tab/u-cate-tab.vue | 340 + .../components/u-cell-group/cellGroup.js | 17 + .../components/u-cell-group/props.js | 16 + .../components/u-cell-group/u-cell-group.vue | 66 + .../uview-plus/components/u-cell/cell.js | 35 + .../uview-plus/components/u-cell/props.js | 112 + .../uview-plus/components/u-cell/u-cell.vue | 267 + .../u-checkbox-group/checkboxGroup.js | 29 + .../components/u-checkbox-group/props.js | 93 + .../u-checkbox-group/u-checkbox-group.vue | 133 + .../components/u-checkbox/checkbox.js | 27 + .../uview-plus/components/u-checkbox/props.js | 76 + .../components/u-checkbox/u-checkbox.vue | 388 + .../u-circle-progress/circleProgress.js | 15 + .../components/u-circle-progress/props.js | 10 + .../u-circle-progress/u-circle-progress.vue | 200 + .../u-city-locate/u-city-locate.vue | 161 + .../components/u-code-input/codeInput.js | 29 + .../components/u-code-input/props.js | 90 + .../components/u-code-input/u-code-input.vue | 299 + .../uview-plus/components/u-code/code.js | 21 + .../uview-plus/components/u-code/props.js | 36 + .../uview-plus/components/u-code/u-code.vue | 131 + .../uview-plus/components/u-col/col.js | 19 + .../uview-plus/components/u-col/props.js | 31 + .../uview-plus/components/u-col/u-col.vue | 169 + .../u-collapse-item/collapseItem.js | 31 + .../components/u-collapse-item/props.js | 97 + .../u-collapse-item/u-collapse-item.vue | 243 + .../components/u-collapse/collapse.js | 17 + .../uview-plus/components/u-collapse/props.js | 21 + .../components/u-collapse/u-collapse.vue | 90 + .../u-column-notice/columnNotice.js | 25 + .../components/u-column-notice/props.js | 61 + .../u-column-notice/u-column-notice.vue | 165 + .../uview-plus/components/u-copy/u-copy.vue | 70 + .../components/u-count-down/countDown.js | 18 + .../components/u-count-down/props.js | 26 + .../components/u-count-down/u-count-down.vue | 167 + .../components/u-count-down/utils.js | 62 + .../components/u-count-to/countTo.js | 25 + .../uview-plus/components/u-count-to/props.js | 61 + .../components/u-count-to/u-count-to.vue | 187 + .../components/u-cropper/u-cropper.vue | 1213 +++ .../u-datetime-picker/datetimePicker.js | 42 + .../components/u-datetime-picker/props.js | 168 + .../u-datetime-picker/u-datetime-picker.vue | 523 ++ .../components/u-divider/divider.js | 23 + .../uview-plus/components/u-divider/props.js | 46 + .../components/u-divider/u-divider.vue | 122 + .../components/u-dragsort/u-dragsort.vue | 367 + .../components/u-dropdown-item/props.js | 47 + .../u-dropdown-item/u-dropdown-item.vue | 120 + .../uview-plus/components/u-dropdown/props.js | 61 + .../components/u-dropdown/u-dropdown.vue | 258 + .../uview-plus/components/u-empty/empty.js | 26 + .../uview-plus/components/u-empty/props.js | 61 + .../uview-plus/components/u-empty/u-empty.vue | 132 + .../u-float-button/u-float-button.vue | 167 + .../components/u-form-item/formItem.js | 24 + .../components/u-form-item/props.js | 55 + .../components/u-form-item/u-form-item.vue | 261 + .../uview-plus/components/u-form/form.js | 22 + .../uview-plus/components/u-form/props.js | 47 + .../uview-plus/components/u-form/u-form.vue | 258 + .../uview-plus/components/u-gap/gap.js | 19 + .../uview-plus/components/u-gap/props.js | 26 + .../uview-plus/components/u-gap/u-gap.vue | 40 + .../components/u-grid-item/gridItem.js | 16 + .../components/u-grid-item/props.js | 16 + .../components/u-grid-item/u-grid-item.vue | 218 + .../uview-plus/components/u-grid/grid.js | 17 + .../uview-plus/components/u-grid/props.js | 26 + .../uview-plus/components/u-grid/u-grid.vue | 113 + .../uview-plus/components/u-icon/icon.js | 36 + .../uview-plus/components/u-icon/icons.js | 214 + .../uview-plus/components/u-icon/props.js | 91 + .../uview-plus/components/u-icon/u-icon.vue | 238 + .../uview-plus/components/u-icon/util.js | 68 + .../uview-plus/components/u-image/image.js | 30 + .../uview-plus/components/u-image/props.js | 86 + .../uview-plus/components/u-image/u-image.vue | 267 + .../components/u-index-anchor/indexAnchor.js | 19 + .../components/u-index-anchor/props.js | 31 + .../u-index-anchor/u-index-anchor.vue | 110 + .../components/u-index-item/props.js | 8 + .../components/u-index-item/u-index-item.vue | 89 + .../components/u-index-list/indexList.js | 20 + .../components/u-index-list/props.js | 36 + .../components/u-index-list/u-index-list.vue | 593 ++ .../uview-plus/components/u-input/input.js | 49 + .../uview-plus/components/u-input/props.js | 203 + .../uview-plus/components/u-input/u-input.vue | 401 + .../components/u-keyboard/keyboard.js | 30 + .../uview-plus/components/u-keyboard/props.js | 86 + .../components/u-keyboard/u-keyboard.vue | 166 + .../components/u-lazy-load/u-lazy-load.vue | 260 + .../u-line-progress/lineProgress.js | 20 + .../components/u-line-progress/props.js | 35 + .../u-line-progress/u-line-progress.vue | 152 + .../uview-plus/components/u-line/line.js | 20 + .../uview-plus/components/u-line/props.js | 35 + .../uview-plus/components/u-line/u-line.vue | 64 + .../uview-plus/components/u-link/link.js | 26 + .../uview-plus/components/u-link/props.js | 41 + .../uview-plus/components/u-link/u-link.vue | 86 + .../components/u-list-item/listItem.js | 15 + .../components/u-list-item/props.js | 11 + .../components/u-list-item/u-list-item.vue | 118 + .../uview-plus/components/u-list/list.js | 28 + .../uview-plus/components/u-list/props.js | 101 + .../uview-plus/components/u-list/u-list.vue | 182 + .../components/u-loading-icon/loadingIcon.js | 30 + .../components/u-loading-icon/props.js | 61 + .../u-loading-icon/u-loading-icon.vue | 348 + .../components/u-loading-page/loadingPage.js | 24 + .../components/u-loading-page/props.js | 57 + .../u-loading-page/u-loading-page.vue | 121 + .../components/u-loadmore/loadmore.js | 32 + .../uview-plus/components/u-loadmore/props.js | 96 + .../components/u-loadmore/u-loadmore.vue | 154 + .../u-message-input/u-message-input.vue | 318 + .../uview-plus/components/u-modal/modal.js | 35 + .../uview-plus/components/u-modal/props.js | 111 + .../uview-plus/components/u-modal/u-modal.vue | 265 + .../components/u-navbar-mini/props.js | 51 + .../u-navbar-mini/u-navbar-mini.vue | 137 + .../uview-plus/components/u-navbar/navbar.js | 33 + .../uview-plus/components/u-navbar/props.js | 97 + .../components/u-navbar/u-navbar.vue | 200 + .../components/u-no-network/noNetwork.js | 18 + .../components/u-no-network/props.js | 21 + .../components/u-no-network/u-no-network.vue | 222 + .../components/u-notice-bar/noticeBar.js | 28 + .../components/u-notice-bar/props.js | 76 + .../components/u-notice-bar/u-notice-bar.vue | 105 + .../uview-plus/components/u-notify/notify.js | 22 + .../uview-plus/components/u-notify/props.js | 51 + .../components/u-notify/u-notify.vue | 216 + .../components/u-number-box/numberBox.js | 40 + .../components/u-number-box/props.js | 145 + .../components/u-number-box/u-number-box.vue | 478 + .../u-number-keyboard/numberKeyboard.js | 17 + .../components/u-number-keyboard/props.js | 21 + .../u-number-keyboard/u-number-keyboard.vue | 198 + .../components/u-overlay/overlay.js | 18 + .../uview-plus/components/u-overlay/props.js | 26 + .../components/u-overlay/u-overlay.vue | 71 + .../components/u-pagination/u-pagination.vue | 283 + .../components/u-parse/node/node.vue | 599 ++ .../uview-plus/components/u-parse/parse.js | 22 + .../uview-plus/components/u-parse/parser.js | 1400 +++ .../uview-plus/components/u-parse/props.js | 48 + .../uview-plus/components/u-parse/u-parse.vue | 504 + .../components/u-picker-column/props.js | 7 + .../u-picker-column/u-picker-column.vue | 28 + .../u-picker-data/u-picker-data.vue | 130 + .../uview-plus/components/u-picker/picker.js | 40 + .../uview-plus/components/u-picker/props.js | 147 + .../components/u-picker/u-picker.vue | 472 + .../uview-plus/components/u-popup/popup.js | 29 + .../uview-plus/components/u-popup/props.js | 81 + .../uview-plus/components/u-popup/u-popup.vue | 335 + .../u-pull-refresh/u-pull-refresh.vue | 332 + .../uview-plus/components/u-qrcode/qrcode.js | 1319 +++ .../components/u-qrcode/u-qrcode.vue | 449 + .../components/u-radio-group/props.js | 100 + .../components/u-radio-group/radioGroup.js | 31 + .../u-radio-group/u-radio-group.vue | 136 + .../uview-plus/components/u-radio/props.js | 71 + .../uview-plus/components/u-radio/radio.js | 27 + .../uview-plus/components/u-radio/u-radio.vue | 350 + .../uview-plus/components/u-rate/props.js | 80 + .../uview-plus/components/u-rate/rate.js | 26 + .../uview-plus/components/u-rate/u-rate.vue | 327 + .../components/u-read-more/props.js | 63 + .../components/u-read-more/readMore.js | 22 + .../components/u-read-more/u-read-more.vue | 165 + .../u-refresh-virtual-list.vue | 85 + .../components/u-row-notice/props.js | 41 + .../components/u-row-notice/rowNotice.js | 21 + .../components/u-row-notice/u-row-notice.vue | 336 + .../uview-plus/components/u-row/props.js | 21 + .../uview-plus/components/u-row/row.js | 17 + .../uview-plus/components/u-row/u-row.vue | 96 + .../components/u-safe-bottom/props.js | 7 + .../u-safe-bottom/u-safe-bottom.vue | 59 + .../components/u-scroll-list/nvue.js | 31 + .../components/u-scroll-list/other.js | 0 .../components/u-scroll-list/props.js | 36 + .../components/u-scroll-list/scrollList.js | 20 + .../components/u-scroll-list/scrollWxs.wxs | 50 + .../u-scroll-list/u-scroll-list.vue | 233 + .../uview-plus/components/u-search/props.js | 138 + .../uview-plus/components/u-search/search.js | 38 + .../components/u-search/u-search.vue | 342 + .../components/u-section/section.js | 24 + .../components/u-select/u-select.vue | 218 + .../components/u-signature/u-signature.vue | 498 + .../uview-plus/components/u-skeleton/props.js | 61 + .../components/u-skeleton/skeleton.js | 25 + .../components/u-skeleton/u-skeleton.vue | 248 + .../uview-plus/components/u-slider/mpother.js | 113 + .../uview-plus/components/u-slider/mpwxs.js | 43 + .../uview-plus/components/u-slider/mpwxs.wxs | 121 + .../uview-plus/components/u-slider/nvue.js | 193 + .../uview-plus/components/u-slider/props.js | 91 + .../uview-plus/components/u-slider/slider.js | 27 + .../components/u-slider/u-slider.vue | 506 + .../components/u-status-bar/props.js | 15 + .../components/u-status-bar/statusBar.js | 16 + .../components/u-status-bar/u-status-bar.vue | 63 + .../components/u-steps-item/props.js | 31 + .../components/u-steps-item/stepsItem.js | 18 + .../components/u-steps-item/u-steps-item.vue | 342 + .../uview-plus/components/u-steps/props.js | 41 + .../uview-plus/components/u-steps/steps.js | 21 + .../uview-plus/components/u-steps/u-steps.vue | 94 + .../uview-plus/components/u-sticky/props.js | 42 + .../uview-plus/components/u-sticky/sticky.js | 20 + .../components/u-sticky/u-sticky.vue | 221 + .../components/u-subsection/props.js | 67 + .../components/u-subsection/subsection.js | 26 + .../components/u-subsection/u-subsection.vue | 405 + .../components/u-swipe-action-item/alipay.sjs | 229 + .../u-swipe-action-item/index - backup.wxs | 256 + .../components/u-swipe-action-item/index.wxs | 234 + .../u-swipe-action-item/nvue - backup.js | 270 + .../components/u-swipe-action-item/nvue.js | 174 + .../components/u-swipe-action-item/other.js | 178 + .../components/u-swipe-action-item/props.js | 47 + .../u-swipe-action-item/swipeActionItem.js | 22 + .../u-swipe-action-item.vue | 249 + .../components/u-swipe-action-item/wxs.js | 15 + .../components/u-swipe-action/props.js | 16 + .../components/u-swipe-action/swipeAction.js | 15 + .../u-swipe-action/u-swipe-action.vue | 84 + .../components/u-swiper-indicator/props.js | 31 + .../u-swiper-indicator/swipterIndicator.js | 19 + .../u-swiper-indicator/u-swiper-indicator.vue | 114 + .../uview-plus/components/u-swiper/props.js | 127 + .../uview-plus/components/u-swiper/swiper.js | 39 + .../components/u-swiper/u-swiper.vue | 269 + .../uview-plus/components/u-switch/props.js | 64 + .../uview-plus/components/u-switch/switch.js | 24 + .../components/u-switch/u-switch.vue | 215 + .../components/u-tabbar-item/props.js | 37 + .../components/u-tabbar-item/tabbarItem.js | 20 + .../u-tabbar-item/u-tabbar-item.vue | 157 + .../uview-plus/components/u-tabbar/props.js | 47 + .../uview-plus/components/u-tabbar/tabbar.js | 22 + .../components/u-tabbar/u-tabbar.vue | 144 + .../uview-plus/components/u-table/props.js | 7 + .../uview-plus/components/u-table/u-table.vue | 104 + .../components/u-table2/tableRow.vue | 244 + .../components/u-table2/u-table2.vue | 746 ++ .../components/u-tabs-item/props.js | 7 + .../components/u-tabs-item/u-tabs-item.vue | 31 + .../uview-plus/components/u-tabs/props.js | 71 + .../uview-plus/components/u-tabs/tabs.js | 33 + .../uview-plus/components/u-tabs/u-tabs.vue | 411 + .../uview-plus/components/u-tag/props.js | 116 + .../uview-plus/components/u-tag/tag.js | 35 + .../uview-plus/components/u-tag/u-tag.vue | 402 + .../uview-plus/components/u-td/props.js | 7 + .../uview-plus/components/u-td/u-td.vue | 98 + .../uview-plus/components/u-text/props.js | 117 + .../uview-plus/components/u-text/text.js | 39 + .../uview-plus/components/u-text/u-text.vue | 234 + .../uview-plus/components/u-text/value.js | 87 + .../uview-plus/components/u-textarea/props.js | 127 + .../components/u-textarea/textarea.js | 36 + .../components/u-textarea/u-textarea.vue | 285 + .../uview-plus/components/u-th/props.js | 7 + .../uview-plus/components/u-th/u-th.vue | 66 + .../uview-plus/components/u-title/u-title.vue | 36 + .../uview-plus/components/u-toast/toast.js | 30 + .../uview-plus/components/u-toast/u-toast.vue | 304 + .../uview-plus/components/u-toolbar/props.js | 41 + .../components/u-toolbar/toolbar.js | 21 + .../components/u-toolbar/u-toolbar.vue | 125 + .../uview-plus/components/u-tooltip/props.js | 61 + .../components/u-tooltip/tooltip.js | 25 + .../components/u-tooltip/u-tooltip.vue | 341 + .../uview-plus/components/u-tr/props.js | 7 + .../uview-plus/components/u-tr/u-tr.vue | 34 + .../components/u-transition/nvue-ani-map.js | 68 + .../components/u-transition/props.js | 26 + .../components/u-transition/transition.js | 18 + .../u-transition/transitionMixin.js | 163 + .../components/u-transition/u-transition.vue | 207 + .../u-transition/vue.ani-style.scss | 113 + .../components/u-tree/tree-node.vue | 128 + .../uview-plus/components/u-tree/u-tree.vue | 117 + .../uview-plus/components/u-upload/mixin.js | 23 + .../uview-plus/components/u-upload/props.js | 176 + .../components/u-upload/u-upload.vue | 925 ++ .../uview-plus/components/u-upload/upload.js | 46 + .../uview-plus/components/u-upload/utils.js | 184 + .../uview-plus/components/u-view/u-view.vue | 71 + .../u-virtual-list/u-virtual-list.vue | 253 + .../components/u-waterfall/u-waterfall.vue | 406 + .../components/uview-plus/uview-plus.vue | 15 + uni_modules/uview-plus/index.js | 154 + uni_modules/uview-plus/index.scss | 25 + uni_modules/uview-plus/libs/config/color.js | 17 + uni_modules/uview-plus/libs/config/config.js | 56 + uni_modules/uview-plus/libs/config/props.js | 216 + uni_modules/uview-plus/libs/config/zIndex.js | 20 + uni_modules/uview-plus/libs/css/color.scss | 311 + uni_modules/uview-plus/libs/css/common.scss | 112 + .../uview-plus/libs/css/components.scss | 34 + uni_modules/uview-plus/libs/css/flex.scss | 368 + uni_modules/uview-plus/libs/css/h5.scss | 0 uni_modules/uview-plus/libs/css/mixin.scss | 8 + uni_modules/uview-plus/libs/css/mp.scss | 0 uni_modules/uview-plus/libs/css/nvue.scss | 0 uni_modules/uview-plus/libs/css/vue.scss | 28 + uni_modules/uview-plus/libs/function/calc.js | 64 + .../uview-plus/libs/function/colorGradient.js | 134 + .../uview-plus/libs/function/debounce.js | 29 + uni_modules/uview-plus/libs/function/digit.js | 167 + uni_modules/uview-plus/libs/function/http.js | 4 + uni_modules/uview-plus/libs/function/index.js | 857 ++ .../uview-plus/libs/function/platform.js | 75 + uni_modules/uview-plus/libs/function/test.js | 327 + .../uview-plus/libs/function/throttle.js | 30 + .../libs/luch-request/adapters/index.js | 97 + .../luch-request/core/InterceptorManager.js | 50 + .../libs/luch-request/core/Request.js | 199 + .../libs/luch-request/core/buildFullPath.js | 20 + .../libs/luch-request/core/defaults.js | 29 + .../libs/luch-request/core/dispatchRequest.js | 3 + .../libs/luch-request/core/mergeConfig.js | 103 + .../libs/luch-request/core/settle.js | 16 + .../libs/luch-request/helpers/buildURL.js | 69 + .../libs/luch-request/helpers/combineURLs.js | 14 + .../luch-request/helpers/isAbsoluteURL.js | 14 + .../uview-plus/libs/luch-request/index.d.ts | 116 + .../uview-plus/libs/luch-request/index.js | 3 + .../uview-plus/libs/luch-request/utils.js | 131 + .../libs/luch-request/utils/clone.js | 264 + uni_modules/uview-plus/libs/mixin/button.js | 18 + uni_modules/uview-plus/libs/mixin/mixin.js | 201 + uni_modules/uview-plus/libs/mixin/mpMixin.js | 13 + uni_modules/uview-plus/libs/mixin/mpShare.js | 26 + uni_modules/uview-plus/libs/mixin/openType.js | 27 + uni_modules/uview-plus/libs/mixin/style.js | 249 + uni_modules/uview-plus/libs/mixin/touch.js | 61 + .../uview-plus/libs/util/async-validator.js | 1343 +++ uni_modules/uview-plus/libs/util/calendar.js | 546 ++ uni_modules/uview-plus/libs/util/emitter.js | 51 + .../libs/util/gcanvas/bridge/bridge-weex.js | 241 + .../context-2d/FillStyleLinearGradient.js | 18 + .../gcanvas/context-2d/FillStylePattern.js | 8 + .../context-2d/FillStyleRadialGradient.js | 17 + .../gcanvas/context-2d/RenderingContext.js | 666 ++ .../util/gcanvas/context-webgl/ActiveInfo.js | 11 + .../libs/util/gcanvas/context-webgl/Buffer.js | 21 + .../util/gcanvas/context-webgl/Framebuffer.js | 21 + .../libs/util/gcanvas/context-webgl/GLenum.js | 298 + .../util/gcanvas/context-webgl/GLmethod.js | 142 + .../libs/util/gcanvas/context-webgl/GLtype.js | 23 + .../util/gcanvas/context-webgl/Program.js | 21 + .../gcanvas/context-webgl/Renderbuffer.js | 21 + .../gcanvas/context-webgl/RenderingContext.js | 1191 +++ .../libs/util/gcanvas/context-webgl/Shader.js | 22 + .../context-webgl/ShaderPrecisionFormat.js | 11 + .../util/gcanvas/context-webgl/Texture.js | 22 + .../gcanvas/context-webgl/UniformLocation.js | 22 + .../util/gcanvas/context-webgl/classUtils.js | 3 + .../libs/util/gcanvas/env/canvas.js | 74 + .../uview-plus/libs/util/gcanvas/env/image.js | 96 + .../uview-plus/libs/util/gcanvas/env/tool.js | 24 + .../uview-plus/libs/util/gcanvas/index.js | 39 + uni_modules/uview-plus/libs/util/route.js | 124 + uni_modules/uview-plus/libs/vue.js | 3 + uni_modules/uview-plus/package.json | 111 + uni_modules/uview-plus/theme.scss | 44 + uni_modules/uview-plus/types/comps.d.ts | 102 + .../uview-plus/types/comps/_common.d.ts | 9 + .../uview-plus/types/comps/actionSheet.d.ts | 121 + uni_modules/uview-plus/types/comps/album.d.ts | 82 + uni_modules/uview-plus/types/comps/alert.d.ts | 55 + .../uview-plus/types/comps/avatar.d.ts | 85 + .../uview-plus/types/comps/avatarGroup.d.ts | 62 + .../uview-plus/types/comps/backTop.d.ts | 74 + uni_modules/uview-plus/types/comps/badge.d.ts | 76 + .../uview-plus/types/comps/button.d.ts | 169 + .../uview-plus/types/comps/calendar.d.ts | 164 + uni_modules/uview-plus/types/comps/cell.d.ts | 133 + .../uview-plus/types/comps/cellGroup.d.ts | 27 + .../uview-plus/types/comps/checkbox.d.ts | 69 + .../uview-plus/types/comps/checkboxGroup.d.ts | 93 + uni_modules/uview-plus/types/comps/code.d.ts | 69 + .../uview-plus/types/comps/codeInput.d.ts | 98 + uni_modules/uview-plus/types/comps/col.d.ts | 43 + .../uview-plus/types/comps/collapse.d.ts | 52 + .../uview-plus/types/comps/collapseItem.d.ts | 83 + .../uview-plus/types/comps/countDown.d.ts | 60 + .../uview-plus/types/comps/countTo.d.ts | 88 + .../types/comps/datetimePicker.d.ts | 146 + .../uview-plus/types/comps/divider.d.ts | 58 + uni_modules/uview-plus/types/comps/empty.d.ts | 72 + uni_modules/uview-plus/types/comps/form.d.ts | 76 + .../uview-plus/types/comps/formItem.d.ts | 68 + uni_modules/uview-plus/types/comps/gap.d.ts | 35 + uni_modules/uview-plus/types/comps/grid.d.ts | 34 + .../uview-plus/types/comps/gridItem.d.ts | 28 + uni_modules/uview-plus/types/comps/icon.d.ts | 93 + uni_modules/uview-plus/types/comps/image.d.ts | 119 + .../uview-plus/types/comps/indexAnchor.d.ts | 38 + .../uview-plus/types/comps/indexItem.d.ts | 18 + .../uview-plus/types/comps/indexList.d.ts | 39 + uni_modules/uview-plus/types/comps/input.d.ts | 234 + .../uview-plus/types/comps/keyboard.d.ts | 125 + uni_modules/uview-plus/types/comps/line.d.ts | 44 + .../uview-plus/types/comps/lineProgress.d.ts | 51 + uni_modules/uview-plus/types/comps/link.d.ts | 51 + uni_modules/uview-plus/types/comps/list.d.ts | 92 + .../uview-plus/types/comps/listItem.d.ts | 18 + .../uview-plus/types/comps/loadMore.d.ts | 108 + .../uview-plus/types/comps/loadingIcon.d.ts | 68 + .../uview-plus/types/comps/loadingPage.d.ts | 58 + uni_modules/uview-plus/types/comps/modal.d.ts | 115 + .../uview-plus/types/comps/navbar.d.ts | 118 + .../uview-plus/types/comps/noNetwork.d.ts | 40 + .../uview-plus/types/comps/noticeBar.d.ts | 85 + .../uview-plus/types/comps/notify.d.ts | 73 + .../uview-plus/types/comps/numberBox.d.ts | 155 + .../uview-plus/types/comps/overlay.d.ts | 46 + uni_modules/uview-plus/types/comps/parse.d.ts | 101 + .../uview-plus/types/comps/picker.d.ts | 115 + uni_modules/uview-plus/types/comps/popup.d.ts | 103 + .../uview-plus/types/comps/qrcode.d.ts | 77 + uni_modules/uview-plus/types/comps/radio.d.ts | 77 + .../uview-plus/types/comps/radioGroup.d.ts | 97 + uni_modules/uview-plus/types/comps/rate.d.ts | 85 + .../uview-plus/types/comps/readMore.d.ts | 80 + uni_modules/uview-plus/types/comps/row.d.ts | 34 + .../uview-plus/types/comps/safeBottom.d.ts | 16 + .../uview-plus/types/comps/scrollList.d.ts | 51 + .../uview-plus/types/comps/search.d.ts | 180 + .../uview-plus/types/comps/skeleton.d.ts | 70 + .../uview-plus/types/comps/slider.d.ts | 79 + .../uview-plus/types/comps/statusBar.d.ts | 22 + uni_modules/uview-plus/types/comps/steps.d.ts | 48 + .../uview-plus/types/comps/stepsItem.d.ts | 41 + .../uview-plus/types/comps/sticky.d.ts | 48 + .../uview-plus/types/comps/subsection.d.ts | 80 + .../uview-plus/types/comps/swipeAction.d.ts | 24 + .../types/comps/swipeActionItem.d.ts | 58 + .../uview-plus/types/comps/swiper.d.ts | 142 + .../types/comps/swiperIndicator.d.ts | 37 + .../uview-plus/types/comps/switch.d.ts | 73 + .../uview-plus/types/comps/tabbar.d.ts | 54 + .../uview-plus/types/comps/tabbarItem.d.ts | 52 + uni_modules/uview-plus/types/comps/tabs.d.ts | 85 + uni_modules/uview-plus/types/comps/tag.d.ts | 93 + uni_modules/uview-plus/types/comps/text.d.ts | 110 + .../uview-plus/types/comps/textarea.d.ts | 158 + uni_modules/uview-plus/types/comps/toast.d.ts | 63 + .../uview-plus/types/comps/tooltip.d.ts | 71 + .../uview-plus/types/comps/transition.d.ts | 61 + .../uview-plus/types/comps/upload.d.ts | 204 + uni_modules/uview-plus/types/index.d.ts | 172 + uni_modules/uview-plus/types/package.json | 26 + .../dist/cache/.vite/deps/_metadata.json | 15 + .../dist/cache/.vite/deps/dayjs_esm_index.js | 492 + .../cache/.vite/deps/dayjs_esm_index.js.map | 7 + unpackage/dist/cache/.vite/deps/package.json | 3 + utils/request.js | 63 + vite.config.json | 0 1138 files changed, 97519 insertions(+) create mode 100644 App.vue create mode 100644 components/ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js create mode 100644 components/ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js.map create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 node_modules/.package-lock.json create mode 100644 node_modules/clipboard/.babelrc.json create mode 100644 node_modules/clipboard/.editorconfig create mode 100644 node_modules/clipboard/.eslintignore create mode 100644 node_modules/clipboard/.eslintrc.json create mode 100644 node_modules/clipboard/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 node_modules/clipboard/.github/ISSUE_TEMPLATE/documentation.md create mode 100644 node_modules/clipboard/.github/ISSUE_TEMPLATE/proposal.md create mode 100644 node_modules/clipboard/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 node_modules/clipboard/.github/stale.yml create mode 100644 node_modules/clipboard/.github/workflows/publish.yml create mode 100644 node_modules/clipboard/.github/workflows/test.js.yml create mode 100644 node_modules/clipboard/.husky/pre-commit create mode 100644 node_modules/clipboard/.nvmrc create mode 100644 node_modules/clipboard/.prettierignore create mode 100644 node_modules/clipboard/.prettierrc.json create mode 100644 node_modules/clipboard/LICENSE create mode 100644 node_modules/clipboard/bower.json create mode 100644 node_modules/clipboard/composer.json create mode 100644 node_modules/clipboard/contributing.md create mode 100644 node_modules/clipboard/demo/constructor-node.html create mode 100644 node_modules/clipboard/demo/constructor-nodelist.html create mode 100644 node_modules/clipboard/demo/constructor-selector.html create mode 100644 node_modules/clipboard/demo/function-target.html create mode 100644 node_modules/clipboard/demo/function-text.html create mode 100644 node_modules/clipboard/demo/target-div.html create mode 100644 node_modules/clipboard/demo/target-input-number.html create mode 100644 node_modules/clipboard/demo/target-input.html create mode 100644 node_modules/clipboard/demo/target-programmatic-copy.html create mode 100644 node_modules/clipboard/demo/target-programmatic-cut.html create mode 100644 node_modules/clipboard/demo/target-textarea.html create mode 100644 node_modules/clipboard/demo/text-programmatic-copy.html create mode 100644 node_modules/clipboard/dist/clipboard.js create mode 100644 node_modules/clipboard/dist/clipboard.min.js create mode 100644 node_modules/clipboard/karma.conf.js create mode 100644 node_modules/clipboard/package.js create mode 100644 node_modules/clipboard/package.json create mode 100644 node_modules/clipboard/readme.md create mode 100644 node_modules/clipboard/src/actions/copy.js create mode 100644 node_modules/clipboard/src/actions/cut.js create mode 100644 node_modules/clipboard/src/actions/default.js create mode 100644 node_modules/clipboard/src/clipboard.d.ts create mode 100644 node_modules/clipboard/src/clipboard.js create mode 100644 node_modules/clipboard/src/clipboard.test-d.ts create mode 100644 node_modules/clipboard/src/common/command.js create mode 100644 node_modules/clipboard/src/common/create-fake-element.js create mode 100644 node_modules/clipboard/test/actions/copy.js create mode 100644 node_modules/clipboard/test/actions/cut.js create mode 100644 node_modules/clipboard/test/actions/default.js create mode 100644 node_modules/clipboard/test/clipboard.js create mode 100644 node_modules/clipboard/test/common/command.js create mode 100644 node_modules/clipboard/test/common/create-fake-element.js create mode 100644 node_modules/clipboard/webpack.config.js create mode 100644 node_modules/dayjs/.editorconfig create mode 100644 node_modules/dayjs/CHANGELOG.md create mode 100644 node_modules/dayjs/LICENSE create mode 100644 node_modules/dayjs/README.md create mode 100644 node_modules/dayjs/dayjs.min.js create mode 100644 node_modules/dayjs/esm/constant.js create mode 100644 node_modules/dayjs/esm/index.d.ts create mode 100644 node_modules/dayjs/esm/index.js create mode 100644 node_modules/dayjs/esm/locale/af.js create mode 100644 node_modules/dayjs/esm/locale/am.js create mode 100644 node_modules/dayjs/esm/locale/ar-dz.js create mode 100644 node_modules/dayjs/esm/locale/ar-iq.js create mode 100644 node_modules/dayjs/esm/locale/ar-kw.js create mode 100644 node_modules/dayjs/esm/locale/ar-ly.js create mode 100644 node_modules/dayjs/esm/locale/ar-ma.js create mode 100644 node_modules/dayjs/esm/locale/ar-sa.js create mode 100644 node_modules/dayjs/esm/locale/ar-tn.js create mode 100644 node_modules/dayjs/esm/locale/ar.js create mode 100644 node_modules/dayjs/esm/locale/az.js create mode 100644 node_modules/dayjs/esm/locale/be.js create mode 100644 node_modules/dayjs/esm/locale/bg.js create mode 100644 node_modules/dayjs/esm/locale/bi.js create mode 100644 node_modules/dayjs/esm/locale/bm.js create mode 100644 node_modules/dayjs/esm/locale/bn-bd.js create mode 100644 node_modules/dayjs/esm/locale/bn.js create mode 100644 node_modules/dayjs/esm/locale/bo.js create mode 100644 node_modules/dayjs/esm/locale/br.js create mode 100644 node_modules/dayjs/esm/locale/bs.js create mode 100644 node_modules/dayjs/esm/locale/ca.js create mode 100644 node_modules/dayjs/esm/locale/cs.js create mode 100644 node_modules/dayjs/esm/locale/cv.js create mode 100644 node_modules/dayjs/esm/locale/cy.js create mode 100644 node_modules/dayjs/esm/locale/da.js create mode 100644 node_modules/dayjs/esm/locale/de-at.js create mode 100644 node_modules/dayjs/esm/locale/de-ch.js create mode 100644 node_modules/dayjs/esm/locale/de.js create mode 100644 node_modules/dayjs/esm/locale/dv.js create mode 100644 node_modules/dayjs/esm/locale/el.js create mode 100644 node_modules/dayjs/esm/locale/en-au.js create mode 100644 node_modules/dayjs/esm/locale/en-ca.js create mode 100644 node_modules/dayjs/esm/locale/en-gb.js create mode 100644 node_modules/dayjs/esm/locale/en-ie.js create mode 100644 node_modules/dayjs/esm/locale/en-il.js create mode 100644 node_modules/dayjs/esm/locale/en-in.js create mode 100644 node_modules/dayjs/esm/locale/en-nz.js create mode 100644 node_modules/dayjs/esm/locale/en-sg.js create mode 100644 node_modules/dayjs/esm/locale/en-tt.js create mode 100644 node_modules/dayjs/esm/locale/en.js create mode 100644 node_modules/dayjs/esm/locale/eo.js create mode 100644 node_modules/dayjs/esm/locale/es-do.js create mode 100644 node_modules/dayjs/esm/locale/es-mx.js create mode 100644 node_modules/dayjs/esm/locale/es-pr.js create mode 100644 node_modules/dayjs/esm/locale/es-us.js create mode 100644 node_modules/dayjs/esm/locale/es.js create mode 100644 node_modules/dayjs/esm/locale/et.js create mode 100644 node_modules/dayjs/esm/locale/eu.js create mode 100644 node_modules/dayjs/esm/locale/fa.js create mode 100644 node_modules/dayjs/esm/locale/fi.js create mode 100644 node_modules/dayjs/esm/locale/fo.js create mode 100644 node_modules/dayjs/esm/locale/fr-ca.js create mode 100644 node_modules/dayjs/esm/locale/fr-ch.js create mode 100644 node_modules/dayjs/esm/locale/fr.js create mode 100644 node_modules/dayjs/esm/locale/fy.js create mode 100644 node_modules/dayjs/esm/locale/ga.js create mode 100644 node_modules/dayjs/esm/locale/gd.js create mode 100644 node_modules/dayjs/esm/locale/gl.js create mode 100644 node_modules/dayjs/esm/locale/gom-latn.js create mode 100644 node_modules/dayjs/esm/locale/gu.js create mode 100644 node_modules/dayjs/esm/locale/he.js create mode 100644 node_modules/dayjs/esm/locale/hi.js create mode 100644 node_modules/dayjs/esm/locale/hr.js create mode 100644 node_modules/dayjs/esm/locale/ht.js create mode 100644 node_modules/dayjs/esm/locale/hu.js create mode 100644 node_modules/dayjs/esm/locale/hy-am.js create mode 100644 node_modules/dayjs/esm/locale/id.js create mode 100644 node_modules/dayjs/esm/locale/index.d.ts create mode 100644 node_modules/dayjs/esm/locale/is.js create mode 100644 node_modules/dayjs/esm/locale/it-ch.js create mode 100644 node_modules/dayjs/esm/locale/it.js create mode 100644 node_modules/dayjs/esm/locale/ja.js create mode 100644 node_modules/dayjs/esm/locale/jv.js create mode 100644 node_modules/dayjs/esm/locale/ka.js create mode 100644 node_modules/dayjs/esm/locale/kk.js create mode 100644 node_modules/dayjs/esm/locale/km.js create mode 100644 node_modules/dayjs/esm/locale/kn.js create mode 100644 node_modules/dayjs/esm/locale/ko.js create mode 100644 node_modules/dayjs/esm/locale/ku.js create mode 100644 node_modules/dayjs/esm/locale/ky.js create mode 100644 node_modules/dayjs/esm/locale/lb.js create mode 100644 node_modules/dayjs/esm/locale/lo.js create mode 100644 node_modules/dayjs/esm/locale/lt.js create mode 100644 node_modules/dayjs/esm/locale/lv.js create mode 100644 node_modules/dayjs/esm/locale/me.js create mode 100644 node_modules/dayjs/esm/locale/mi.js create mode 100644 node_modules/dayjs/esm/locale/mk.js create mode 100644 node_modules/dayjs/esm/locale/ml.js create mode 100644 node_modules/dayjs/esm/locale/mn.js create mode 100644 node_modules/dayjs/esm/locale/mr.js create mode 100644 node_modules/dayjs/esm/locale/ms-my.js create mode 100644 node_modules/dayjs/esm/locale/ms.js create mode 100644 node_modules/dayjs/esm/locale/mt.js create mode 100644 node_modules/dayjs/esm/locale/my.js create mode 100644 node_modules/dayjs/esm/locale/nb.js create mode 100644 node_modules/dayjs/esm/locale/ne.js create mode 100644 node_modules/dayjs/esm/locale/nl-be.js create mode 100644 node_modules/dayjs/esm/locale/nl.js create mode 100644 node_modules/dayjs/esm/locale/nn.js create mode 100644 node_modules/dayjs/esm/locale/oc-lnc.js create mode 100644 node_modules/dayjs/esm/locale/pa-in.js create mode 100644 node_modules/dayjs/esm/locale/pl.js create mode 100644 node_modules/dayjs/esm/locale/pt-br.js create mode 100644 node_modules/dayjs/esm/locale/pt.js create mode 100644 node_modules/dayjs/esm/locale/rn.js create mode 100644 node_modules/dayjs/esm/locale/ro.js create mode 100644 node_modules/dayjs/esm/locale/ru.js create mode 100644 node_modules/dayjs/esm/locale/rw.js create mode 100644 node_modules/dayjs/esm/locale/sd.js create mode 100644 node_modules/dayjs/esm/locale/se.js create mode 100644 node_modules/dayjs/esm/locale/si.js create mode 100644 node_modules/dayjs/esm/locale/sk.js create mode 100644 node_modules/dayjs/esm/locale/sl.js create mode 100644 node_modules/dayjs/esm/locale/sq.js create mode 100644 node_modules/dayjs/esm/locale/sr-cyrl.js create mode 100644 node_modules/dayjs/esm/locale/sr.js create mode 100644 node_modules/dayjs/esm/locale/ss.js create mode 100644 node_modules/dayjs/esm/locale/sv-fi.js create mode 100644 node_modules/dayjs/esm/locale/sv.js create mode 100644 node_modules/dayjs/esm/locale/sw.js create mode 100644 node_modules/dayjs/esm/locale/ta.js create mode 100644 node_modules/dayjs/esm/locale/te.js create mode 100644 node_modules/dayjs/esm/locale/tet.js create mode 100644 node_modules/dayjs/esm/locale/tg.js create mode 100644 node_modules/dayjs/esm/locale/th.js create mode 100644 node_modules/dayjs/esm/locale/tk.js create mode 100644 node_modules/dayjs/esm/locale/tl-ph.js create mode 100644 node_modules/dayjs/esm/locale/tlh.js create mode 100644 node_modules/dayjs/esm/locale/tr.js create mode 100644 node_modules/dayjs/esm/locale/types.d.ts create mode 100644 node_modules/dayjs/esm/locale/tzl.js create mode 100644 node_modules/dayjs/esm/locale/tzm-latn.js create mode 100644 node_modules/dayjs/esm/locale/tzm.js create mode 100644 node_modules/dayjs/esm/locale/ug-cn.js create mode 100644 node_modules/dayjs/esm/locale/uk.js create mode 100644 node_modules/dayjs/esm/locale/ur.js create mode 100644 node_modules/dayjs/esm/locale/uz-latn.js create mode 100644 node_modules/dayjs/esm/locale/uz.js create mode 100644 node_modules/dayjs/esm/locale/vi.js create mode 100644 node_modules/dayjs/esm/locale/x-pseudo.js create mode 100644 node_modules/dayjs/esm/locale/yo.js create mode 100644 node_modules/dayjs/esm/locale/zh-cn.js create mode 100644 node_modules/dayjs/esm/locale/zh-hk.js create mode 100644 node_modules/dayjs/esm/locale/zh-tw.js create mode 100644 node_modules/dayjs/esm/locale/zh.js create mode 100644 node_modules/dayjs/esm/plugin/advancedFormat/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/advancedFormat/index.js create mode 100644 node_modules/dayjs/esm/plugin/arraySupport/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/arraySupport/index.js create mode 100644 node_modules/dayjs/esm/plugin/badMutable/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/badMutable/index.js create mode 100644 node_modules/dayjs/esm/plugin/bigIntSupport/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/bigIntSupport/index.js create mode 100644 node_modules/dayjs/esm/plugin/buddhistEra/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/buddhistEra/index.js create mode 100644 node_modules/dayjs/esm/plugin/calendar/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/calendar/index.js create mode 100644 node_modules/dayjs/esm/plugin/customParseFormat/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/customParseFormat/index.js create mode 100644 node_modules/dayjs/esm/plugin/dayOfYear/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/dayOfYear/index.js create mode 100644 node_modules/dayjs/esm/plugin/devHelper/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/devHelper/index.js create mode 100644 node_modules/dayjs/esm/plugin/duration/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/duration/index.js create mode 100644 node_modules/dayjs/esm/plugin/isBetween/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isBetween/index.js create mode 100644 node_modules/dayjs/esm/plugin/isLeapYear/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isLeapYear/index.js create mode 100644 node_modules/dayjs/esm/plugin/isMoment/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isMoment/index.js create mode 100644 node_modules/dayjs/esm/plugin/isSameOrAfter/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isSameOrAfter/index.js create mode 100644 node_modules/dayjs/esm/plugin/isSameOrBefore/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isSameOrBefore/index.js create mode 100644 node_modules/dayjs/esm/plugin/isToday/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isToday/index.js create mode 100644 node_modules/dayjs/esm/plugin/isTomorrow/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isTomorrow/index.js create mode 100644 node_modules/dayjs/esm/plugin/isYesterday/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isYesterday/index.js create mode 100644 node_modules/dayjs/esm/plugin/isoWeek/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isoWeek/index.js create mode 100644 node_modules/dayjs/esm/plugin/isoWeeksInYear/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/isoWeeksInYear/index.js create mode 100644 node_modules/dayjs/esm/plugin/localeData/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/localeData/index.js create mode 100644 node_modules/dayjs/esm/plugin/localizedFormat/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/localizedFormat/index.js create mode 100644 node_modules/dayjs/esm/plugin/localizedFormat/utils.js create mode 100644 node_modules/dayjs/esm/plugin/minMax/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/minMax/index.js create mode 100644 node_modules/dayjs/esm/plugin/negativeYear/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/negativeYear/index.js create mode 100644 node_modules/dayjs/esm/plugin/objectSupport/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/objectSupport/index.js create mode 100644 node_modules/dayjs/esm/plugin/pluralGetSet/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/pluralGetSet/index.js create mode 100644 node_modules/dayjs/esm/plugin/preParsePostFormat/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/preParsePostFormat/index.js create mode 100644 node_modules/dayjs/esm/plugin/quarterOfYear/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/quarterOfYear/index.js create mode 100644 node_modules/dayjs/esm/plugin/relativeTime/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/relativeTime/index.js create mode 100644 node_modules/dayjs/esm/plugin/timezone/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/timezone/index.js create mode 100644 node_modules/dayjs/esm/plugin/toArray/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/toArray/index.js create mode 100644 node_modules/dayjs/esm/plugin/toObject/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/toObject/index.js create mode 100644 node_modules/dayjs/esm/plugin/updateLocale/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/updateLocale/index.js create mode 100644 node_modules/dayjs/esm/plugin/utc/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/utc/index.js create mode 100644 node_modules/dayjs/esm/plugin/weekOfYear/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/weekOfYear/index.js create mode 100644 node_modules/dayjs/esm/plugin/weekYear/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/weekYear/index.js create mode 100644 node_modules/dayjs/esm/plugin/weekday/index.d.ts create mode 100644 node_modules/dayjs/esm/plugin/weekday/index.js create mode 100644 node_modules/dayjs/esm/utils.js create mode 100644 node_modules/dayjs/index.d.ts create mode 100644 node_modules/dayjs/locale.json create mode 100644 node_modules/dayjs/locale/af.js create mode 100644 node_modules/dayjs/locale/am.js create mode 100644 node_modules/dayjs/locale/ar-dz.js create mode 100644 node_modules/dayjs/locale/ar-iq.js create mode 100644 node_modules/dayjs/locale/ar-kw.js create mode 100644 node_modules/dayjs/locale/ar-ly.js create mode 100644 node_modules/dayjs/locale/ar-ma.js create mode 100644 node_modules/dayjs/locale/ar-sa.js create mode 100644 node_modules/dayjs/locale/ar-tn.js create mode 100644 node_modules/dayjs/locale/ar.js create mode 100644 node_modules/dayjs/locale/az.js create mode 100644 node_modules/dayjs/locale/be.js create mode 100644 node_modules/dayjs/locale/bg.js create mode 100644 node_modules/dayjs/locale/bi.js create mode 100644 node_modules/dayjs/locale/bm.js create mode 100644 node_modules/dayjs/locale/bn-bd.js create mode 100644 node_modules/dayjs/locale/bn.js create mode 100644 node_modules/dayjs/locale/bo.js create mode 100644 node_modules/dayjs/locale/br.js create mode 100644 node_modules/dayjs/locale/bs.js create mode 100644 node_modules/dayjs/locale/ca.js create mode 100644 node_modules/dayjs/locale/cs.js create mode 100644 node_modules/dayjs/locale/cv.js create mode 100644 node_modules/dayjs/locale/cy.js create mode 100644 node_modules/dayjs/locale/da.js create mode 100644 node_modules/dayjs/locale/de-at.js create mode 100644 node_modules/dayjs/locale/de-ch.js create mode 100644 node_modules/dayjs/locale/de.js create mode 100644 node_modules/dayjs/locale/dv.js create mode 100644 node_modules/dayjs/locale/el.js create mode 100644 node_modules/dayjs/locale/en-au.js create mode 100644 node_modules/dayjs/locale/en-ca.js create mode 100644 node_modules/dayjs/locale/en-gb.js create mode 100644 node_modules/dayjs/locale/en-ie.js create mode 100644 node_modules/dayjs/locale/en-il.js create mode 100644 node_modules/dayjs/locale/en-in.js create mode 100644 node_modules/dayjs/locale/en-nz.js create mode 100644 node_modules/dayjs/locale/en-sg.js create mode 100644 node_modules/dayjs/locale/en-tt.js create mode 100644 node_modules/dayjs/locale/en.js create mode 100644 node_modules/dayjs/locale/eo.js create mode 100644 node_modules/dayjs/locale/es-do.js create mode 100644 node_modules/dayjs/locale/es-mx.js create mode 100644 node_modules/dayjs/locale/es-pr.js create mode 100644 node_modules/dayjs/locale/es-us.js create mode 100644 node_modules/dayjs/locale/es.js create mode 100644 node_modules/dayjs/locale/et.js create mode 100644 node_modules/dayjs/locale/eu.js create mode 100644 node_modules/dayjs/locale/fa.js create mode 100644 node_modules/dayjs/locale/fi.js create mode 100644 node_modules/dayjs/locale/fo.js create mode 100644 node_modules/dayjs/locale/fr-ca.js create mode 100644 node_modules/dayjs/locale/fr-ch.js create mode 100644 node_modules/dayjs/locale/fr.js create mode 100644 node_modules/dayjs/locale/fy.js create mode 100644 node_modules/dayjs/locale/ga.js create mode 100644 node_modules/dayjs/locale/gd.js create mode 100644 node_modules/dayjs/locale/gl.js create mode 100644 node_modules/dayjs/locale/gom-latn.js create mode 100644 node_modules/dayjs/locale/gu.js create mode 100644 node_modules/dayjs/locale/he.js create mode 100644 node_modules/dayjs/locale/hi.js create mode 100644 node_modules/dayjs/locale/hr.js create mode 100644 node_modules/dayjs/locale/ht.js create mode 100644 node_modules/dayjs/locale/hu.js create mode 100644 node_modules/dayjs/locale/hy-am.js create mode 100644 node_modules/dayjs/locale/id.js create mode 100644 node_modules/dayjs/locale/index.d.ts create mode 100644 node_modules/dayjs/locale/is.js create mode 100644 node_modules/dayjs/locale/it-ch.js create mode 100644 node_modules/dayjs/locale/it.js create mode 100644 node_modules/dayjs/locale/ja.js create mode 100644 node_modules/dayjs/locale/jv.js create mode 100644 node_modules/dayjs/locale/ka.js create mode 100644 node_modules/dayjs/locale/kk.js create mode 100644 node_modules/dayjs/locale/km.js create mode 100644 node_modules/dayjs/locale/kn.js create mode 100644 node_modules/dayjs/locale/ko.js create mode 100644 node_modules/dayjs/locale/ku.js create mode 100644 node_modules/dayjs/locale/ky.js create mode 100644 node_modules/dayjs/locale/lb.js create mode 100644 node_modules/dayjs/locale/lo.js create mode 100644 node_modules/dayjs/locale/lt.js create mode 100644 node_modules/dayjs/locale/lv.js create mode 100644 node_modules/dayjs/locale/me.js create mode 100644 node_modules/dayjs/locale/mi.js create mode 100644 node_modules/dayjs/locale/mk.js create mode 100644 node_modules/dayjs/locale/ml.js create mode 100644 node_modules/dayjs/locale/mn.js create mode 100644 node_modules/dayjs/locale/mr.js create mode 100644 node_modules/dayjs/locale/ms-my.js create mode 100644 node_modules/dayjs/locale/ms.js create mode 100644 node_modules/dayjs/locale/mt.js create mode 100644 node_modules/dayjs/locale/my.js create mode 100644 node_modules/dayjs/locale/nb.js create mode 100644 node_modules/dayjs/locale/ne.js create mode 100644 node_modules/dayjs/locale/nl-be.js create mode 100644 node_modules/dayjs/locale/nl.js create mode 100644 node_modules/dayjs/locale/nn.js create mode 100644 node_modules/dayjs/locale/oc-lnc.js create mode 100644 node_modules/dayjs/locale/pa-in.js create mode 100644 node_modules/dayjs/locale/pl.js create mode 100644 node_modules/dayjs/locale/pt-br.js create mode 100644 node_modules/dayjs/locale/pt.js create mode 100644 node_modules/dayjs/locale/rn.js create mode 100644 node_modules/dayjs/locale/ro.js create mode 100644 node_modules/dayjs/locale/ru.js create mode 100644 node_modules/dayjs/locale/rw.js create mode 100644 node_modules/dayjs/locale/sd.js create mode 100644 node_modules/dayjs/locale/se.js create mode 100644 node_modules/dayjs/locale/si.js create mode 100644 node_modules/dayjs/locale/sk.js create mode 100644 node_modules/dayjs/locale/sl.js create mode 100644 node_modules/dayjs/locale/sq.js create mode 100644 node_modules/dayjs/locale/sr-cyrl.js create mode 100644 node_modules/dayjs/locale/sr.js create mode 100644 node_modules/dayjs/locale/ss.js create mode 100644 node_modules/dayjs/locale/sv-fi.js create mode 100644 node_modules/dayjs/locale/sv.js create mode 100644 node_modules/dayjs/locale/sw.js create mode 100644 node_modules/dayjs/locale/ta.js create mode 100644 node_modules/dayjs/locale/te.js create mode 100644 node_modules/dayjs/locale/tet.js create mode 100644 node_modules/dayjs/locale/tg.js create mode 100644 node_modules/dayjs/locale/th.js create mode 100644 node_modules/dayjs/locale/tk.js create mode 100644 node_modules/dayjs/locale/tl-ph.js create mode 100644 node_modules/dayjs/locale/tlh.js create mode 100644 node_modules/dayjs/locale/tr.js create mode 100644 node_modules/dayjs/locale/types.d.ts create mode 100644 node_modules/dayjs/locale/tzl.js create mode 100644 node_modules/dayjs/locale/tzm-latn.js create mode 100644 node_modules/dayjs/locale/tzm.js create mode 100644 node_modules/dayjs/locale/ug-cn.js create mode 100644 node_modules/dayjs/locale/uk.js create mode 100644 node_modules/dayjs/locale/ur.js create mode 100644 node_modules/dayjs/locale/uz-latn.js create mode 100644 node_modules/dayjs/locale/uz.js create mode 100644 node_modules/dayjs/locale/vi.js create mode 100644 node_modules/dayjs/locale/x-pseudo.js create mode 100644 node_modules/dayjs/locale/yo.js create mode 100644 node_modules/dayjs/locale/zh-cn.js create mode 100644 node_modules/dayjs/locale/zh-hk.js create mode 100644 node_modules/dayjs/locale/zh-tw.js create mode 100644 node_modules/dayjs/locale/zh.js create mode 100644 node_modules/dayjs/package.json create mode 100644 node_modules/dayjs/plugin/advancedFormat.d.ts create mode 100644 node_modules/dayjs/plugin/advancedFormat.js create mode 100644 node_modules/dayjs/plugin/arraySupport.d.ts create mode 100644 node_modules/dayjs/plugin/arraySupport.js create mode 100644 node_modules/dayjs/plugin/badMutable.d.ts create mode 100644 node_modules/dayjs/plugin/badMutable.js create mode 100644 node_modules/dayjs/plugin/bigIntSupport.d.ts create mode 100644 node_modules/dayjs/plugin/bigIntSupport.js create mode 100644 node_modules/dayjs/plugin/buddhistEra.d.ts create mode 100644 node_modules/dayjs/plugin/buddhistEra.js create mode 100644 node_modules/dayjs/plugin/calendar.d.ts create mode 100644 node_modules/dayjs/plugin/calendar.js create mode 100644 node_modules/dayjs/plugin/customParseFormat.d.ts create mode 100644 node_modules/dayjs/plugin/customParseFormat.js create mode 100644 node_modules/dayjs/plugin/dayOfYear.d.ts create mode 100644 node_modules/dayjs/plugin/dayOfYear.js create mode 100644 node_modules/dayjs/plugin/devHelper.d.ts create mode 100644 node_modules/dayjs/plugin/devHelper.js create mode 100644 node_modules/dayjs/plugin/duration.d.ts create mode 100644 node_modules/dayjs/plugin/duration.js create mode 100644 node_modules/dayjs/plugin/isBetween.d.ts create mode 100644 node_modules/dayjs/plugin/isBetween.js create mode 100644 node_modules/dayjs/plugin/isLeapYear.d.ts create mode 100644 node_modules/dayjs/plugin/isLeapYear.js create mode 100644 node_modules/dayjs/plugin/isMoment.d.ts create mode 100644 node_modules/dayjs/plugin/isMoment.js create mode 100644 node_modules/dayjs/plugin/isSameOrAfter.d.ts create mode 100644 node_modules/dayjs/plugin/isSameOrAfter.js create mode 100644 node_modules/dayjs/plugin/isSameOrBefore.d.ts create mode 100644 node_modules/dayjs/plugin/isSameOrBefore.js create mode 100644 node_modules/dayjs/plugin/isToday.d.ts create mode 100644 node_modules/dayjs/plugin/isToday.js create mode 100644 node_modules/dayjs/plugin/isTomorrow.d.ts create mode 100644 node_modules/dayjs/plugin/isTomorrow.js create mode 100644 node_modules/dayjs/plugin/isYesterday.d.ts create mode 100644 node_modules/dayjs/plugin/isYesterday.js create mode 100644 node_modules/dayjs/plugin/isoWeek.d.ts create mode 100644 node_modules/dayjs/plugin/isoWeek.js create mode 100644 node_modules/dayjs/plugin/isoWeeksInYear.d.ts create mode 100644 node_modules/dayjs/plugin/isoWeeksInYear.js create mode 100644 node_modules/dayjs/plugin/localeData.d.ts create mode 100644 node_modules/dayjs/plugin/localeData.js create mode 100644 node_modules/dayjs/plugin/localizedFormat.d.ts create mode 100644 node_modules/dayjs/plugin/localizedFormat.js create mode 100644 node_modules/dayjs/plugin/minMax.d.ts create mode 100644 node_modules/dayjs/plugin/minMax.js create mode 100644 node_modules/dayjs/plugin/negativeYear.d.ts create mode 100644 node_modules/dayjs/plugin/negativeYear.js create mode 100644 node_modules/dayjs/plugin/objectSupport.d.ts create mode 100644 node_modules/dayjs/plugin/objectSupport.js create mode 100644 node_modules/dayjs/plugin/pluralGetSet.d.ts create mode 100644 node_modules/dayjs/plugin/pluralGetSet.js create mode 100644 node_modules/dayjs/plugin/preParsePostFormat.d.ts create mode 100644 node_modules/dayjs/plugin/preParsePostFormat.js create mode 100644 node_modules/dayjs/plugin/quarterOfYear.d.ts create mode 100644 node_modules/dayjs/plugin/quarterOfYear.js create mode 100644 node_modules/dayjs/plugin/relativeTime.d.ts create mode 100644 node_modules/dayjs/plugin/relativeTime.js create mode 100644 node_modules/dayjs/plugin/timezone.d.ts create mode 100644 node_modules/dayjs/plugin/timezone.js create mode 100644 node_modules/dayjs/plugin/toArray.d.ts create mode 100644 node_modules/dayjs/plugin/toArray.js create mode 100644 node_modules/dayjs/plugin/toObject.d.ts create mode 100644 node_modules/dayjs/plugin/toObject.js create mode 100644 node_modules/dayjs/plugin/updateLocale.d.ts create mode 100644 node_modules/dayjs/plugin/updateLocale.js create mode 100644 node_modules/dayjs/plugin/utc.d.ts create mode 100644 node_modules/dayjs/plugin/utc.js create mode 100644 node_modules/dayjs/plugin/weekOfYear.d.ts create mode 100644 node_modules/dayjs/plugin/weekOfYear.js create mode 100644 node_modules/dayjs/plugin/weekYear.d.ts create mode 100644 node_modules/dayjs/plugin/weekYear.js create mode 100644 node_modules/dayjs/plugin/weekday.d.ts create mode 100644 node_modules/dayjs/plugin/weekday.js create mode 100644 node_modules/delegate/.editorconfig create mode 100644 node_modules/delegate/.travis.yml create mode 100644 node_modules/delegate/demo/delegate.html create mode 100644 node_modules/delegate/demo/multiple.html create mode 100644 node_modules/delegate/demo/undelegate.html create mode 100644 node_modules/delegate/dist/delegate.js create mode 100644 node_modules/delegate/karma.conf.js create mode 100644 node_modules/delegate/package.json create mode 100644 node_modules/delegate/readme.md create mode 100644 node_modules/delegate/src/closest.js create mode 100644 node_modules/delegate/src/delegate.js create mode 100644 node_modules/delegate/test/closest.js create mode 100644 node_modules/delegate/test/delegate.js create mode 100644 node_modules/good-listener/.editorconfig create mode 100644 node_modules/good-listener/.npmignore create mode 100644 node_modules/good-listener/.travis.yml create mode 100644 node_modules/good-listener/bower.json create mode 100644 node_modules/good-listener/demo/destroy.html create mode 100644 node_modules/good-listener/demo/multiple.html create mode 100644 node_modules/good-listener/demo/node.html create mode 100644 node_modules/good-listener/demo/nodelist.html create mode 100644 node_modules/good-listener/demo/selector.html create mode 100644 node_modules/good-listener/dist/good-listener.js create mode 100644 node_modules/good-listener/karma.conf.js create mode 100644 node_modules/good-listener/package.json create mode 100644 node_modules/good-listener/readme.md create mode 100644 node_modules/good-listener/src/is.js create mode 100644 node_modules/good-listener/src/listen.js create mode 100644 node_modules/good-listener/test/is.js create mode 100644 node_modules/good-listener/test/listen.js create mode 100644 node_modules/select/.editorconfig create mode 100644 node_modules/select/.npmignore create mode 100644 node_modules/select/.travis.yml create mode 100644 node_modules/select/bower.json create mode 100644 node_modules/select/demo/contenteditable.html create mode 100644 node_modules/select/demo/dropdown.html create mode 100644 node_modules/select/demo/editable.html create mode 100644 node_modules/select/demo/multiple.html create mode 100644 node_modules/select/demo/nested.html create mode 100644 node_modules/select/demo/non-editable.html create mode 100644 node_modules/select/dist/select.js create mode 100644 node_modules/select/karma.conf.js create mode 100644 node_modules/select/package.json create mode 100644 node_modules/select/readme.md create mode 100644 node_modules/select/src/select.js create mode 100644 node_modules/select/test/select.js create mode 100644 node_modules/tiny-emitter/LICENSE create mode 100644 node_modules/tiny-emitter/README.md create mode 100644 node_modules/tiny-emitter/dist/tinyemitter.js create mode 100644 node_modules/tiny-emitter/dist/tinyemitter.min.js create mode 100644 node_modules/tiny-emitter/index.d.ts create mode 100644 node_modules/tiny-emitter/index.js create mode 100644 node_modules/tiny-emitter/instance.js create mode 100644 node_modules/tiny-emitter/package.json create mode 100644 node_modules/tiny-emitter/test/index.js create mode 100644 node_modules/tiny-emitter/yarn.lock create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/index/index.vue create mode 100644 pages/live/player.vue create mode 100644 pages/login/login.vue create mode 100644 pages/tabbar/order/order.vue create mode 100644 pages/tabbar/stock/detail.vue create mode 100644 pages/tabbar/stock/stock.vue create mode 100644 pages/tabbar/video/video.spec.js create mode 100644 pages/tabbar/video/video.vue create mode 100644 static/login.png create mode 100644 static/logo.png create mode 100644 static/pic02.jpg create mode 100644 static/tabbar/icon/order.png create mode 100644 static/tabbar/icon/order2.png create mode 100644 static/tabbar/icon/stock.png create mode 100644 static/tabbar/icon/stock2.png create mode 100644 static/tabbar/icon/video.png create mode 100644 static/tabbar/icon/video2.png create mode 100644 static/tabbar/icon/箭头_右上.png create mode 100644 static/tabbar/icon/箭头_右下.png create mode 100644 static/tabbar/icon/箭头_左上.png create mode 100644 static/tabbar/icon/箭头_左下.png create mode 100644 uni.promisify.adaptor.js create mode 100644 uni.scss create mode 100644 uni_modules/uni-data-select/changelog.md create mode 100644 uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue create mode 100644 uni_modules/uni-data-select/package.json create mode 100644 uni_modules/uni-data-select/readme.md create mode 100644 uni_modules/uni-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 uni_modules/uview-plus/LICENSE create mode 100644 uni_modules/uview-plus/README.md create mode 100644 uni_modules/uview-plus/changelog.md create mode 100644 uni_modules/uview-plus/components/u-action-sheet-data/u-action-sheet-data.vue create mode 100644 uni_modules/uview-plus/components/u-action-sheet/actionSheet.js create mode 100644 uni_modules/uview-plus/components/u-action-sheet/props.js create mode 100644 uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue create mode 100644 uni_modules/uview-plus/components/u-agreement/u-agreement.vue create mode 100644 uni_modules/uview-plus/components/u-album/album.js create mode 100644 uni_modules/uview-plus/components/u-album/props.js create mode 100644 uni_modules/uview-plus/components/u-album/u-album.vue create mode 100644 uni_modules/uview-plus/components/u-alert/alert.js create mode 100644 uni_modules/uview-plus/components/u-alert/props.js create mode 100644 uni_modules/uview-plus/components/u-alert/u-alert.vue create mode 100644 uni_modules/uview-plus/components/u-avatar-group/avatarGroup.js create mode 100644 uni_modules/uview-plus/components/u-avatar-group/props.js create mode 100644 uni_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue create mode 100644 uni_modules/uview-plus/components/u-avatar/avatar.js create mode 100644 uni_modules/uview-plus/components/u-avatar/props.js create mode 100644 uni_modules/uview-plus/components/u-avatar/u-avatar.vue create mode 100644 uni_modules/uview-plus/components/u-back-top/backtop.js create mode 100644 uni_modules/uview-plus/components/u-back-top/props.js create mode 100644 uni_modules/uview-plus/components/u-back-top/u-back-top.vue create mode 100644 uni_modules/uview-plus/components/u-badge/badge.js create mode 100644 uni_modules/uview-plus/components/u-badge/props.js create mode 100644 uni_modules/uview-plus/components/u-badge/u-badge.vue create mode 100644 uni_modules/uview-plus/components/u-barcode/u-barcode.vue create mode 100644 uni_modules/uview-plus/components/u-box/props.js create mode 100644 uni_modules/uview-plus/components/u-box/u-box.vue create mode 100644 uni_modules/uview-plus/components/u-button/button.js create mode 100644 uni_modules/uview-plus/components/u-button/nvue.scss create mode 100644 uni_modules/uview-plus/components/u-button/props.js create mode 100644 uni_modules/uview-plus/components/u-button/u-button.vue create mode 100644 uni_modules/uview-plus/components/u-button/vue.scss create mode 100644 uni_modules/uview-plus/components/u-calendar/calendar.js create mode 100644 uni_modules/uview-plus/components/u-calendar/header.vue create mode 100644 uni_modules/uview-plus/components/u-calendar/month.vue create mode 100644 uni_modules/uview-plus/components/u-calendar/props.js create mode 100644 uni_modules/uview-plus/components/u-calendar/u-calendar.vue create mode 100644 uni_modules/uview-plus/components/u-calendar/util.js create mode 100644 uni_modules/uview-plus/components/u-car-keyboard/carKeyboard.js create mode 100644 uni_modules/uview-plus/components/u-car-keyboard/props.js create mode 100644 uni_modules/uview-plus/components/u-car-keyboard/u-car-keyboard.vue create mode 100644 uni_modules/uview-plus/components/u-card/card.js create mode 100644 uni_modules/uview-plus/components/u-card/props.js create mode 100644 uni_modules/uview-plus/components/u-card/u-card.vue create mode 100644 uni_modules/uview-plus/components/u-cate-tab/u-cate-tab.vue create mode 100644 uni_modules/uview-plus/components/u-cell-group/cellGroup.js create mode 100644 uni_modules/uview-plus/components/u-cell-group/props.js create mode 100644 uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue create mode 100644 uni_modules/uview-plus/components/u-cell/cell.js create mode 100644 uni_modules/uview-plus/components/u-cell/props.js create mode 100644 uni_modules/uview-plus/components/u-cell/u-cell.vue create mode 100644 uni_modules/uview-plus/components/u-checkbox-group/checkboxGroup.js create mode 100644 uni_modules/uview-plus/components/u-checkbox-group/props.js create mode 100644 uni_modules/uview-plus/components/u-checkbox-group/u-checkbox-group.vue create mode 100644 uni_modules/uview-plus/components/u-checkbox/checkbox.js create mode 100644 uni_modules/uview-plus/components/u-checkbox/props.js create mode 100644 uni_modules/uview-plus/components/u-checkbox/u-checkbox.vue create mode 100644 uni_modules/uview-plus/components/u-circle-progress/circleProgress.js create mode 100644 uni_modules/uview-plus/components/u-circle-progress/props.js create mode 100644 uni_modules/uview-plus/components/u-circle-progress/u-circle-progress.vue create mode 100644 uni_modules/uview-plus/components/u-city-locate/u-city-locate.vue create mode 100644 uni_modules/uview-plus/components/u-code-input/codeInput.js create mode 100644 uni_modules/uview-plus/components/u-code-input/props.js create mode 100644 uni_modules/uview-plus/components/u-code-input/u-code-input.vue create mode 100644 uni_modules/uview-plus/components/u-code/code.js create mode 100644 uni_modules/uview-plus/components/u-code/props.js create mode 100644 uni_modules/uview-plus/components/u-code/u-code.vue create mode 100644 uni_modules/uview-plus/components/u-col/col.js create mode 100644 uni_modules/uview-plus/components/u-col/props.js create mode 100644 uni_modules/uview-plus/components/u-col/u-col.vue create mode 100644 uni_modules/uview-plus/components/u-collapse-item/collapseItem.js create mode 100644 uni_modules/uview-plus/components/u-collapse-item/props.js create mode 100644 uni_modules/uview-plus/components/u-collapse-item/u-collapse-item.vue create mode 100644 uni_modules/uview-plus/components/u-collapse/collapse.js create mode 100644 uni_modules/uview-plus/components/u-collapse/props.js create mode 100644 uni_modules/uview-plus/components/u-collapse/u-collapse.vue create mode 100644 uni_modules/uview-plus/components/u-column-notice/columnNotice.js create mode 100644 uni_modules/uview-plus/components/u-column-notice/props.js create mode 100644 uni_modules/uview-plus/components/u-column-notice/u-column-notice.vue create mode 100644 uni_modules/uview-plus/components/u-copy/u-copy.vue create mode 100644 uni_modules/uview-plus/components/u-count-down/countDown.js create mode 100644 uni_modules/uview-plus/components/u-count-down/props.js create mode 100644 uni_modules/uview-plus/components/u-count-down/u-count-down.vue create mode 100644 uni_modules/uview-plus/components/u-count-down/utils.js create mode 100644 uni_modules/uview-plus/components/u-count-to/countTo.js create mode 100644 uni_modules/uview-plus/components/u-count-to/props.js create mode 100644 uni_modules/uview-plus/components/u-count-to/u-count-to.vue create mode 100644 uni_modules/uview-plus/components/u-cropper/u-cropper.vue create mode 100644 uni_modules/uview-plus/components/u-datetime-picker/datetimePicker.js create mode 100644 uni_modules/uview-plus/components/u-datetime-picker/props.js create mode 100644 uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.vue create mode 100644 uni_modules/uview-plus/components/u-divider/divider.js create mode 100644 uni_modules/uview-plus/components/u-divider/props.js create mode 100644 uni_modules/uview-plus/components/u-divider/u-divider.vue create mode 100644 uni_modules/uview-plus/components/u-dragsort/u-dragsort.vue create mode 100644 uni_modules/uview-plus/components/u-dropdown-item/props.js create mode 100644 uni_modules/uview-plus/components/u-dropdown-item/u-dropdown-item.vue create mode 100644 uni_modules/uview-plus/components/u-dropdown/props.js create mode 100644 uni_modules/uview-plus/components/u-dropdown/u-dropdown.vue create mode 100644 uni_modules/uview-plus/components/u-empty/empty.js create mode 100644 uni_modules/uview-plus/components/u-empty/props.js create mode 100644 uni_modules/uview-plus/components/u-empty/u-empty.vue create mode 100644 uni_modules/uview-plus/components/u-float-button/u-float-button.vue create mode 100644 uni_modules/uview-plus/components/u-form-item/formItem.js create mode 100644 uni_modules/uview-plus/components/u-form-item/props.js create mode 100644 uni_modules/uview-plus/components/u-form-item/u-form-item.vue create mode 100644 uni_modules/uview-plus/components/u-form/form.js create mode 100644 uni_modules/uview-plus/components/u-form/props.js create mode 100644 uni_modules/uview-plus/components/u-form/u-form.vue create mode 100644 uni_modules/uview-plus/components/u-gap/gap.js create mode 100644 uni_modules/uview-plus/components/u-gap/props.js create mode 100644 uni_modules/uview-plus/components/u-gap/u-gap.vue create mode 100644 uni_modules/uview-plus/components/u-grid-item/gridItem.js create mode 100644 uni_modules/uview-plus/components/u-grid-item/props.js create mode 100644 uni_modules/uview-plus/components/u-grid-item/u-grid-item.vue create mode 100644 uni_modules/uview-plus/components/u-grid/grid.js create mode 100644 uni_modules/uview-plus/components/u-grid/props.js create mode 100644 uni_modules/uview-plus/components/u-grid/u-grid.vue create mode 100644 uni_modules/uview-plus/components/u-icon/icon.js create mode 100644 uni_modules/uview-plus/components/u-icon/icons.js create mode 100644 uni_modules/uview-plus/components/u-icon/props.js create mode 100644 uni_modules/uview-plus/components/u-icon/u-icon.vue create mode 100644 uni_modules/uview-plus/components/u-icon/util.js create mode 100644 uni_modules/uview-plus/components/u-image/image.js create mode 100644 uni_modules/uview-plus/components/u-image/props.js create mode 100644 uni_modules/uview-plus/components/u-image/u-image.vue create mode 100644 uni_modules/uview-plus/components/u-index-anchor/indexAnchor.js create mode 100644 uni_modules/uview-plus/components/u-index-anchor/props.js create mode 100644 uni_modules/uview-plus/components/u-index-anchor/u-index-anchor.vue create mode 100644 uni_modules/uview-plus/components/u-index-item/props.js create mode 100644 uni_modules/uview-plus/components/u-index-item/u-index-item.vue create mode 100644 uni_modules/uview-plus/components/u-index-list/indexList.js create mode 100644 uni_modules/uview-plus/components/u-index-list/props.js create mode 100644 uni_modules/uview-plus/components/u-index-list/u-index-list.vue create mode 100644 uni_modules/uview-plus/components/u-input/input.js create mode 100644 uni_modules/uview-plus/components/u-input/props.js create mode 100644 uni_modules/uview-plus/components/u-input/u-input.vue create mode 100644 uni_modules/uview-plus/components/u-keyboard/keyboard.js create mode 100644 uni_modules/uview-plus/components/u-keyboard/props.js create mode 100644 uni_modules/uview-plus/components/u-keyboard/u-keyboard.vue create mode 100644 uni_modules/uview-plus/components/u-lazy-load/u-lazy-load.vue create mode 100644 uni_modules/uview-plus/components/u-line-progress/lineProgress.js create mode 100644 uni_modules/uview-plus/components/u-line-progress/props.js create mode 100644 uni_modules/uview-plus/components/u-line-progress/u-line-progress.vue create mode 100644 uni_modules/uview-plus/components/u-line/line.js create mode 100644 uni_modules/uview-plus/components/u-line/props.js create mode 100644 uni_modules/uview-plus/components/u-line/u-line.vue create mode 100644 uni_modules/uview-plus/components/u-link/link.js create mode 100644 uni_modules/uview-plus/components/u-link/props.js create mode 100644 uni_modules/uview-plus/components/u-link/u-link.vue create mode 100644 uni_modules/uview-plus/components/u-list-item/listItem.js create mode 100644 uni_modules/uview-plus/components/u-list-item/props.js create mode 100644 uni_modules/uview-plus/components/u-list-item/u-list-item.vue create mode 100644 uni_modules/uview-plus/components/u-list/list.js create mode 100644 uni_modules/uview-plus/components/u-list/props.js create mode 100644 uni_modules/uview-plus/components/u-list/u-list.vue create mode 100644 uni_modules/uview-plus/components/u-loading-icon/loadingIcon.js create mode 100644 uni_modules/uview-plus/components/u-loading-icon/props.js create mode 100644 uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue create mode 100644 uni_modules/uview-plus/components/u-loading-page/loadingPage.js create mode 100644 uni_modules/uview-plus/components/u-loading-page/props.js create mode 100644 uni_modules/uview-plus/components/u-loading-page/u-loading-page.vue create mode 100644 uni_modules/uview-plus/components/u-loadmore/loadmore.js create mode 100644 uni_modules/uview-plus/components/u-loadmore/props.js create mode 100644 uni_modules/uview-plus/components/u-loadmore/u-loadmore.vue create mode 100644 uni_modules/uview-plus/components/u-message-input/u-message-input.vue create mode 100644 uni_modules/uview-plus/components/u-modal/modal.js create mode 100644 uni_modules/uview-plus/components/u-modal/props.js create mode 100644 uni_modules/uview-plus/components/u-modal/u-modal.vue create mode 100644 uni_modules/uview-plus/components/u-navbar-mini/props.js create mode 100644 uni_modules/uview-plus/components/u-navbar-mini/u-navbar-mini.vue create mode 100644 uni_modules/uview-plus/components/u-navbar/navbar.js create mode 100644 uni_modules/uview-plus/components/u-navbar/props.js create mode 100644 uni_modules/uview-plus/components/u-navbar/u-navbar.vue create mode 100644 uni_modules/uview-plus/components/u-no-network/noNetwork.js create mode 100644 uni_modules/uview-plus/components/u-no-network/props.js create mode 100644 uni_modules/uview-plus/components/u-no-network/u-no-network.vue create mode 100644 uni_modules/uview-plus/components/u-notice-bar/noticeBar.js create mode 100644 uni_modules/uview-plus/components/u-notice-bar/props.js create mode 100644 uni_modules/uview-plus/components/u-notice-bar/u-notice-bar.vue create mode 100644 uni_modules/uview-plus/components/u-notify/notify.js create mode 100644 uni_modules/uview-plus/components/u-notify/props.js create mode 100644 uni_modules/uview-plus/components/u-notify/u-notify.vue create mode 100644 uni_modules/uview-plus/components/u-number-box/numberBox.js create mode 100644 uni_modules/uview-plus/components/u-number-box/props.js create mode 100644 uni_modules/uview-plus/components/u-number-box/u-number-box.vue create mode 100644 uni_modules/uview-plus/components/u-number-keyboard/numberKeyboard.js create mode 100644 uni_modules/uview-plus/components/u-number-keyboard/props.js create mode 100644 uni_modules/uview-plus/components/u-number-keyboard/u-number-keyboard.vue create mode 100644 uni_modules/uview-plus/components/u-overlay/overlay.js create mode 100644 uni_modules/uview-plus/components/u-overlay/props.js create mode 100644 uni_modules/uview-plus/components/u-overlay/u-overlay.vue create mode 100644 uni_modules/uview-plus/components/u-pagination/u-pagination.vue create mode 100644 uni_modules/uview-plus/components/u-parse/node/node.vue create mode 100644 uni_modules/uview-plus/components/u-parse/parse.js create mode 100644 uni_modules/uview-plus/components/u-parse/parser.js create mode 100644 uni_modules/uview-plus/components/u-parse/props.js create mode 100644 uni_modules/uview-plus/components/u-parse/u-parse.vue create mode 100644 uni_modules/uview-plus/components/u-picker-column/props.js create mode 100644 uni_modules/uview-plus/components/u-picker-column/u-picker-column.vue create mode 100644 uni_modules/uview-plus/components/u-picker-data/u-picker-data.vue create mode 100644 uni_modules/uview-plus/components/u-picker/picker.js create mode 100644 uni_modules/uview-plus/components/u-picker/props.js create mode 100644 uni_modules/uview-plus/components/u-picker/u-picker.vue create mode 100644 uni_modules/uview-plus/components/u-popup/popup.js create mode 100644 uni_modules/uview-plus/components/u-popup/props.js create mode 100644 uni_modules/uview-plus/components/u-popup/u-popup.vue create mode 100644 uni_modules/uview-plus/components/u-pull-refresh/u-pull-refresh.vue create mode 100644 uni_modules/uview-plus/components/u-qrcode/qrcode.js create mode 100644 uni_modules/uview-plus/components/u-qrcode/u-qrcode.vue create mode 100644 uni_modules/uview-plus/components/u-radio-group/props.js create mode 100644 uni_modules/uview-plus/components/u-radio-group/radioGroup.js create mode 100644 uni_modules/uview-plus/components/u-radio-group/u-radio-group.vue create mode 100644 uni_modules/uview-plus/components/u-radio/props.js create mode 100644 uni_modules/uview-plus/components/u-radio/radio.js create mode 100644 uni_modules/uview-plus/components/u-radio/u-radio.vue create mode 100644 uni_modules/uview-plus/components/u-rate/props.js create mode 100644 uni_modules/uview-plus/components/u-rate/rate.js create mode 100644 uni_modules/uview-plus/components/u-rate/u-rate.vue create mode 100644 uni_modules/uview-plus/components/u-read-more/props.js create mode 100644 uni_modules/uview-plus/components/u-read-more/readMore.js create mode 100644 uni_modules/uview-plus/components/u-read-more/u-read-more.vue create mode 100644 uni_modules/uview-plus/components/u-refresh-virtual-list/u-refresh-virtual-list.vue create mode 100644 uni_modules/uview-plus/components/u-row-notice/props.js create mode 100644 uni_modules/uview-plus/components/u-row-notice/rowNotice.js create mode 100644 uni_modules/uview-plus/components/u-row-notice/u-row-notice.vue create mode 100644 uni_modules/uview-plus/components/u-row/props.js create mode 100644 uni_modules/uview-plus/components/u-row/row.js create mode 100644 uni_modules/uview-plus/components/u-row/u-row.vue create mode 100644 uni_modules/uview-plus/components/u-safe-bottom/props.js create mode 100644 uni_modules/uview-plus/components/u-safe-bottom/u-safe-bottom.vue create mode 100644 uni_modules/uview-plus/components/u-scroll-list/nvue.js create mode 100644 uni_modules/uview-plus/components/u-scroll-list/other.js create mode 100644 uni_modules/uview-plus/components/u-scroll-list/props.js create mode 100644 uni_modules/uview-plus/components/u-scroll-list/scrollList.js create mode 100644 uni_modules/uview-plus/components/u-scroll-list/scrollWxs.wxs create mode 100644 uni_modules/uview-plus/components/u-scroll-list/u-scroll-list.vue create mode 100644 uni_modules/uview-plus/components/u-search/props.js create mode 100644 uni_modules/uview-plus/components/u-search/search.js create mode 100644 uni_modules/uview-plus/components/u-search/u-search.vue create mode 100644 uni_modules/uview-plus/components/u-section/section.js create mode 100644 uni_modules/uview-plus/components/u-select/u-select.vue create mode 100644 uni_modules/uview-plus/components/u-signature/u-signature.vue create mode 100644 uni_modules/uview-plus/components/u-skeleton/props.js create mode 100644 uni_modules/uview-plus/components/u-skeleton/skeleton.js create mode 100644 uni_modules/uview-plus/components/u-skeleton/u-skeleton.vue create mode 100644 uni_modules/uview-plus/components/u-slider/mpother.js create mode 100644 uni_modules/uview-plus/components/u-slider/mpwxs.js create mode 100644 uni_modules/uview-plus/components/u-slider/mpwxs.wxs create mode 100644 uni_modules/uview-plus/components/u-slider/nvue.js create mode 100644 uni_modules/uview-plus/components/u-slider/props.js create mode 100644 uni_modules/uview-plus/components/u-slider/slider.js create mode 100644 uni_modules/uview-plus/components/u-slider/u-slider.vue create mode 100644 uni_modules/uview-plus/components/u-status-bar/props.js create mode 100644 uni_modules/uview-plus/components/u-status-bar/statusBar.js create mode 100644 uni_modules/uview-plus/components/u-status-bar/u-status-bar.vue create mode 100644 uni_modules/uview-plus/components/u-steps-item/props.js create mode 100644 uni_modules/uview-plus/components/u-steps-item/stepsItem.js create mode 100644 uni_modules/uview-plus/components/u-steps-item/u-steps-item.vue create mode 100644 uni_modules/uview-plus/components/u-steps/props.js create mode 100644 uni_modules/uview-plus/components/u-steps/steps.js create mode 100644 uni_modules/uview-plus/components/u-steps/u-steps.vue create mode 100644 uni_modules/uview-plus/components/u-sticky/props.js create mode 100644 uni_modules/uview-plus/components/u-sticky/sticky.js create mode 100644 uni_modules/uview-plus/components/u-sticky/u-sticky.vue create mode 100644 uni_modules/uview-plus/components/u-subsection/props.js create mode 100644 uni_modules/uview-plus/components/u-subsection/subsection.js create mode 100644 uni_modules/uview-plus/components/u-subsection/u-subsection.vue create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/alipay.sjs create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/index - backup.wxs create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/index.wxs create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/nvue - backup.js create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/nvue.js create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/other.js create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/props.js create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/swipeActionItem.js create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/u-swipe-action-item.vue create mode 100644 uni_modules/uview-plus/components/u-swipe-action-item/wxs.js create mode 100644 uni_modules/uview-plus/components/u-swipe-action/props.js create mode 100644 uni_modules/uview-plus/components/u-swipe-action/swipeAction.js create mode 100644 uni_modules/uview-plus/components/u-swipe-action/u-swipe-action.vue create mode 100644 uni_modules/uview-plus/components/u-swiper-indicator/props.js create mode 100644 uni_modules/uview-plus/components/u-swiper-indicator/swipterIndicator.js create mode 100644 uni_modules/uview-plus/components/u-swiper-indicator/u-swiper-indicator.vue create mode 100644 uni_modules/uview-plus/components/u-swiper/props.js create mode 100644 uni_modules/uview-plus/components/u-swiper/swiper.js create mode 100644 uni_modules/uview-plus/components/u-swiper/u-swiper.vue create mode 100644 uni_modules/uview-plus/components/u-switch/props.js create mode 100644 uni_modules/uview-plus/components/u-switch/switch.js create mode 100644 uni_modules/uview-plus/components/u-switch/u-switch.vue create mode 100644 uni_modules/uview-plus/components/u-tabbar-item/props.js create mode 100644 uni_modules/uview-plus/components/u-tabbar-item/tabbarItem.js create mode 100644 uni_modules/uview-plus/components/u-tabbar-item/u-tabbar-item.vue create mode 100644 uni_modules/uview-plus/components/u-tabbar/props.js create mode 100644 uni_modules/uview-plus/components/u-tabbar/tabbar.js create mode 100644 uni_modules/uview-plus/components/u-tabbar/u-tabbar.vue create mode 100644 uni_modules/uview-plus/components/u-table/props.js create mode 100644 uni_modules/uview-plus/components/u-table/u-table.vue create mode 100644 uni_modules/uview-plus/components/u-table2/tableRow.vue create mode 100644 uni_modules/uview-plus/components/u-table2/u-table2.vue create mode 100644 uni_modules/uview-plus/components/u-tabs-item/props.js create mode 100644 uni_modules/uview-plus/components/u-tabs-item/u-tabs-item.vue create mode 100644 uni_modules/uview-plus/components/u-tabs/props.js create mode 100644 uni_modules/uview-plus/components/u-tabs/tabs.js create mode 100644 uni_modules/uview-plus/components/u-tabs/u-tabs.vue create mode 100644 uni_modules/uview-plus/components/u-tag/props.js create mode 100644 uni_modules/uview-plus/components/u-tag/tag.js create mode 100644 uni_modules/uview-plus/components/u-tag/u-tag.vue create mode 100644 uni_modules/uview-plus/components/u-td/props.js create mode 100644 uni_modules/uview-plus/components/u-td/u-td.vue create mode 100644 uni_modules/uview-plus/components/u-text/props.js create mode 100644 uni_modules/uview-plus/components/u-text/text.js create mode 100644 uni_modules/uview-plus/components/u-text/u-text.vue create mode 100644 uni_modules/uview-plus/components/u-text/value.js create mode 100644 uni_modules/uview-plus/components/u-textarea/props.js create mode 100644 uni_modules/uview-plus/components/u-textarea/textarea.js create mode 100644 uni_modules/uview-plus/components/u-textarea/u-textarea.vue create mode 100644 uni_modules/uview-plus/components/u-th/props.js create mode 100644 uni_modules/uview-plus/components/u-th/u-th.vue create mode 100644 uni_modules/uview-plus/components/u-title/u-title.vue create mode 100644 uni_modules/uview-plus/components/u-toast/toast.js create mode 100644 uni_modules/uview-plus/components/u-toast/u-toast.vue create mode 100644 uni_modules/uview-plus/components/u-toolbar/props.js create mode 100644 uni_modules/uview-plus/components/u-toolbar/toolbar.js create mode 100644 uni_modules/uview-plus/components/u-toolbar/u-toolbar.vue create mode 100644 uni_modules/uview-plus/components/u-tooltip/props.js create mode 100644 uni_modules/uview-plus/components/u-tooltip/tooltip.js create mode 100644 uni_modules/uview-plus/components/u-tooltip/u-tooltip.vue create mode 100644 uni_modules/uview-plus/components/u-tr/props.js create mode 100644 uni_modules/uview-plus/components/u-tr/u-tr.vue create mode 100644 uni_modules/uview-plus/components/u-transition/nvue-ani-map.js create mode 100644 uni_modules/uview-plus/components/u-transition/props.js create mode 100644 uni_modules/uview-plus/components/u-transition/transition.js create mode 100644 uni_modules/uview-plus/components/u-transition/transitionMixin.js create mode 100644 uni_modules/uview-plus/components/u-transition/u-transition.vue create mode 100644 uni_modules/uview-plus/components/u-transition/vue.ani-style.scss create mode 100644 uni_modules/uview-plus/components/u-tree/tree-node.vue create mode 100644 uni_modules/uview-plus/components/u-tree/u-tree.vue create mode 100644 uni_modules/uview-plus/components/u-upload/mixin.js create mode 100644 uni_modules/uview-plus/components/u-upload/props.js create mode 100644 uni_modules/uview-plus/components/u-upload/u-upload.vue create mode 100644 uni_modules/uview-plus/components/u-upload/upload.js create mode 100644 uni_modules/uview-plus/components/u-upload/utils.js create mode 100644 uni_modules/uview-plus/components/u-view/u-view.vue create mode 100644 uni_modules/uview-plus/components/u-virtual-list/u-virtual-list.vue create mode 100644 uni_modules/uview-plus/components/u-waterfall/u-waterfall.vue create mode 100644 uni_modules/uview-plus/components/uview-plus/uview-plus.vue create mode 100644 uni_modules/uview-plus/index.js create mode 100644 uni_modules/uview-plus/index.scss create mode 100644 uni_modules/uview-plus/libs/config/color.js create mode 100644 uni_modules/uview-plus/libs/config/config.js create mode 100644 uni_modules/uview-plus/libs/config/props.js create mode 100644 uni_modules/uview-plus/libs/config/zIndex.js create mode 100644 uni_modules/uview-plus/libs/css/color.scss create mode 100644 uni_modules/uview-plus/libs/css/common.scss create mode 100644 uni_modules/uview-plus/libs/css/components.scss create mode 100644 uni_modules/uview-plus/libs/css/flex.scss create mode 100644 uni_modules/uview-plus/libs/css/h5.scss create mode 100644 uni_modules/uview-plus/libs/css/mixin.scss create mode 100644 uni_modules/uview-plus/libs/css/mp.scss create mode 100644 uni_modules/uview-plus/libs/css/nvue.scss create mode 100644 uni_modules/uview-plus/libs/css/vue.scss create mode 100644 uni_modules/uview-plus/libs/function/calc.js create mode 100644 uni_modules/uview-plus/libs/function/colorGradient.js create mode 100644 uni_modules/uview-plus/libs/function/debounce.js create mode 100644 uni_modules/uview-plus/libs/function/digit.js create mode 100644 uni_modules/uview-plus/libs/function/http.js create mode 100644 uni_modules/uview-plus/libs/function/index.js create mode 100644 uni_modules/uview-plus/libs/function/platform.js create mode 100644 uni_modules/uview-plus/libs/function/test.js create mode 100644 uni_modules/uview-plus/libs/function/throttle.js create mode 100644 uni_modules/uview-plus/libs/luch-request/adapters/index.js create mode 100644 uni_modules/uview-plus/libs/luch-request/core/InterceptorManager.js create mode 100644 uni_modules/uview-plus/libs/luch-request/core/Request.js create mode 100644 uni_modules/uview-plus/libs/luch-request/core/buildFullPath.js create mode 100644 uni_modules/uview-plus/libs/luch-request/core/defaults.js create mode 100644 uni_modules/uview-plus/libs/luch-request/core/dispatchRequest.js create mode 100644 uni_modules/uview-plus/libs/luch-request/core/mergeConfig.js create mode 100644 uni_modules/uview-plus/libs/luch-request/core/settle.js create mode 100644 uni_modules/uview-plus/libs/luch-request/helpers/buildURL.js create mode 100644 uni_modules/uview-plus/libs/luch-request/helpers/combineURLs.js create mode 100644 uni_modules/uview-plus/libs/luch-request/helpers/isAbsoluteURL.js create mode 100644 uni_modules/uview-plus/libs/luch-request/index.d.ts create mode 100644 uni_modules/uview-plus/libs/luch-request/index.js create mode 100644 uni_modules/uview-plus/libs/luch-request/utils.js create mode 100644 uni_modules/uview-plus/libs/luch-request/utils/clone.js create mode 100644 uni_modules/uview-plus/libs/mixin/button.js create mode 100644 uni_modules/uview-plus/libs/mixin/mixin.js create mode 100644 uni_modules/uview-plus/libs/mixin/mpMixin.js create mode 100644 uni_modules/uview-plus/libs/mixin/mpShare.js create mode 100644 uni_modules/uview-plus/libs/mixin/openType.js create mode 100644 uni_modules/uview-plus/libs/mixin/style.js create mode 100644 uni_modules/uview-plus/libs/mixin/touch.js create mode 100644 uni_modules/uview-plus/libs/util/async-validator.js create mode 100644 uni_modules/uview-plus/libs/util/calendar.js create mode 100644 uni_modules/uview-plus/libs/util/emitter.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/bridge/bridge-weex.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-2d/FillStyleLinearGradient.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-2d/FillStylePattern.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-2d/FillStyleRadialGradient.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-2d/RenderingContext.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/ActiveInfo.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/Buffer.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/Framebuffer.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/GLenum.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/GLmethod.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/GLtype.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/Program.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/Renderbuffer.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/RenderingContext.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/Shader.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/ShaderPrecisionFormat.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/Texture.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/UniformLocation.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/context-webgl/classUtils.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/env/canvas.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/env/image.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/env/tool.js create mode 100644 uni_modules/uview-plus/libs/util/gcanvas/index.js create mode 100644 uni_modules/uview-plus/libs/util/route.js create mode 100644 uni_modules/uview-plus/libs/vue.js create mode 100644 uni_modules/uview-plus/package.json create mode 100644 uni_modules/uview-plus/theme.scss create mode 100644 uni_modules/uview-plus/types/comps.d.ts create mode 100644 uni_modules/uview-plus/types/comps/_common.d.ts create mode 100644 uni_modules/uview-plus/types/comps/actionSheet.d.ts create mode 100644 uni_modules/uview-plus/types/comps/album.d.ts create mode 100644 uni_modules/uview-plus/types/comps/alert.d.ts create mode 100644 uni_modules/uview-plus/types/comps/avatar.d.ts create mode 100644 uni_modules/uview-plus/types/comps/avatarGroup.d.ts create mode 100644 uni_modules/uview-plus/types/comps/backTop.d.ts create mode 100644 uni_modules/uview-plus/types/comps/badge.d.ts create mode 100644 uni_modules/uview-plus/types/comps/button.d.ts create mode 100644 uni_modules/uview-plus/types/comps/calendar.d.ts create mode 100644 uni_modules/uview-plus/types/comps/cell.d.ts create mode 100644 uni_modules/uview-plus/types/comps/cellGroup.d.ts create mode 100644 uni_modules/uview-plus/types/comps/checkbox.d.ts create mode 100644 uni_modules/uview-plus/types/comps/checkboxGroup.d.ts create mode 100644 uni_modules/uview-plus/types/comps/code.d.ts create mode 100644 uni_modules/uview-plus/types/comps/codeInput.d.ts create mode 100644 uni_modules/uview-plus/types/comps/col.d.ts create mode 100644 uni_modules/uview-plus/types/comps/collapse.d.ts create mode 100644 uni_modules/uview-plus/types/comps/collapseItem.d.ts create mode 100644 uni_modules/uview-plus/types/comps/countDown.d.ts create mode 100644 uni_modules/uview-plus/types/comps/countTo.d.ts create mode 100644 uni_modules/uview-plus/types/comps/datetimePicker.d.ts create mode 100644 uni_modules/uview-plus/types/comps/divider.d.ts create mode 100644 uni_modules/uview-plus/types/comps/empty.d.ts create mode 100644 uni_modules/uview-plus/types/comps/form.d.ts create mode 100644 uni_modules/uview-plus/types/comps/formItem.d.ts create mode 100644 uni_modules/uview-plus/types/comps/gap.d.ts create mode 100644 uni_modules/uview-plus/types/comps/grid.d.ts create mode 100644 uni_modules/uview-plus/types/comps/gridItem.d.ts create mode 100644 uni_modules/uview-plus/types/comps/icon.d.ts create mode 100644 uni_modules/uview-plus/types/comps/image.d.ts create mode 100644 uni_modules/uview-plus/types/comps/indexAnchor.d.ts create mode 100644 uni_modules/uview-plus/types/comps/indexItem.d.ts create mode 100644 uni_modules/uview-plus/types/comps/indexList.d.ts create mode 100644 uni_modules/uview-plus/types/comps/input.d.ts create mode 100644 uni_modules/uview-plus/types/comps/keyboard.d.ts create mode 100644 uni_modules/uview-plus/types/comps/line.d.ts create mode 100644 uni_modules/uview-plus/types/comps/lineProgress.d.ts create mode 100644 uni_modules/uview-plus/types/comps/link.d.ts create mode 100644 uni_modules/uview-plus/types/comps/list.d.ts create mode 100644 uni_modules/uview-plus/types/comps/listItem.d.ts create mode 100644 uni_modules/uview-plus/types/comps/loadMore.d.ts create mode 100644 uni_modules/uview-plus/types/comps/loadingIcon.d.ts create mode 100644 uni_modules/uview-plus/types/comps/loadingPage.d.ts create mode 100644 uni_modules/uview-plus/types/comps/modal.d.ts create mode 100644 uni_modules/uview-plus/types/comps/navbar.d.ts create mode 100644 uni_modules/uview-plus/types/comps/noNetwork.d.ts create mode 100644 uni_modules/uview-plus/types/comps/noticeBar.d.ts create mode 100644 uni_modules/uview-plus/types/comps/notify.d.ts create mode 100644 uni_modules/uview-plus/types/comps/numberBox.d.ts create mode 100644 uni_modules/uview-plus/types/comps/overlay.d.ts create mode 100644 uni_modules/uview-plus/types/comps/parse.d.ts create mode 100644 uni_modules/uview-plus/types/comps/picker.d.ts create mode 100644 uni_modules/uview-plus/types/comps/popup.d.ts create mode 100644 uni_modules/uview-plus/types/comps/qrcode.d.ts create mode 100644 uni_modules/uview-plus/types/comps/radio.d.ts create mode 100644 uni_modules/uview-plus/types/comps/radioGroup.d.ts create mode 100644 uni_modules/uview-plus/types/comps/rate.d.ts create mode 100644 uni_modules/uview-plus/types/comps/readMore.d.ts create mode 100644 uni_modules/uview-plus/types/comps/row.d.ts create mode 100644 uni_modules/uview-plus/types/comps/safeBottom.d.ts create mode 100644 uni_modules/uview-plus/types/comps/scrollList.d.ts create mode 100644 uni_modules/uview-plus/types/comps/search.d.ts create mode 100644 uni_modules/uview-plus/types/comps/skeleton.d.ts create mode 100644 uni_modules/uview-plus/types/comps/slider.d.ts create mode 100644 uni_modules/uview-plus/types/comps/statusBar.d.ts create mode 100644 uni_modules/uview-plus/types/comps/steps.d.ts create mode 100644 uni_modules/uview-plus/types/comps/stepsItem.d.ts create mode 100644 uni_modules/uview-plus/types/comps/sticky.d.ts create mode 100644 uni_modules/uview-plus/types/comps/subsection.d.ts create mode 100644 uni_modules/uview-plus/types/comps/swipeAction.d.ts create mode 100644 uni_modules/uview-plus/types/comps/swipeActionItem.d.ts create mode 100644 uni_modules/uview-plus/types/comps/swiper.d.ts create mode 100644 uni_modules/uview-plus/types/comps/swiperIndicator.d.ts create mode 100644 uni_modules/uview-plus/types/comps/switch.d.ts create mode 100644 uni_modules/uview-plus/types/comps/tabbar.d.ts create mode 100644 uni_modules/uview-plus/types/comps/tabbarItem.d.ts create mode 100644 uni_modules/uview-plus/types/comps/tabs.d.ts create mode 100644 uni_modules/uview-plus/types/comps/tag.d.ts create mode 100644 uni_modules/uview-plus/types/comps/text.d.ts create mode 100644 uni_modules/uview-plus/types/comps/textarea.d.ts create mode 100644 uni_modules/uview-plus/types/comps/toast.d.ts create mode 100644 uni_modules/uview-plus/types/comps/tooltip.d.ts create mode 100644 uni_modules/uview-plus/types/comps/transition.d.ts create mode 100644 uni_modules/uview-plus/types/comps/upload.d.ts create mode 100644 uni_modules/uview-plus/types/index.d.ts create mode 100644 uni_modules/uview-plus/types/package.json create mode 100644 unpackage/dist/cache/.vite/deps/_metadata.json create mode 100644 unpackage/dist/cache/.vite/deps/dayjs_esm_index.js create mode 100644 unpackage/dist/cache/.vite/deps/dayjs_esm_index.js.map create mode 100644 unpackage/dist/cache/.vite/deps/package.json create mode 100644 utils/request.js create mode 100644 vite.config.json diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..2889ddb --- /dev/null +++ b/App.vue @@ -0,0 +1,17 @@ + + + \ No newline at end of file diff --git a/components/ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js b/components/ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js new file mode 100644 index 0000000..72ab84f --- /dev/null +++ b/components/ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js @@ -0,0 +1,8225 @@ +export { + ZLMRTCClient +} +var ZLMRTCClient = (function (exports) { + 'use strict'; + + const Events$1 = { + WEBRTC_NOT_SUPPORT: 'WEBRTC_NOT_SUPPORT', + WEBRTC_ICE_CANDIDATE_ERROR: 'WEBRTC_ICE_CANDIDATE_ERROR', + WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED: 'WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED', + WEBRTC_ON_REMOTE_STREAMS: 'WEBRTC_ON_REMOTE_STREAMS', + WEBRTC_ON_LOCAL_STREAM: 'WEBRTC_ON_LOCAL_STREAM', + WEBRTC_ON_CONNECTION_STATE_CHANGE: 'WEBRTC_ON_CONNECTION_STATE_CHANGE', + WEBRTC_ON_DATA_CHANNEL_OPEN: 'WEBRTC_ON_DATA_CHANNEL_OPEN', + WEBRTC_ON_DATA_CHANNEL_CLOSE: 'WEBRTC_ON_DATA_CHANNEL_CLOSE', + WEBRTC_ON_DATA_CHANNEL_ERR: 'WEBRTC_ON_DATA_CHANNEL_ERR', + WEBRTC_ON_DATA_CHANNEL_MSG: 'WEBRTC_ON_DATA_CHANNEL_MSG', + CAPTURE_STREAM_FAILED: 'CAPTURE_STREAM_FAILED' + }; + + const VERSION$1 = '1.0.1'; + const BUILD_DATE = 'Mon Mar 27 2023 19:11:59 GMT+0800 (China Standard Time)'; + + // Copyright (C) <2018> Intel Corporation + // + // SPDX-License-Identifier: Apache-2.0 + + // eslint-disable-next-line require-jsdoc + function isFirefox() { + return window.navigator.userAgent.match('Firefox') !== null; + } + // eslint-disable-next-line require-jsdoc + function isChrome() { + return window.navigator.userAgent.match('Chrome') !== null; + } + // eslint-disable-next-line require-jsdoc + function isEdge() { + return window.navigator.userAgent.match(/Edge\/(\d+).(\d+)$/) !== null; + } + + // Copyright (C) <2018> Intel Corporation + + /** + * @class AudioSourceInfo + * @classDesc Source info about an audio track. Values: 'mic', 'screen-cast', 'file', 'mixed'. + * @memberOf Owt.Base + * @readonly + * @enum {string} + */ + const AudioSourceInfo = { + MIC: 'mic', + SCREENCAST: 'screen-cast', + FILE: 'file', + MIXED: 'mixed' + }; + + /** + * @class VideoSourceInfo + * @classDesc Source info about a video track. Values: 'camera', 'screen-cast', 'file', 'mixed'. + * @memberOf Owt.Base + * @readonly + * @enum {string} + */ + const VideoSourceInfo = { + CAMERA: 'camera', + SCREENCAST: 'screen-cast', + FILE: 'file', + MIXED: 'mixed' + }; + + /** + * @class TrackKind + * @classDesc Kind of a track. Values: 'audio' for audio track, 'video' for video track, 'av' for both audio and video tracks. + * @memberOf Owt.Base + * @readonly + * @enum {string} + */ + const TrackKind = { + /** + * Audio tracks. + * @type string + */ + AUDIO: 'audio', + /** + * Video tracks. + * @type string + */ + VIDEO: 'video', + /** + * Both audio and video tracks. + * @type string + */ + AUDIO_AND_VIDEO: 'av' + }; + /** + * @class Resolution + * @memberOf Owt.Base + * @classDesc The Resolution defines the size of a rectangle. + * @constructor + * @param {number} width + * @param {number} height + */ + class Resolution { + // eslint-disable-next-line require-jsdoc + constructor(width, height) { + /** + * @member {number} width + * @instance + * @memberof Owt.Base.Resolution + */ + this.width = width; + /** + * @member {number} height + * @instance + * @memberof Owt.Base.Resolution + */ + this.height = height; + } + } + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + let logDisabled_ = true; + let deprecationWarnings_ = true; + + /** + * Extract browser version out of the provided user agent string. + * + * @param {!string} uastring userAgent string. + * @param {!string} expr Regular expression used as match criteria. + * @param {!number} pos position in the version string to be returned. + * @return {!number} browser version. + */ + function extractVersion(uastring, expr, pos) { + const match = uastring.match(expr); + return match && match.length >= pos && parseInt(match[pos], 10); + } + + // Wraps the peerconnection event eventNameToWrap in a function + // which returns the modified event object (or false to prevent + // the event). + function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) { + if (!window.RTCPeerConnection) { + return; + } + const proto = window.RTCPeerConnection.prototype; + const nativeAddEventListener = proto.addEventListener; + proto.addEventListener = function(nativeEventName, cb) { + if (nativeEventName !== eventNameToWrap) { + return nativeAddEventListener.apply(this, arguments); + } + const wrappedCallback = (e) => { + const modifiedEvent = wrapper(e); + if (modifiedEvent) { + if (cb.handleEvent) { + cb.handleEvent(modifiedEvent); + } else { + cb(modifiedEvent); + } + } + }; + this._eventMap = this._eventMap || {}; + if (!this._eventMap[eventNameToWrap]) { + this._eventMap[eventNameToWrap] = new Map(); + } + this._eventMap[eventNameToWrap].set(cb, wrappedCallback); + return nativeAddEventListener.apply(this, [nativeEventName, + wrappedCallback]); + }; + + const nativeRemoveEventListener = proto.removeEventListener; + proto.removeEventListener = function(nativeEventName, cb) { + if (nativeEventName !== eventNameToWrap || !this._eventMap + || !this._eventMap[eventNameToWrap]) { + return nativeRemoveEventListener.apply(this, arguments); + } + if (!this._eventMap[eventNameToWrap].has(cb)) { + return nativeRemoveEventListener.apply(this, arguments); + } + const unwrappedCb = this._eventMap[eventNameToWrap].get(cb); + this._eventMap[eventNameToWrap].delete(cb); + if (this._eventMap[eventNameToWrap].size === 0) { + delete this._eventMap[eventNameToWrap]; + } + if (Object.keys(this._eventMap).length === 0) { + delete this._eventMap; + } + return nativeRemoveEventListener.apply(this, [nativeEventName, + unwrappedCb]); + }; + + Object.defineProperty(proto, 'on' + eventNameToWrap, { + get() { + return this['_on' + eventNameToWrap]; + }, + set(cb) { + if (this['_on' + eventNameToWrap]) { + this.removeEventListener(eventNameToWrap, + this['_on' + eventNameToWrap]); + delete this['_on' + eventNameToWrap]; + } + if (cb) { + this.addEventListener(eventNameToWrap, + this['_on' + eventNameToWrap] = cb); + } + }, + enumerable: true, + configurable: true + }); + } + + function disableLog(bool) { + if (typeof bool !== 'boolean') { + return new Error('Argument type: ' + typeof bool + + '. Please use a boolean.'); + } + logDisabled_ = bool; + return (bool) ? 'adapter.js logging disabled' : + 'adapter.js logging enabled'; + } + + /** + * Disable or enable deprecation warnings + * @param {!boolean} bool set to true to disable warnings. + */ + function disableWarnings(bool) { + if (typeof bool !== 'boolean') { + return new Error('Argument type: ' + typeof bool + + '. Please use a boolean.'); + } + deprecationWarnings_ = !bool; + return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled'); + } + + function log$1() { + if (typeof window === 'object') { + if (logDisabled_) { + return; + } + if (typeof console !== 'undefined' && typeof console.log === 'function') { + console.log.apply(console, arguments); + } + } + } + + /** + * Shows a deprecation warning suggesting the modern and spec-compatible API. + */ + function deprecated(oldMethod, newMethod) { + if (!deprecationWarnings_) { + return; + } + console.warn(oldMethod + ' is deprecated, please use ' + newMethod + + ' instead.'); + } + + /** + * Browser detector. + * + * @return {object} result containing browser and version + * properties. + */ + function detectBrowser(window) { + // Returned result object. + const result = {browser: null, version: null}; + + // Fail early if it's not a browser + if (typeof window === 'undefined' || !window.navigator) { + result.browser = 'Not a browser.'; + return result; + } + + const {navigator} = window; + + if (navigator.mozGetUserMedia) { // Firefox. + result.browser = 'firefox'; + result.version = extractVersion(navigator.userAgent, + /Firefox\/(\d+)\./, 1); + } else if (navigator.webkitGetUserMedia || + (window.isSecureContext === false && window.webkitRTCPeerConnection && + !window.RTCIceGatherer)) { + // Chrome, Chromium, Webview, Opera. + // Version matches Chrome/WebRTC version. + // Chrome 74 removed webkitGetUserMedia on http as well so we need the + // more complicated fallback to webkitRTCPeerConnection. + result.browser = 'chrome'; + result.version = extractVersion(navigator.userAgent, + /Chrom(e|ium)\/(\d+)\./, 2); + } else if (navigator.mediaDevices && + navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)) { // Edge. + result.browser = 'edge'; + result.version = extractVersion(navigator.userAgent, + /Edge\/(\d+).(\d+)$/, 2); + } else if (window.RTCPeerConnection && + navigator.userAgent.match(/AppleWebKit\/(\d+)\./)) { // Safari. + result.browser = 'safari'; + result.version = extractVersion(navigator.userAgent, + /AppleWebKit\/(\d+)\./, 1); + result.supportsUnifiedPlan = window.RTCRtpTransceiver && + 'currentDirection' in window.RTCRtpTransceiver.prototype; + } else { // Default fallthrough: not supported. + result.browser = 'Not a supported browser.'; + return result; + } + + return result; + } + + /** + * Checks if something is an object. + * + * @param {*} val The something you want to check. + * @return true if val is an object, false otherwise. + */ + function isObject$1(val) { + return Object.prototype.toString.call(val) === '[object Object]'; + } + + /** + * Remove all empty objects and undefined values + * from a nested object -- an enhanced and vanilla version + * of Lodash's `compact`. + */ + function compactObject(data) { + if (!isObject$1(data)) { + return data; + } + + return Object.keys(data).reduce(function(accumulator, key) { + const isObj = isObject$1(data[key]); + const value = isObj ? compactObject(data[key]) : data[key]; + const isEmptyObject = isObj && !Object.keys(value).length; + if (value === undefined || isEmptyObject) { + return accumulator; + } + return Object.assign(accumulator, {[key]: value}); + }, {}); + } + + /* iterates the stats graph recursively. */ + function walkStats(stats, base, resultSet) { + if (!base || resultSet.has(base.id)) { + return; + } + resultSet.set(base.id, base); + Object.keys(base).forEach(name => { + if (name.endsWith('Id')) { + walkStats(stats, stats.get(base[name]), resultSet); + } else if (name.endsWith('Ids')) { + base[name].forEach(id => { + walkStats(stats, stats.get(id), resultSet); + }); + } + }); + } + + /* filter getStats for a sender/receiver track. */ + function filterStats(result, track, outbound) { + const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp'; + const filteredResult = new Map(); + if (track === null) { + return filteredResult; + } + const trackStats = []; + result.forEach(value => { + if (value.type === 'track' && + value.trackIdentifier === track.id) { + trackStats.push(value); + } + }); + trackStats.forEach(trackStat => { + result.forEach(stats => { + if (stats.type === streamStatsType && stats.trackId === trackStat.id) { + walkStats(result, stats, filteredResult); + } + }); + }); + return filteredResult; + } + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + const logging = log$1; + + function shimGetUserMedia$3(window, browserDetails) { + const navigator = window && window.navigator; + + if (!navigator.mediaDevices) { + return; + } + + const constraintsToChrome_ = function(c) { + if (typeof c !== 'object' || c.mandatory || c.optional) { + return c; + } + const cc = {}; + Object.keys(c).forEach(key => { + if (key === 'require' || key === 'advanced' || key === 'mediaSource') { + return; + } + const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]}; + if (r.exact !== undefined && typeof r.exact === 'number') { + r.min = r.max = r.exact; + } + const oldname_ = function(prefix, name) { + if (prefix) { + return prefix + name.charAt(0).toUpperCase() + name.slice(1); + } + return (name === 'deviceId') ? 'sourceId' : name; + }; + if (r.ideal !== undefined) { + cc.optional = cc.optional || []; + let oc = {}; + if (typeof r.ideal === 'number') { + oc[oldname_('min', key)] = r.ideal; + cc.optional.push(oc); + oc = {}; + oc[oldname_('max', key)] = r.ideal; + cc.optional.push(oc); + } else { + oc[oldname_('', key)] = r.ideal; + cc.optional.push(oc); + } + } + if (r.exact !== undefined && typeof r.exact !== 'number') { + cc.mandatory = cc.mandatory || {}; + cc.mandatory[oldname_('', key)] = r.exact; + } else { + ['min', 'max'].forEach(mix => { + if (r[mix] !== undefined) { + cc.mandatory = cc.mandatory || {}; + cc.mandatory[oldname_(mix, key)] = r[mix]; + } + }); + } + }); + if (c.advanced) { + cc.optional = (cc.optional || []).concat(c.advanced); + } + return cc; + }; + + const shimConstraints_ = function(constraints, func) { + if (browserDetails.version >= 61) { + return func(constraints); + } + constraints = JSON.parse(JSON.stringify(constraints)); + if (constraints && typeof constraints.audio === 'object') { + const remap = function(obj, a, b) { + if (a in obj && !(b in obj)) { + obj[b] = obj[a]; + delete obj[a]; + } + }; + constraints = JSON.parse(JSON.stringify(constraints)); + remap(constraints.audio, 'autoGainControl', 'googAutoGainControl'); + remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression'); + constraints.audio = constraintsToChrome_(constraints.audio); + } + if (constraints && typeof constraints.video === 'object') { + // Shim facingMode for mobile & surface pro. + let face = constraints.video.facingMode; + face = face && ((typeof face === 'object') ? face : {ideal: face}); + const getSupportedFacingModeLies = browserDetails.version < 66; + + if ((face && (face.exact === 'user' || face.exact === 'environment' || + face.ideal === 'user' || face.ideal === 'environment')) && + !(navigator.mediaDevices.getSupportedConstraints && + navigator.mediaDevices.getSupportedConstraints().facingMode && + !getSupportedFacingModeLies)) { + delete constraints.video.facingMode; + let matches; + if (face.exact === 'environment' || face.ideal === 'environment') { + matches = ['back', 'rear']; + } else if (face.exact === 'user' || face.ideal === 'user') { + matches = ['front']; + } + if (matches) { + // Look for matches in label, or use last cam for back (typical). + return navigator.mediaDevices.enumerateDevices() + .then(devices => { + devices = devices.filter(d => d.kind === 'videoinput'); + let dev = devices.find(d => matches.some(match => + d.label.toLowerCase().includes(match))); + if (!dev && devices.length && matches.includes('back')) { + dev = devices[devices.length - 1]; // more likely the back cam + } + if (dev) { + constraints.video.deviceId = face.exact ? {exact: dev.deviceId} : + {ideal: dev.deviceId}; + } + constraints.video = constraintsToChrome_(constraints.video); + logging('chrome: ' + JSON.stringify(constraints)); + return func(constraints); + }); + } + } + constraints.video = constraintsToChrome_(constraints.video); + } + logging('chrome: ' + JSON.stringify(constraints)); + return func(constraints); + }; + + const shimError_ = function(e) { + if (browserDetails.version >= 64) { + return e; + } + return { + name: { + PermissionDeniedError: 'NotAllowedError', + PermissionDismissedError: 'NotAllowedError', + InvalidStateError: 'NotAllowedError', + DevicesNotFoundError: 'NotFoundError', + ConstraintNotSatisfiedError: 'OverconstrainedError', + TrackStartError: 'NotReadableError', + MediaDeviceFailedDueToShutdown: 'NotAllowedError', + MediaDeviceKillSwitchOn: 'NotAllowedError', + TabCaptureError: 'AbortError', + ScreenCaptureError: 'AbortError', + DeviceCaptureError: 'AbortError' + }[e.name] || e.name, + message: e.message, + constraint: e.constraint || e.constraintName, + toString() { + return this.name + (this.message && ': ') + this.message; + } + }; + }; + + const getUserMedia_ = function(constraints, onSuccess, onError) { + shimConstraints_(constraints, c => { + navigator.webkitGetUserMedia(c, onSuccess, e => { + if (onError) { + onError(shimError_(e)); + } + }); + }); + }; + navigator.getUserMedia = getUserMedia_.bind(navigator); + + // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia + // function which returns a Promise, it does not accept spec-style + // constraints. + if (navigator.mediaDevices.getUserMedia) { + const origGetUserMedia = navigator.mediaDevices.getUserMedia. + bind(navigator.mediaDevices); + navigator.mediaDevices.getUserMedia = function(cs) { + return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => { + if (c.audio && !stream.getAudioTracks().length || + c.video && !stream.getVideoTracks().length) { + stream.getTracks().forEach(track => { + track.stop(); + }); + throw new DOMException('', 'NotFoundError'); + } + return stream; + }, e => Promise.reject(shimError_(e)))); + }; + } + } + + /* + * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + function shimGetDisplayMedia$2(window, getSourceId) { + if (window.navigator.mediaDevices && + 'getDisplayMedia' in window.navigator.mediaDevices) { + return; + } + if (!(window.navigator.mediaDevices)) { + return; + } + // getSourceId is a function that returns a promise resolving with + // the sourceId of the screen/window/tab to be shared. + if (typeof getSourceId !== 'function') { + console.error('shimGetDisplayMedia: getSourceId argument is not ' + + 'a function'); + return; + } + window.navigator.mediaDevices.getDisplayMedia = + function getDisplayMedia(constraints) { + return getSourceId(constraints) + .then(sourceId => { + const widthSpecified = constraints.video && constraints.video.width; + const heightSpecified = constraints.video && + constraints.video.height; + const frameRateSpecified = constraints.video && + constraints.video.frameRate; + constraints.video = { + mandatory: { + chromeMediaSource: 'desktop', + chromeMediaSourceId: sourceId, + maxFrameRate: frameRateSpecified || 3 + } + }; + if (widthSpecified) { + constraints.video.mandatory.maxWidth = widthSpecified; + } + if (heightSpecified) { + constraints.video.mandatory.maxHeight = heightSpecified; + } + return window.navigator.mediaDevices.getUserMedia(constraints); + }); + }; + } + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + function shimMediaStream(window) { + window.MediaStream = window.MediaStream || window.webkitMediaStream; + } + + function shimOnTrack$1(window) { + if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in + window.RTCPeerConnection.prototype)) { + Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', { + get() { + return this._ontrack; + }, + set(f) { + if (this._ontrack) { + this.removeEventListener('track', this._ontrack); + } + this.addEventListener('track', this._ontrack = f); + }, + enumerable: true, + configurable: true + }); + const origSetRemoteDescription = + window.RTCPeerConnection.prototype.setRemoteDescription; + window.RTCPeerConnection.prototype.setRemoteDescription = + function setRemoteDescription() { + if (!this._ontrackpoly) { + this._ontrackpoly = (e) => { + // onaddstream does not fire when a track is added to an existing + // stream. But stream.onaddtrack is implemented so we use that. + e.stream.addEventListener('addtrack', te => { + let receiver; + if (window.RTCPeerConnection.prototype.getReceivers) { + receiver = this.getReceivers() + .find(r => r.track && r.track.id === te.track.id); + } else { + receiver = {track: te.track}; + } + + const event = new Event('track'); + event.track = te.track; + event.receiver = receiver; + event.transceiver = {receiver}; + event.streams = [e.stream]; + this.dispatchEvent(event); + }); + e.stream.getTracks().forEach(track => { + let receiver; + if (window.RTCPeerConnection.prototype.getReceivers) { + receiver = this.getReceivers() + .find(r => r.track && r.track.id === track.id); + } else { + receiver = {track}; + } + const event = new Event('track'); + event.track = track; + event.receiver = receiver; + event.transceiver = {receiver}; + event.streams = [e.stream]; + this.dispatchEvent(event); + }); + }; + this.addEventListener('addstream', this._ontrackpoly); + } + return origSetRemoteDescription.apply(this, arguments); + }; + } else { + // even if RTCRtpTransceiver is in window, it is only used and + // emitted in unified-plan. Unfortunately this means we need + // to unconditionally wrap the event. + wrapPeerConnectionEvent(window, 'track', e => { + if (!e.transceiver) { + Object.defineProperty(e, 'transceiver', + {value: {receiver: e.receiver}}); + } + return e; + }); + } + } + + function shimGetSendersWithDtmf(window) { + // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack. + if (typeof window === 'object' && window.RTCPeerConnection && + !('getSenders' in window.RTCPeerConnection.prototype) && + 'createDTMFSender' in window.RTCPeerConnection.prototype) { + const shimSenderWithDtmf = function(pc, track) { + return { + track, + get dtmf() { + if (this._dtmf === undefined) { + if (track.kind === 'audio') { + this._dtmf = pc.createDTMFSender(track); + } else { + this._dtmf = null; + } + } + return this._dtmf; + }, + _pc: pc + }; + }; + + // augment addTrack when getSenders is not available. + if (!window.RTCPeerConnection.prototype.getSenders) { + window.RTCPeerConnection.prototype.getSenders = function getSenders() { + this._senders = this._senders || []; + return this._senders.slice(); // return a copy of the internal state. + }; + const origAddTrack = window.RTCPeerConnection.prototype.addTrack; + window.RTCPeerConnection.prototype.addTrack = + function addTrack(track, stream) { + let sender = origAddTrack.apply(this, arguments); + if (!sender) { + sender = shimSenderWithDtmf(this, track); + this._senders.push(sender); + } + return sender; + }; + + const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack; + window.RTCPeerConnection.prototype.removeTrack = + function removeTrack(sender) { + origRemoveTrack.apply(this, arguments); + const idx = this._senders.indexOf(sender); + if (idx !== -1) { + this._senders.splice(idx, 1); + } + }; + } + const origAddStream = window.RTCPeerConnection.prototype.addStream; + window.RTCPeerConnection.prototype.addStream = function addStream(stream) { + this._senders = this._senders || []; + origAddStream.apply(this, [stream]); + stream.getTracks().forEach(track => { + this._senders.push(shimSenderWithDtmf(this, track)); + }); + }; + + const origRemoveStream = window.RTCPeerConnection.prototype.removeStream; + window.RTCPeerConnection.prototype.removeStream = + function removeStream(stream) { + this._senders = this._senders || []; + origRemoveStream.apply(this, [stream]); + + stream.getTracks().forEach(track => { + const sender = this._senders.find(s => s.track === track); + if (sender) { // remove sender + this._senders.splice(this._senders.indexOf(sender), 1); + } + }); + }; + } else if (typeof window === 'object' && window.RTCPeerConnection && + 'getSenders' in window.RTCPeerConnection.prototype && + 'createDTMFSender' in window.RTCPeerConnection.prototype && + window.RTCRtpSender && + !('dtmf' in window.RTCRtpSender.prototype)) { + const origGetSenders = window.RTCPeerConnection.prototype.getSenders; + window.RTCPeerConnection.prototype.getSenders = function getSenders() { + const senders = origGetSenders.apply(this, []); + senders.forEach(sender => sender._pc = this); + return senders; + }; + + Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', { + get() { + if (this._dtmf === undefined) { + if (this.track.kind === 'audio') { + this._dtmf = this._pc.createDTMFSender(this.track); + } else { + this._dtmf = null; + } + } + return this._dtmf; + } + }); + } + } + + function shimGetStats(window) { + if (!window.RTCPeerConnection) { + return; + } + + const origGetStats = window.RTCPeerConnection.prototype.getStats; + window.RTCPeerConnection.prototype.getStats = function getStats() { + const [selector, onSucc, onErr] = arguments; + + // If selector is a function then we are in the old style stats so just + // pass back the original getStats format to avoid breaking old users. + if (arguments.length > 0 && typeof selector === 'function') { + return origGetStats.apply(this, arguments); + } + + // When spec-style getStats is supported, return those when called with + // either no arguments or the selector argument is null. + if (origGetStats.length === 0 && (arguments.length === 0 || + typeof selector !== 'function')) { + return origGetStats.apply(this, []); + } + + const fixChromeStats_ = function(response) { + const standardReport = {}; + const reports = response.result(); + reports.forEach(report => { + const standardStats = { + id: report.id, + timestamp: report.timestamp, + type: { + localcandidate: 'local-candidate', + remotecandidate: 'remote-candidate' + }[report.type] || report.type + }; + report.names().forEach(name => { + standardStats[name] = report.stat(name); + }); + standardReport[standardStats.id] = standardStats; + }); + + return standardReport; + }; + + // shim getStats with maplike support + const makeMapStats = function(stats) { + return new Map(Object.keys(stats).map(key => [key, stats[key]])); + }; + + if (arguments.length >= 2) { + const successCallbackWrapper_ = function(response) { + onSucc(makeMapStats(fixChromeStats_(response))); + }; + + return origGetStats.apply(this, [successCallbackWrapper_, + selector]); + } + + // promise-support + return new Promise((resolve, reject) => { + origGetStats.apply(this, [ + function(response) { + resolve(makeMapStats(fixChromeStats_(response))); + }, reject]); + }).then(onSucc, onErr); + }; + } + + function shimSenderReceiverGetStats(window) { + if (!(typeof window === 'object' && window.RTCPeerConnection && + window.RTCRtpSender && window.RTCRtpReceiver)) { + return; + } + + // shim sender stats. + if (!('getStats' in window.RTCRtpSender.prototype)) { + const origGetSenders = window.RTCPeerConnection.prototype.getSenders; + if (origGetSenders) { + window.RTCPeerConnection.prototype.getSenders = function getSenders() { + const senders = origGetSenders.apply(this, []); + senders.forEach(sender => sender._pc = this); + return senders; + }; + } + + const origAddTrack = window.RTCPeerConnection.prototype.addTrack; + if (origAddTrack) { + window.RTCPeerConnection.prototype.addTrack = function addTrack() { + const sender = origAddTrack.apply(this, arguments); + sender._pc = this; + return sender; + }; + } + window.RTCRtpSender.prototype.getStats = function getStats() { + const sender = this; + return this._pc.getStats().then(result => + /* Note: this will include stats of all senders that + * send a track with the same id as sender.track as + * it is not possible to identify the RTCRtpSender. + */ + filterStats(result, sender.track, true)); + }; + } + + // shim receiver stats. + if (!('getStats' in window.RTCRtpReceiver.prototype)) { + const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers; + if (origGetReceivers) { + window.RTCPeerConnection.prototype.getReceivers = + function getReceivers() { + const receivers = origGetReceivers.apply(this, []); + receivers.forEach(receiver => receiver._pc = this); + return receivers; + }; + } + wrapPeerConnectionEvent(window, 'track', e => { + e.receiver._pc = e.srcElement; + return e; + }); + window.RTCRtpReceiver.prototype.getStats = function getStats() { + const receiver = this; + return this._pc.getStats().then(result => + filterStats(result, receiver.track, false)); + }; + } + + if (!('getStats' in window.RTCRtpSender.prototype && + 'getStats' in window.RTCRtpReceiver.prototype)) { + return; + } + + // shim RTCPeerConnection.getStats(track). + const origGetStats = window.RTCPeerConnection.prototype.getStats; + window.RTCPeerConnection.prototype.getStats = function getStats() { + if (arguments.length > 0 && + arguments[0] instanceof window.MediaStreamTrack) { + const track = arguments[0]; + let sender; + let receiver; + let err; + this.getSenders().forEach(s => { + if (s.track === track) { + if (sender) { + err = true; + } else { + sender = s; + } + } + }); + this.getReceivers().forEach(r => { + if (r.track === track) { + if (receiver) { + err = true; + } else { + receiver = r; + } + } + return r.track === track; + }); + if (err || (sender && receiver)) { + return Promise.reject(new DOMException( + 'There are more than one sender or receiver for the track.', + 'InvalidAccessError')); + } else if (sender) { + return sender.getStats(); + } else if (receiver) { + return receiver.getStats(); + } + return Promise.reject(new DOMException( + 'There is no sender or receiver for the track.', + 'InvalidAccessError')); + } + return origGetStats.apply(this, arguments); + }; + } + + function shimAddTrackRemoveTrackWithNative(window) { + // shim addTrack/removeTrack with native variants in order to make + // the interactions with legacy getLocalStreams behave as in other browsers. + // Keeps a mapping stream.id => [stream, rtpsenders...] + window.RTCPeerConnection.prototype.getLocalStreams = + function getLocalStreams() { + this._shimmedLocalStreams = this._shimmedLocalStreams || {}; + return Object.keys(this._shimmedLocalStreams) + .map(streamId => this._shimmedLocalStreams[streamId][0]); + }; + + const origAddTrack = window.RTCPeerConnection.prototype.addTrack; + window.RTCPeerConnection.prototype.addTrack = + function addTrack(track, stream) { + if (!stream) { + return origAddTrack.apply(this, arguments); + } + this._shimmedLocalStreams = this._shimmedLocalStreams || {}; + + const sender = origAddTrack.apply(this, arguments); + if (!this._shimmedLocalStreams[stream.id]) { + this._shimmedLocalStreams[stream.id] = [stream, sender]; + } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) { + this._shimmedLocalStreams[stream.id].push(sender); + } + return sender; + }; + + const origAddStream = window.RTCPeerConnection.prototype.addStream; + window.RTCPeerConnection.prototype.addStream = function addStream(stream) { + this._shimmedLocalStreams = this._shimmedLocalStreams || {}; + + stream.getTracks().forEach(track => { + const alreadyExists = this.getSenders().find(s => s.track === track); + if (alreadyExists) { + throw new DOMException('Track already exists.', + 'InvalidAccessError'); + } + }); + const existingSenders = this.getSenders(); + origAddStream.apply(this, arguments); + const newSenders = this.getSenders() + .filter(newSender => existingSenders.indexOf(newSender) === -1); + this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders); + }; + + const origRemoveStream = window.RTCPeerConnection.prototype.removeStream; + window.RTCPeerConnection.prototype.removeStream = + function removeStream(stream) { + this._shimmedLocalStreams = this._shimmedLocalStreams || {}; + delete this._shimmedLocalStreams[stream.id]; + return origRemoveStream.apply(this, arguments); + }; + + const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack; + window.RTCPeerConnection.prototype.removeTrack = + function removeTrack(sender) { + this._shimmedLocalStreams = this._shimmedLocalStreams || {}; + if (sender) { + Object.keys(this._shimmedLocalStreams).forEach(streamId => { + const idx = this._shimmedLocalStreams[streamId].indexOf(sender); + if (idx !== -1) { + this._shimmedLocalStreams[streamId].splice(idx, 1); + } + if (this._shimmedLocalStreams[streamId].length === 1) { + delete this._shimmedLocalStreams[streamId]; + } + }); + } + return origRemoveTrack.apply(this, arguments); + }; + } + + function shimAddTrackRemoveTrack(window, browserDetails) { + if (!window.RTCPeerConnection) { + return; + } + // shim addTrack and removeTrack. + if (window.RTCPeerConnection.prototype.addTrack && + browserDetails.version >= 65) { + return shimAddTrackRemoveTrackWithNative(window); + } + + // also shim pc.getLocalStreams when addTrack is shimmed + // to return the original streams. + const origGetLocalStreams = window.RTCPeerConnection.prototype + .getLocalStreams; + window.RTCPeerConnection.prototype.getLocalStreams = + function getLocalStreams() { + const nativeStreams = origGetLocalStreams.apply(this); + this._reverseStreams = this._reverseStreams || {}; + return nativeStreams.map(stream => this._reverseStreams[stream.id]); + }; + + const origAddStream = window.RTCPeerConnection.prototype.addStream; + window.RTCPeerConnection.prototype.addStream = function addStream(stream) { + this._streams = this._streams || {}; + this._reverseStreams = this._reverseStreams || {}; + + stream.getTracks().forEach(track => { + const alreadyExists = this.getSenders().find(s => s.track === track); + if (alreadyExists) { + throw new DOMException('Track already exists.', + 'InvalidAccessError'); + } + }); + // Add identity mapping for consistency with addTrack. + // Unless this is being used with a stream from addTrack. + if (!this._reverseStreams[stream.id]) { + const newStream = new window.MediaStream(stream.getTracks()); + this._streams[stream.id] = newStream; + this._reverseStreams[newStream.id] = stream; + stream = newStream; + } + origAddStream.apply(this, [stream]); + }; + + const origRemoveStream = window.RTCPeerConnection.prototype.removeStream; + window.RTCPeerConnection.prototype.removeStream = + function removeStream(stream) { + this._streams = this._streams || {}; + this._reverseStreams = this._reverseStreams || {}; + + origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]); + delete this._reverseStreams[(this._streams[stream.id] ? + this._streams[stream.id].id : stream.id)]; + delete this._streams[stream.id]; + }; + + window.RTCPeerConnection.prototype.addTrack = + function addTrack(track, stream) { + if (this.signalingState === 'closed') { + throw new DOMException( + 'The RTCPeerConnection\'s signalingState is \'closed\'.', + 'InvalidStateError'); + } + const streams = [].slice.call(arguments, 1); + if (streams.length !== 1 || + !streams[0].getTracks().find(t => t === track)) { + // this is not fully correct but all we can manage without + // [[associated MediaStreams]] internal slot. + throw new DOMException( + 'The adapter.js addTrack polyfill only supports a single ' + + ' stream which is associated with the specified track.', + 'NotSupportedError'); + } + + const alreadyExists = this.getSenders().find(s => s.track === track); + if (alreadyExists) { + throw new DOMException('Track already exists.', + 'InvalidAccessError'); + } + + this._streams = this._streams || {}; + this._reverseStreams = this._reverseStreams || {}; + const oldStream = this._streams[stream.id]; + if (oldStream) { + // this is using odd Chrome behaviour, use with caution: + // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815 + // Note: we rely on the high-level addTrack/dtmf shim to + // create the sender with a dtmf sender. + oldStream.addTrack(track); + + // Trigger ONN async. + Promise.resolve().then(() => { + this.dispatchEvent(new Event('negotiationneeded')); + }); + } else { + const newStream = new window.MediaStream([track]); + this._streams[stream.id] = newStream; + this._reverseStreams[newStream.id] = stream; + this.addStream(newStream); + } + return this.getSenders().find(s => s.track === track); + }; + + // replace the internal stream id with the external one and + // vice versa. + function replaceInternalStreamId(pc, description) { + let sdp = description.sdp; + Object.keys(pc._reverseStreams || []).forEach(internalId => { + const externalStream = pc._reverseStreams[internalId]; + const internalStream = pc._streams[externalStream.id]; + sdp = sdp.replace(new RegExp(internalStream.id, 'g'), + externalStream.id); + }); + return new RTCSessionDescription({ + type: description.type, + sdp + }); + } + function replaceExternalStreamId(pc, description) { + let sdp = description.sdp; + Object.keys(pc._reverseStreams || []).forEach(internalId => { + const externalStream = pc._reverseStreams[internalId]; + const internalStream = pc._streams[externalStream.id]; + sdp = sdp.replace(new RegExp(externalStream.id, 'g'), + internalStream.id); + }); + return new RTCSessionDescription({ + type: description.type, + sdp + }); + } + ['createOffer', 'createAnswer'].forEach(function(method) { + const nativeMethod = window.RTCPeerConnection.prototype[method]; + const methodObj = {[method]() { + const args = arguments; + const isLegacyCall = arguments.length && + typeof arguments[0] === 'function'; + if (isLegacyCall) { + return nativeMethod.apply(this, [ + (description) => { + const desc = replaceInternalStreamId(this, description); + args[0].apply(null, [desc]); + }, + (err) => { + if (args[1]) { + args[1].apply(null, err); + } + }, arguments[2] + ]); + } + return nativeMethod.apply(this, arguments) + .then(description => replaceInternalStreamId(this, description)); + }}; + window.RTCPeerConnection.prototype[method] = methodObj[method]; + }); + + const origSetLocalDescription = + window.RTCPeerConnection.prototype.setLocalDescription; + window.RTCPeerConnection.prototype.setLocalDescription = + function setLocalDescription() { + if (!arguments.length || !arguments[0].type) { + return origSetLocalDescription.apply(this, arguments); + } + arguments[0] = replaceExternalStreamId(this, arguments[0]); + return origSetLocalDescription.apply(this, arguments); + }; + + // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier + + const origLocalDescription = Object.getOwnPropertyDescriptor( + window.RTCPeerConnection.prototype, 'localDescription'); + Object.defineProperty(window.RTCPeerConnection.prototype, + 'localDescription', { + get() { + const description = origLocalDescription.get.apply(this); + if (description.type === '') { + return description; + } + return replaceInternalStreamId(this, description); + } + }); + + window.RTCPeerConnection.prototype.removeTrack = + function removeTrack(sender) { + if (this.signalingState === 'closed') { + throw new DOMException( + 'The RTCPeerConnection\'s signalingState is \'closed\'.', + 'InvalidStateError'); + } + // We can not yet check for sender instanceof RTCRtpSender + // since we shim RTPSender. So we check if sender._pc is set. + if (!sender._pc) { + throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' + + 'does not implement interface RTCRtpSender.', 'TypeError'); + } + const isLocal = sender._pc === this; + if (!isLocal) { + throw new DOMException('Sender was not created by this connection.', + 'InvalidAccessError'); + } + + // Search for the native stream the senders track belongs to. + this._streams = this._streams || {}; + let stream; + Object.keys(this._streams).forEach(streamid => { + const hasTrack = this._streams[streamid].getTracks() + .find(track => sender.track === track); + if (hasTrack) { + stream = this._streams[streamid]; + } + }); + + if (stream) { + if (stream.getTracks().length === 1) { + // if this is the last track of the stream, remove the stream. This + // takes care of any shimmed _senders. + this.removeStream(this._reverseStreams[stream.id]); + } else { + // relying on the same odd chrome behaviour as above. + stream.removeTrack(sender.track); + } + this.dispatchEvent(new Event('negotiationneeded')); + } + }; + } + + function shimPeerConnection$2(window, browserDetails) { + if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) { + // very basic support for old versions. + window.RTCPeerConnection = window.webkitRTCPeerConnection; + } + if (!window.RTCPeerConnection) { + return; + } + + // shim implicit creation of RTCSessionDescription/RTCIceCandidate + if (browserDetails.version < 53) { + ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'] + .forEach(function(method) { + const nativeMethod = window.RTCPeerConnection.prototype[method]; + const methodObj = {[method]() { + arguments[0] = new ((method === 'addIceCandidate') ? + window.RTCIceCandidate : + window.RTCSessionDescription)(arguments[0]); + return nativeMethod.apply(this, arguments); + }}; + window.RTCPeerConnection.prototype[method] = methodObj[method]; + }); + } + } + + // Attempt to fix ONN in plan-b mode. + function fixNegotiationNeeded(window, browserDetails) { + wrapPeerConnectionEvent(window, 'negotiationneeded', e => { + const pc = e.target; + if (browserDetails.version < 72 || (pc.getConfiguration && + pc.getConfiguration().sdpSemantics === 'plan-b')) { + if (pc.signalingState !== 'stable') { + return; + } + } + return e; + }); + } + + var chromeShim = /*#__PURE__*/Object.freeze({ + __proto__: null, + shimMediaStream: shimMediaStream, + shimOnTrack: shimOnTrack$1, + shimGetSendersWithDtmf: shimGetSendersWithDtmf, + shimGetStats: shimGetStats, + shimSenderReceiverGetStats: shimSenderReceiverGetStats, + shimAddTrackRemoveTrackWithNative: shimAddTrackRemoveTrackWithNative, + shimAddTrackRemoveTrack: shimAddTrackRemoveTrack, + shimPeerConnection: shimPeerConnection$2, + fixNegotiationNeeded: fixNegotiationNeeded, + shimGetUserMedia: shimGetUserMedia$3, + shimGetDisplayMedia: shimGetDisplayMedia$2 + }); + + /* + * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + // Edge does not like + // 1) stun: filtered after 14393 unless ?transport=udp is present + // 2) turn: that does not have all of turn:host:port?transport=udp + // 3) turn: with ipv6 addresses + // 4) turn: occurring muliple times + function filterIceServers$1(iceServers, edgeVersion) { + let hasTurn = false; + iceServers = JSON.parse(JSON.stringify(iceServers)); + return iceServers.filter(server => { + if (server && (server.urls || server.url)) { + let urls = server.urls || server.url; + if (server.url && !server.urls) { + deprecated('RTCIceServer.url', 'RTCIceServer.urls'); + } + const isString = typeof urls === 'string'; + if (isString) { + urls = [urls]; + } + urls = urls.filter(url => { + // filter STUN unconditionally. + if (url.indexOf('stun:') === 0) { + return false; + } + + const validTurn = url.startsWith('turn') && + !url.startsWith('turn:[') && + url.includes('transport=udp'); + if (validTurn && !hasTurn) { + hasTurn = true; + return true; + } + return validTurn && !hasTurn; + }); + + delete server.url; + server.urls = isString ? urls[0] : urls; + return !!urls.length; + } + }); + } + + function createCommonjsModule(fn) { + var module = { exports: {} }; + return fn(module, module.exports), module.exports; + } + + /* eslint-env node */ + + var sdp = createCommonjsModule(function (module) { + + // SDP helpers. + var SDPUtils = {}; + + // Generate an alphanumeric identifier for cname or mids. + // TODO: use UUIDs instead? https://gist.github.com/jed/982883 + SDPUtils.generateIdentifier = function() { + return Math.random().toString(36).substr(2, 10); + }; + + // The RTCP CNAME used by all peerconnections from the same JS. + SDPUtils.localCName = SDPUtils.generateIdentifier(); + + // Splits SDP into lines, dealing with both CRLF and LF. + SDPUtils.splitLines = function(blob) { + return blob.trim().split('\n').map(function(line) { + return line.trim(); + }); + }; + // Splits SDP into sessionpart and mediasections. Ensures CRLF. + SDPUtils.splitSections = function(blob) { + var parts = blob.split('\nm='); + return parts.map(function(part, index) { + return (index > 0 ? 'm=' + part : part).trim() + '\r\n'; + }); + }; + + // returns the session description. + SDPUtils.getDescription = function(blob) { + var sections = SDPUtils.splitSections(blob); + return sections && sections[0]; + }; + + // returns the individual media sections. + SDPUtils.getMediaSections = function(blob) { + var sections = SDPUtils.splitSections(blob); + sections.shift(); + return sections; + }; + + // Returns lines that start with a certain prefix. + SDPUtils.matchPrefix = function(blob, prefix) { + return SDPUtils.splitLines(blob).filter(function(line) { + return line.indexOf(prefix) === 0; + }); + }; + + // Parses an ICE candidate line. Sample input: + // candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8 + // rport 55996" + SDPUtils.parseCandidate = function(line) { + var parts; + // Parse both variants. + if (line.indexOf('a=candidate:') === 0) { + parts = line.substring(12).split(' '); + } else { + parts = line.substring(10).split(' '); + } + + var candidate = { + foundation: parts[0], + component: parseInt(parts[1], 10), + protocol: parts[2].toLowerCase(), + priority: parseInt(parts[3], 10), + ip: parts[4], + address: parts[4], // address is an alias for ip. + port: parseInt(parts[5], 10), + // skip parts[6] == 'typ' + type: parts[7] + }; + + for (var i = 8; i < parts.length; i += 2) { + switch (parts[i]) { + case 'raddr': + candidate.relatedAddress = parts[i + 1]; + break; + case 'rport': + candidate.relatedPort = parseInt(parts[i + 1], 10); + break; + case 'tcptype': + candidate.tcpType = parts[i + 1]; + break; + case 'ufrag': + candidate.ufrag = parts[i + 1]; // for backward compability. + candidate.usernameFragment = parts[i + 1]; + break; + default: // extension handling, in particular ufrag + candidate[parts[i]] = parts[i + 1]; + break; + } + } + return candidate; + }; + + // Translates a candidate object into SDP candidate attribute. + SDPUtils.writeCandidate = function(candidate) { + var sdp = []; + sdp.push(candidate.foundation); + sdp.push(candidate.component); + sdp.push(candidate.protocol.toUpperCase()); + sdp.push(candidate.priority); + sdp.push(candidate.address || candidate.ip); + sdp.push(candidate.port); + + var type = candidate.type; + sdp.push('typ'); + sdp.push(type); + if (type !== 'host' && candidate.relatedAddress && + candidate.relatedPort) { + sdp.push('raddr'); + sdp.push(candidate.relatedAddress); + sdp.push('rport'); + sdp.push(candidate.relatedPort); + } + if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') { + sdp.push('tcptype'); + sdp.push(candidate.tcpType); + } + if (candidate.usernameFragment || candidate.ufrag) { + sdp.push('ufrag'); + sdp.push(candidate.usernameFragment || candidate.ufrag); + } + return 'candidate:' + sdp.join(' '); + }; + + // Parses an ice-options line, returns an array of option tags. + // a=ice-options:foo bar + SDPUtils.parseIceOptions = function(line) { + return line.substr(14).split(' '); + }; + + // Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input: + // a=rtpmap:111 opus/48000/2 + SDPUtils.parseRtpMap = function(line) { + var parts = line.substr(9).split(' '); + var parsed = { + payloadType: parseInt(parts.shift(), 10) // was: id + }; + + parts = parts[0].split('/'); + + parsed.name = parts[0]; + parsed.clockRate = parseInt(parts[1], 10); // was: clockrate + parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1; + // legacy alias, got renamed back to channels in ORTC. + parsed.numChannels = parsed.channels; + return parsed; + }; + + // Generate an a=rtpmap line from RTCRtpCodecCapability or + // RTCRtpCodecParameters. + SDPUtils.writeRtpMap = function(codec) { + var pt = codec.payloadType; + if (codec.preferredPayloadType !== undefined) { + pt = codec.preferredPayloadType; + } + var channels = codec.channels || codec.numChannels || 1; + return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate + + (channels !== 1 ? '/' + channels : '') + '\r\n'; + }; + + // Parses an a=extmap line (headerextension from RFC 5285). Sample input: + // a=extmap:2 urn:ietf:params:rtp-hdrext:toffset + // a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset + SDPUtils.parseExtmap = function(line) { + var parts = line.substr(9).split(' '); + return { + id: parseInt(parts[0], 10), + direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv', + uri: parts[1] + }; + }; + + // Generates a=extmap line from RTCRtpHeaderExtensionParameters or + // RTCRtpHeaderExtension. + SDPUtils.writeExtmap = function(headerExtension) { + return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) + + (headerExtension.direction && headerExtension.direction !== 'sendrecv' + ? '/' + headerExtension.direction + : '') + + ' ' + headerExtension.uri + '\r\n'; + }; + + // Parses an ftmp line, returns dictionary. Sample input: + // a=fmtp:96 vbr=on;cng=on + // Also deals with vbr=on; cng=on + SDPUtils.parseFmtp = function(line) { + var parsed = {}; + var kv; + var parts = line.substr(line.indexOf(' ') + 1).split(';'); + for (var j = 0; j < parts.length; j++) { + kv = parts[j].trim().split('='); + parsed[kv[0].trim()] = kv[1]; + } + return parsed; + }; + + // Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters. + SDPUtils.writeFmtp = function(codec) { + var line = ''; + var pt = codec.payloadType; + if (codec.preferredPayloadType !== undefined) { + pt = codec.preferredPayloadType; + } + if (codec.parameters && Object.keys(codec.parameters).length) { + var params = []; + Object.keys(codec.parameters).forEach(function(param) { + if (codec.parameters[param]) { + params.push(param + '=' + codec.parameters[param]); + } else { + params.push(param); + } + }); + line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\r\n'; + } + return line; + }; + + // Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input: + // a=rtcp-fb:98 nack rpsi + SDPUtils.parseRtcpFb = function(line) { + var parts = line.substr(line.indexOf(' ') + 1).split(' '); + return { + type: parts.shift(), + parameter: parts.join(' ') + }; + }; + // Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters. + SDPUtils.writeRtcpFb = function(codec) { + var lines = ''; + var pt = codec.payloadType; + if (codec.preferredPayloadType !== undefined) { + pt = codec.preferredPayloadType; + } + if (codec.rtcpFeedback && codec.rtcpFeedback.length) { + // FIXME: special handling for trr-int? + codec.rtcpFeedback.forEach(function(fb) { + lines += 'a=rtcp-fb:' + pt + ' ' + fb.type + + (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') + + '\r\n'; + }); + } + return lines; + }; + + // Parses an RFC 5576 ssrc media attribute. Sample input: + // a=ssrc:3735928559 cname:something + SDPUtils.parseSsrcMedia = function(line) { + var sp = line.indexOf(' '); + var parts = { + ssrc: parseInt(line.substr(7, sp - 7), 10) + }; + var colon = line.indexOf(':', sp); + if (colon > -1) { + parts.attribute = line.substr(sp + 1, colon - sp - 1); + parts.value = line.substr(colon + 1); + } else { + parts.attribute = line.substr(sp + 1); + } + return parts; + }; + + SDPUtils.parseSsrcGroup = function(line) { + var parts = line.substr(13).split(' '); + return { + semantics: parts.shift(), + ssrcs: parts.map(function(ssrc) { + return parseInt(ssrc, 10); + }) + }; + }; + + // Extracts the MID (RFC 5888) from a media section. + // returns the MID or undefined if no mid line was found. + SDPUtils.getMid = function(mediaSection) { + var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0]; + if (mid) { + return mid.substr(6); + } + }; + + SDPUtils.parseFingerprint = function(line) { + var parts = line.substr(14).split(' '); + return { + algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge. + value: parts[1] + }; + }; + + // Extracts DTLS parameters from SDP media section or sessionpart. + // FIXME: for consistency with other functions this should only + // get the fingerprint line as input. See also getIceParameters. + SDPUtils.getDtlsParameters = function(mediaSection, sessionpart) { + var lines = SDPUtils.matchPrefix(mediaSection + sessionpart, + 'a=fingerprint:'); + // Note: a=setup line is ignored since we use the 'auto' role. + // Note2: 'algorithm' is not case sensitive except in Edge. + return { + role: 'auto', + fingerprints: lines.map(SDPUtils.parseFingerprint) + }; + }; + + // Serializes DTLS parameters to SDP. + SDPUtils.writeDtlsParameters = function(params, setupType) { + var sdp = 'a=setup:' + setupType + '\r\n'; + params.fingerprints.forEach(function(fp) { + sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\r\n'; + }); + return sdp; + }; + + // Parses a=crypto lines into + // https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members + SDPUtils.parseCryptoLine = function(line) { + var parts = line.substr(9).split(' '); + return { + tag: parseInt(parts[0], 10), + cryptoSuite: parts[1], + keyParams: parts[2], + sessionParams: parts.slice(3), + }; + }; + + SDPUtils.writeCryptoLine = function(parameters) { + return 'a=crypto:' + parameters.tag + ' ' + + parameters.cryptoSuite + ' ' + + (typeof parameters.keyParams === 'object' + ? SDPUtils.writeCryptoKeyParams(parameters.keyParams) + : parameters.keyParams) + + (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') + + '\r\n'; + }; + + // Parses the crypto key parameters into + // https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam* + SDPUtils.parseCryptoKeyParams = function(keyParams) { + if (keyParams.indexOf('inline:') !== 0) { + return null; + } + var parts = keyParams.substr(7).split('|'); + return { + keyMethod: 'inline', + keySalt: parts[0], + lifeTime: parts[1], + mkiValue: parts[2] ? parts[2].split(':')[0] : undefined, + mkiLength: parts[2] ? parts[2].split(':')[1] : undefined, + }; + }; + + SDPUtils.writeCryptoKeyParams = function(keyParams) { + return keyParams.keyMethod + ':' + + keyParams.keySalt + + (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') + + (keyParams.mkiValue && keyParams.mkiLength + ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength + : ''); + }; + + // Extracts all SDES paramters. + SDPUtils.getCryptoParameters = function(mediaSection, sessionpart) { + var lines = SDPUtils.matchPrefix(mediaSection + sessionpart, + 'a=crypto:'); + return lines.map(SDPUtils.parseCryptoLine); + }; + + // Parses ICE information from SDP media section or sessionpart. + // FIXME: for consistency with other functions this should only + // get the ice-ufrag and ice-pwd lines as input. + SDPUtils.getIceParameters = function(mediaSection, sessionpart) { + var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart, + 'a=ice-ufrag:')[0]; + var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart, + 'a=ice-pwd:')[0]; + if (!(ufrag && pwd)) { + return null; + } + return { + usernameFragment: ufrag.substr(12), + password: pwd.substr(10), + }; + }; + + // Serializes ICE parameters to SDP. + SDPUtils.writeIceParameters = function(params) { + return 'a=ice-ufrag:' + params.usernameFragment + '\r\n' + + 'a=ice-pwd:' + params.password + '\r\n'; + }; + + // Parses the SDP media section and returns RTCRtpParameters. + SDPUtils.parseRtpParameters = function(mediaSection) { + var description = { + codecs: [], + headerExtensions: [], + fecMechanisms: [], + rtcp: [] + }; + var lines = SDPUtils.splitLines(mediaSection); + var mline = lines[0].split(' '); + for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..] + var pt = mline[i]; + var rtpmapline = SDPUtils.matchPrefix( + mediaSection, 'a=rtpmap:' + pt + ' ')[0]; + if (rtpmapline) { + var codec = SDPUtils.parseRtpMap(rtpmapline); + var fmtps = SDPUtils.matchPrefix( + mediaSection, 'a=fmtp:' + pt + ' '); + // Only the first a=fmtp: is considered. + codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {}; + codec.rtcpFeedback = SDPUtils.matchPrefix( + mediaSection, 'a=rtcp-fb:' + pt + ' ') + .map(SDPUtils.parseRtcpFb); + description.codecs.push(codec); + // parse FEC mechanisms from rtpmap lines. + switch (codec.name.toUpperCase()) { + case 'RED': + case 'ULPFEC': + description.fecMechanisms.push(codec.name.toUpperCase()); + break; + } + } + } + SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) { + description.headerExtensions.push(SDPUtils.parseExtmap(line)); + }); + // FIXME: parse rtcp. + return description; + }; + + // Generates parts of the SDP media section describing the capabilities / + // parameters. + SDPUtils.writeRtpDescription = function(kind, caps) { + var sdp = ''; + + // Build the mline. + sdp += 'm=' + kind + ' '; + sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs. + sdp += ' UDP/TLS/RTP/SAVPF '; + sdp += caps.codecs.map(function(codec) { + if (codec.preferredPayloadType !== undefined) { + return codec.preferredPayloadType; + } + return codec.payloadType; + }).join(' ') + '\r\n'; + + sdp += 'c=IN IP4 0.0.0.0\r\n'; + sdp += 'a=rtcp:9 IN IP4 0.0.0.0\r\n'; + + // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb. + caps.codecs.forEach(function(codec) { + sdp += SDPUtils.writeRtpMap(codec); + sdp += SDPUtils.writeFmtp(codec); + sdp += SDPUtils.writeRtcpFb(codec); + }); + var maxptime = 0; + caps.codecs.forEach(function(codec) { + if (codec.maxptime > maxptime) { + maxptime = codec.maxptime; + } + }); + if (maxptime > 0) { + sdp += 'a=maxptime:' + maxptime + '\r\n'; + } + sdp += 'a=rtcp-mux\r\n'; + + if (caps.headerExtensions) { + caps.headerExtensions.forEach(function(extension) { + sdp += SDPUtils.writeExtmap(extension); + }); + } + // FIXME: write fecMechanisms. + return sdp; + }; + + // Parses the SDP media section and returns an array of + // RTCRtpEncodingParameters. + SDPUtils.parseRtpEncodingParameters = function(mediaSection) { + var encodingParameters = []; + var description = SDPUtils.parseRtpParameters(mediaSection); + var hasRed = description.fecMechanisms.indexOf('RED') !== -1; + var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1; + + // filter a=ssrc:... cname:, ignore PlanB-msid + var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') + .map(function(line) { + return SDPUtils.parseSsrcMedia(line); + }) + .filter(function(parts) { + return parts.attribute === 'cname'; + }); + var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc; + var secondarySsrc; + + var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID') + .map(function(line) { + var parts = line.substr(17).split(' '); + return parts.map(function(part) { + return parseInt(part, 10); + }); + }); + if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) { + secondarySsrc = flows[0][1]; + } + + description.codecs.forEach(function(codec) { + if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) { + var encParam = { + ssrc: primarySsrc, + codecPayloadType: parseInt(codec.parameters.apt, 10) + }; + if (primarySsrc && secondarySsrc) { + encParam.rtx = {ssrc: secondarySsrc}; + } + encodingParameters.push(encParam); + if (hasRed) { + encParam = JSON.parse(JSON.stringify(encParam)); + encParam.fec = { + ssrc: primarySsrc, + mechanism: hasUlpfec ? 'red+ulpfec' : 'red' + }; + encodingParameters.push(encParam); + } + } + }); + if (encodingParameters.length === 0 && primarySsrc) { + encodingParameters.push({ + ssrc: primarySsrc + }); + } + + // we support both b=AS and b=TIAS but interpret AS as TIAS. + var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b='); + if (bandwidth.length) { + if (bandwidth[0].indexOf('b=TIAS:') === 0) { + bandwidth = parseInt(bandwidth[0].substr(7), 10); + } else if (bandwidth[0].indexOf('b=AS:') === 0) { + // use formula from JSEP to convert b=AS to TIAS value. + bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95 + - (50 * 40 * 8); + } else { + bandwidth = undefined; + } + encodingParameters.forEach(function(params) { + params.maxBitrate = bandwidth; + }); + } + return encodingParameters; + }; + + // parses http://draft.ortc.org/#rtcrtcpparameters* + SDPUtils.parseRtcpParameters = function(mediaSection) { + var rtcpParameters = {}; + + // Gets the first SSRC. Note tha with RTX there might be multiple + // SSRCs. + var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') + .map(function(line) { + return SDPUtils.parseSsrcMedia(line); + }) + .filter(function(obj) { + return obj.attribute === 'cname'; + })[0]; + if (remoteSsrc) { + rtcpParameters.cname = remoteSsrc.value; + rtcpParameters.ssrc = remoteSsrc.ssrc; + } + + // Edge uses the compound attribute instead of reducedSize + // compound is !reducedSize + var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize'); + rtcpParameters.reducedSize = rsize.length > 0; + rtcpParameters.compound = rsize.length === 0; + + // parses the rtcp-mux attrіbute. + // Note that Edge does not support unmuxed RTCP. + var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux'); + rtcpParameters.mux = mux.length > 0; + + return rtcpParameters; + }; + + // parses either a=msid: or a=ssrc:... msid lines and returns + // the id of the MediaStream and MediaStreamTrack. + SDPUtils.parseMsid = function(mediaSection) { + var parts; + var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:'); + if (spec.length === 1) { + parts = spec[0].substr(7).split(' '); + return {stream: parts[0], track: parts[1]}; + } + var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:') + .map(function(line) { + return SDPUtils.parseSsrcMedia(line); + }) + .filter(function(msidParts) { + return msidParts.attribute === 'msid'; + }); + if (planB.length > 0) { + parts = planB[0].value.split(' '); + return {stream: parts[0], track: parts[1]}; + } + }; + + // SCTP + // parses draft-ietf-mmusic-sctp-sdp-26 first and falls back + // to draft-ietf-mmusic-sctp-sdp-05 + SDPUtils.parseSctpDescription = function(mediaSection) { + var mline = SDPUtils.parseMLine(mediaSection); + var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:'); + var maxMessageSize; + if (maxSizeLine.length > 0) { + maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10); + } + if (isNaN(maxMessageSize)) { + maxMessageSize = 65536; + } + var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:'); + if (sctpPort.length > 0) { + return { + port: parseInt(sctpPort[0].substr(12), 10), + protocol: mline.fmt, + maxMessageSize: maxMessageSize + }; + } + var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:'); + if (sctpMapLines.length > 0) { + var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0] + .substr(10) + .split(' '); + return { + port: parseInt(parts[0], 10), + protocol: parts[1], + maxMessageSize: maxMessageSize + }; + } + }; + + // SCTP + // outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers + // support by now receiving in this format, unless we originally parsed + // as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line + // protocol of DTLS/SCTP -- without UDP/ or TCP/) + SDPUtils.writeSctpDescription = function(media, sctp) { + var output = []; + if (media.protocol !== 'DTLS/SCTP') { + output = [ + 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\r\n', + 'c=IN IP4 0.0.0.0\r\n', + 'a=sctp-port:' + sctp.port + '\r\n' + ]; + } else { + output = [ + 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\r\n', + 'c=IN IP4 0.0.0.0\r\n', + 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\r\n' + ]; + } + if (sctp.maxMessageSize !== undefined) { + output.push('a=max-message-size:' + sctp.maxMessageSize + '\r\n'); + } + return output.join(''); + }; + + // Generate a session ID for SDP. + // https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1 + // recommends using a cryptographically random +ve 64-bit value + // but right now this should be acceptable and within the right range + SDPUtils.generateSessionId = function() { + return Math.random().toString().substr(2, 21); + }; + + // Write boilder plate for start of SDP + // sessId argument is optional - if not supplied it will + // be generated randomly + // sessVersion is optional and defaults to 2 + // sessUser is optional and defaults to 'thisisadapterortc' + SDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) { + var sessionId; + var version = sessVer !== undefined ? sessVer : 2; + if (sessId) { + sessionId = sessId; + } else { + sessionId = SDPUtils.generateSessionId(); + } + var user = sessUser || 'thisisadapterortc'; + // FIXME: sess-id should be an NTP timestamp. + return 'v=0\r\n' + + 'o=' + user + ' ' + sessionId + ' ' + version + + ' IN IP4 127.0.0.1\r\n' + + 's=-\r\n' + + 't=0 0\r\n'; + }; + + SDPUtils.writeMediaSection = function(transceiver, caps, type, stream) { + var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps); + + // Map ICE parameters (ufrag, pwd) to SDP. + sdp += SDPUtils.writeIceParameters( + transceiver.iceGatherer.getLocalParameters()); + + // Map DTLS parameters to SDP. + sdp += SDPUtils.writeDtlsParameters( + transceiver.dtlsTransport.getLocalParameters(), + type === 'offer' ? 'actpass' : 'active'); + + sdp += 'a=mid:' + transceiver.mid + '\r\n'; + + if (transceiver.direction) { + sdp += 'a=' + transceiver.direction + '\r\n'; + } else if (transceiver.rtpSender && transceiver.rtpReceiver) { + sdp += 'a=sendrecv\r\n'; + } else if (transceiver.rtpSender) { + sdp += 'a=sendonly\r\n'; + } else if (transceiver.rtpReceiver) { + sdp += 'a=recvonly\r\n'; + } else { + sdp += 'a=inactive\r\n'; + } + + if (transceiver.rtpSender) { + // spec. + var msid = 'msid:' + stream.id + ' ' + + transceiver.rtpSender.track.id + '\r\n'; + sdp += 'a=' + msid; + + // for Chrome. + sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + + ' ' + msid; + if (transceiver.sendEncodingParameters[0].rtx) { + sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + + ' ' + msid; + sdp += 'a=ssrc-group:FID ' + + transceiver.sendEncodingParameters[0].ssrc + ' ' + + transceiver.sendEncodingParameters[0].rtx.ssrc + + '\r\n'; + } + } + // FIXME: this should be written by writeRtpDescription. + sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + + ' cname:' + SDPUtils.localCName + '\r\n'; + if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) { + sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + + ' cname:' + SDPUtils.localCName + '\r\n'; + } + return sdp; + }; + + // Gets the direction from the mediaSection or the sessionpart. + SDPUtils.getDirection = function(mediaSection, sessionpart) { + // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv. + var lines = SDPUtils.splitLines(mediaSection); + for (var i = 0; i < lines.length; i++) { + switch (lines[i]) { + case 'a=sendrecv': + case 'a=sendonly': + case 'a=recvonly': + case 'a=inactive': + return lines[i].substr(2); + // FIXME: What should happen here? + } + } + if (sessionpart) { + return SDPUtils.getDirection(sessionpart); + } + return 'sendrecv'; + }; + + SDPUtils.getKind = function(mediaSection) { + var lines = SDPUtils.splitLines(mediaSection); + var mline = lines[0].split(' '); + return mline[0].substr(2); + }; + + SDPUtils.isRejected = function(mediaSection) { + return mediaSection.split(' ', 2)[1] === '0'; + }; + + SDPUtils.parseMLine = function(mediaSection) { + var lines = SDPUtils.splitLines(mediaSection); + var parts = lines[0].substr(2).split(' '); + return { + kind: parts[0], + port: parseInt(parts[1], 10), + protocol: parts[2], + fmt: parts.slice(3).join(' ') + }; + }; + + SDPUtils.parseOLine = function(mediaSection) { + var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0]; + var parts = line.substr(2).split(' '); + return { + username: parts[0], + sessionId: parts[1], + sessionVersion: parseInt(parts[2], 10), + netType: parts[3], + addressType: parts[4], + address: parts[5] + }; + }; + + // a very naive interpretation of a valid SDP. + SDPUtils.isValidSDP = function(blob) { + if (typeof blob !== 'string' || blob.length === 0) { + return false; + } + var lines = SDPUtils.splitLines(blob); + for (var i = 0; i < lines.length; i++) { + if (lines[i].length < 2 || lines[i].charAt(1) !== '=') { + return false; + } + // TODO: check the modifier a bit more. + } + return true; + }; + + // Expose public methods. + { + module.exports = SDPUtils; + } + }); + + /* + * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + + + function fixStatsType(stat) { + return { + inboundrtp: 'inbound-rtp', + outboundrtp: 'outbound-rtp', + candidatepair: 'candidate-pair', + localcandidate: 'local-candidate', + remotecandidate: 'remote-candidate' + }[stat.type] || stat.type; + } + + function writeMediaSection(transceiver, caps, type, stream, dtlsRole) { + var sdp$1 = sdp.writeRtpDescription(transceiver.kind, caps); + + // Map ICE parameters (ufrag, pwd) to SDP. + sdp$1 += sdp.writeIceParameters( + transceiver.iceGatherer.getLocalParameters()); + + // Map DTLS parameters to SDP. + sdp$1 += sdp.writeDtlsParameters( + transceiver.dtlsTransport.getLocalParameters(), + type === 'offer' ? 'actpass' : dtlsRole || 'active'); + + sdp$1 += 'a=mid:' + transceiver.mid + '\r\n'; + + if (transceiver.rtpSender && transceiver.rtpReceiver) { + sdp$1 += 'a=sendrecv\r\n'; + } else if (transceiver.rtpSender) { + sdp$1 += 'a=sendonly\r\n'; + } else if (transceiver.rtpReceiver) { + sdp$1 += 'a=recvonly\r\n'; + } else { + sdp$1 += 'a=inactive\r\n'; + } + + if (transceiver.rtpSender) { + var trackId = transceiver.rtpSender._initialTrackId || + transceiver.rtpSender.track.id; + transceiver.rtpSender._initialTrackId = trackId; + // spec. + var msid = 'msid:' + (stream ? stream.id : '-') + ' ' + + trackId + '\r\n'; + sdp$1 += 'a=' + msid; + // for Chrome. Legacy should no longer be required. + sdp$1 += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + + ' ' + msid; + + // RTX + if (transceiver.sendEncodingParameters[0].rtx) { + sdp$1 += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + + ' ' + msid; + sdp$1 += 'a=ssrc-group:FID ' + + transceiver.sendEncodingParameters[0].ssrc + ' ' + + transceiver.sendEncodingParameters[0].rtx.ssrc + + '\r\n'; + } + } + // FIXME: this should be written by writeRtpDescription. + sdp$1 += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + + ' cname:' + sdp.localCName + '\r\n'; + if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) { + sdp$1 += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + + ' cname:' + sdp.localCName + '\r\n'; + } + return sdp$1; + } + + // Edge does not like + // 1) stun: filtered after 14393 unless ?transport=udp is present + // 2) turn: that does not have all of turn:host:port?transport=udp + // 3) turn: with ipv6 addresses + // 4) turn: occurring muliple times + function filterIceServers(iceServers, edgeVersion) { + var hasTurn = false; + iceServers = JSON.parse(JSON.stringify(iceServers)); + return iceServers.filter(function(server) { + if (server && (server.urls || server.url)) { + var urls = server.urls || server.url; + if (server.url && !server.urls) { + console.warn('RTCIceServer.url is deprecated! Use urls instead.'); + } + var isString = typeof urls === 'string'; + if (isString) { + urls = [urls]; + } + urls = urls.filter(function(url) { + var validTurn = url.indexOf('turn:') === 0 && + url.indexOf('transport=udp') !== -1 && + url.indexOf('turn:[') === -1 && + !hasTurn; + + if (validTurn) { + hasTurn = true; + return true; + } + return url.indexOf('stun:') === 0 && edgeVersion >= 14393 && + url.indexOf('?transport=udp') === -1; + }); + + delete server.url; + server.urls = isString ? urls[0] : urls; + return !!urls.length; + } + }); + } + + // Determines the intersection of local and remote capabilities. + function getCommonCapabilities(localCapabilities, remoteCapabilities) { + var commonCapabilities = { + codecs: [], + headerExtensions: [], + fecMechanisms: [] + }; + + var findCodecByPayloadType = function(pt, codecs) { + pt = parseInt(pt, 10); + for (var i = 0; i < codecs.length; i++) { + if (codecs[i].payloadType === pt || + codecs[i].preferredPayloadType === pt) { + return codecs[i]; + } + } + }; + + var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) { + var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs); + var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs); + return lCodec && rCodec && + lCodec.name.toLowerCase() === rCodec.name.toLowerCase(); + }; + + localCapabilities.codecs.forEach(function(lCodec) { + for (var i = 0; i < remoteCapabilities.codecs.length; i++) { + var rCodec = remoteCapabilities.codecs[i]; + if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() && + lCodec.clockRate === rCodec.clockRate) { + if (lCodec.name.toLowerCase() === 'rtx' && + lCodec.parameters && rCodec.parameters.apt) { + // for RTX we need to find the local rtx that has a apt + // which points to the same local codec as the remote one. + if (!rtxCapabilityMatches(lCodec, rCodec, + localCapabilities.codecs, remoteCapabilities.codecs)) { + continue; + } + } + rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy + // number of channels is the highest common number of channels + rCodec.numChannels = Math.min(lCodec.numChannels, + rCodec.numChannels); + // push rCodec so we reply with offerer payload type + commonCapabilities.codecs.push(rCodec); + + // determine common feedback mechanisms + rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) { + for (var j = 0; j < lCodec.rtcpFeedback.length; j++) { + if (lCodec.rtcpFeedback[j].type === fb.type && + lCodec.rtcpFeedback[j].parameter === fb.parameter) { + return true; + } + } + return false; + }); + // FIXME: also need to determine .parameters + // see https://github.com/openpeer/ortc/issues/569 + break; + } + } + }); + + localCapabilities.headerExtensions.forEach(function(lHeaderExtension) { + for (var i = 0; i < remoteCapabilities.headerExtensions.length; + i++) { + var rHeaderExtension = remoteCapabilities.headerExtensions[i]; + if (lHeaderExtension.uri === rHeaderExtension.uri) { + commonCapabilities.headerExtensions.push(rHeaderExtension); + break; + } + } + }); + + // FIXME: fecMechanisms + return commonCapabilities; + } + + // is action=setLocalDescription with type allowed in signalingState + function isActionAllowedInSignalingState(action, type, signalingState) { + return { + offer: { + setLocalDescription: ['stable', 'have-local-offer'], + setRemoteDescription: ['stable', 'have-remote-offer'] + }, + answer: { + setLocalDescription: ['have-remote-offer', 'have-local-pranswer'], + setRemoteDescription: ['have-local-offer', 'have-remote-pranswer'] + } + }[type][action].indexOf(signalingState) !== -1; + } + + function maybeAddCandidate(iceTransport, candidate) { + // Edge's internal representation adds some fields therefore + // not all fieldѕ are taken into account. + var alreadyAdded = iceTransport.getRemoteCandidates() + .find(function(remoteCandidate) { + return candidate.foundation === remoteCandidate.foundation && + candidate.ip === remoteCandidate.ip && + candidate.port === remoteCandidate.port && + candidate.priority === remoteCandidate.priority && + candidate.protocol === remoteCandidate.protocol && + candidate.type === remoteCandidate.type; + }); + if (!alreadyAdded) { + iceTransport.addRemoteCandidate(candidate); + } + return !alreadyAdded; + } + + + function makeError(name, description) { + var e = new Error(description); + e.name = name; + // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names + e.code = { + NotSupportedError: 9, + InvalidStateError: 11, + InvalidAccessError: 15, + TypeError: undefined, + OperationError: undefined + }[name]; + return e; + } + + var rtcpeerconnection = function(window, edgeVersion) { + // https://w3c.github.io/mediacapture-main/#mediastream + // Helper function to add the track to the stream and + // dispatch the event ourselves. + function addTrackToStreamAndFireEvent(track, stream) { + stream.addTrack(track); + stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack', + {track: track})); + } + + function removeTrackFromStreamAndFireEvent(track, stream) { + stream.removeTrack(track); + stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack', + {track: track})); + } + + function fireAddTrack(pc, track, receiver, streams) { + var trackEvent = new Event('track'); + trackEvent.track = track; + trackEvent.receiver = receiver; + trackEvent.transceiver = {receiver: receiver}; + trackEvent.streams = streams; + window.setTimeout(function() { + pc._dispatchEvent('track', trackEvent); + }); + } + + var RTCPeerConnection = function(config) { + var pc = this; + + var _eventTarget = document.createDocumentFragment(); + ['addEventListener', 'removeEventListener', 'dispatchEvent'] + .forEach(function(method) { + pc[method] = _eventTarget[method].bind(_eventTarget); + }); + + this.canTrickleIceCandidates = null; + + this.needNegotiation = false; + + this.localStreams = []; + this.remoteStreams = []; + + this._localDescription = null; + this._remoteDescription = null; + + this.signalingState = 'stable'; + this.iceConnectionState = 'new'; + this.connectionState = 'new'; + this.iceGatheringState = 'new'; + + config = JSON.parse(JSON.stringify(config || {})); + + this.usingBundle = config.bundlePolicy === 'max-bundle'; + if (config.rtcpMuxPolicy === 'negotiate') { + throw(makeError('NotSupportedError', + 'rtcpMuxPolicy \'negotiate\' is not supported')); + } else if (!config.rtcpMuxPolicy) { + config.rtcpMuxPolicy = 'require'; + } + + switch (config.iceTransportPolicy) { + case 'all': + case 'relay': + break; + default: + config.iceTransportPolicy = 'all'; + break; + } + + switch (config.bundlePolicy) { + case 'balanced': + case 'max-compat': + case 'max-bundle': + break; + default: + config.bundlePolicy = 'balanced'; + break; + } + + config.iceServers = filterIceServers(config.iceServers || [], edgeVersion); + + this._iceGatherers = []; + if (config.iceCandidatePoolSize) { + for (var i = config.iceCandidatePoolSize; i > 0; i--) { + this._iceGatherers.push(new window.RTCIceGatherer({ + iceServers: config.iceServers, + gatherPolicy: config.iceTransportPolicy + })); + } + } else { + config.iceCandidatePoolSize = 0; + } + + this._config = config; + + // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ... + // everything that is needed to describe a SDP m-line. + this.transceivers = []; + + this._sdpSessionId = sdp.generateSessionId(); + this._sdpSessionVersion = 0; + + this._dtlsRole = undefined; // role for a=setup to use in answers. + + this._isClosed = false; + }; + + Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', { + configurable: true, + get: function() { + return this._localDescription; + } + }); + Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', { + configurable: true, + get: function() { + return this._remoteDescription; + } + }); + + // set up event handlers on prototype + RTCPeerConnection.prototype.onicecandidate = null; + RTCPeerConnection.prototype.onaddstream = null; + RTCPeerConnection.prototype.ontrack = null; + RTCPeerConnection.prototype.onremovestream = null; + RTCPeerConnection.prototype.onsignalingstatechange = null; + RTCPeerConnection.prototype.oniceconnectionstatechange = null; + RTCPeerConnection.prototype.onconnectionstatechange = null; + RTCPeerConnection.prototype.onicegatheringstatechange = null; + RTCPeerConnection.prototype.onnegotiationneeded = null; + RTCPeerConnection.prototype.ondatachannel = null; + + RTCPeerConnection.prototype._dispatchEvent = function(name, event) { + if (this._isClosed) { + return; + } + this.dispatchEvent(event); + if (typeof this['on' + name] === 'function') { + this['on' + name](event); + } + }; + + RTCPeerConnection.prototype._emitGatheringStateChange = function() { + var event = new Event('icegatheringstatechange'); + this._dispatchEvent('icegatheringstatechange', event); + }; + + RTCPeerConnection.prototype.getConfiguration = function() { + return this._config; + }; + + RTCPeerConnection.prototype.getLocalStreams = function() { + return this.localStreams; + }; + + RTCPeerConnection.prototype.getRemoteStreams = function() { + return this.remoteStreams; + }; + + // internal helper to create a transceiver object. + // (which is not yet the same as the WebRTC 1.0 transceiver) + RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) { + var hasBundleTransport = this.transceivers.length > 0; + var transceiver = { + track: null, + iceGatherer: null, + iceTransport: null, + dtlsTransport: null, + localCapabilities: null, + remoteCapabilities: null, + rtpSender: null, + rtpReceiver: null, + kind: kind, + mid: null, + sendEncodingParameters: null, + recvEncodingParameters: null, + stream: null, + associatedRemoteMediaStreams: [], + wantReceive: true + }; + if (this.usingBundle && hasBundleTransport) { + transceiver.iceTransport = this.transceivers[0].iceTransport; + transceiver.dtlsTransport = this.transceivers[0].dtlsTransport; + } else { + var transports = this._createIceAndDtlsTransports(); + transceiver.iceTransport = transports.iceTransport; + transceiver.dtlsTransport = transports.dtlsTransport; + } + if (!doNotAdd) { + this.transceivers.push(transceiver); + } + return transceiver; + }; + + RTCPeerConnection.prototype.addTrack = function(track, stream) { + if (this._isClosed) { + throw makeError('InvalidStateError', + 'Attempted to call addTrack on a closed peerconnection.'); + } + + var alreadyExists = this.transceivers.find(function(s) { + return s.track === track; + }); + + if (alreadyExists) { + throw makeError('InvalidAccessError', 'Track already exists.'); + } + + var transceiver; + for (var i = 0; i < this.transceivers.length; i++) { + if (!this.transceivers[i].track && + this.transceivers[i].kind === track.kind) { + transceiver = this.transceivers[i]; + } + } + if (!transceiver) { + transceiver = this._createTransceiver(track.kind); + } + + this._maybeFireNegotiationNeeded(); + + if (this.localStreams.indexOf(stream) === -1) { + this.localStreams.push(stream); + } + + transceiver.track = track; + transceiver.stream = stream; + transceiver.rtpSender = new window.RTCRtpSender(track, + transceiver.dtlsTransport); + return transceiver.rtpSender; + }; + + RTCPeerConnection.prototype.addStream = function(stream) { + var pc = this; + if (edgeVersion >= 15025) { + stream.getTracks().forEach(function(track) { + pc.addTrack(track, stream); + }); + } else { + // Clone is necessary for local demos mostly, attaching directly + // to two different senders does not work (build 10547). + // Fixed in 15025 (or earlier) + var clonedStream = stream.clone(); + stream.getTracks().forEach(function(track, idx) { + var clonedTrack = clonedStream.getTracks()[idx]; + track.addEventListener('enabled', function(event) { + clonedTrack.enabled = event.enabled; + }); + }); + clonedStream.getTracks().forEach(function(track) { + pc.addTrack(track, clonedStream); + }); + } + }; + + RTCPeerConnection.prototype.removeTrack = function(sender) { + if (this._isClosed) { + throw makeError('InvalidStateError', + 'Attempted to call removeTrack on a closed peerconnection.'); + } + + if (!(sender instanceof window.RTCRtpSender)) { + throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' + + 'does not implement interface RTCRtpSender.'); + } + + var transceiver = this.transceivers.find(function(t) { + return t.rtpSender === sender; + }); + + if (!transceiver) { + throw makeError('InvalidAccessError', + 'Sender was not created by this connection.'); + } + var stream = transceiver.stream; + + transceiver.rtpSender.stop(); + transceiver.rtpSender = null; + transceiver.track = null; + transceiver.stream = null; + + // remove the stream from the set of local streams + var localStreams = this.transceivers.map(function(t) { + return t.stream; + }); + if (localStreams.indexOf(stream) === -1 && + this.localStreams.indexOf(stream) > -1) { + this.localStreams.splice(this.localStreams.indexOf(stream), 1); + } + + this._maybeFireNegotiationNeeded(); + }; + + RTCPeerConnection.prototype.removeStream = function(stream) { + var pc = this; + stream.getTracks().forEach(function(track) { + var sender = pc.getSenders().find(function(s) { + return s.track === track; + }); + if (sender) { + pc.removeTrack(sender); + } + }); + }; + + RTCPeerConnection.prototype.getSenders = function() { + return this.transceivers.filter(function(transceiver) { + return !!transceiver.rtpSender; + }) + .map(function(transceiver) { + return transceiver.rtpSender; + }); + }; + + RTCPeerConnection.prototype.getReceivers = function() { + return this.transceivers.filter(function(transceiver) { + return !!transceiver.rtpReceiver; + }) + .map(function(transceiver) { + return transceiver.rtpReceiver; + }); + }; + + + RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex, + usingBundle) { + var pc = this; + if (usingBundle && sdpMLineIndex > 0) { + return this.transceivers[0].iceGatherer; + } else if (this._iceGatherers.length) { + return this._iceGatherers.shift(); + } + var iceGatherer = new window.RTCIceGatherer({ + iceServers: this._config.iceServers, + gatherPolicy: this._config.iceTransportPolicy + }); + Object.defineProperty(iceGatherer, 'state', + {value: 'new', writable: true} + ); + + this.transceivers[sdpMLineIndex].bufferedCandidateEvents = []; + this.transceivers[sdpMLineIndex].bufferCandidates = function(event) { + var end = !event.candidate || Object.keys(event.candidate).length === 0; + // polyfill since RTCIceGatherer.state is not implemented in + // Edge 10547 yet. + iceGatherer.state = end ? 'completed' : 'gathering'; + if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) { + pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event); + } + }; + iceGatherer.addEventListener('localcandidate', + this.transceivers[sdpMLineIndex].bufferCandidates); + return iceGatherer; + }; + + // start gathering from an RTCIceGatherer. + RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) { + var pc = this; + var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer; + if (iceGatherer.onlocalcandidate) { + return; + } + var bufferedCandidateEvents = + this.transceivers[sdpMLineIndex].bufferedCandidateEvents; + this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null; + iceGatherer.removeEventListener('localcandidate', + this.transceivers[sdpMLineIndex].bufferCandidates); + iceGatherer.onlocalcandidate = function(evt) { + if (pc.usingBundle && sdpMLineIndex > 0) { + // if we know that we use bundle we can drop candidates with + // ѕdpMLineIndex > 0. If we don't do this then our state gets + // confused since we dispose the extra ice gatherer. + return; + } + var event = new Event('icecandidate'); + event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex}; + + var cand = evt.candidate; + // Edge emits an empty object for RTCIceCandidateComplete‥ + var end = !cand || Object.keys(cand).length === 0; + if (end) { + // polyfill since RTCIceGatherer.state is not implemented in + // Edge 10547 yet. + if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') { + iceGatherer.state = 'completed'; + } + } else { + if (iceGatherer.state === 'new') { + iceGatherer.state = 'gathering'; + } + // RTCIceCandidate doesn't have a component, needs to be added + cand.component = 1; + // also the usernameFragment. TODO: update SDP to take both variants. + cand.ufrag = iceGatherer.getLocalParameters().usernameFragment; + + var serializedCandidate = sdp.writeCandidate(cand); + event.candidate = Object.assign(event.candidate, + sdp.parseCandidate(serializedCandidate)); + + event.candidate.candidate = serializedCandidate; + event.candidate.toJSON = function() { + return { + candidate: event.candidate.candidate, + sdpMid: event.candidate.sdpMid, + sdpMLineIndex: event.candidate.sdpMLineIndex, + usernameFragment: event.candidate.usernameFragment + }; + }; + } + + // update local description. + var sections = sdp.getMediaSections(pc._localDescription.sdp); + if (!end) { + sections[event.candidate.sdpMLineIndex] += + 'a=' + event.candidate.candidate + '\r\n'; + } else { + sections[event.candidate.sdpMLineIndex] += + 'a=end-of-candidates\r\n'; + } + pc._localDescription.sdp = + sdp.getDescription(pc._localDescription.sdp) + + sections.join(''); + var complete = pc.transceivers.every(function(transceiver) { + return transceiver.iceGatherer && + transceiver.iceGatherer.state === 'completed'; + }); + + if (pc.iceGatheringState !== 'gathering') { + pc.iceGatheringState = 'gathering'; + pc._emitGatheringStateChange(); + } + + // Emit candidate. Also emit null candidate when all gatherers are + // complete. + if (!end) { + pc._dispatchEvent('icecandidate', event); + } + if (complete) { + pc._dispatchEvent('icecandidate', new Event('icecandidate')); + pc.iceGatheringState = 'complete'; + pc._emitGatheringStateChange(); + } + }; + + // emit already gathered candidates. + window.setTimeout(function() { + bufferedCandidateEvents.forEach(function(e) { + iceGatherer.onlocalcandidate(e); + }); + }, 0); + }; + + // Create ICE transport and DTLS transport. + RTCPeerConnection.prototype._createIceAndDtlsTransports = function() { + var pc = this; + var iceTransport = new window.RTCIceTransport(null); + iceTransport.onicestatechange = function() { + pc._updateIceConnectionState(); + pc._updateConnectionState(); + }; + + var dtlsTransport = new window.RTCDtlsTransport(iceTransport); + dtlsTransport.ondtlsstatechange = function() { + pc._updateConnectionState(); + }; + dtlsTransport.onerror = function() { + // onerror does not set state to failed by itself. + Object.defineProperty(dtlsTransport, 'state', + {value: 'failed', writable: true}); + pc._updateConnectionState(); + }; + + return { + iceTransport: iceTransport, + dtlsTransport: dtlsTransport + }; + }; + + // Destroy ICE gatherer, ICE transport and DTLS transport. + // Without triggering the callbacks. + RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function( + sdpMLineIndex) { + var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer; + if (iceGatherer) { + delete iceGatherer.onlocalcandidate; + delete this.transceivers[sdpMLineIndex].iceGatherer; + } + var iceTransport = this.transceivers[sdpMLineIndex].iceTransport; + if (iceTransport) { + delete iceTransport.onicestatechange; + delete this.transceivers[sdpMLineIndex].iceTransport; + } + var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport; + if (dtlsTransport) { + delete dtlsTransport.ondtlsstatechange; + delete dtlsTransport.onerror; + delete this.transceivers[sdpMLineIndex].dtlsTransport; + } + }; + + // Start the RTP Sender and Receiver for a transceiver. + RTCPeerConnection.prototype._transceive = function(transceiver, + send, recv) { + var params = getCommonCapabilities(transceiver.localCapabilities, + transceiver.remoteCapabilities); + if (send && transceiver.rtpSender) { + params.encodings = transceiver.sendEncodingParameters; + params.rtcp = { + cname: sdp.localCName, + compound: transceiver.rtcpParameters.compound + }; + if (transceiver.recvEncodingParameters.length) { + params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc; + } + transceiver.rtpSender.send(params); + } + if (recv && transceiver.rtpReceiver && params.codecs.length > 0) { + // remove RTX field in Edge 14942 + if (transceiver.kind === 'video' + && transceiver.recvEncodingParameters + && edgeVersion < 15019) { + transceiver.recvEncodingParameters.forEach(function(p) { + delete p.rtx; + }); + } + if (transceiver.recvEncodingParameters.length) { + params.encodings = transceiver.recvEncodingParameters; + } else { + params.encodings = [{}]; + } + params.rtcp = { + compound: transceiver.rtcpParameters.compound + }; + if (transceiver.rtcpParameters.cname) { + params.rtcp.cname = transceiver.rtcpParameters.cname; + } + if (transceiver.sendEncodingParameters.length) { + params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc; + } + transceiver.rtpReceiver.receive(params); + } + }; + + RTCPeerConnection.prototype.setLocalDescription = function(description) { + var pc = this; + + // Note: pranswer is not supported. + if (['offer', 'answer'].indexOf(description.type) === -1) { + return Promise.reject(makeError('TypeError', + 'Unsupported type "' + description.type + '"')); + } + + if (!isActionAllowedInSignalingState('setLocalDescription', + description.type, pc.signalingState) || pc._isClosed) { + return Promise.reject(makeError('InvalidStateError', + 'Can not set local ' + description.type + + ' in state ' + pc.signalingState)); + } + + var sections; + var sessionpart; + if (description.type === 'offer') { + // VERY limited support for SDP munging. Limited to: + // * changing the order of codecs + sections = sdp.splitSections(description.sdp); + sessionpart = sections.shift(); + sections.forEach(function(mediaSection, sdpMLineIndex) { + var caps = sdp.parseRtpParameters(mediaSection); + pc.transceivers[sdpMLineIndex].localCapabilities = caps; + }); + + pc.transceivers.forEach(function(transceiver, sdpMLineIndex) { + pc._gather(transceiver.mid, sdpMLineIndex); + }); + } else if (description.type === 'answer') { + sections = sdp.splitSections(pc._remoteDescription.sdp); + sessionpart = sections.shift(); + var isIceLite = sdp.matchPrefix(sessionpart, + 'a=ice-lite').length > 0; + sections.forEach(function(mediaSection, sdpMLineIndex) { + var transceiver = pc.transceivers[sdpMLineIndex]; + var iceGatherer = transceiver.iceGatherer; + var iceTransport = transceiver.iceTransport; + var dtlsTransport = transceiver.dtlsTransport; + var localCapabilities = transceiver.localCapabilities; + var remoteCapabilities = transceiver.remoteCapabilities; + + // treat bundle-only as not-rejected. + var rejected = sdp.isRejected(mediaSection) && + sdp.matchPrefix(mediaSection, 'a=bundle-only').length === 0; + + if (!rejected && !transceiver.rejected) { + var remoteIceParameters = sdp.getIceParameters( + mediaSection, sessionpart); + var remoteDtlsParameters = sdp.getDtlsParameters( + mediaSection, sessionpart); + if (isIceLite) { + remoteDtlsParameters.role = 'server'; + } + + if (!pc.usingBundle || sdpMLineIndex === 0) { + pc._gather(transceiver.mid, sdpMLineIndex); + if (iceTransport.state === 'new') { + iceTransport.start(iceGatherer, remoteIceParameters, + isIceLite ? 'controlling' : 'controlled'); + } + if (dtlsTransport.state === 'new') { + dtlsTransport.start(remoteDtlsParameters); + } + } + + // Calculate intersection of capabilities. + var params = getCommonCapabilities(localCapabilities, + remoteCapabilities); + + // Start the RTCRtpSender. The RTCRtpReceiver for this + // transceiver has already been started in setRemoteDescription. + pc._transceive(transceiver, + params.codecs.length > 0, + false); + } + }); + } + + pc._localDescription = { + type: description.type, + sdp: description.sdp + }; + if (description.type === 'offer') { + pc._updateSignalingState('have-local-offer'); + } else { + pc._updateSignalingState('stable'); + } + + return Promise.resolve(); + }; + + RTCPeerConnection.prototype.setRemoteDescription = function(description) { + var pc = this; + + // Note: pranswer is not supported. + if (['offer', 'answer'].indexOf(description.type) === -1) { + return Promise.reject(makeError('TypeError', + 'Unsupported type "' + description.type + '"')); + } + + if (!isActionAllowedInSignalingState('setRemoteDescription', + description.type, pc.signalingState) || pc._isClosed) { + return Promise.reject(makeError('InvalidStateError', + 'Can not set remote ' + description.type + + ' in state ' + pc.signalingState)); + } + + var streams = {}; + pc.remoteStreams.forEach(function(stream) { + streams[stream.id] = stream; + }); + var receiverList = []; + var sections = sdp.splitSections(description.sdp); + var sessionpart = sections.shift(); + var isIceLite = sdp.matchPrefix(sessionpart, + 'a=ice-lite').length > 0; + var usingBundle = sdp.matchPrefix(sessionpart, + 'a=group:BUNDLE ').length > 0; + pc.usingBundle = usingBundle; + var iceOptions = sdp.matchPrefix(sessionpart, + 'a=ice-options:')[0]; + if (iceOptions) { + pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ') + .indexOf('trickle') >= 0; + } else { + pc.canTrickleIceCandidates = false; + } + + sections.forEach(function(mediaSection, sdpMLineIndex) { + var lines = sdp.splitLines(mediaSection); + var kind = sdp.getKind(mediaSection); + // treat bundle-only as not-rejected. + var rejected = sdp.isRejected(mediaSection) && + sdp.matchPrefix(mediaSection, 'a=bundle-only').length === 0; + var protocol = lines[0].substr(2).split(' ')[2]; + + var direction = sdp.getDirection(mediaSection, sessionpart); + var remoteMsid = sdp.parseMsid(mediaSection); + + var mid = sdp.getMid(mediaSection) || sdp.generateIdentifier(); + + // Reject datachannels which are not implemented yet. + if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' || + protocol === 'UDP/DTLS/SCTP'))) { + // TODO: this is dangerous in the case where a non-rejected m-line + // becomes rejected. + pc.transceivers[sdpMLineIndex] = { + mid: mid, + kind: kind, + protocol: protocol, + rejected: true + }; + return; + } + + if (!rejected && pc.transceivers[sdpMLineIndex] && + pc.transceivers[sdpMLineIndex].rejected) { + // recycle a rejected transceiver. + pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true); + } + + var transceiver; + var iceGatherer; + var iceTransport; + var dtlsTransport; + var rtpReceiver; + var sendEncodingParameters; + var recvEncodingParameters; + var localCapabilities; + + var track; + // FIXME: ensure the mediaSection has rtcp-mux set. + var remoteCapabilities = sdp.parseRtpParameters(mediaSection); + var remoteIceParameters; + var remoteDtlsParameters; + if (!rejected) { + remoteIceParameters = sdp.getIceParameters(mediaSection, + sessionpart); + remoteDtlsParameters = sdp.getDtlsParameters(mediaSection, + sessionpart); + remoteDtlsParameters.role = 'client'; + } + recvEncodingParameters = + sdp.parseRtpEncodingParameters(mediaSection); + + var rtcpParameters = sdp.parseRtcpParameters(mediaSection); + + var isComplete = sdp.matchPrefix(mediaSection, + 'a=end-of-candidates', sessionpart).length > 0; + var cands = sdp.matchPrefix(mediaSection, 'a=candidate:') + .map(function(cand) { + return sdp.parseCandidate(cand); + }) + .filter(function(cand) { + return cand.component === 1; + }); + + // Check if we can use BUNDLE and dispose transports. + if ((description.type === 'offer' || description.type === 'answer') && + !rejected && usingBundle && sdpMLineIndex > 0 && + pc.transceivers[sdpMLineIndex]) { + pc._disposeIceAndDtlsTransports(sdpMLineIndex); + pc.transceivers[sdpMLineIndex].iceGatherer = + pc.transceivers[0].iceGatherer; + pc.transceivers[sdpMLineIndex].iceTransport = + pc.transceivers[0].iceTransport; + pc.transceivers[sdpMLineIndex].dtlsTransport = + pc.transceivers[0].dtlsTransport; + if (pc.transceivers[sdpMLineIndex].rtpSender) { + pc.transceivers[sdpMLineIndex].rtpSender.setTransport( + pc.transceivers[0].dtlsTransport); + } + if (pc.transceivers[sdpMLineIndex].rtpReceiver) { + pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport( + pc.transceivers[0].dtlsTransport); + } + } + if (description.type === 'offer' && !rejected) { + transceiver = pc.transceivers[sdpMLineIndex] || + pc._createTransceiver(kind); + transceiver.mid = mid; + + if (!transceiver.iceGatherer) { + transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex, + usingBundle); + } + + if (cands.length && transceiver.iceTransport.state === 'new') { + if (isComplete && (!usingBundle || sdpMLineIndex === 0)) { + transceiver.iceTransport.setRemoteCandidates(cands); + } else { + cands.forEach(function(candidate) { + maybeAddCandidate(transceiver.iceTransport, candidate); + }); + } + } + + localCapabilities = window.RTCRtpReceiver.getCapabilities(kind); + + // filter RTX until additional stuff needed for RTX is implemented + // in adapter.js + if (edgeVersion < 15019) { + localCapabilities.codecs = localCapabilities.codecs.filter( + function(codec) { + return codec.name !== 'rtx'; + }); + } + + sendEncodingParameters = transceiver.sendEncodingParameters || [{ + ssrc: (2 * sdpMLineIndex + 2) * 1001 + }]; + + // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams + var isNewTrack = false; + if (direction === 'sendrecv' || direction === 'sendonly') { + isNewTrack = !transceiver.rtpReceiver; + rtpReceiver = transceiver.rtpReceiver || + new window.RTCRtpReceiver(transceiver.dtlsTransport, kind); + + if (isNewTrack) { + var stream; + track = rtpReceiver.track; + // FIXME: does not work with Plan B. + if (remoteMsid && remoteMsid.stream === '-') ; else if (remoteMsid) { + if (!streams[remoteMsid.stream]) { + streams[remoteMsid.stream] = new window.MediaStream(); + Object.defineProperty(streams[remoteMsid.stream], 'id', { + get: function() { + return remoteMsid.stream; + } + }); + } + Object.defineProperty(track, 'id', { + get: function() { + return remoteMsid.track; + } + }); + stream = streams[remoteMsid.stream]; + } else { + if (!streams.default) { + streams.default = new window.MediaStream(); + } + stream = streams.default; + } + if (stream) { + addTrackToStreamAndFireEvent(track, stream); + transceiver.associatedRemoteMediaStreams.push(stream); + } + receiverList.push([track, rtpReceiver, stream]); + } + } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) { + transceiver.associatedRemoteMediaStreams.forEach(function(s) { + var nativeTrack = s.getTracks().find(function(t) { + return t.id === transceiver.rtpReceiver.track.id; + }); + if (nativeTrack) { + removeTrackFromStreamAndFireEvent(nativeTrack, s); + } + }); + transceiver.associatedRemoteMediaStreams = []; + } + + transceiver.localCapabilities = localCapabilities; + transceiver.remoteCapabilities = remoteCapabilities; + transceiver.rtpReceiver = rtpReceiver; + transceiver.rtcpParameters = rtcpParameters; + transceiver.sendEncodingParameters = sendEncodingParameters; + transceiver.recvEncodingParameters = recvEncodingParameters; + + // Start the RTCRtpReceiver now. The RTPSender is started in + // setLocalDescription. + pc._transceive(pc.transceivers[sdpMLineIndex], + false, + isNewTrack); + } else if (description.type === 'answer' && !rejected) { + transceiver = pc.transceivers[sdpMLineIndex]; + iceGatherer = transceiver.iceGatherer; + iceTransport = transceiver.iceTransport; + dtlsTransport = transceiver.dtlsTransport; + rtpReceiver = transceiver.rtpReceiver; + sendEncodingParameters = transceiver.sendEncodingParameters; + localCapabilities = transceiver.localCapabilities; + + pc.transceivers[sdpMLineIndex].recvEncodingParameters = + recvEncodingParameters; + pc.transceivers[sdpMLineIndex].remoteCapabilities = + remoteCapabilities; + pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters; + + if (cands.length && iceTransport.state === 'new') { + if ((isIceLite || isComplete) && + (!usingBundle || sdpMLineIndex === 0)) { + iceTransport.setRemoteCandidates(cands); + } else { + cands.forEach(function(candidate) { + maybeAddCandidate(transceiver.iceTransport, candidate); + }); + } + } + + if (!usingBundle || sdpMLineIndex === 0) { + if (iceTransport.state === 'new') { + iceTransport.start(iceGatherer, remoteIceParameters, + 'controlling'); + } + if (dtlsTransport.state === 'new') { + dtlsTransport.start(remoteDtlsParameters); + } + } + + // If the offer contained RTX but the answer did not, + // remove RTX from sendEncodingParameters. + var commonCapabilities = getCommonCapabilities( + transceiver.localCapabilities, + transceiver.remoteCapabilities); + + var hasRtx = commonCapabilities.codecs.filter(function(c) { + return c.name.toLowerCase() === 'rtx'; + }).length; + if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) { + delete transceiver.sendEncodingParameters[0].rtx; + } + + pc._transceive(transceiver, + direction === 'sendrecv' || direction === 'recvonly', + direction === 'sendrecv' || direction === 'sendonly'); + + // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams + if (rtpReceiver && + (direction === 'sendrecv' || direction === 'sendonly')) { + track = rtpReceiver.track; + if (remoteMsid) { + if (!streams[remoteMsid.stream]) { + streams[remoteMsid.stream] = new window.MediaStream(); + } + addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]); + receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]); + } else { + if (!streams.default) { + streams.default = new window.MediaStream(); + } + addTrackToStreamAndFireEvent(track, streams.default); + receiverList.push([track, rtpReceiver, streams.default]); + } + } else { + // FIXME: actually the receiver should be created later. + delete transceiver.rtpReceiver; + } + } + }); + + if (pc._dtlsRole === undefined) { + pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive'; + } + + pc._remoteDescription = { + type: description.type, + sdp: description.sdp + }; + if (description.type === 'offer') { + pc._updateSignalingState('have-remote-offer'); + } else { + pc._updateSignalingState('stable'); + } + Object.keys(streams).forEach(function(sid) { + var stream = streams[sid]; + if (stream.getTracks().length) { + if (pc.remoteStreams.indexOf(stream) === -1) { + pc.remoteStreams.push(stream); + var event = new Event('addstream'); + event.stream = stream; + window.setTimeout(function() { + pc._dispatchEvent('addstream', event); + }); + } + + receiverList.forEach(function(item) { + var track = item[0]; + var receiver = item[1]; + if (stream.id !== item[2].id) { + return; + } + fireAddTrack(pc, track, receiver, [stream]); + }); + } + }); + receiverList.forEach(function(item) { + if (item[2]) { + return; + } + fireAddTrack(pc, item[0], item[1], []); + }); + + // check whether addIceCandidate({}) was called within four seconds after + // setRemoteDescription. + window.setTimeout(function() { + if (!(pc && pc.transceivers)) { + return; + } + pc.transceivers.forEach(function(transceiver) { + if (transceiver.iceTransport && + transceiver.iceTransport.state === 'new' && + transceiver.iceTransport.getRemoteCandidates().length > 0) { + console.warn('Timeout for addRemoteCandidate. Consider sending ' + + 'an end-of-candidates notification'); + transceiver.iceTransport.addRemoteCandidate({}); + } + }); + }, 4000); + + return Promise.resolve(); + }; + + RTCPeerConnection.prototype.close = function() { + this.transceivers.forEach(function(transceiver) { + /* not yet + if (transceiver.iceGatherer) { + transceiver.iceGatherer.close(); + } + */ + if (transceiver.iceTransport) { + transceiver.iceTransport.stop(); + } + if (transceiver.dtlsTransport) { + transceiver.dtlsTransport.stop(); + } + if (transceiver.rtpSender) { + transceiver.rtpSender.stop(); + } + if (transceiver.rtpReceiver) { + transceiver.rtpReceiver.stop(); + } + }); + // FIXME: clean up tracks, local streams, remote streams, etc + this._isClosed = true; + this._updateSignalingState('closed'); + }; + + // Update the signaling state. + RTCPeerConnection.prototype._updateSignalingState = function(newState) { + this.signalingState = newState; + var event = new Event('signalingstatechange'); + this._dispatchEvent('signalingstatechange', event); + }; + + // Determine whether to fire the negotiationneeded event. + RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() { + var pc = this; + if (this.signalingState !== 'stable' || this.needNegotiation === true) { + return; + } + this.needNegotiation = true; + window.setTimeout(function() { + if (pc.needNegotiation) { + pc.needNegotiation = false; + var event = new Event('negotiationneeded'); + pc._dispatchEvent('negotiationneeded', event); + } + }, 0); + }; + + // Update the ice connection state. + RTCPeerConnection.prototype._updateIceConnectionState = function() { + var newState; + var states = { + 'new': 0, + closed: 0, + checking: 0, + connected: 0, + completed: 0, + disconnected: 0, + failed: 0 + }; + this.transceivers.forEach(function(transceiver) { + if (transceiver.iceTransport && !transceiver.rejected) { + states[transceiver.iceTransport.state]++; + } + }); + + newState = 'new'; + if (states.failed > 0) { + newState = 'failed'; + } else if (states.checking > 0) { + newState = 'checking'; + } else if (states.disconnected > 0) { + newState = 'disconnected'; + } else if (states.new > 0) { + newState = 'new'; + } else if (states.connected > 0) { + newState = 'connected'; + } else if (states.completed > 0) { + newState = 'completed'; + } + + if (newState !== this.iceConnectionState) { + this.iceConnectionState = newState; + var event = new Event('iceconnectionstatechange'); + this._dispatchEvent('iceconnectionstatechange', event); + } + }; + + // Update the connection state. + RTCPeerConnection.prototype._updateConnectionState = function() { + var newState; + var states = { + 'new': 0, + closed: 0, + connecting: 0, + connected: 0, + completed: 0, + disconnected: 0, + failed: 0 + }; + this.transceivers.forEach(function(transceiver) { + if (transceiver.iceTransport && transceiver.dtlsTransport && + !transceiver.rejected) { + states[transceiver.iceTransport.state]++; + states[transceiver.dtlsTransport.state]++; + } + }); + // ICETransport.completed and connected are the same for this purpose. + states.connected += states.completed; + + newState = 'new'; + if (states.failed > 0) { + newState = 'failed'; + } else if (states.connecting > 0) { + newState = 'connecting'; + } else if (states.disconnected > 0) { + newState = 'disconnected'; + } else if (states.new > 0) { + newState = 'new'; + } else if (states.connected > 0) { + newState = 'connected'; + } + + if (newState !== this.connectionState) { + this.connectionState = newState; + var event = new Event('connectionstatechange'); + this._dispatchEvent('connectionstatechange', event); + } + }; + + RTCPeerConnection.prototype.createOffer = function() { + var pc = this; + + if (pc._isClosed) { + return Promise.reject(makeError('InvalidStateError', + 'Can not call createOffer after close')); + } + + var numAudioTracks = pc.transceivers.filter(function(t) { + return t.kind === 'audio'; + }).length; + var numVideoTracks = pc.transceivers.filter(function(t) { + return t.kind === 'video'; + }).length; + + // Determine number of audio and video tracks we need to send/recv. + var offerOptions = arguments[0]; + if (offerOptions) { + // Reject Chrome legacy constraints. + if (offerOptions.mandatory || offerOptions.optional) { + throw new TypeError( + 'Legacy mandatory/optional constraints not supported.'); + } + if (offerOptions.offerToReceiveAudio !== undefined) { + if (offerOptions.offerToReceiveAudio === true) { + numAudioTracks = 1; + } else if (offerOptions.offerToReceiveAudio === false) { + numAudioTracks = 0; + } else { + numAudioTracks = offerOptions.offerToReceiveAudio; + } + } + if (offerOptions.offerToReceiveVideo !== undefined) { + if (offerOptions.offerToReceiveVideo === true) { + numVideoTracks = 1; + } else if (offerOptions.offerToReceiveVideo === false) { + numVideoTracks = 0; + } else { + numVideoTracks = offerOptions.offerToReceiveVideo; + } + } + } + + pc.transceivers.forEach(function(transceiver) { + if (transceiver.kind === 'audio') { + numAudioTracks--; + if (numAudioTracks < 0) { + transceiver.wantReceive = false; + } + } else if (transceiver.kind === 'video') { + numVideoTracks--; + if (numVideoTracks < 0) { + transceiver.wantReceive = false; + } + } + }); + + // Create M-lines for recvonly streams. + while (numAudioTracks > 0 || numVideoTracks > 0) { + if (numAudioTracks > 0) { + pc._createTransceiver('audio'); + numAudioTracks--; + } + if (numVideoTracks > 0) { + pc._createTransceiver('video'); + numVideoTracks--; + } + } + + var sdp$1 = sdp.writeSessionBoilerplate(pc._sdpSessionId, + pc._sdpSessionVersion++); + pc.transceivers.forEach(function(transceiver, sdpMLineIndex) { + // For each track, create an ice gatherer, ice transport, + // dtls transport, potentially rtpsender and rtpreceiver. + var track = transceiver.track; + var kind = transceiver.kind; + var mid = transceiver.mid || sdp.generateIdentifier(); + transceiver.mid = mid; + + if (!transceiver.iceGatherer) { + transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex, + pc.usingBundle); + } + + var localCapabilities = window.RTCRtpSender.getCapabilities(kind); + // filter RTX until additional stuff needed for RTX is implemented + // in adapter.js + if (edgeVersion < 15019) { + localCapabilities.codecs = localCapabilities.codecs.filter( + function(codec) { + return codec.name !== 'rtx'; + }); + } + localCapabilities.codecs.forEach(function(codec) { + // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552 + // by adding level-asymmetry-allowed=1 + if (codec.name === 'H264' && + codec.parameters['level-asymmetry-allowed'] === undefined) { + codec.parameters['level-asymmetry-allowed'] = '1'; + } + + // for subsequent offers, we might have to re-use the payload + // type of the last offer. + if (transceiver.remoteCapabilities && + transceiver.remoteCapabilities.codecs) { + transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) { + if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() && + codec.clockRate === remoteCodec.clockRate) { + codec.preferredPayloadType = remoteCodec.payloadType; + } + }); + } + }); + localCapabilities.headerExtensions.forEach(function(hdrExt) { + var remoteExtensions = transceiver.remoteCapabilities && + transceiver.remoteCapabilities.headerExtensions || []; + remoteExtensions.forEach(function(rHdrExt) { + if (hdrExt.uri === rHdrExt.uri) { + hdrExt.id = rHdrExt.id; + } + }); + }); + + // generate an ssrc now, to be used later in rtpSender.send + var sendEncodingParameters = transceiver.sendEncodingParameters || [{ + ssrc: (2 * sdpMLineIndex + 1) * 1001 + }]; + if (track) { + // add RTX + if (edgeVersion >= 15019 && kind === 'video' && + !sendEncodingParameters[0].rtx) { + sendEncodingParameters[0].rtx = { + ssrc: sendEncodingParameters[0].ssrc + 1 + }; + } + } + + if (transceiver.wantReceive) { + transceiver.rtpReceiver = new window.RTCRtpReceiver( + transceiver.dtlsTransport, kind); + } + + transceiver.localCapabilities = localCapabilities; + transceiver.sendEncodingParameters = sendEncodingParameters; + }); + + // always offer BUNDLE and dispose on return if not supported. + if (pc._config.bundlePolicy !== 'max-compat') { + sdp$1 += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) { + return t.mid; + }).join(' ') + '\r\n'; + } + sdp$1 += 'a=ice-options:trickle\r\n'; + + pc.transceivers.forEach(function(transceiver, sdpMLineIndex) { + sdp$1 += writeMediaSection(transceiver, transceiver.localCapabilities, + 'offer', transceiver.stream, pc._dtlsRole); + sdp$1 += 'a=rtcp-rsize\r\n'; + + if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' && + (sdpMLineIndex === 0 || !pc.usingBundle)) { + transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) { + cand.component = 1; + sdp$1 += 'a=' + sdp.writeCandidate(cand) + '\r\n'; + }); + + if (transceiver.iceGatherer.state === 'completed') { + sdp$1 += 'a=end-of-candidates\r\n'; + } + } + }); + + var desc = new window.RTCSessionDescription({ + type: 'offer', + sdp: sdp$1 + }); + return Promise.resolve(desc); + }; + + RTCPeerConnection.prototype.createAnswer = function() { + var pc = this; + + if (pc._isClosed) { + return Promise.reject(makeError('InvalidStateError', + 'Can not call createAnswer after close')); + } + + if (!(pc.signalingState === 'have-remote-offer' || + pc.signalingState === 'have-local-pranswer')) { + return Promise.reject(makeError('InvalidStateError', + 'Can not call createAnswer in signalingState ' + pc.signalingState)); + } + + var sdp$1 = sdp.writeSessionBoilerplate(pc._sdpSessionId, + pc._sdpSessionVersion++); + if (pc.usingBundle) { + sdp$1 += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) { + return t.mid; + }).join(' ') + '\r\n'; + } + sdp$1 += 'a=ice-options:trickle\r\n'; + + var mediaSectionsInOffer = sdp.getMediaSections( + pc._remoteDescription.sdp).length; + pc.transceivers.forEach(function(transceiver, sdpMLineIndex) { + if (sdpMLineIndex + 1 > mediaSectionsInOffer) { + return; + } + if (transceiver.rejected) { + if (transceiver.kind === 'application') { + if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt + sdp$1 += 'm=application 0 DTLS/SCTP 5000\r\n'; + } else { + sdp$1 += 'm=application 0 ' + transceiver.protocol + + ' webrtc-datachannel\r\n'; + } + } else if (transceiver.kind === 'audio') { + sdp$1 += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\r\n' + + 'a=rtpmap:0 PCMU/8000\r\n'; + } else if (transceiver.kind === 'video') { + sdp$1 += 'm=video 0 UDP/TLS/RTP/SAVPF 120\r\n' + + 'a=rtpmap:120 VP8/90000\r\n'; + } + sdp$1 += 'c=IN IP4 0.0.0.0\r\n' + + 'a=inactive\r\n' + + 'a=mid:' + transceiver.mid + '\r\n'; + return; + } + + // FIXME: look at direction. + if (transceiver.stream) { + var localTrack; + if (transceiver.kind === 'audio') { + localTrack = transceiver.stream.getAudioTracks()[0]; + } else if (transceiver.kind === 'video') { + localTrack = transceiver.stream.getVideoTracks()[0]; + } + if (localTrack) { + // add RTX + if (edgeVersion >= 15019 && transceiver.kind === 'video' && + !transceiver.sendEncodingParameters[0].rtx) { + transceiver.sendEncodingParameters[0].rtx = { + ssrc: transceiver.sendEncodingParameters[0].ssrc + 1 + }; + } + } + } + + // Calculate intersection of capabilities. + var commonCapabilities = getCommonCapabilities( + transceiver.localCapabilities, + transceiver.remoteCapabilities); + + var hasRtx = commonCapabilities.codecs.filter(function(c) { + return c.name.toLowerCase() === 'rtx'; + }).length; + if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) { + delete transceiver.sendEncodingParameters[0].rtx; + } + + sdp$1 += writeMediaSection(transceiver, commonCapabilities, + 'answer', transceiver.stream, pc._dtlsRole); + if (transceiver.rtcpParameters && + transceiver.rtcpParameters.reducedSize) { + sdp$1 += 'a=rtcp-rsize\r\n'; + } + }); + + var desc = new window.RTCSessionDescription({ + type: 'answer', + sdp: sdp$1 + }); + return Promise.resolve(desc); + }; + + RTCPeerConnection.prototype.addIceCandidate = function(candidate) { + var pc = this; + var sections; + if (candidate && !(candidate.sdpMLineIndex !== undefined || + candidate.sdpMid)) { + return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required')); + } + + // TODO: needs to go into ops queue. + return new Promise(function(resolve, reject) { + if (!pc._remoteDescription) { + return reject(makeError('InvalidStateError', + 'Can not add ICE candidate without a remote description')); + } else if (!candidate || candidate.candidate === '') { + for (var j = 0; j < pc.transceivers.length; j++) { + if (pc.transceivers[j].rejected) { + continue; + } + pc.transceivers[j].iceTransport.addRemoteCandidate({}); + sections = sdp.getMediaSections(pc._remoteDescription.sdp); + sections[j] += 'a=end-of-candidates\r\n'; + pc._remoteDescription.sdp = + sdp.getDescription(pc._remoteDescription.sdp) + + sections.join(''); + if (pc.usingBundle) { + break; + } + } + } else { + var sdpMLineIndex = candidate.sdpMLineIndex; + if (candidate.sdpMid) { + for (var i = 0; i < pc.transceivers.length; i++) { + if (pc.transceivers[i].mid === candidate.sdpMid) { + sdpMLineIndex = i; + break; + } + } + } + var transceiver = pc.transceivers[sdpMLineIndex]; + if (transceiver) { + if (transceiver.rejected) { + return resolve(); + } + var cand = Object.keys(candidate.candidate).length > 0 ? + sdp.parseCandidate(candidate.candidate) : {}; + // Ignore Chrome's invalid candidates since Edge does not like them. + if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) { + return resolve(); + } + // Ignore RTCP candidates, we assume RTCP-MUX. + if (cand.component && cand.component !== 1) { + return resolve(); + } + // when using bundle, avoid adding candidates to the wrong + // ice transport. And avoid adding candidates added in the SDP. + if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 && + transceiver.iceTransport !== pc.transceivers[0].iceTransport)) { + if (!maybeAddCandidate(transceiver.iceTransport, cand)) { + return reject(makeError('OperationError', + 'Can not add ICE candidate')); + } + } + + // update the remoteDescription. + var candidateString = candidate.candidate.trim(); + if (candidateString.indexOf('a=') === 0) { + candidateString = candidateString.substr(2); + } + sections = sdp.getMediaSections(pc._remoteDescription.sdp); + sections[sdpMLineIndex] += 'a=' + + (cand.type ? candidateString : 'end-of-candidates') + + '\r\n'; + pc._remoteDescription.sdp = + sdp.getDescription(pc._remoteDescription.sdp) + + sections.join(''); + } else { + return reject(makeError('OperationError', + 'Can not add ICE candidate')); + } + } + resolve(); + }); + }; + + RTCPeerConnection.prototype.getStats = function(selector) { + if (selector && selector instanceof window.MediaStreamTrack) { + var senderOrReceiver = null; + this.transceivers.forEach(function(transceiver) { + if (transceiver.rtpSender && + transceiver.rtpSender.track === selector) { + senderOrReceiver = transceiver.rtpSender; + } else if (transceiver.rtpReceiver && + transceiver.rtpReceiver.track === selector) { + senderOrReceiver = transceiver.rtpReceiver; + } + }); + if (!senderOrReceiver) { + throw makeError('InvalidAccessError', 'Invalid selector.'); + } + return senderOrReceiver.getStats(); + } + + var promises = []; + this.transceivers.forEach(function(transceiver) { + ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport', + 'dtlsTransport'].forEach(function(method) { + if (transceiver[method]) { + promises.push(transceiver[method].getStats()); + } + }); + }); + return Promise.all(promises).then(function(allStats) { + var results = new Map(); + allStats.forEach(function(stats) { + stats.forEach(function(stat) { + results.set(stat.id, stat); + }); + }); + return results; + }); + }; + + // fix low-level stat names and return Map instead of object. + var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer', + 'RTCIceTransport', 'RTCDtlsTransport']; + ortcObjects.forEach(function(ortcObjectName) { + var obj = window[ortcObjectName]; + if (obj && obj.prototype && obj.prototype.getStats) { + var nativeGetstats = obj.prototype.getStats; + obj.prototype.getStats = function() { + return nativeGetstats.apply(this) + .then(function(nativeStats) { + var mapStats = new Map(); + Object.keys(nativeStats).forEach(function(id) { + nativeStats[id].type = fixStatsType(nativeStats[id]); + mapStats.set(id, nativeStats[id]); + }); + return mapStats; + }); + }; + } + }); + + // legacy callback shims. Should be moved to adapter.js some days. + var methods = ['createOffer', 'createAnswer']; + methods.forEach(function(method) { + var nativeMethod = RTCPeerConnection.prototype[method]; + RTCPeerConnection.prototype[method] = function() { + var args = arguments; + if (typeof args[0] === 'function' || + typeof args[1] === 'function') { // legacy + return nativeMethod.apply(this, [arguments[2]]) + .then(function(description) { + if (typeof args[0] === 'function') { + args[0].apply(null, [description]); + } + }, function(error) { + if (typeof args[1] === 'function') { + args[1].apply(null, [error]); + } + }); + } + return nativeMethod.apply(this, arguments); + }; + }); + + methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']; + methods.forEach(function(method) { + var nativeMethod = RTCPeerConnection.prototype[method]; + RTCPeerConnection.prototype[method] = function() { + var args = arguments; + if (typeof args[1] === 'function' || + typeof args[2] === 'function') { // legacy + return nativeMethod.apply(this, arguments) + .then(function() { + if (typeof args[1] === 'function') { + args[1].apply(null); + } + }, function(error) { + if (typeof args[2] === 'function') { + args[2].apply(null, [error]); + } + }); + } + return nativeMethod.apply(this, arguments); + }; + }); + + // getStats is special. It doesn't have a spec legacy method yet we support + // getStats(something, cb) without error callbacks. + ['getStats'].forEach(function(method) { + var nativeMethod = RTCPeerConnection.prototype[method]; + RTCPeerConnection.prototype[method] = function() { + var args = arguments; + if (typeof args[1] === 'function') { + return nativeMethod.apply(this, arguments) + .then(function() { + if (typeof args[1] === 'function') { + args[1].apply(null); + } + }); + } + return nativeMethod.apply(this, arguments); + }; + }); + + return RTCPeerConnection; + }; + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + function shimGetUserMedia$2(window) { + const navigator = window && window.navigator; + + const shimError_ = function(e) { + return { + name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name, + message: e.message, + constraint: e.constraint, + toString() { + return this.name; + } + }; + }; + + // getUserMedia error shim. + const origGetUserMedia = navigator.mediaDevices.getUserMedia. + bind(navigator.mediaDevices); + navigator.mediaDevices.getUserMedia = function(c) { + return origGetUserMedia(c).catch(e => Promise.reject(shimError_(e))); + }; + } + + /* + * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + function shimGetDisplayMedia$1(window) { + if (!('getDisplayMedia' in window.navigator)) { + return; + } + if (!(window.navigator.mediaDevices)) { + return; + } + if (window.navigator.mediaDevices && + 'getDisplayMedia' in window.navigator.mediaDevices) { + return; + } + window.navigator.mediaDevices.getDisplayMedia = + window.navigator.getDisplayMedia.bind(window.navigator); + } + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + function shimPeerConnection$1(window, browserDetails) { + if (window.RTCIceGatherer) { + if (!window.RTCIceCandidate) { + window.RTCIceCandidate = function RTCIceCandidate(args) { + return args; + }; + } + if (!window.RTCSessionDescription) { + window.RTCSessionDescription = function RTCSessionDescription(args) { + return args; + }; + } + // this adds an additional event listener to MediaStrackTrack that signals + // when a tracks enabled property was changed. Workaround for a bug in + // addStream, see below. No longer required in 15025+ + if (browserDetails.version < 15025) { + const origMSTEnabled = Object.getOwnPropertyDescriptor( + window.MediaStreamTrack.prototype, 'enabled'); + Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', { + set(value) { + origMSTEnabled.set.call(this, value); + const ev = new Event('enabled'); + ev.enabled = value; + this.dispatchEvent(ev); + } + }); + } + } + + // ORTC defines the DTMF sender a bit different. + // https://github.com/w3c/ortc/issues/714 + if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) { + Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', { + get() { + if (this._dtmf === undefined) { + if (this.track.kind === 'audio') { + this._dtmf = new window.RTCDtmfSender(this); + } else if (this.track.kind === 'video') { + this._dtmf = null; + } + } + return this._dtmf; + } + }); + } + // Edge currently only implements the RTCDtmfSender, not the + // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2* + if (window.RTCDtmfSender && !window.RTCDTMFSender) { + window.RTCDTMFSender = window.RTCDtmfSender; + } + + const RTCPeerConnectionShim = rtcpeerconnection(window, + browserDetails.version); + window.RTCPeerConnection = function RTCPeerConnection(config) { + if (config && config.iceServers) { + config.iceServers = filterIceServers$1(config.iceServers, + browserDetails.version); + log$1('ICE servers after filtering:', config.iceServers); + } + return new RTCPeerConnectionShim(config); + }; + window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype; + } + + function shimReplaceTrack(window) { + // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614 + if (window.RTCRtpSender && + !('replaceTrack' in window.RTCRtpSender.prototype)) { + window.RTCRtpSender.prototype.replaceTrack = + window.RTCRtpSender.prototype.setTrack; + } + } + + var edgeShim = /*#__PURE__*/Object.freeze({ + __proto__: null, + shimPeerConnection: shimPeerConnection$1, + shimReplaceTrack: shimReplaceTrack, + shimGetUserMedia: shimGetUserMedia$2, + shimGetDisplayMedia: shimGetDisplayMedia$1 + }); + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + function shimGetUserMedia$1(window, browserDetails) { + const navigator = window && window.navigator; + const MediaStreamTrack = window && window.MediaStreamTrack; + + navigator.getUserMedia = function(constraints, onSuccess, onError) { + // Replace Firefox 44+'s deprecation warning with unprefixed version. + deprecated('navigator.getUserMedia', + 'navigator.mediaDevices.getUserMedia'); + navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError); + }; + + if (!(browserDetails.version > 55 && + 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) { + const remap = function(obj, a, b) { + if (a in obj && !(b in obj)) { + obj[b] = obj[a]; + delete obj[a]; + } + }; + + const nativeGetUserMedia = navigator.mediaDevices.getUserMedia. + bind(navigator.mediaDevices); + navigator.mediaDevices.getUserMedia = function(c) { + if (typeof c === 'object' && typeof c.audio === 'object') { + c = JSON.parse(JSON.stringify(c)); + remap(c.audio, 'autoGainControl', 'mozAutoGainControl'); + remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression'); + } + return nativeGetUserMedia(c); + }; + + if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) { + const nativeGetSettings = MediaStreamTrack.prototype.getSettings; + MediaStreamTrack.prototype.getSettings = function() { + const obj = nativeGetSettings.apply(this, arguments); + remap(obj, 'mozAutoGainControl', 'autoGainControl'); + remap(obj, 'mozNoiseSuppression', 'noiseSuppression'); + return obj; + }; + } + + if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) { + const nativeApplyConstraints = + MediaStreamTrack.prototype.applyConstraints; + MediaStreamTrack.prototype.applyConstraints = function(c) { + if (this.kind === 'audio' && typeof c === 'object') { + c = JSON.parse(JSON.stringify(c)); + remap(c, 'autoGainControl', 'mozAutoGainControl'); + remap(c, 'noiseSuppression', 'mozNoiseSuppression'); + } + return nativeApplyConstraints.apply(this, [c]); + }; + } + } + } + + /* + * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + function shimGetDisplayMedia(window, preferredMediaSource) { + if (window.navigator.mediaDevices && + 'getDisplayMedia' in window.navigator.mediaDevices) { + return; + } + if (!(window.navigator.mediaDevices)) { + return; + } + window.navigator.mediaDevices.getDisplayMedia = + function getDisplayMedia(constraints) { + if (!(constraints && constraints.video)) { + const err = new DOMException('getDisplayMedia without video ' + + 'constraints is undefined'); + err.name = 'NotFoundError'; + // from https://heycam.github.io/webidl/#idl-DOMException-error-names + err.code = 8; + return Promise.reject(err); + } + if (constraints.video === true) { + constraints.video = {mediaSource: preferredMediaSource}; + } else { + constraints.video.mediaSource = preferredMediaSource; + } + return window.navigator.mediaDevices.getUserMedia(constraints); + }; + } + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + function shimOnTrack(window) { + if (typeof window === 'object' && window.RTCTrackEvent && + ('receiver' in window.RTCTrackEvent.prototype) && + !('transceiver' in window.RTCTrackEvent.prototype)) { + Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', { + get() { + return {receiver: this.receiver}; + } + }); + } + } + + function shimPeerConnection(window, browserDetails) { + if (typeof window !== 'object' || + !(window.RTCPeerConnection || window.mozRTCPeerConnection)) { + return; // probably media.peerconnection.enabled=false in about:config + } + if (!window.RTCPeerConnection && window.mozRTCPeerConnection) { + // very basic support for old versions. + window.RTCPeerConnection = window.mozRTCPeerConnection; + } + + if (browserDetails.version < 53) { + // shim away need for obsolete RTCIceCandidate/RTCSessionDescription. + ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'] + .forEach(function(method) { + const nativeMethod = window.RTCPeerConnection.prototype[method]; + const methodObj = {[method]() { + arguments[0] = new ((method === 'addIceCandidate') ? + window.RTCIceCandidate : + window.RTCSessionDescription)(arguments[0]); + return nativeMethod.apply(this, arguments); + }}; + window.RTCPeerConnection.prototype[method] = methodObj[method]; + }); + } + + const modernStatsTypes = { + inboundrtp: 'inbound-rtp', + outboundrtp: 'outbound-rtp', + candidatepair: 'candidate-pair', + localcandidate: 'local-candidate', + remotecandidate: 'remote-candidate' + }; + + const nativeGetStats = window.RTCPeerConnection.prototype.getStats; + window.RTCPeerConnection.prototype.getStats = function getStats() { + const [selector, onSucc, onErr] = arguments; + return nativeGetStats.apply(this, [selector || null]) + .then(stats => { + if (browserDetails.version < 53 && !onSucc) { + // Shim only promise getStats with spec-hyphens in type names + // Leave callback version alone; misc old uses of forEach before Map + try { + stats.forEach(stat => { + stat.type = modernStatsTypes[stat.type] || stat.type; + }); + } catch (e) { + if (e.name !== 'TypeError') { + throw e; + } + // Avoid TypeError: "type" is read-only, in old versions. 34-43ish + stats.forEach((stat, i) => { + stats.set(i, Object.assign({}, stat, { + type: modernStatsTypes[stat.type] || stat.type + })); + }); + } + } + return stats; + }) + .then(onSucc, onErr); + }; + } + + function shimSenderGetStats(window) { + if (!(typeof window === 'object' && window.RTCPeerConnection && + window.RTCRtpSender)) { + return; + } + if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) { + return; + } + const origGetSenders = window.RTCPeerConnection.prototype.getSenders; + if (origGetSenders) { + window.RTCPeerConnection.prototype.getSenders = function getSenders() { + const senders = origGetSenders.apply(this, []); + senders.forEach(sender => sender._pc = this); + return senders; + }; + } + + const origAddTrack = window.RTCPeerConnection.prototype.addTrack; + if (origAddTrack) { + window.RTCPeerConnection.prototype.addTrack = function addTrack() { + const sender = origAddTrack.apply(this, arguments); + sender._pc = this; + return sender; + }; + } + window.RTCRtpSender.prototype.getStats = function getStats() { + return this.track ? this._pc.getStats(this.track) : + Promise.resolve(new Map()); + }; + } + + function shimReceiverGetStats(window) { + if (!(typeof window === 'object' && window.RTCPeerConnection && + window.RTCRtpSender)) { + return; + } + if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) { + return; + } + const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers; + if (origGetReceivers) { + window.RTCPeerConnection.prototype.getReceivers = function getReceivers() { + const receivers = origGetReceivers.apply(this, []); + receivers.forEach(receiver => receiver._pc = this); + return receivers; + }; + } + wrapPeerConnectionEvent(window, 'track', e => { + e.receiver._pc = e.srcElement; + return e; + }); + window.RTCRtpReceiver.prototype.getStats = function getStats() { + return this._pc.getStats(this.track); + }; + } + + function shimRemoveStream(window) { + if (!window.RTCPeerConnection || + 'removeStream' in window.RTCPeerConnection.prototype) { + return; + } + window.RTCPeerConnection.prototype.removeStream = + function removeStream(stream) { + deprecated('removeStream', 'removeTrack'); + this.getSenders().forEach(sender => { + if (sender.track && stream.getTracks().includes(sender.track)) { + this.removeTrack(sender); + } + }); + }; + } + + function shimRTCDataChannel(window) { + // rename DataChannel to RTCDataChannel (native fix in FF60): + // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851 + if (window.DataChannel && !window.RTCDataChannel) { + window.RTCDataChannel = window.DataChannel; + } + } + + function shimAddTransceiver(window) { + // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647 + // Firefox ignores the init sendEncodings options passed to addTransceiver + // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918 + if (!(typeof window === 'object' && window.RTCPeerConnection)) { + return; + } + const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver; + if (origAddTransceiver) { + window.RTCPeerConnection.prototype.addTransceiver = + function addTransceiver() { + this.setParametersPromises = []; + const initParameters = arguments[1]; + const shouldPerformCheck = initParameters && + 'sendEncodings' in initParameters; + if (shouldPerformCheck) { + // If sendEncodings params are provided, validate grammar + initParameters.sendEncodings.forEach((encodingParam) => { + if ('rid' in encodingParam) { + const ridRegex = /^[a-z0-9]{0,16}$/i; + if (!ridRegex.test(encodingParam.rid)) { + throw new TypeError('Invalid RID value provided.'); + } + } + if ('scaleResolutionDownBy' in encodingParam) { + if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) { + throw new RangeError('scale_resolution_down_by must be >= 1.0'); + } + } + if ('maxFramerate' in encodingParam) { + if (!(parseFloat(encodingParam.maxFramerate) >= 0)) { + throw new RangeError('max_framerate must be >= 0.0'); + } + } + }); + } + const transceiver = origAddTransceiver.apply(this, arguments); + if (shouldPerformCheck) { + // Check if the init options were applied. If not we do this in an + // asynchronous way and save the promise reference in a global object. + // This is an ugly hack, but at the same time is way more robust than + // checking the sender parameters before and after the createOffer + // Also note that after the createoffer we are not 100% sure that + // the params were asynchronously applied so we might miss the + // opportunity to recreate offer. + const {sender} = transceiver; + const params = sender.getParameters(); + if (!('encodings' in params) || + // Avoid being fooled by patched getParameters() below. + (params.encodings.length === 1 && + Object.keys(params.encodings[0]).length === 0)) { + params.encodings = initParameters.sendEncodings; + sender.sendEncodings = initParameters.sendEncodings; + this.setParametersPromises.push(sender.setParameters(params) + .then(() => { + delete sender.sendEncodings; + }).catch(() => { + delete sender.sendEncodings; + }) + ); + } + } + return transceiver; + }; + } + } + + function shimGetParameters(window) { + if (!(typeof window === 'object' && window.RTCRtpSender)) { + return; + } + const origGetParameters = window.RTCRtpSender.prototype.getParameters; + if (origGetParameters) { + window.RTCRtpSender.prototype.getParameters = + function getParameters() { + const params = origGetParameters.apply(this, arguments); + if (!('encodings' in params)) { + params.encodings = [].concat(this.sendEncodings || [{}]); + } + return params; + }; + } + } + + function shimCreateOffer(window) { + // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647 + // Firefox ignores the init sendEncodings options passed to addTransceiver + // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918 + if (!(typeof window === 'object' && window.RTCPeerConnection)) { + return; + } + const origCreateOffer = window.RTCPeerConnection.prototype.createOffer; + window.RTCPeerConnection.prototype.createOffer = function createOffer() { + if (this.setParametersPromises && this.setParametersPromises.length) { + return Promise.all(this.setParametersPromises) + .then(() => { + return origCreateOffer.apply(this, arguments); + }) + .finally(() => { + this.setParametersPromises = []; + }); + } + return origCreateOffer.apply(this, arguments); + }; + } + + function shimCreateAnswer(window) { + // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647 + // Firefox ignores the init sendEncodings options passed to addTransceiver + // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918 + if (!(typeof window === 'object' && window.RTCPeerConnection)) { + return; + } + const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer; + window.RTCPeerConnection.prototype.createAnswer = function createAnswer() { + if (this.setParametersPromises && this.setParametersPromises.length) { + return Promise.all(this.setParametersPromises) + .then(() => { + return origCreateAnswer.apply(this, arguments); + }) + .finally(() => { + this.setParametersPromises = []; + }); + } + return origCreateAnswer.apply(this, arguments); + }; + } + + var firefoxShim = /*#__PURE__*/Object.freeze({ + __proto__: null, + shimOnTrack: shimOnTrack, + shimPeerConnection: shimPeerConnection, + shimSenderGetStats: shimSenderGetStats, + shimReceiverGetStats: shimReceiverGetStats, + shimRemoveStream: shimRemoveStream, + shimRTCDataChannel: shimRTCDataChannel, + shimAddTransceiver: shimAddTransceiver, + shimGetParameters: shimGetParameters, + shimCreateOffer: shimCreateOffer, + shimCreateAnswer: shimCreateAnswer, + shimGetUserMedia: shimGetUserMedia$1, + shimGetDisplayMedia: shimGetDisplayMedia + }); + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + function shimLocalStreamsAPI(window) { + if (typeof window !== 'object' || !window.RTCPeerConnection) { + return; + } + if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) { + window.RTCPeerConnection.prototype.getLocalStreams = + function getLocalStreams() { + if (!this._localStreams) { + this._localStreams = []; + } + return this._localStreams; + }; + } + if (!('addStream' in window.RTCPeerConnection.prototype)) { + const _addTrack = window.RTCPeerConnection.prototype.addTrack; + window.RTCPeerConnection.prototype.addStream = function addStream(stream) { + if (!this._localStreams) { + this._localStreams = []; + } + if (!this._localStreams.includes(stream)) { + this._localStreams.push(stream); + } + // Try to emulate Chrome's behaviour of adding in audio-video order. + // Safari orders by track id. + stream.getAudioTracks().forEach(track => _addTrack.call(this, track, + stream)); + stream.getVideoTracks().forEach(track => _addTrack.call(this, track, + stream)); + }; + + window.RTCPeerConnection.prototype.addTrack = + function addTrack(track, ...streams) { + if (streams) { + streams.forEach((stream) => { + if (!this._localStreams) { + this._localStreams = [stream]; + } else if (!this._localStreams.includes(stream)) { + this._localStreams.push(stream); + } + }); + } + return _addTrack.apply(this, arguments); + }; + } + if (!('removeStream' in window.RTCPeerConnection.prototype)) { + window.RTCPeerConnection.prototype.removeStream = + function removeStream(stream) { + if (!this._localStreams) { + this._localStreams = []; + } + const index = this._localStreams.indexOf(stream); + if (index === -1) { + return; + } + this._localStreams.splice(index, 1); + const tracks = stream.getTracks(); + this.getSenders().forEach(sender => { + if (tracks.includes(sender.track)) { + this.removeTrack(sender); + } + }); + }; + } + } + + function shimRemoteStreamsAPI(window) { + if (typeof window !== 'object' || !window.RTCPeerConnection) { + return; + } + if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) { + window.RTCPeerConnection.prototype.getRemoteStreams = + function getRemoteStreams() { + return this._remoteStreams ? this._remoteStreams : []; + }; + } + if (!('onaddstream' in window.RTCPeerConnection.prototype)) { + Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', { + get() { + return this._onaddstream; + }, + set(f) { + if (this._onaddstream) { + this.removeEventListener('addstream', this._onaddstream); + this.removeEventListener('track', this._onaddstreampoly); + } + this.addEventListener('addstream', this._onaddstream = f); + this.addEventListener('track', this._onaddstreampoly = (e) => { + e.streams.forEach(stream => { + if (!this._remoteStreams) { + this._remoteStreams = []; + } + if (this._remoteStreams.includes(stream)) { + return; + } + this._remoteStreams.push(stream); + const event = new Event('addstream'); + event.stream = stream; + this.dispatchEvent(event); + }); + }); + } + }); + const origSetRemoteDescription = + window.RTCPeerConnection.prototype.setRemoteDescription; + window.RTCPeerConnection.prototype.setRemoteDescription = + function setRemoteDescription() { + const pc = this; + if (!this._onaddstreampoly) { + this.addEventListener('track', this._onaddstreampoly = function(e) { + e.streams.forEach(stream => { + if (!pc._remoteStreams) { + pc._remoteStreams = []; + } + if (pc._remoteStreams.indexOf(stream) >= 0) { + return; + } + pc._remoteStreams.push(stream); + const event = new Event('addstream'); + event.stream = stream; + pc.dispatchEvent(event); + }); + }); + } + return origSetRemoteDescription.apply(pc, arguments); + }; + } + } + + function shimCallbacksAPI(window) { + if (typeof window !== 'object' || !window.RTCPeerConnection) { + return; + } + const prototype = window.RTCPeerConnection.prototype; + const origCreateOffer = prototype.createOffer; + const origCreateAnswer = prototype.createAnswer; + const setLocalDescription = prototype.setLocalDescription; + const setRemoteDescription = prototype.setRemoteDescription; + const addIceCandidate = prototype.addIceCandidate; + + prototype.createOffer = + function createOffer(successCallback, failureCallback) { + const options = (arguments.length >= 2) ? arguments[2] : arguments[0]; + const promise = origCreateOffer.apply(this, [options]); + if (!failureCallback) { + return promise; + } + promise.then(successCallback, failureCallback); + return Promise.resolve(); + }; + + prototype.createAnswer = + function createAnswer(successCallback, failureCallback) { + const options = (arguments.length >= 2) ? arguments[2] : arguments[0]; + const promise = origCreateAnswer.apply(this, [options]); + if (!failureCallback) { + return promise; + } + promise.then(successCallback, failureCallback); + return Promise.resolve(); + }; + + let withCallback = function(description, successCallback, failureCallback) { + const promise = setLocalDescription.apply(this, [description]); + if (!failureCallback) { + return promise; + } + promise.then(successCallback, failureCallback); + return Promise.resolve(); + }; + prototype.setLocalDescription = withCallback; + + withCallback = function(description, successCallback, failureCallback) { + const promise = setRemoteDescription.apply(this, [description]); + if (!failureCallback) { + return promise; + } + promise.then(successCallback, failureCallback); + return Promise.resolve(); + }; + prototype.setRemoteDescription = withCallback; + + withCallback = function(candidate, successCallback, failureCallback) { + const promise = addIceCandidate.apply(this, [candidate]); + if (!failureCallback) { + return promise; + } + promise.then(successCallback, failureCallback); + return Promise.resolve(); + }; + prototype.addIceCandidate = withCallback; + } + + function shimGetUserMedia(window) { + const navigator = window && window.navigator; + + if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { + // shim not needed in Safari 12.1 + const mediaDevices = navigator.mediaDevices; + const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices); + navigator.mediaDevices.getUserMedia = (constraints) => { + return _getUserMedia(shimConstraints(constraints)); + }; + } + + if (!navigator.getUserMedia && navigator.mediaDevices && + navigator.mediaDevices.getUserMedia) { + navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) { + navigator.mediaDevices.getUserMedia(constraints) + .then(cb, errcb); + }.bind(navigator); + } + } + + function shimConstraints(constraints) { + if (constraints && constraints.video !== undefined) { + return Object.assign({}, + constraints, + {video: compactObject(constraints.video)} + ); + } + + return constraints; + } + + function shimRTCIceServerUrls(window) { + if (!window.RTCPeerConnection) { + return; + } + // migrate from non-spec RTCIceServer.url to RTCIceServer.urls + const OrigPeerConnection = window.RTCPeerConnection; + window.RTCPeerConnection = + function RTCPeerConnection(pcConfig, pcConstraints) { + if (pcConfig && pcConfig.iceServers) { + const newIceServers = []; + for (let i = 0; i < pcConfig.iceServers.length; i++) { + let server = pcConfig.iceServers[i]; + if (!server.hasOwnProperty('urls') && + server.hasOwnProperty('url')) { + deprecated('RTCIceServer.url', 'RTCIceServer.urls'); + server = JSON.parse(JSON.stringify(server)); + server.urls = server.url; + delete server.url; + newIceServers.push(server); + } else { + newIceServers.push(pcConfig.iceServers[i]); + } + } + pcConfig.iceServers = newIceServers; + } + return new OrigPeerConnection(pcConfig, pcConstraints); + }; + window.RTCPeerConnection.prototype = OrigPeerConnection.prototype; + // wrap static methods. Currently just generateCertificate. + if ('generateCertificate' in OrigPeerConnection) { + Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', { + get() { + return OrigPeerConnection.generateCertificate; + } + }); + } + } + + function shimTrackEventTransceiver(window) { + // Add event.transceiver member over deprecated event.receiver + if (typeof window === 'object' && window.RTCTrackEvent && + 'receiver' in window.RTCTrackEvent.prototype && + !('transceiver' in window.RTCTrackEvent.prototype)) { + Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', { + get() { + return {receiver: this.receiver}; + } + }); + } + } + + function shimCreateOfferLegacy(window) { + const origCreateOffer = window.RTCPeerConnection.prototype.createOffer; + window.RTCPeerConnection.prototype.createOffer = + function createOffer(offerOptions) { + if (offerOptions) { + if (typeof offerOptions.offerToReceiveAudio !== 'undefined') { + // support bit values + offerOptions.offerToReceiveAudio = + !!offerOptions.offerToReceiveAudio; + } + const audioTransceiver = this.getTransceivers().find(transceiver => + transceiver.receiver.track.kind === 'audio'); + if (offerOptions.offerToReceiveAudio === false && audioTransceiver) { + if (audioTransceiver.direction === 'sendrecv') { + if (audioTransceiver.setDirection) { + audioTransceiver.setDirection('sendonly'); + } else { + audioTransceiver.direction = 'sendonly'; + } + } else if (audioTransceiver.direction === 'recvonly') { + if (audioTransceiver.setDirection) { + audioTransceiver.setDirection('inactive'); + } else { + audioTransceiver.direction = 'inactive'; + } + } + } else if (offerOptions.offerToReceiveAudio === true && + !audioTransceiver) { + this.addTransceiver('audio'); + } + + if (typeof offerOptions.offerToReceiveVideo !== 'undefined') { + // support bit values + offerOptions.offerToReceiveVideo = + !!offerOptions.offerToReceiveVideo; + } + const videoTransceiver = this.getTransceivers().find(transceiver => + transceiver.receiver.track.kind === 'video'); + if (offerOptions.offerToReceiveVideo === false && videoTransceiver) { + if (videoTransceiver.direction === 'sendrecv') { + if (videoTransceiver.setDirection) { + videoTransceiver.setDirection('sendonly'); + } else { + videoTransceiver.direction = 'sendonly'; + } + } else if (videoTransceiver.direction === 'recvonly') { + if (videoTransceiver.setDirection) { + videoTransceiver.setDirection('inactive'); + } else { + videoTransceiver.direction = 'inactive'; + } + } + } else if (offerOptions.offerToReceiveVideo === true && + !videoTransceiver) { + this.addTransceiver('video'); + } + } + return origCreateOffer.apply(this, arguments); + }; + } + + function shimAudioContext(window) { + if (typeof window !== 'object' || window.AudioContext) { + return; + } + window.AudioContext = window.webkitAudioContext; + } + + var safariShim = /*#__PURE__*/Object.freeze({ + __proto__: null, + shimLocalStreamsAPI: shimLocalStreamsAPI, + shimRemoteStreamsAPI: shimRemoteStreamsAPI, + shimCallbacksAPI: shimCallbacksAPI, + shimGetUserMedia: shimGetUserMedia, + shimConstraints: shimConstraints, + shimRTCIceServerUrls: shimRTCIceServerUrls, + shimTrackEventTransceiver: shimTrackEventTransceiver, + shimCreateOfferLegacy: shimCreateOfferLegacy, + shimAudioContext: shimAudioContext + }); + + /* + * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + function shimRTCIceCandidate(window) { + // foundation is arbitrarily chosen as an indicator for full support for + // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface + if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in + window.RTCIceCandidate.prototype)) { + return; + } + + const NativeRTCIceCandidate = window.RTCIceCandidate; + window.RTCIceCandidate = function RTCIceCandidate(args) { + // Remove the a= which shouldn't be part of the candidate string. + if (typeof args === 'object' && args.candidate && + args.candidate.indexOf('a=') === 0) { + args = JSON.parse(JSON.stringify(args)); + args.candidate = args.candidate.substr(2); + } + + if (args.candidate && args.candidate.length) { + // Augment the native candidate with the parsed fields. + const nativeCandidate = new NativeRTCIceCandidate(args); + const parsedCandidate = sdp.parseCandidate(args.candidate); + const augmentedCandidate = Object.assign(nativeCandidate, + parsedCandidate); + + // Add a serializer that does not serialize the extra attributes. + augmentedCandidate.toJSON = function toJSON() { + return { + candidate: augmentedCandidate.candidate, + sdpMid: augmentedCandidate.sdpMid, + sdpMLineIndex: augmentedCandidate.sdpMLineIndex, + usernameFragment: augmentedCandidate.usernameFragment, + }; + }; + return augmentedCandidate; + } + return new NativeRTCIceCandidate(args); + }; + window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype; + + // Hook up the augmented candidate in onicecandidate and + // addEventListener('icecandidate', ...) + wrapPeerConnectionEvent(window, 'icecandidate', e => { + if (e.candidate) { + Object.defineProperty(e, 'candidate', { + value: new window.RTCIceCandidate(e.candidate), + writable: 'false' + }); + } + return e; + }); + } + + function shimMaxMessageSize(window, browserDetails) { + if (!window.RTCPeerConnection) { + return; + } + + if (!('sctp' in window.RTCPeerConnection.prototype)) { + Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', { + get() { + return typeof this._sctp === 'undefined' ? null : this._sctp; + } + }); + } + + const sctpInDescription = function(description) { + if (!description || !description.sdp) { + return false; + } + const sections = sdp.splitSections(description.sdp); + sections.shift(); + return sections.some(mediaSection => { + const mLine = sdp.parseMLine(mediaSection); + return mLine && mLine.kind === 'application' + && mLine.protocol.indexOf('SCTP') !== -1; + }); + }; + + const getRemoteFirefoxVersion = function(description) { + // TODO: Is there a better solution for detecting Firefox? + const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/); + if (match === null || match.length < 2) { + return -1; + } + const version = parseInt(match[1], 10); + // Test for NaN (yes, this is ugly) + return version !== version ? -1 : version; + }; + + const getCanSendMaxMessageSize = function(remoteIsFirefox) { + // Every implementation we know can send at least 64 KiB. + // Note: Although Chrome is technically able to send up to 256 KiB, the + // data does not reach the other peer reliably. + // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419 + let canSendMaxMessageSize = 65536; + if (browserDetails.browser === 'firefox') { + if (browserDetails.version < 57) { + if (remoteIsFirefox === -1) { + // FF < 57 will send in 16 KiB chunks using the deprecated PPID + // fragmentation. + canSendMaxMessageSize = 16384; + } else { + // However, other FF (and RAWRTC) can reassemble PPID-fragmented + // messages. Thus, supporting ~2 GiB when sending. + canSendMaxMessageSize = 2147483637; + } + } else if (browserDetails.version < 60) { + // Currently, all FF >= 57 will reset the remote maximum message size + // to the default value when a data channel is created at a later + // stage. :( + // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831 + canSendMaxMessageSize = + browserDetails.version === 57 ? 65535 : 65536; + } else { + // FF >= 60 supports sending ~2 GiB + canSendMaxMessageSize = 2147483637; + } + } + return canSendMaxMessageSize; + }; + + const getMaxMessageSize = function(description, remoteIsFirefox) { + // Note: 65536 bytes is the default value from the SDP spec. Also, + // every implementation we know supports receiving 65536 bytes. + let maxMessageSize = 65536; + + // FF 57 has a slightly incorrect default remote max message size, so + // we need to adjust it here to avoid a failure when sending. + // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697 + if (browserDetails.browser === 'firefox' + && browserDetails.version === 57) { + maxMessageSize = 65535; + } + + const match = sdp.matchPrefix(description.sdp, + 'a=max-message-size:'); + if (match.length > 0) { + maxMessageSize = parseInt(match[0].substr(19), 10); + } else if (browserDetails.browser === 'firefox' && + remoteIsFirefox !== -1) { + // If the maximum message size is not present in the remote SDP and + // both local and remote are Firefox, the remote peer can receive + // ~2 GiB. + maxMessageSize = 2147483637; + } + return maxMessageSize; + }; + + const origSetRemoteDescription = + window.RTCPeerConnection.prototype.setRemoteDescription; + window.RTCPeerConnection.prototype.setRemoteDescription = + function setRemoteDescription() { + this._sctp = null; + // Chrome decided to not expose .sctp in plan-b mode. + // As usual, adapter.js has to do an 'ugly worakaround' + // to cover up the mess. + if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) { + const {sdpSemantics} = this.getConfiguration(); + if (sdpSemantics === 'plan-b') { + Object.defineProperty(this, 'sctp', { + get() { + return typeof this._sctp === 'undefined' ? null : this._sctp; + }, + enumerable: true, + configurable: true, + }); + } + } + + if (sctpInDescription(arguments[0])) { + // Check if the remote is FF. + const isFirefox = getRemoteFirefoxVersion(arguments[0]); + + // Get the maximum message size the local peer is capable of sending + const canSendMMS = getCanSendMaxMessageSize(isFirefox); + + // Get the maximum message size of the remote peer. + const remoteMMS = getMaxMessageSize(arguments[0], isFirefox); + + // Determine final maximum message size + let maxMessageSize; + if (canSendMMS === 0 && remoteMMS === 0) { + maxMessageSize = Number.POSITIVE_INFINITY; + } else if (canSendMMS === 0 || remoteMMS === 0) { + maxMessageSize = Math.max(canSendMMS, remoteMMS); + } else { + maxMessageSize = Math.min(canSendMMS, remoteMMS); + } + + // Create a dummy RTCSctpTransport object and the 'maxMessageSize' + // attribute. + const sctp = {}; + Object.defineProperty(sctp, 'maxMessageSize', { + get() { + return maxMessageSize; + } + }); + this._sctp = sctp; + } + + return origSetRemoteDescription.apply(this, arguments); + }; + } + + function shimSendThrowTypeError(window) { + if (!(window.RTCPeerConnection && + 'createDataChannel' in window.RTCPeerConnection.prototype)) { + return; + } + + // Note: Although Firefox >= 57 has a native implementation, the maximum + // message size can be reset for all data channels at a later stage. + // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831 + + function wrapDcSend(dc, pc) { + const origDataChannelSend = dc.send; + dc.send = function send() { + const data = arguments[0]; + const length = data.length || data.size || data.byteLength; + if (dc.readyState === 'open' && + pc.sctp && length > pc.sctp.maxMessageSize) { + throw new TypeError('Message too large (can send a maximum of ' + + pc.sctp.maxMessageSize + ' bytes)'); + } + return origDataChannelSend.apply(dc, arguments); + }; + } + const origCreateDataChannel = + window.RTCPeerConnection.prototype.createDataChannel; + window.RTCPeerConnection.prototype.createDataChannel = + function createDataChannel() { + const dataChannel = origCreateDataChannel.apply(this, arguments); + wrapDcSend(dataChannel, this); + return dataChannel; + }; + wrapPeerConnectionEvent(window, 'datachannel', e => { + wrapDcSend(e.channel, e.target); + return e; + }); + } + + + /* shims RTCConnectionState by pretending it is the same as iceConnectionState. + * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12 + * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect + * since DTLS failures would be hidden. See + * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827 + * for the Firefox tracking bug. + */ + function shimConnectionState(window) { + if (!window.RTCPeerConnection || + 'connectionState' in window.RTCPeerConnection.prototype) { + return; + } + const proto = window.RTCPeerConnection.prototype; + Object.defineProperty(proto, 'connectionState', { + get() { + return { + completed: 'connected', + checking: 'connecting' + }[this.iceConnectionState] || this.iceConnectionState; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(proto, 'onconnectionstatechange', { + get() { + return this._onconnectionstatechange || null; + }, + set(cb) { + if (this._onconnectionstatechange) { + this.removeEventListener('connectionstatechange', + this._onconnectionstatechange); + delete this._onconnectionstatechange; + } + if (cb) { + this.addEventListener('connectionstatechange', + this._onconnectionstatechange = cb); + } + }, + enumerable: true, + configurable: true + }); + + ['setLocalDescription', 'setRemoteDescription'].forEach((method) => { + const origMethod = proto[method]; + proto[method] = function() { + if (!this._connectionstatechangepoly) { + this._connectionstatechangepoly = e => { + const pc = e.target; + if (pc._lastConnectionState !== pc.connectionState) { + pc._lastConnectionState = pc.connectionState; + const newEvent = new Event('connectionstatechange', e); + pc.dispatchEvent(newEvent); + } + return e; + }; + this.addEventListener('iceconnectionstatechange', + this._connectionstatechangepoly); + } + return origMethod.apply(this, arguments); + }; + }); + } + + function removeExtmapAllowMixed(window, browserDetails) { + /* remove a=extmap-allow-mixed for webrtc.org < M71 */ + if (!window.RTCPeerConnection) { + return; + } + if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) { + return; + } + if (browserDetails.browser === 'safari' && browserDetails.version >= 605) { + return; + } + const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription; + window.RTCPeerConnection.prototype.setRemoteDescription = + function setRemoteDescription(desc) { + if (desc && desc.sdp && desc.sdp.indexOf('\na=extmap-allow-mixed') !== -1) { + const sdp = desc.sdp.split('\n').filter((line) => { + return line.trim() !== 'a=extmap-allow-mixed'; + }).join('\n'); + // Safari enforces read-only-ness of RTCSessionDescription fields. + if (window.RTCSessionDescription && + desc instanceof window.RTCSessionDescription) { + arguments[0] = new window.RTCSessionDescription({ + type: desc.type, + sdp, + }); + } else { + desc.sdp = sdp; + } + } + return nativeSRD.apply(this, arguments); + }; + } + + function shimAddIceCandidateNullOrEmpty(window, browserDetails) { + // Support for addIceCandidate(null or undefined) + // as well as addIceCandidate({candidate: "", ...}) + // https://bugs.chromium.org/p/chromium/issues/detail?id=978582 + // Note: must be called before other polyfills which change the signature. + if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) { + return; + } + const nativeAddIceCandidate = + window.RTCPeerConnection.prototype.addIceCandidate; + if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) { + return; + } + window.RTCPeerConnection.prototype.addIceCandidate = + function addIceCandidate() { + if (!arguments[0]) { + if (arguments[1]) { + arguments[1].apply(null); + } + return Promise.resolve(); + } + // Firefox 68+ emits and processes {candidate: "", ...}, ignore + // in older versions. + // Native support for ignoring exists for Chrome M77+. + // Safari ignores as well, exact version unknown but works in the same + // version that also ignores addIceCandidate(null). + if (((browserDetails.browser === 'chrome' && browserDetails.version < 78) + || (browserDetails.browser === 'firefox' + && browserDetails.version < 68) + || (browserDetails.browser === 'safari')) + && arguments[0] && arguments[0].candidate === '') { + return Promise.resolve(); + } + return nativeAddIceCandidate.apply(this, arguments); + }; + } + + var commonShim = /*#__PURE__*/Object.freeze({ + __proto__: null, + shimRTCIceCandidate: shimRTCIceCandidate, + shimMaxMessageSize: shimMaxMessageSize, + shimSendThrowTypeError: shimSendThrowTypeError, + shimConnectionState: shimConnectionState, + removeExtmapAllowMixed: removeExtmapAllowMixed, + shimAddIceCandidateNullOrEmpty: shimAddIceCandidateNullOrEmpty + }); + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + // Shimming starts here. + function adapterFactory({window} = {}, options = { + shimChrome: true, + shimFirefox: true, + shimEdge: true, + shimSafari: true, + }) { + // Utils. + const logging = log$1; + const browserDetails = detectBrowser(window); + + const adapter = { + browserDetails, + commonShim, + extractVersion: extractVersion, + disableLog: disableLog, + disableWarnings: disableWarnings + }; + + // Shim browser if found. + switch (browserDetails.browser) { + case 'chrome': + if (!chromeShim || !shimPeerConnection$2 || + !options.shimChrome) { + logging('Chrome shim is not included in this adapter release.'); + return adapter; + } + if (browserDetails.version === null) { + logging('Chrome shim can not determine version, not shimming.'); + return adapter; + } + logging('adapter.js shimming chrome.'); + // Export to the adapter global object visible in the browser. + adapter.browserShim = chromeShim; + + // Must be called before shimPeerConnection. + shimAddIceCandidateNullOrEmpty(window, browserDetails); + + shimGetUserMedia$3(window, browserDetails); + shimMediaStream(window); + shimPeerConnection$2(window, browserDetails); + shimOnTrack$1(window); + shimAddTrackRemoveTrack(window, browserDetails); + shimGetSendersWithDtmf(window); + shimGetStats(window); + shimSenderReceiverGetStats(window); + fixNegotiationNeeded(window, browserDetails); + + shimRTCIceCandidate(window); + shimConnectionState(window); + shimMaxMessageSize(window, browserDetails); + shimSendThrowTypeError(window); + removeExtmapAllowMixed(window, browserDetails); + break; + case 'firefox': + if (!firefoxShim || !shimPeerConnection || + !options.shimFirefox) { + logging('Firefox shim is not included in this adapter release.'); + return adapter; + } + logging('adapter.js shimming firefox.'); + // Export to the adapter global object visible in the browser. + adapter.browserShim = firefoxShim; + + // Must be called before shimPeerConnection. + shimAddIceCandidateNullOrEmpty(window, browserDetails); + + shimGetUserMedia$1(window, browserDetails); + shimPeerConnection(window, browserDetails); + shimOnTrack(window); + shimRemoveStream(window); + shimSenderGetStats(window); + shimReceiverGetStats(window); + shimRTCDataChannel(window); + shimAddTransceiver(window); + shimGetParameters(window); + shimCreateOffer(window); + shimCreateAnswer(window); + + shimRTCIceCandidate(window); + shimConnectionState(window); + shimMaxMessageSize(window, browserDetails); + shimSendThrowTypeError(window); + break; + case 'edge': + if (!edgeShim || !shimPeerConnection$1 || !options.shimEdge) { + logging('MS edge shim is not included in this adapter release.'); + return adapter; + } + logging('adapter.js shimming edge.'); + // Export to the adapter global object visible in the browser. + adapter.browserShim = edgeShim; + + shimGetUserMedia$2(window); + shimGetDisplayMedia$1(window); + shimPeerConnection$1(window, browserDetails); + shimReplaceTrack(window); + + // the edge shim implements the full RTCIceCandidate object. + + shimMaxMessageSize(window, browserDetails); + shimSendThrowTypeError(window); + break; + case 'safari': + if (!safariShim || !options.shimSafari) { + logging('Safari shim is not included in this adapter release.'); + return adapter; + } + logging('adapter.js shimming safari.'); + // Export to the adapter global object visible in the browser. + adapter.browserShim = safariShim; + + // Must be called before shimCallbackAPI. + shimAddIceCandidateNullOrEmpty(window, browserDetails); + + shimRTCIceServerUrls(window); + shimCreateOfferLegacy(window); + shimCallbacksAPI(window); + shimLocalStreamsAPI(window); + shimRemoteStreamsAPI(window); + shimTrackEventTransceiver(window); + shimGetUserMedia(window); + shimAudioContext(window); + + shimRTCIceCandidate(window); + shimMaxMessageSize(window, browserDetails); + shimSendThrowTypeError(window); + removeExtmapAllowMixed(window, browserDetails); + break; + default: + logging('Unsupported browser!'); + break; + } + + return adapter; + } + + /* + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. + */ + + adapterFactory({window: typeof window === 'undefined' ? undefined : window}); + + /** + * @class AudioTrackConstraints + * @classDesc Constraints for creating an audio MediaStreamTrack. + * @memberof Owt.Base + * @constructor + * @param {Owt.Base.AudioSourceInfo} source Source info of this audio track. + */ + class AudioTrackConstraints { + // eslint-disable-next-line require-jsdoc + constructor(source) { + if (!Object.values(AudioSourceInfo).some(v => v === source)) { + throw new TypeError('Invalid source.'); + } + /** + * @member {string} source + * @memberof Owt.Base.AudioTrackConstraints + * @desc Values could be "mic", "screen-cast", "file" or "mixed". + * @instance + */ + this.source = source; + /** + * @member {string} deviceId + * @memberof Owt.Base.AudioTrackConstraints + * @desc Do not provide deviceId if source is not "mic". + * @instance + * @see https://w3c.github.io/mediacapture-main/#def-constraint-deviceId + */ + this.deviceId = undefined; + } + } + + /** + * @class VideoTrackConstraints + * @classDesc Constraints for creating a video MediaStreamTrack. + * @memberof Owt.Base + * @constructor + * @param {Owt.Base.VideoSourceInfo} source Source info of this video track. + */ + class VideoTrackConstraints { + // eslint-disable-next-line require-jsdoc + constructor(source) { + if (!Object.values(VideoSourceInfo).some(v => v === source)) { + throw new TypeError('Invalid source.'); + } + /** + * @member {string} source + * @memberof Owt.Base.VideoTrackConstraints + * @desc Values could be "camera", "screen-cast", "file" or "mixed". + * @instance + */ + this.source = source; + /** + * @member {string} deviceId + * @memberof Owt.Base.VideoTrackConstraints + * @desc Do not provide deviceId if source is not "camera". + * @instance + * @see https://w3c.github.io/mediacapture-main/#def-constraint-deviceId + */ + + this.deviceId = undefined; + + /** + * @member {Owt.Base.Resolution} resolution + * @memberof Owt.Base.VideoTrackConstraints + * @instance + */ + this.resolution = undefined; + + /** + * @member {number} frameRate + * @memberof Owt.Base.VideoTrackConstraints + * @instance + */ + this.frameRate = undefined; + } + } + /** + * @class StreamConstraints + * @classDesc Constraints for creating a MediaStream from screen mic and camera. + * @memberof Owt.Base + * @constructor + * @param {?Owt.Base.AudioTrackConstraints} audioConstraints + * @param {?Owt.Base.VideoTrackConstraints} videoConstraints + */ + class StreamConstraints { + // eslint-disable-next-line require-jsdoc + constructor(audioConstraints = false, videoConstraints = false) { + /** + * @member {Owt.Base.MediaStreamTrackDeviceConstraintsForAudio} audio + * @memberof Owt.Base.MediaStreamDeviceConstraints + * @instance + */ + this.audio = audioConstraints; + /** + * @member {Owt.Base.MediaStreamTrackDeviceConstraintsForVideo} Video + * @memberof Owt.Base.MediaStreamDeviceConstraints + * @instance + */ + this.video = videoConstraints; + } + } + + // eslint-disable-next-line require-jsdoc + function isVideoConstrainsForScreenCast(constraints) { + return typeof constraints.video === 'object' && constraints.video.source === VideoSourceInfo.SCREENCAST; + } + + /** + * @class MediaStreamFactory + * @classDesc A factory to create MediaStream. You can also create MediaStream by yourself. + * @memberof Owt.Base + */ + class MediaStreamFactory { + /** + * @function createMediaStream + * @static + * @desc Create a MediaStream with given constraints. If you want to create a MediaStream for screen cast, please make sure both audio and video's source are "screen-cast". + * @memberof Owt.Base.MediaStreamFactory + * @return {Promise} Return a promise that is resolved when stream is successfully created, or rejected if one of the following error happened: + * - One or more parameters cannot be satisfied. + * - Specified device is busy. + * - Cannot obtain necessary permission or operation is canceled by user. + * - Video source is screen cast, while audio source is not. + * - Audio source is screen cast, while video source is disabled. + * @param {Owt.Base.StreamConstraints} constraints + */ + static createMediaStream(constraints) { + if (typeof constraints !== 'object' || !constraints.audio && !constraints.video) { + return Promise.reject(new TypeError('Invalid constrains')); + } + if (!isVideoConstrainsForScreenCast(constraints) && typeof constraints.audio === 'object' && constraints.audio.source === AudioSourceInfo.SCREENCAST) { + return Promise.reject(new TypeError('Cannot share screen without video.')); + } + if (isVideoConstrainsForScreenCast(constraints) && !isChrome() && !isFirefox()) { + return Promise.reject(new TypeError('Screen sharing only supports Chrome and Firefox.')); + } + if (isVideoConstrainsForScreenCast(constraints) && typeof constraints.audio === 'object' && constraints.audio.source !== AudioSourceInfo.SCREENCAST) { + return Promise.reject(new TypeError('Cannot capture video from screen cast while capture audio from' + ' other source.')); + } + + // Check and convert constraints. + if (!constraints.audio && !constraints.video) { + return Promise.reject(new TypeError('At least one of audio and video must be requested.')); + } + const mediaConstraints = Object.create({}); + if (typeof constraints.audio === 'object' && constraints.audio.source === AudioSourceInfo.MIC) { + mediaConstraints.audio = Object.create({}); + if (isEdge()) { + mediaConstraints.audio.deviceId = constraints.audio.deviceId; + } else { + mediaConstraints.audio.deviceId = { + exact: constraints.audio.deviceId + }; + } + } else { + if (constraints.audio.source === AudioSourceInfo.SCREENCAST) { + mediaConstraints.audio = true; + } else { + mediaConstraints.audio = constraints.audio; + } + } + if (typeof constraints.video === 'object') { + mediaConstraints.video = Object.create({}); + if (typeof constraints.video.frameRate === 'number') { + mediaConstraints.video.frameRate = constraints.video.frameRate; + } + if (constraints.video.resolution && constraints.video.resolution.width && constraints.video.resolution.height) { + if (constraints.video.source === VideoSourceInfo.SCREENCAST) { + mediaConstraints.video.width = constraints.video.resolution.width; + mediaConstraints.video.height = constraints.video.resolution.height; + } else { + mediaConstraints.video.width = Object.create({}); + mediaConstraints.video.width.exact = constraints.video.resolution.width; + mediaConstraints.video.height = Object.create({}); + mediaConstraints.video.height.exact = constraints.video.resolution.height; + } + } + if (typeof constraints.video.deviceId === 'string') { + mediaConstraints.video.deviceId = { + exact: constraints.video.deviceId + }; + } + if (isFirefox() && constraints.video.source === VideoSourceInfo.SCREENCAST) { + mediaConstraints.video.mediaSource = 'screen'; + } + } else { + mediaConstraints.video = constraints.video; + } + if (isVideoConstrainsForScreenCast(constraints)) { + return navigator.mediaDevices.getDisplayMedia(mediaConstraints); + } else { + return navigator.mediaDevices.getUserMedia(mediaConstraints); + } + } + } + + // Copyright (C) <2018> Intel Corporation + + var media = /*#__PURE__*/Object.freeze({ + __proto__: null, + AudioTrackConstraints: AudioTrackConstraints, + VideoTrackConstraints: VideoTrackConstraints, + StreamConstraints: StreamConstraints, + MediaStreamFactory: MediaStreamFactory, + AudioSourceInfo: AudioSourceInfo, + VideoSourceInfo: VideoSourceInfo, + TrackKind: TrackKind, + Resolution: Resolution + }); + + let logger; + let errorLogger; + function setLogger() { + /*eslint-disable */ + logger = console.log; + errorLogger = console.error; + /*eslint-enable */ + } + function log(message, ...optionalParams) { + if (logger) { + logger(message, ...optionalParams); + } + } + function error(message, ...optionalParams) { + if (errorLogger) { + errorLogger(message, ...optionalParams); + } + } + + class Event$1 { + constructor(type) { + this.listener = {}; + this.type = type | ''; + } + on(event, fn) { + if (!this.listener[event]) { + this.listener[event] = []; + } + this.listener[event].push(fn); + return true; + } + off(event, fn) { + if (this.listener[event]) { + var index = this.listener[event].indexOf(fn); + if (index > -1) { + this.listener[event].splice(index, 1); + } + return true; + } + return false; + } + offAll() { + this.listener = {}; + } + dispatch(event, data) { + if (this.listener[event]) { + this.listener[event].map(each => { + each.apply(null, [data]); + }); + return true; + } + return false; + } + } + + var bind = function bind(fn, thisArg) { + return function wrap() { + var args = new Array(arguments.length); + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i]; + } + return fn.apply(thisArg, args); + }; + }; + + // utils is a library of generic helper functions non-specific to axios + + var toString = Object.prototype.toString; + + // eslint-disable-next-line func-names + var kindOf = (function(cache) { + // eslint-disable-next-line func-names + return function(thing) { + var str = toString.call(thing); + return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); + }; + })(Object.create(null)); + + function kindOfTest(type) { + type = type.toLowerCase(); + return function isKindOf(thing) { + return kindOf(thing) === type; + }; + } + + /** + * Determine if a value is an Array + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Array, otherwise false + */ + function isArray(val) { + return Array.isArray(val); + } + + /** + * Determine if a value is undefined + * + * @param {Object} val The value to test + * @returns {boolean} True if the value is undefined, otherwise false + */ + function isUndefined(val) { + return typeof val === 'undefined'; + } + + /** + * Determine if a value is a Buffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Buffer, otherwise false + */ + function isBuffer(val) { + return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) + && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val); + } + + /** + * Determine if a value is an ArrayBuffer + * + * @function + * @param {Object} val The value to test + * @returns {boolean} True if value is an ArrayBuffer, otherwise false + */ + var isArrayBuffer = kindOfTest('ArrayBuffer'); + + + /** + * Determine if a value is a view on an ArrayBuffer + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false + */ + function isArrayBufferView(val) { + var result; + if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) { + result = ArrayBuffer.isView(val); + } else { + result = (val) && (val.buffer) && (isArrayBuffer(val.buffer)); + } + return result; + } + + /** + * Determine if a value is a String + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a String, otherwise false + */ + function isString(val) { + return typeof val === 'string'; + } + + /** + * Determine if a value is a Number + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Number, otherwise false + */ + function isNumber(val) { + return typeof val === 'number'; + } + + /** + * Determine if a value is an Object + * + * @param {Object} val The value to test + * @returns {boolean} True if value is an Object, otherwise false + */ + function isObject(val) { + return val !== null && typeof val === 'object'; + } + + /** + * Determine if a value is a plain Object + * + * @param {Object} val The value to test + * @return {boolean} True if value is a plain Object, otherwise false + */ + function isPlainObject(val) { + if (kindOf(val) !== 'object') { + return false; + } + + var prototype = Object.getPrototypeOf(val); + return prototype === null || prototype === Object.prototype; + } + + /** + * Determine if a value is a Date + * + * @function + * @param {Object} val The value to test + * @returns {boolean} True if value is a Date, otherwise false + */ + var isDate = kindOfTest('Date'); + + /** + * Determine if a value is a File + * + * @function + * @param {Object} val The value to test + * @returns {boolean} True if value is a File, otherwise false + */ + var isFile = kindOfTest('File'); + + /** + * Determine if a value is a Blob + * + * @function + * @param {Object} val The value to test + * @returns {boolean} True if value is a Blob, otherwise false + */ + var isBlob = kindOfTest('Blob'); + + /** + * Determine if a value is a FileList + * + * @function + * @param {Object} val The value to test + * @returns {boolean} True if value is a File, otherwise false + */ + var isFileList = kindOfTest('FileList'); + + /** + * Determine if a value is a Function + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Function, otherwise false + */ + function isFunction(val) { + return toString.call(val) === '[object Function]'; + } + + /** + * Determine if a value is a Stream + * + * @param {Object} val The value to test + * @returns {boolean} True if value is a Stream, otherwise false + */ + function isStream(val) { + return isObject(val) && isFunction(val.pipe); + } + + /** + * Determine if a value is a FormData + * + * @param {Object} thing The value to test + * @returns {boolean} True if value is an FormData, otherwise false + */ + function isFormData(thing) { + var pattern = '[object FormData]'; + return thing && ( + (typeof FormData === 'function' && thing instanceof FormData) || + toString.call(thing) === pattern || + (isFunction(thing.toString) && thing.toString() === pattern) + ); + } + + /** + * Determine if a value is a URLSearchParams object + * @function + * @param {Object} val The value to test + * @returns {boolean} True if value is a URLSearchParams object, otherwise false + */ + var isURLSearchParams = kindOfTest('URLSearchParams'); + + /** + * Trim excess whitespace off the beginning and end of a string + * + * @param {String} str The String to trim + * @returns {String} The String freed of excess whitespace + */ + function trim(str) { + return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); + } + + /** + * Determine if we're running in a standard browser environment + * + * This allows axios to run in a web worker, and react-native. + * Both environments support XMLHttpRequest, but not fully standard globals. + * + * web workers: + * typeof window -> undefined + * typeof document -> undefined + * + * react-native: + * navigator.product -> 'ReactNative' + * nativescript + * navigator.product -> 'NativeScript' or 'NS' + */ + function isStandardBrowserEnv() { + if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' || + navigator.product === 'NativeScript' || + navigator.product === 'NS')) { + return false; + } + return ( + typeof window !== 'undefined' && + typeof document !== 'undefined' + ); + } + + /** + * Iterate over an Array or an Object invoking a function for each item. + * + * If `obj` is an Array callback will be called passing + * the value, index, and complete array for each item. + * + * If 'obj' is an Object callback will be called passing + * the value, key, and complete object for each property. + * + * @param {Object|Array} obj The object to iterate + * @param {Function} fn The callback to invoke for each item + */ + function forEach(obj, fn) { + // Don't bother if no value provided + if (obj === null || typeof obj === 'undefined') { + return; + } + + // Force an array if not already something iterable + if (typeof obj !== 'object') { + /*eslint no-param-reassign:0*/ + obj = [obj]; + } + + if (isArray(obj)) { + // Iterate over array values + for (var i = 0, l = obj.length; i < l; i++) { + fn.call(null, obj[i], i, obj); + } + } else { + // Iterate over object keys + for (var key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + fn.call(null, obj[key], key, obj); + } + } + } + } + + /** + * Accepts varargs expecting each argument to be an object, then + * immutably merges the properties of each object and returns result. + * + * When multiple objects contain the same key the later object in + * the arguments list will take precedence. + * + * Example: + * + * ```js + * var result = merge({foo: 123}, {foo: 456}); + * console.log(result.foo); // outputs 456 + * ``` + * + * @param {Object} obj1 Object to merge + * @returns {Object} Result of all merge properties + */ + function merge(/* obj1, obj2, obj3, ... */) { + var result = {}; + function assignValue(val, key) { + if (isPlainObject(result[key]) && isPlainObject(val)) { + result[key] = merge(result[key], val); + } else if (isPlainObject(val)) { + result[key] = merge({}, val); + } else if (isArray(val)) { + result[key] = val.slice(); + } else { + result[key] = val; + } + } + + for (var i = 0, l = arguments.length; i < l; i++) { + forEach(arguments[i], assignValue); + } + return result; + } + + /** + * Extends object a by mutably adding to it the properties of object b. + * + * @param {Object} a The object to be extended + * @param {Object} b The object to copy properties from + * @param {Object} thisArg The object to bind function to + * @return {Object} The resulting value of object a + */ + function extend(a, b, thisArg) { + forEach(b, function assignValue(val, key) { + if (thisArg && typeof val === 'function') { + a[key] = bind(val, thisArg); + } else { + a[key] = val; + } + }); + return a; + } + + /** + * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM) + * + * @param {string} content with BOM + * @return {string} content value without BOM + */ + function stripBOM(content) { + if (content.charCodeAt(0) === 0xFEFF) { + content = content.slice(1); + } + return content; + } + + /** + * Inherit the prototype methods from one constructor into another + * @param {function} constructor + * @param {function} superConstructor + * @param {object} [props] + * @param {object} [descriptors] + */ + + function inherits(constructor, superConstructor, props, descriptors) { + constructor.prototype = Object.create(superConstructor.prototype, descriptors); + constructor.prototype.constructor = constructor; + props && Object.assign(constructor.prototype, props); + } + + /** + * Resolve object with deep prototype chain to a flat object + * @param {Object} sourceObj source object + * @param {Object} [destObj] + * @param {Function} [filter] + * @returns {Object} + */ + + function toFlatObject(sourceObj, destObj, filter) { + var props; + var i; + var prop; + var merged = {}; + + destObj = destObj || {}; + + do { + props = Object.getOwnPropertyNames(sourceObj); + i = props.length; + while (i-- > 0) { + prop = props[i]; + if (!merged[prop]) { + destObj[prop] = sourceObj[prop]; + merged[prop] = true; + } + } + sourceObj = Object.getPrototypeOf(sourceObj); + } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype); + + return destObj; + } + + /* + * determines whether a string ends with the characters of a specified string + * @param {String} str + * @param {String} searchString + * @param {Number} [position= 0] + * @returns {boolean} + */ + function endsWith(str, searchString, position) { + str = String(str); + if (position === undefined || position > str.length) { + position = str.length; + } + position -= searchString.length; + var lastIndex = str.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + } + + + /** + * Returns new array from array like object + * @param {*} [thing] + * @returns {Array} + */ + function toArray(thing) { + if (!thing) return null; + var i = thing.length; + if (isUndefined(i)) return null; + var arr = new Array(i); + while (i-- > 0) { + arr[i] = thing[i]; + } + return arr; + } + + // eslint-disable-next-line func-names + var isTypedArray = (function(TypedArray) { + // eslint-disable-next-line func-names + return function(thing) { + return TypedArray && thing instanceof TypedArray; + }; + })(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array)); + + var utils = { + isArray: isArray, + isArrayBuffer: isArrayBuffer, + isBuffer: isBuffer, + isFormData: isFormData, + isArrayBufferView: isArrayBufferView, + isString: isString, + isNumber: isNumber, + isObject: isObject, + isPlainObject: isPlainObject, + isUndefined: isUndefined, + isDate: isDate, + isFile: isFile, + isBlob: isBlob, + isFunction: isFunction, + isStream: isStream, + isURLSearchParams: isURLSearchParams, + isStandardBrowserEnv: isStandardBrowserEnv, + forEach: forEach, + merge: merge, + extend: extend, + trim: trim, + stripBOM: stripBOM, + inherits: inherits, + toFlatObject: toFlatObject, + kindOf: kindOf, + kindOfTest: kindOfTest, + endsWith: endsWith, + toArray: toArray, + isTypedArray: isTypedArray, + isFileList: isFileList + }; + + function encode(val) { + return encodeURIComponent(val). + replace(/%3A/gi, ':'). + replace(/%24/g, '$'). + replace(/%2C/gi, ','). + replace(/%20/g, '+'). + replace(/%5B/gi, '['). + replace(/%5D/gi, ']'); + } + + /** + * Build a URL by appending params to the end + * + * @param {string} url The base of the url (e.g., http://www.google.com) + * @param {object} [params] The params to be appended + * @returns {string} The formatted url + */ + var buildURL = function buildURL(url, params, paramsSerializer) { + /*eslint no-param-reassign:0*/ + if (!params) { + return url; + } + + var serializedParams; + if (paramsSerializer) { + serializedParams = paramsSerializer(params); + } else if (utils.isURLSearchParams(params)) { + serializedParams = params.toString(); + } else { + var parts = []; + + utils.forEach(params, function serialize(val, key) { + if (val === null || typeof val === 'undefined') { + return; + } + + if (utils.isArray(val)) { + key = key + '[]'; + } else { + val = [val]; + } + + utils.forEach(val, function parseValue(v) { + if (utils.isDate(v)) { + v = v.toISOString(); + } else if (utils.isObject(v)) { + v = JSON.stringify(v); + } + parts.push(encode(key) + '=' + encode(v)); + }); + }); + + serializedParams = parts.join('&'); + } + + if (serializedParams) { + var hashmarkIndex = url.indexOf('#'); + if (hashmarkIndex !== -1) { + url = url.slice(0, hashmarkIndex); + } + + url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams; + } + + return url; + }; + + function InterceptorManager() { + this.handlers = []; + } + + /** + * Add a new interceptor to the stack + * + * @param {Function} fulfilled The function to handle `then` for a `Promise` + * @param {Function} rejected The function to handle `reject` for a `Promise` + * + * @return {Number} An ID used to remove interceptor later + */ + InterceptorManager.prototype.use = function use(fulfilled, rejected, options) { + this.handlers.push({ + fulfilled: fulfilled, + rejected: rejected, + synchronous: options ? options.synchronous : false, + runWhen: options ? options.runWhen : null + }); + return this.handlers.length - 1; + }; + + /** + * Remove an interceptor from the stack + * + * @param {Number} id The ID that was returned by `use` + */ + InterceptorManager.prototype.eject = function eject(id) { + if (this.handlers[id]) { + this.handlers[id] = null; + } + }; + + /** + * Iterate over all the registered interceptors + * + * This method is particularly useful for skipping over any + * interceptors that may have become `null` calling `eject`. + * + * @param {Function} fn The function to call for each interceptor + */ + InterceptorManager.prototype.forEach = function forEach(fn) { + utils.forEach(this.handlers, function forEachHandler(h) { + if (h !== null) { + fn(h); + } + }); + }; + + var InterceptorManager_1 = InterceptorManager; + + var normalizeHeaderName = function normalizeHeaderName(headers, normalizedName) { + utils.forEach(headers, function processHeader(value, name) { + if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) { + headers[normalizedName] = value; + delete headers[name]; + } + }); + }; + + /** + * Create an Error with the specified message, config, error code, request and response. + * + * @param {string} message The error message. + * @param {string} [code] The error code (for example, 'ECONNABORTED'). + * @param {Object} [config] The config. + * @param {Object} [request] The request. + * @param {Object} [response] The response. + * @returns {Error} The created error. + */ + function AxiosError(message, code, config, request, response) { + Error.call(this); + this.message = message; + this.name = 'AxiosError'; + code && (this.code = code); + config && (this.config = config); + request && (this.request = request); + response && (this.response = response); + } + + utils.inherits(AxiosError, Error, { + toJSON: function toJSON() { + return { + // Standard + message: this.message, + name: this.name, + // Microsoft + description: this.description, + number: this.number, + // Mozilla + fileName: this.fileName, + lineNumber: this.lineNumber, + columnNumber: this.columnNumber, + stack: this.stack, + // Axios + config: this.config, + code: this.code, + status: this.response && this.response.status ? this.response.status : null + }; + } + }); + + var prototype = AxiosError.prototype; + var descriptors = {}; + + [ + 'ERR_BAD_OPTION_VALUE', + 'ERR_BAD_OPTION', + 'ECONNABORTED', + 'ETIMEDOUT', + 'ERR_NETWORK', + 'ERR_FR_TOO_MANY_REDIRECTS', + 'ERR_DEPRECATED', + 'ERR_BAD_RESPONSE', + 'ERR_BAD_REQUEST', + 'ERR_CANCELED' + // eslint-disable-next-line func-names + ].forEach(function(code) { + descriptors[code] = {value: code}; + }); + + Object.defineProperties(AxiosError, descriptors); + Object.defineProperty(prototype, 'isAxiosError', {value: true}); + + // eslint-disable-next-line func-names + AxiosError.from = function(error, code, config, request, response, customProps) { + var axiosError = Object.create(prototype); + + utils.toFlatObject(error, axiosError, function filter(obj) { + return obj !== Error.prototype; + }); + + AxiosError.call(axiosError, error.message, code, config, request, response); + + axiosError.name = error.name; + + customProps && Object.assign(axiosError, customProps); + + return axiosError; + }; + + var AxiosError_1 = AxiosError; + + var transitional = { + silentJSONParsing: true, + forcedJSONParsing: true, + clarifyTimeoutError: false + }; + + /** + * Convert a data object to FormData + * @param {Object} obj + * @param {?Object} [formData] + * @returns {Object} + **/ + + function toFormData(obj, formData) { + // eslint-disable-next-line no-param-reassign + formData = formData || new FormData(); + + var stack = []; + + function convertValue(value) { + if (value === null) return ''; + + if (utils.isDate(value)) { + return value.toISOString(); + } + + if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) { + return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value); + } + + return value; + } + + function build(data, parentKey) { + if (utils.isPlainObject(data) || utils.isArray(data)) { + if (stack.indexOf(data) !== -1) { + throw Error('Circular reference detected in ' + parentKey); + } + + stack.push(data); + + utils.forEach(data, function each(value, key) { + if (utils.isUndefined(value)) return; + var fullKey = parentKey ? parentKey + '.' + key : key; + var arr; + + if (value && !parentKey && typeof value === 'object') { + if (utils.endsWith(key, '{}')) { + // eslint-disable-next-line no-param-reassign + value = JSON.stringify(value); + } else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) { + // eslint-disable-next-line func-names + arr.forEach(function(el) { + !utils.isUndefined(el) && formData.append(fullKey, convertValue(el)); + }); + return; + } + } + + build(value, fullKey); + }); + + stack.pop(); + } else { + formData.append(parentKey, convertValue(data)); + } + } + + build(obj); + + return formData; + } + + var toFormData_1 = toFormData; + + /** + * Resolve or reject a Promise based on response status. + * + * @param {Function} resolve A function that resolves the promise. + * @param {Function} reject A function that rejects the promise. + * @param {object} response The response. + */ + var settle = function settle(resolve, reject, response) { + var validateStatus = response.config.validateStatus; + if (!response.status || !validateStatus || validateStatus(response.status)) { + resolve(response); + } else { + reject(new AxiosError_1( + 'Request failed with status code ' + response.status, + [AxiosError_1.ERR_BAD_REQUEST, AxiosError_1.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], + response.config, + response.request, + response + )); + } + }; + + var cookies = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs support document.cookie + (function standardBrowserEnv() { + return { + write: function write(name, value, expires, path, domain, secure) { + var cookie = []; + cookie.push(name + '=' + encodeURIComponent(value)); + + if (utils.isNumber(expires)) { + cookie.push('expires=' + new Date(expires).toGMTString()); + } + + if (utils.isString(path)) { + cookie.push('path=' + path); + } + + if (utils.isString(domain)) { + cookie.push('domain=' + domain); + } + + if (secure === true) { + cookie.push('secure'); + } + + document.cookie = cookie.join('; '); + }, + + read: function read(name) { + var match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, + + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); + } + }; + })() : + + // Non standard browser env (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return { + write: function write() {}, + read: function read() { return null; }, + remove: function remove() {} + }; + })() + ); + + /** + * Determines whether the specified URL is absolute + * + * @param {string} url The URL to test + * @returns {boolean} True if the specified URL is absolute, otherwise false + */ + var isAbsoluteURL = function isAbsoluteURL(url) { + // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL). + // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed + // by any combination of letters, digits, plus, period, or hyphen. + return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); + }; + + /** + * Creates a new URL by combining the specified URLs + * + * @param {string} baseURL The base URL + * @param {string} relativeURL The relative URL + * @returns {string} The combined URL + */ + var combineURLs = function combineURLs(baseURL, relativeURL) { + return relativeURL + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') + : baseURL; + }; + + /** + * Creates a new URL by combining the baseURL with the requestedURL, + * only when the requestedURL is not already an absolute URL. + * If the requestURL is absolute, this function returns the requestedURL untouched. + * + * @param {string} baseURL The base URL + * @param {string} requestedURL Absolute or relative URL to combine + * @returns {string} The combined full path + */ + var buildFullPath = function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { + return combineURLs(baseURL, requestedURL); + } + return requestedURL; + }; + + // Headers whose duplicates are ignored by node + // c.f. https://nodejs.org/api/http.html#http_message_headers + var ignoreDuplicateOf = [ + 'age', 'authorization', 'content-length', 'content-type', 'etag', + 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', + 'last-modified', 'location', 'max-forwards', 'proxy-authorization', + 'referer', 'retry-after', 'user-agent' + ]; + + /** + * Parse headers into an object + * + * ``` + * Date: Wed, 27 Aug 2014 08:58:49 GMT + * Content-Type: application/json + * Connection: keep-alive + * Transfer-Encoding: chunked + * ``` + * + * @param {String} headers Headers needing to be parsed + * @returns {Object} Headers parsed into an object + */ + var parseHeaders = function parseHeaders(headers) { + var parsed = {}; + var key; + var val; + var i; + + if (!headers) { return parsed; } + + utils.forEach(headers.split('\n'), function parser(line) { + i = line.indexOf(':'); + key = utils.trim(line.substr(0, i)).toLowerCase(); + val = utils.trim(line.substr(i + 1)); + + if (key) { + if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) { + return; + } + if (key === 'set-cookie') { + parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]); + } else { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; + } + } + }); + + return parsed; + }; + + var isURLSameOrigin = ( + utils.isStandardBrowserEnv() ? + + // Standard browser envs have full support of the APIs needed to test + // whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + var msie = /(msie|trident)/i.test(navigator.userAgent); + var urlParsingNode = document.createElement('a'); + var originURL; + + /** + * Parse a URL to discover it's components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + var href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })() + ); + + /** + * A `CanceledError` is an object that is thrown when an operation is canceled. + * + * @class + * @param {string=} message The message. + */ + function CanceledError(message) { + // eslint-disable-next-line no-eq-null,eqeqeq + AxiosError_1.call(this, message == null ? 'canceled' : message, AxiosError_1.ERR_CANCELED); + this.name = 'CanceledError'; + } + + utils.inherits(CanceledError, AxiosError_1, { + __CANCEL__: true + }); + + var CanceledError_1 = CanceledError; + + var parseProtocol = function parseProtocol(url) { + var match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); + return match && match[1] || ''; + }; + + var xhr = function xhrAdapter(config) { + return new Promise(function dispatchXhrRequest(resolve, reject) { + var requestData = config.data; + var requestHeaders = config.headers; + var responseType = config.responseType; + var onCanceled; + function done() { + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } + + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } + + if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) { + delete requestHeaders['Content-Type']; // Let the browser set it + } + + var request = new XMLHttpRequest(); + + // HTTP basic authentication + if (config.auth) { + var username = config.auth.username || ''; + var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password); + } + + var fullPath = buildFullPath(config.baseURL, config.url); + + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); + + // Set the request timeout in MS + request.timeout = config.timeout; + + function onloadend() { + if (!request) { + return; + } + // Prepare the response + var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; + var responseData = !responseType || responseType === 'text' || responseType === 'json' ? + request.responseText : request.response; + var response = { + data: responseData, + status: request.status, + statusText: request.statusText, + headers: responseHeaders, + config: config, + request: request + }; + + settle(function _resolve(value) { + resolve(value); + done(); + }, function _reject(err) { + reject(err); + done(); + }, response); + + // Clean up request + request = null; + } + + if ('onloadend' in request) { + // Use onloadend if available + request.onloadend = onloadend; + } else { + // Listen for ready state to emulate onloadend + request.onreadystatechange = function handleLoad() { + if (!request || request.readyState !== 4) { + return; + } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + // With one exception: request that using file: protocol, most browsers + // will return status as 0 even though it's a successful request + if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) { + return; + } + // readystate handler is calling before onerror or ontimeout handlers, + // so we should call onloadend on the next 'tick' + setTimeout(onloadend); + }; + } + + // Handle browser request cancellation (as opposed to a manual cancellation) + request.onabort = function handleAbort() { + if (!request) { + return; + } + + reject(new AxiosError_1('Request aborted', AxiosError_1.ECONNABORTED, config, request)); + + // Clean up request + request = null; + }; + + // Handle low level network errors + request.onerror = function handleError() { + // Real errors are hidden from us by the browser + // onerror should only fire if it's a network error + reject(new AxiosError_1('Network Error', AxiosError_1.ERR_NETWORK, config, request, request)); + + // Clean up request + request = null; + }; + + // Handle timeout + request.ontimeout = function handleTimeout() { + var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded'; + var transitional$1 = config.transitional || transitional; + if (config.timeoutErrorMessage) { + timeoutErrorMessage = config.timeoutErrorMessage; + } + reject(new AxiosError_1( + timeoutErrorMessage, + transitional$1.clarifyTimeoutError ? AxiosError_1.ETIMEDOUT : AxiosError_1.ECONNABORTED, + config, + request)); + + // Clean up request + request = null; + }; + + // Add xsrf header + // This is only done if running in a standard browser environment. + // Specifically not if we're in a web worker, or react-native. + if (utils.isStandardBrowserEnv()) { + // Add xsrf header + var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ? + cookies.read(config.xsrfCookieName) : + undefined; + + if (xsrfValue) { + requestHeaders[config.xsrfHeaderName] = xsrfValue; + } + } + + // Add headers to the request + if ('setRequestHeader' in request) { + utils.forEach(requestHeaders, function setRequestHeader(val, key) { + if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') { + // Remove Content-Type if data is undefined + delete requestHeaders[key]; + } else { + // Otherwise add header to the request + request.setRequestHeader(key, val); + } + }); + } + + // Add withCredentials to request if needed + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; + } + + // Add responseType to request if needed + if (responseType && responseType !== 'json') { + request.responseType = config.responseType; + } + + // Handle progress if needed + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', config.onDownloadProgress); + } + + // Not all browsers support upload events + if (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', config.onUploadProgress); + } + + if (config.cancelToken || config.signal) { + // Handle cancellation + // eslint-disable-next-line func-names + onCanceled = function(cancel) { + if (!request) { + return; + } + reject(!cancel || (cancel && cancel.type) ? new CanceledError_1() : cancel); + request.abort(); + request = null; + }; + + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); + } + } + + if (!requestData) { + requestData = null; + } + + var protocol = parseProtocol(fullPath); + + if (protocol && [ 'http', 'https', 'file' ].indexOf(protocol) === -1) { + reject(new AxiosError_1('Unsupported protocol ' + protocol + ':', AxiosError_1.ERR_BAD_REQUEST, config)); + return; + } + + + // Send the request + request.send(requestData); + }); + }; + + // eslint-disable-next-line strict + var _null = null; + + var DEFAULT_CONTENT_TYPE = { + 'Content-Type': 'application/x-www-form-urlencoded' + }; + + function setContentTypeIfUnset(headers, value) { + if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) { + headers['Content-Type'] = value; + } + } + + function getDefaultAdapter() { + var adapter; + if (typeof XMLHttpRequest !== 'undefined') { + // For browsers use XHR adapter + adapter = xhr; + } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') { + // For node use HTTP adapter + adapter = xhr; + } + return adapter; + } + + function stringifySafely(rawValue, parser, encoder) { + if (utils.isString(rawValue)) { + try { + (parser || JSON.parse)(rawValue); + return utils.trim(rawValue); + } catch (e) { + if (e.name !== 'SyntaxError') { + throw e; + } + } + } + + return (encoder || JSON.stringify)(rawValue); + } + + var defaults = { + + transitional: transitional, + + adapter: getDefaultAdapter(), + + transformRequest: [function transformRequest(data, headers) { + normalizeHeaderName(headers, 'Accept'); + normalizeHeaderName(headers, 'Content-Type'); + + if (utils.isFormData(data) || + utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) + ) { + return data; + } + if (utils.isArrayBufferView(data)) { + return data.buffer; + } + if (utils.isURLSearchParams(data)) { + setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8'); + return data.toString(); + } + + var isObjectPayload = utils.isObject(data); + var contentType = headers && headers['Content-Type']; + + var isFileList; + + if ((isFileList = utils.isFileList(data)) || (isObjectPayload && contentType === 'multipart/form-data')) { + var _FormData = this.env && this.env.FormData; + return toFormData_1(isFileList ? {'files[]': data} : data, _FormData && new _FormData()); + } else if (isObjectPayload || contentType === 'application/json') { + setContentTypeIfUnset(headers, 'application/json'); + return stringifySafely(data); + } + + return data; + }], + + transformResponse: [function transformResponse(data) { + var transitional = this.transitional || defaults.transitional; + var silentJSONParsing = transitional && transitional.silentJSONParsing; + var forcedJSONParsing = transitional && transitional.forcedJSONParsing; + var strictJSONParsing = !silentJSONParsing && this.responseType === 'json'; + + if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) { + try { + return JSON.parse(data); + } catch (e) { + if (strictJSONParsing) { + if (e.name === 'SyntaxError') { + throw AxiosError_1.from(e, AxiosError_1.ERR_BAD_RESPONSE, this, null, this.response); + } + throw e; + } + } + } + + return data; + }], + + /** + * A timeout in milliseconds to abort a request. If set to 0 (default) a + * timeout is not created. + */ + timeout: 0, + + xsrfCookieName: 'XSRF-TOKEN', + xsrfHeaderName: 'X-XSRF-TOKEN', + + maxContentLength: -1, + maxBodyLength: -1, + + env: { + FormData: _null + }, + + validateStatus: function validateStatus(status) { + return status >= 200 && status < 300; + }, + + headers: { + common: { + 'Accept': 'application/json, text/plain, */*' + } + } + }; + + utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { + defaults.headers[method] = {}; + }); + + utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); + }); + + var defaults_1 = defaults; + + /** + * Transform the data for a request or a response + * + * @param {Object|String} data The data to be transformed + * @param {Array} headers The headers for the request or response + * @param {Array|Function} fns A single function or Array of functions + * @returns {*} The resulting transformed data + */ + var transformData = function transformData(data, headers, fns) { + var context = this || defaults_1; + /*eslint no-param-reassign:0*/ + utils.forEach(fns, function transform(fn) { + data = fn.call(context, data, headers); + }); + + return data; + }; + + var isCancel = function isCancel(value) { + return !!(value && value.__CANCEL__); + }; + + /** + * Throws a `CanceledError` if cancellation has been requested. + */ + function throwIfCancellationRequested(config) { + if (config.cancelToken) { + config.cancelToken.throwIfRequested(); + } + + if (config.signal && config.signal.aborted) { + throw new CanceledError_1(); + } + } + + /** + * Dispatch a request to the server using the configured adapter. + * + * @param {object} config The config that is to be used for the request + * @returns {Promise} The Promise to be fulfilled + */ + var dispatchRequest = function dispatchRequest(config) { + throwIfCancellationRequested(config); + + // Ensure headers exist + config.headers = config.headers || {}; + + // Transform request data + config.data = transformData.call( + config, + config.data, + config.headers, + config.transformRequest + ); + + // Flatten headers + config.headers = utils.merge( + config.headers.common || {}, + config.headers[config.method] || {}, + config.headers + ); + + utils.forEach( + ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], + function cleanHeaderConfig(method) { + delete config.headers[method]; + } + ); + + var adapter = config.adapter || defaults_1.adapter; + + return adapter(config).then(function onAdapterResolution(response) { + throwIfCancellationRequested(config); + + // Transform response data + response.data = transformData.call( + config, + response.data, + response.headers, + config.transformResponse + ); + + return response; + }, function onAdapterRejection(reason) { + if (!isCancel(reason)) { + throwIfCancellationRequested(config); + + // Transform response data + if (reason && reason.response) { + reason.response.data = transformData.call( + config, + reason.response.data, + reason.response.headers, + config.transformResponse + ); + } + } + + return Promise.reject(reason); + }); + }; + + /** + * Config-specific merge-function which creates a new config-object + * by merging two configuration objects together. + * + * @param {Object} config1 + * @param {Object} config2 + * @returns {Object} New object resulting from merging config2 to config1 + */ + var mergeConfig = function mergeConfig(config1, config2) { + // eslint-disable-next-line no-param-reassign + config2 = config2 || {}; + var config = {}; + + function getMergedValue(target, source) { + if (utils.isPlainObject(target) && utils.isPlainObject(source)) { + return utils.merge(target, source); + } else if (utils.isPlainObject(source)) { + return utils.merge({}, source); + } else if (utils.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(prop) { + if (!utils.isUndefined(config2[prop])) { + return getMergedValue(config1[prop], config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + return getMergedValue(undefined, config1[prop]); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + return getMergedValue(undefined, config2[prop]); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(prop) { + if (!utils.isUndefined(config2[prop])) { + return getMergedValue(undefined, config2[prop]); + } else if (!utils.isUndefined(config1[prop])) { + return getMergedValue(undefined, config1[prop]); + } + } + + // eslint-disable-next-line consistent-return + function mergeDirectKeys(prop) { + if (prop in config2) { + return getMergedValue(config1[prop], config2[prop]); + } else if (prop in config1) { + return getMergedValue(undefined, config1[prop]); + } + } + + var mergeMap = { + 'url': valueFromConfig2, + 'method': valueFromConfig2, + 'data': valueFromConfig2, + 'baseURL': defaultToConfig2, + 'transformRequest': defaultToConfig2, + 'transformResponse': defaultToConfig2, + 'paramsSerializer': defaultToConfig2, + 'timeout': defaultToConfig2, + 'timeoutMessage': defaultToConfig2, + 'withCredentials': defaultToConfig2, + 'adapter': defaultToConfig2, + 'responseType': defaultToConfig2, + 'xsrfCookieName': defaultToConfig2, + 'xsrfHeaderName': defaultToConfig2, + 'onUploadProgress': defaultToConfig2, + 'onDownloadProgress': defaultToConfig2, + 'decompress': defaultToConfig2, + 'maxContentLength': defaultToConfig2, + 'maxBodyLength': defaultToConfig2, + 'beforeRedirect': defaultToConfig2, + 'transport': defaultToConfig2, + 'httpAgent': defaultToConfig2, + 'httpsAgent': defaultToConfig2, + 'cancelToken': defaultToConfig2, + 'socketPath': defaultToConfig2, + 'responseEncoding': defaultToConfig2, + 'validateStatus': mergeDirectKeys + }; + + utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) { + var merge = mergeMap[prop] || mergeDeepProperties; + var configValue = merge(prop); + (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); + }); + + return config; + }; + + var data = { + "version": "0.27.2" + }; + + var VERSION = data.version; + + + var validators$1 = {}; + + // eslint-disable-next-line func-names + ['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) { + validators$1[type] = function validator(thing) { + return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type; + }; + }); + + var deprecatedWarnings = {}; + + /** + * Transitional option validator + * @param {function|boolean?} validator - set to false if the transitional option has been removed + * @param {string?} version - deprecated version / removed since version + * @param {string?} message - some message with additional info + * @returns {function} + */ + validators$1.transitional = function transitional(validator, version, message) { + function formatMessage(opt, desc) { + return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : ''); + } + + // eslint-disable-next-line func-names + return function(value, opt, opts) { + if (validator === false) { + throw new AxiosError_1( + formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')), + AxiosError_1.ERR_DEPRECATED + ); + } + + if (version && !deprecatedWarnings[opt]) { + deprecatedWarnings[opt] = true; + // eslint-disable-next-line no-console + console.warn( + formatMessage( + opt, + ' has been deprecated since v' + version + ' and will be removed in the near future' + ) + ); + } + + return validator ? validator(value, opt, opts) : true; + }; + }; + + /** + * Assert object's properties type + * @param {object} options + * @param {object} schema + * @param {boolean?} allowUnknown + */ + + function assertOptions(options, schema, allowUnknown) { + if (typeof options !== 'object') { + throw new AxiosError_1('options must be an object', AxiosError_1.ERR_BAD_OPTION_VALUE); + } + var keys = Object.keys(options); + var i = keys.length; + while (i-- > 0) { + var opt = keys[i]; + var validator = schema[opt]; + if (validator) { + var value = options[opt]; + var result = value === undefined || validator(value, opt, options); + if (result !== true) { + throw new AxiosError_1('option ' + opt + ' must be ' + result, AxiosError_1.ERR_BAD_OPTION_VALUE); + } + continue; + } + if (allowUnknown !== true) { + throw new AxiosError_1('Unknown option ' + opt, AxiosError_1.ERR_BAD_OPTION); + } + } + } + + var validator = { + assertOptions: assertOptions, + validators: validators$1 + }; + + var validators = validator.validators; + /** + * Create a new instance of Axios + * + * @param {Object} instanceConfig The default config for the instance + */ + function Axios(instanceConfig) { + this.defaults = instanceConfig; + this.interceptors = { + request: new InterceptorManager_1(), + response: new InterceptorManager_1() + }; + } + + /** + * Dispatch a request + * + * @param {Object} config The config specific for this request (merged with this.defaults) + */ + Axios.prototype.request = function request(configOrUrl, config) { + /*eslint no-param-reassign:0*/ + // Allow for axios('example/url'[, config]) a la fetch API + if (typeof configOrUrl === 'string') { + config = config || {}; + config.url = configOrUrl; + } else { + config = configOrUrl || {}; + } + + config = mergeConfig(this.defaults, config); + + // Set config.method + if (config.method) { + config.method = config.method.toLowerCase(); + } else if (this.defaults.method) { + config.method = this.defaults.method.toLowerCase(); + } else { + config.method = 'get'; + } + + var transitional = config.transitional; + + if (transitional !== undefined) { + validator.assertOptions(transitional, { + silentJSONParsing: validators.transitional(validators.boolean), + forcedJSONParsing: validators.transitional(validators.boolean), + clarifyTimeoutError: validators.transitional(validators.boolean) + }, false); + } + + // filter out skipped interceptors + var requestInterceptorChain = []; + var synchronousRequestInterceptors = true; + this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { + if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) { + return; + } + + synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; + + requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); + }); + + var responseInterceptorChain = []; + this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { + responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); + }); + + var promise; + + if (!synchronousRequestInterceptors) { + var chain = [dispatchRequest, undefined]; + + Array.prototype.unshift.apply(chain, requestInterceptorChain); + chain = chain.concat(responseInterceptorChain); + + promise = Promise.resolve(config); + while (chain.length) { + promise = promise.then(chain.shift(), chain.shift()); + } + + return promise; + } + + + var newConfig = config; + while (requestInterceptorChain.length) { + var onFulfilled = requestInterceptorChain.shift(); + var onRejected = requestInterceptorChain.shift(); + try { + newConfig = onFulfilled(newConfig); + } catch (error) { + onRejected(error); + break; + } + } + + try { + promise = dispatchRequest(newConfig); + } catch (error) { + return Promise.reject(error); + } + + while (responseInterceptorChain.length) { + promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift()); + } + + return promise; + }; + + Axios.prototype.getUri = function getUri(config) { + config = mergeConfig(this.defaults, config); + var fullPath = buildFullPath(config.baseURL, config.url); + return buildURL(fullPath, config.params, config.paramsSerializer); + }; + + // Provide aliases for supported request methods + utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { + /*eslint func-names:0*/ + Axios.prototype[method] = function(url, config) { + return this.request(mergeConfig(config || {}, { + method: method, + url: url, + data: (config || {}).data + })); + }; + }); + + utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + /*eslint func-names:0*/ + + function generateHTTPMethod(isForm) { + return function httpMethod(url, data, config) { + return this.request(mergeConfig(config || {}, { + method: method, + headers: isForm ? { + 'Content-Type': 'multipart/form-data' + } : {}, + url: url, + data: data + })); + }; + } + + Axios.prototype[method] = generateHTTPMethod(); + + Axios.prototype[method + 'Form'] = generateHTTPMethod(true); + }); + + var Axios_1 = Axios; + + /** + * A `CancelToken` is an object that can be used to request cancellation of an operation. + * + * @class + * @param {Function} executor The executor function. + */ + function CancelToken(executor) { + if (typeof executor !== 'function') { + throw new TypeError('executor must be a function.'); + } + + var resolvePromise; + + this.promise = new Promise(function promiseExecutor(resolve) { + resolvePromise = resolve; + }); + + var token = this; + + // eslint-disable-next-line func-names + this.promise.then(function(cancel) { + if (!token._listeners) return; + + var i; + var l = token._listeners.length; + + for (i = 0; i < l; i++) { + token._listeners[i](cancel); + } + token._listeners = null; + }); + + // eslint-disable-next-line func-names + this.promise.then = function(onfulfilled) { + var _resolve; + // eslint-disable-next-line func-names + var promise = new Promise(function(resolve) { + token.subscribe(resolve); + _resolve = resolve; + }).then(onfulfilled); + + promise.cancel = function reject() { + token.unsubscribe(_resolve); + }; + + return promise; + }; + + executor(function cancel(message) { + if (token.reason) { + // Cancellation has already been requested + return; + } + + token.reason = new CanceledError_1(message); + resolvePromise(token.reason); + }); + } + + /** + * Throws a `CanceledError` if cancellation has been requested. + */ + CancelToken.prototype.throwIfRequested = function throwIfRequested() { + if (this.reason) { + throw this.reason; + } + }; + + /** + * Subscribe to the cancel signal + */ + + CancelToken.prototype.subscribe = function subscribe(listener) { + if (this.reason) { + listener(this.reason); + return; + } + + if (this._listeners) { + this._listeners.push(listener); + } else { + this._listeners = [listener]; + } + }; + + /** + * Unsubscribe from the cancel signal + */ + + CancelToken.prototype.unsubscribe = function unsubscribe(listener) { + if (!this._listeners) { + return; + } + var index = this._listeners.indexOf(listener); + if (index !== -1) { + this._listeners.splice(index, 1); + } + }; + + /** + * Returns an object that contains a new `CancelToken` and a function that, when called, + * cancels the `CancelToken`. + */ + CancelToken.source = function source() { + var cancel; + var token = new CancelToken(function executor(c) { + cancel = c; + }); + return { + token: token, + cancel: cancel + }; + }; + + var CancelToken_1 = CancelToken; + + /** + * Syntactic sugar for invoking a function and expanding an array for arguments. + * + * Common use case would be to use `Function.prototype.apply`. + * + * ```js + * function f(x, y, z) {} + * var args = [1, 2, 3]; + * f.apply(null, args); + * ``` + * + * With `spread` this example can be re-written. + * + * ```js + * spread(function(x, y, z) {})([1, 2, 3]); + * ``` + * + * @param {Function} callback + * @returns {Function} + */ + var spread = function spread(callback) { + return function wrap(arr) { + return callback.apply(null, arr); + }; + }; + + /** + * Determines whether the payload is an error thrown by Axios + * + * @param {*} payload The value to test + * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false + */ + var isAxiosError = function isAxiosError(payload) { + return utils.isObject(payload) && (payload.isAxiosError === true); + }; + + /** + * Create an instance of Axios + * + * @param {Object} defaultConfig The default config for the instance + * @return {Axios} A new instance of Axios + */ + function createInstance(defaultConfig) { + var context = new Axios_1(defaultConfig); + var instance = bind(Axios_1.prototype.request, context); + + // Copy axios.prototype to instance + utils.extend(instance, Axios_1.prototype, context); + + // Copy context to instance + utils.extend(instance, context); + + // Factory for creating new instances + instance.create = function create(instanceConfig) { + return createInstance(mergeConfig(defaultConfig, instanceConfig)); + }; + + return instance; + } + + // Create the default instance to be exported + var axios$1 = createInstance(defaults_1); + + // Expose Axios class to allow class inheritance + axios$1.Axios = Axios_1; + + // Expose Cancel & CancelToken + axios$1.CanceledError = CanceledError_1; + axios$1.CancelToken = CancelToken_1; + axios$1.isCancel = isCancel; + axios$1.VERSION = data.version; + axios$1.toFormData = toFormData_1; + + // Expose AxiosError class + axios$1.AxiosError = AxiosError_1; + + // alias for CanceledError for backward compatibility + axios$1.Cancel = axios$1.CanceledError; + + // Expose all/spread + axios$1.all = function all(promises) { + return Promise.all(promises); + }; + axios$1.spread = spread; + + // Expose isAxiosError + axios$1.isAxiosError = isAxiosError; + + var axios_1 = axios$1; + + // Allow use of default import syntax in TypeScript + var _default = axios$1; + axios_1.default = _default; + + var axios = axios_1; + + class RTCEndpoint extends Event$1 { + constructor(options) { + super('RTCPusherPlayer'); + this.TAG = '[RTCPusherPlayer]'; + let defaults = { + element: '', + // html video element + debug: false, + // if output debug log + zlmsdpUrl: '', + simulcast: false, + useCamera: true, + audioEnable: true, + videoEnable: true, + recvOnly: false, + resolution: { + w: 0, + h: 0 + }, + usedatachannel: false + }; + this.options = Object.assign({}, defaults, options); + if (this.options.debug) { + setLogger(); + } + this.e = { + onicecandidate: this._onIceCandidate.bind(this), + ontrack: this._onTrack.bind(this), + onicecandidateerror: this._onIceCandidateError.bind(this), + onconnectionstatechange: this._onconnectionstatechange.bind(this), + ondatachannelopen: this._onDataChannelOpen.bind(this), + ondatachannelmsg: this._onDataChannelMsg.bind(this), + ondatachannelerr: this._onDataChannelErr.bind(this), + ondatachannelclose: this._onDataChannelClose.bind(this) + }; + this._remoteStream = null; + this._localStream = null; + this._tracks = []; + this.pc = new RTCPeerConnection(null); + this.pc.onicecandidate = this.e.onicecandidate; + this.pc.onicecandidateerror = this.e.onicecandidateerror; + this.pc.ontrack = this.e.ontrack; + this.pc.onconnectionstatechange = this.e.onconnectionstatechange; + this.datachannel = null; + if (this.options.usedatachannel) { + this.datachannel = this.pc.createDataChannel('chat'); + this.datachannel.onclose = this.e.ondatachannelclose; + this.datachannel.onerror = this.e.ondatachannelerr; + this.datachannel.onmessage = this.e.ondatachannelmsg; + this.datachannel.onopen = this.e.ondatachannelopen; + } + if (!this.options.recvOnly && (this.options.audioEnable || this.options.videoEnable)) this.start();else this.receive(); + } + receive() { + + //debug.error(this.TAG,'this not implement'); + const AudioTransceiverInit = { + direction: 'recvonly', + sendEncodings: [] + }; + const VideoTransceiverInit = { + direction: 'recvonly', + sendEncodings: [] + }; + if (this.options.videoEnable) { + this.pc.addTransceiver('video', VideoTransceiverInit); + } + if (this.options.audioEnable) { + this.pc.addTransceiver('audio', AudioTransceiverInit); + } + this.pc.createOffer().then(desc => { + log(this.TAG, 'offer:', desc.sdp); + this.pc.setLocalDescription(desc).then(() => { + axios({ + method: 'post', + url: this.options.zlmsdpUrl, + responseType: 'json', + data: desc.sdp, + headers: { + 'Content-Type': 'text/plain;charset=utf-8' + } + }).then(response => { + let ret = response.data; //JSON.parse(response.data); + if (ret.code != 0) { + // mean failed for offer/anwser exchange + this.dispatch(Events$1.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED, ret); + return; + } + let anwser = {}; + anwser.sdp = ret.sdp; + anwser.type = 'answer'; + log(this.TAG, 'answer:', ret.sdp); + this.pc.setRemoteDescription(anwser).then(() => { + log(this.TAG, 'set remote sucess'); + }).catch(e => { + error(this.TAG, e); + }); + }); + }); + }).catch(e => { + error(this.TAG, e); + }); + } + start() { + let videoConstraints = false; + let audioConstraints = false; + if (this.options.useCamera) { + if (this.options.videoEnable) videoConstraints = new VideoTrackConstraints(VideoSourceInfo.CAMERA); + if (this.options.audioEnable) audioConstraints = new AudioTrackConstraints(AudioSourceInfo.MIC); + } else { + if (this.options.videoEnable) { + videoConstraints = new VideoTrackConstraints(VideoSourceInfo.SCREENCAST); + if (this.options.audioEnable) audioConstraints = new AudioTrackConstraints(AudioSourceInfo.SCREENCAST); + } else { + if (this.options.audioEnable) audioConstraints = new AudioTrackConstraints(AudioSourceInfo.MIC);else { + // error shared display media not only audio + error(this.TAG, 'error paramter'); + } + } + } + if (this.options.resolution.w != 0 && this.options.resolution.h != 0 && typeof videoConstraints == 'object') { + videoConstraints.resolution = new Resolution(this.options.resolution.w, this.options.resolution.h); + } + MediaStreamFactory.createMediaStream(new StreamConstraints(audioConstraints, videoConstraints)).then(stream => { + this._localStream = stream; + this.dispatch(Events$1.WEBRTC_ON_LOCAL_STREAM, stream); + const AudioTransceiverInit = { + direction: 'sendrecv', + sendEncodings: [] + }; + const VideoTransceiverInit = { + direction: 'sendrecv', + sendEncodings: [] + }; + if (this.options.simulcast && stream.getVideoTracks().length > 0) { + VideoTransceiverInit.sendEncodings = [{ + rid: 'h', + active: true, + maxBitrate: 1000000 + }, { + rid: 'm', + active: true, + maxBitrate: 500000, + scaleResolutionDownBy: 2 + }, { + rid: 'l', + active: true, + maxBitrate: 200000, + scaleResolutionDownBy: 4 + }]; + } + if (this.options.audioEnable) { + if (stream.getAudioTracks().length > 0) { + this.pc.addTransceiver(stream.getAudioTracks()[0], AudioTransceiverInit); + } else { + AudioTransceiverInit.direction = 'recvonly'; + this.pc.addTransceiver('audio', AudioTransceiverInit); + } + } + if (this.options.videoEnable) { + if (stream.getVideoTracks().length > 0) { + this.pc.addTransceiver(stream.getVideoTracks()[0], VideoTransceiverInit); + } else { + VideoTransceiverInit.direction = 'recvonly'; + this.pc.addTransceiver('video', VideoTransceiverInit); + } + } + + /* + stream.getTracks().forEach((track,idx)=>{ + debug.log(this.TAG,track); + this.pc.addTrack(track); + }); + */ + this.pc.createOffer().then(desc => { + log(this.TAG, 'offer:', desc.sdp); + this.pc.setLocalDescription(desc).then(() => { + axios({ + method: 'post', + url: this.options.zlmsdpUrl, + responseType: 'json', + data: desc.sdp, + headers: { + 'Content-Type': 'text/plain;charset=utf-8' + } + }).then(response => { + let ret = response.data; //JSON.parse(response.data); + if (ret.code != 0) { + // mean failed for offer/anwser exchange + this.dispatch(Events$1.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED, ret); + return; + } + let anwser = {}; + anwser.sdp = ret.sdp; + anwser.type = 'answer'; + log(this.TAG, 'answer:', ret.sdp); + this.pc.setRemoteDescription(anwser).then(() => { + log(this.TAG, 'set remote sucess'); + }).catch(e => { + error(this.TAG, e); + }); + }); + }); + }).catch(e => { + error(this.TAG, e); + }); + }).catch(e => { + this.dispatch(Events$1.CAPTURE_STREAM_FAILED); + //debug.error(this.TAG,e); + }); + + //const offerOptions = {}; + /* + if (typeof this.pc.addTransceiver === 'function') { + // |direction| seems not working on Safari. + this.pc.addTransceiver('audio', { direction: 'recvonly' }); + this.pc.addTransceiver('video', { direction: 'recvonly' }); + } else { + offerOptions.offerToReceiveAudio = true; + offerOptions.offerToReceiveVideo = true; + } + */ + } + + _onIceCandidate(event) { + if (event.candidate) { + log(this.TAG, 'Remote ICE candidate: \n ' + event.candidate.candidate); + // Send the candidate to the remote peer + } + } + _onTrack(event) { + this._tracks.push(event.track); + if (this.options.element && event.streams && event.streams.length > 0) { + this.options.element.srcObject = event.streams[0]; + this._remoteStream = event.streams[0]; + this.dispatch(Events$1.WEBRTC_ON_REMOTE_STREAMS, event); + } else { + if (this.pc.getReceivers().length == this._tracks.length) { + log(this.TAG, 'play remote stream '); + this._remoteStream = new MediaStream(this._tracks); + this.options.element.srcObject = this._remoteStream; + } else { + error(this.TAG, 'wait stream track finish'); + } + } + } + _onIceCandidateError(event) { + this.dispatch(Events$1.WEBRTC_ICE_CANDIDATE_ERROR, event); + } + _onconnectionstatechange(event) { + this.dispatch(Events$1.WEBRTC_ON_CONNECTION_STATE_CHANGE, this.pc.connectionState); + } + _onDataChannelOpen(event) { + log(this.TAG, 'ondatachannel open:', event); + this.dispatch(Events$1.WEBRTC_ON_DATA_CHANNEL_OPEN, event); + } + _onDataChannelMsg(event) { + log(this.TAG, 'ondatachannel msg:', event); + this.dispatch(Events$1.WEBRTC_ON_DATA_CHANNEL_MSG, event); + } + _onDataChannelErr(event) { + log(this.TAG, 'ondatachannel err:', event); + this.dispatch(Events$1.WEBRTC_ON_DATA_CHANNEL_ERR, event); + } + _onDataChannelClose(event) { + log(this.TAG, 'ondatachannel close:', event); + this.dispatch(Events$1.WEBRTC_ON_DATA_CHANNEL_CLOSE, event); + } + sendMsg(data) { + if (this.datachannel != null) { + this.datachannel.send(data); + } else { + error(this.TAG, 'data channel is null'); + } + } + closeDataChannel() { + if (this.datachannel) { + this.datachannel.close(); + this.datachannel = null; + } + } + close() { + this.closeDataChannel(); + if (this.pc) { + this.pc.close(); + this.pc = null; + } + if (this.options) { + this.options = null; + } + if (this._localStream) { + this._localStream.getTracks().forEach((track, idx) => { + track.stop(); + }); + } + if (this._remoteStream) { + this._remoteStream.getTracks().forEach((track, idx) => { + track.stop(); + }); + } + this._tracks.forEach((track, idx) => { + track.stop(); + }); + this._tracks = []; + } + get remoteStream() { + return this._remoteStream; + } + get localStream() { + return this._localStream; + } + } + + const quickScan = [{ + 'label': '4K(UHD)', + 'width': 3840, + 'height': 2160 + }, { + 'label': '1080p(FHD)', + 'width': 1920, + 'height': 1080 + }, { + 'label': 'UXGA', + 'width': 1600, + 'height': 1200, + 'ratio': '4:3' + }, { + 'label': '720p(HD)', + 'width': 1280, + 'height': 720 + }, { + 'label': 'SVGA', + 'width': 800, + 'height': 600 + }, { + 'label': 'VGA', + 'width': 640, + 'height': 480 + }, { + 'label': '360p(nHD)', + 'width': 640, + 'height': 360 + }, { + 'label': 'CIF', + 'width': 352, + 'height': 288 + }, { + 'label': 'QVGA', + 'width': 320, + 'height': 240 + }, { + 'label': 'QCIF', + 'width': 176, + 'height': 144 + }, { + 'label': 'QQVGA', + 'width': 160, + 'height': 120 + }]; + function GetSupportCameraResolutions$1() { + return new Promise(function (resolve, reject) { + let resolutions = []; + let ok = 0; + let err = 0; + for (let i = 0; i < quickScan.length; ++i) { + let videoConstraints = new VideoTrackConstraints(VideoSourceInfo.CAMERA); + videoConstraints.resolution = new Resolution(quickScan[i].width, quickScan[i].height); + MediaStreamFactory.createMediaStream(new StreamConstraints(false, videoConstraints)).then(stream => { + resolutions.push(quickScan[i]); + ok++; + if (ok + err == quickScan.length) { + resolve(resolutions); + } + }).catch(e => { + err++; + if (ok + err == quickScan.length) { + resolve(resolutions); + } + }); + } + }); + } + function GetAllScanResolution$1() { + return quickScan; + } + function isSupportResolution$1(w, h) { + return new Promise(function (resolve, reject) { + let videoConstraints = new VideoTrackConstraints(VideoSourceInfo.CAMERA); + videoConstraints.resolution = new Resolution(w, h); + MediaStreamFactory.createMediaStream(new StreamConstraints(false, videoConstraints)).then(stream => { + resolve(); + }).catch(e => { + reject(e); + }); + }); + } + + console.log('build date:', BUILD_DATE); + console.log('version:', VERSION$1); + const Events = Events$1; + const Media = media; + const Endpoint = RTCEndpoint; + const GetSupportCameraResolutions = GetSupportCameraResolutions$1; + const GetAllScanResolution = GetAllScanResolution$1; + const isSupportResolution = isSupportResolution$1; + + exports.Endpoint = Endpoint; + exports.Events = Events; + exports.GetAllScanResolution = GetAllScanResolution; + exports.GetSupportCameraResolutions = GetSupportCameraResolutions; + exports.Media = Media; + exports.isSupportResolution = isSupportResolution; + + Object.defineProperty(exports, '__esModule', { value: true }); + + return exports; + +})({}); +//# sourceMappingURL=ZLMRTCClient.js.map diff --git a/components/ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js.map b/components/ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js.map new file mode 100644 index 0000000..0bd8ee8 --- /dev/null +++ b/components/ZLMediaKit-Webrtc-Vue/ZLMRTCClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ZLMRTCClient.js","sources":["../src/base/event.js","../src/ulity/version.js","../src/base/utils.js","../src/base/mediaformat.js","../node_modules/webrtc-adapter/src/js/utils.js","../node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","../node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","../node_modules/webrtc-adapter/src/js/edge/filtericeservers.js","../node_modules/sdp/sdp.js","../node_modules/rtcpeerconnection-shim/rtcpeerconnection.js","../node_modules/webrtc-adapter/src/js/edge/getusermedia.js","../node_modules/webrtc-adapter/src/js/edge/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/edge/edge_shim.js","../node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","../node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","../node_modules/webrtc-adapter/src/js/safari/safari_shim.js","../node_modules/webrtc-adapter/src/js/common_shim.js","../node_modules/webrtc-adapter/src/js/adapter_factory.js","../node_modules/webrtc-adapter/src/js/adapter_core.js","../src/base/mediastream-factory.js","../src/base/export.js","../src/ulity/debug.js","../src/ulity/event.js","../node_modules/axios/lib/helpers/bind.js","../node_modules/axios/lib/utils.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/helpers/normalizeHeaderName.js","../node_modules/axios/lib/core/AxiosError.js","../node_modules/axios/lib/defaults/transitional.js","../node_modules/axios/lib/helpers/toFormData.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/cancel/CanceledError.js","../node_modules/axios/lib/helpers/parseProtocol.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/helpers/null.js","../node_modules/axios/lib/defaults/index.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/axios/lib/axios.js","../node_modules/axios/index.js","../src/endpoint/endpoint.js","../src/base/resolutionfind.js","../src/export.js"],"sourcesContent":["const Events = {\n\tWEBRTC_NOT_SUPPORT : 'WEBRTC_NOT_SUPPORT',\n\tWEBRTC_ICE_CANDIDATE_ERROR : 'WEBRTC_ICE_CANDIDATE_ERROR',\n\tWEBRTC_OFFER_ANWSER_EXCHANGE_FAILED:'WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED',\n\tWEBRTC_ON_REMOTE_STREAMS:'WEBRTC_ON_REMOTE_STREAMS',\n\tWEBRTC_ON_LOCAL_STREAM:'WEBRTC_ON_LOCAL_STREAM',\n\tWEBRTC_ON_CONNECTION_STATE_CHANGE:'WEBRTC_ON_CONNECTION_STATE_CHANGE',\n\tWEBRTC_ON_DATA_CHANNEL_OPEN:'WEBRTC_ON_DATA_CHANNEL_OPEN',\n\tWEBRTC_ON_DATA_CHANNEL_CLOSE:'WEBRTC_ON_DATA_CHANNEL_CLOSE',\n\tWEBRTC_ON_DATA_CHANNEL_ERR:'WEBRTC_ON_DATA_CHANNEL_ERR',\n\tWEBRTC_ON_DATA_CHANNEL_MSG:'WEBRTC_ON_DATA_CHANNEL_MSG',\n\tCAPTURE_STREAM_FAILED:'CAPTURE_STREAM_FAILED',\n};\n\nexport default Events;","export const VERSION = '__VERSION__';\nexport const BUILD_DATE = '__BUILD_DATE__';","// Copyright (C) <2018> Intel Corporation\n//\n// SPDX-License-Identifier: Apache-2.0\n\n\n// eslint-disable-next-line require-jsdoc\nexport function isFirefox() {\n return window.navigator.userAgent.match('Firefox') !== null;\n}\n// eslint-disable-next-line require-jsdoc\nexport function isChrome() {\n return window.navigator.userAgent.match('Chrome') !== null;\n}\n// eslint-disable-next-line require-jsdoc\nexport function isSafari() {\n return /^((?!chrome|android).)*safari/i.test(window.navigator.userAgent);\n}\n// eslint-disable-next-line require-jsdoc\nexport function isEdge() {\n return window.navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/) !== null;\n}\n// eslint-disable-next-line require-jsdoc\nexport function createUuid() {\n return 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}","// Copyright (C) <2018> Intel Corporation\n//\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n/**\n * @class AudioSourceInfo\n * @classDesc Source info about an audio track. Values: 'mic', 'screen-cast', 'file', 'mixed'.\n * @memberOf Owt.Base\n * @readonly\n * @enum {string}\n */\nexport const AudioSourceInfo = {\n MIC: 'mic',\n SCREENCAST: 'screen-cast',\n FILE: 'file',\n MIXED: 'mixed',\n};\n\n/**\n * @class VideoSourceInfo\n * @classDesc Source info about a video track. Values: 'camera', 'screen-cast', 'file', 'mixed'.\n * @memberOf Owt.Base\n * @readonly\n * @enum {string}\n */\nexport const VideoSourceInfo = {\n CAMERA: 'camera',\n SCREENCAST: 'screen-cast',\n FILE: 'file',\n MIXED: 'mixed',\n};\n\n/**\n * @class TrackKind\n * @classDesc Kind of a track. Values: 'audio' for audio track, 'video' for video track, 'av' for both audio and video tracks.\n * @memberOf Owt.Base\n * @readonly\n * @enum {string}\n */\nexport const TrackKind = {\n /**\n * Audio tracks.\n * @type string\n */\n AUDIO: 'audio',\n /**\n * Video tracks.\n * @type string\n */\n VIDEO: 'video',\n /**\n * Both audio and video tracks.\n * @type string\n */\n AUDIO_AND_VIDEO: 'av',\n};\n/**\n * @class Resolution\n * @memberOf Owt.Base\n * @classDesc The Resolution defines the size of a rectangle.\n * @constructor\n * @param {number} width\n * @param {number} height\n */\nexport class Resolution {\n // eslint-disable-next-line require-jsdoc\n constructor(width, height) {\n /**\n * @member {number} width\n * @instance\n * @memberof Owt.Base.Resolution\n */\n this.width = width;\n /**\n * @member {number} height\n * @instance\n * @memberof Owt.Base.Resolution\n */\n this.height = height;\n }\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection &&\n !window.RTCIceGatherer)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n const oldname_ = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n let oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(mix => {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nexport function filterIceServers(iceServers, edgeVersion) {\n let hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(server => {\n if (server && (server.urls || server.url)) {\n let urls = server.urls || server.url;\n if (server.url && !server.urls) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n }\n const isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(url => {\n // filter STUN unconditionally.\n if (url.indexOf('stun:') === 0) {\n return false;\n }\n\n const validTurn = url.startsWith('turn') &&\n !url.startsWith('turn:[') &&\n url.includes('transport=udp');\n if (validTurn && !hasTurn) {\n hasTurn = true;\n return true;\n }\n return validTurn && !hasTurn;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(function(line) {\n return line.trim();\n });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n var parts = blob.split('\\nm=');\n return parts.map(function(part, index) {\n return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(function(line) {\n return line.indexOf(prefix) === 0;\n });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n var parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compability.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag\n candidate[parts[i]] = parts[i + 1];\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n var sdp = [];\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n var channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1]\n };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n var parsed = {};\n var kv;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n for (var j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n var line = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n var params = [];\n Object.keys(codec.parameters).forEach(function(param) {\n if (codec.parameters[param]) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n var lines = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(function(fb) {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n var sp = line.indexOf(' ');\n var parts = {\n ssrc: parseInt(line.substr(7, sp - 7), 10)\n };\n var colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substr(sp + 1, colon - sp - 1);\n parts.value = line.substr(colon + 1);\n } else {\n parts.attribute = line.substr(sp + 1);\n }\n return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n var parts = line.substr(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(function(ssrc) {\n return parseInt(ssrc, 10);\n })\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substr(6);\n }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n var parts = line.substr(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1]\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role.\n // Note2: 'algorithm' is not case sensitive except in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n var sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(function(fp) {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n var parts = keyParams.substr(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES paramters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substr(12),\n password: pwd.substr(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n var description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n var pt = mline[i];\n var rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n var codec = SDPUtils.parseRtpMap(rtpmapline);\n var fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n var sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' UDP/TLS/RTP/SAVPF ';\n sdp += caps.codecs.map(function(codec) {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(function(codec) {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n var maxptime = 0;\n caps.codecs.forEach(function(codec) {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n sdp += 'a=rtcp-mux\\r\\n';\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n var encodingParameters = [];\n var description = SDPUtils.parseRtpParameters(mediaSection);\n var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'cname';\n });\n var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n var secondarySsrc;\n\n var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(function(line) {\n var parts = line.substr(17).split(' ');\n return parts.map(function(part) {\n return parseInt(part, 10);\n });\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(function(codec) {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n var encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substr(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(function(params) {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n var rtcpParameters = {};\n\n // Gets the first SSRC. Note tha with RTX there might be multiple\n // SSRCs.\n var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(obj) {\n return obj.attribute === 'cname';\n })[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n var parts;\n var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substr(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(msidParts) {\n return msidParts.attribute === 'msid';\n });\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n var mline = SDPUtils.parseMLine(mediaSection);\n var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n var maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substr(12), 10),\n protocol: mline.fmt,\n maxMessageSize: maxMessageSize\n };\n }\n var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]\n .substr(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize: maxMessageSize\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n var output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n'\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n var user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.direction) {\n sdp += 'a=' + transceiver.direction + '\\r\\n';\n } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n // spec.\n var msid = 'msid:' + stream.id + ' ' +\n transceiver.rtpSender.track.id + '\\r\\n';\n sdp += 'a=' + msid;\n\n // for Chrome.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n var lines = SDPUtils.splitLines(mediaSection);\n for (var i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substr(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var parts = lines[0].substr(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n var parts = line.substr(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5]\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n var lines = SDPUtils.splitLines(blob);\n for (var i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n return {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n var trackId = transceiver.rtpSender._initialTrackId ||\n transceiver.rtpSender.track.id;\n transceiver.rtpSender._initialTrackId = trackId;\n // spec.\n var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n trackId + '\\r\\n';\n sdp += 'a=' + msid;\n // for Chrome. Legacy should no longer be required.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n\n // RTX\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function(server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function(url) {\n var validTurn = url.indexOf('turn:') === 0 &&\n url.indexOf('transport=udp') !== -1 &&\n url.indexOf('turn:[') === -1 &&\n !hasTurn;\n\n if (validTurn) {\n hasTurn = true;\n return true;\n }\n return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n url.indexOf('?transport=udp') === -1;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n var commonCapabilities = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: []\n };\n\n var findCodecByPayloadType = function(pt, codecs) {\n pt = parseInt(pt, 10);\n for (var i = 0; i < codecs.length; i++) {\n if (codecs[i].payloadType === pt ||\n codecs[i].preferredPayloadType === pt) {\n return codecs[i];\n }\n }\n };\n\n var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n return lCodec && rCodec &&\n lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n };\n\n localCapabilities.codecs.forEach(function(lCodec) {\n for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n var rCodec = remoteCapabilities.codecs[i];\n if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n lCodec.clockRate === rCodec.clockRate) {\n if (lCodec.name.toLowerCase() === 'rtx' &&\n lCodec.parameters && rCodec.parameters.apt) {\n // for RTX we need to find the local rtx that has a apt\n // which points to the same local codec as the remote one.\n if (!rtxCapabilityMatches(lCodec, rCodec,\n localCapabilities.codecs, remoteCapabilities.codecs)) {\n continue;\n }\n }\n rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n // number of channels is the highest common number of channels\n rCodec.numChannels = Math.min(lCodec.numChannels,\n rCodec.numChannels);\n // push rCodec so we reply with offerer payload type\n commonCapabilities.codecs.push(rCodec);\n\n // determine common feedback mechanisms\n rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n if (lCodec.rtcpFeedback[j].type === fb.type &&\n lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n return true;\n }\n }\n return false;\n });\n // FIXME: also need to determine .parameters\n // see https://github.com/openpeer/ortc/issues/569\n break;\n }\n }\n });\n\n localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n i++) {\n var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n if (lHeaderExtension.uri === rHeaderExtension.uri) {\n commonCapabilities.headerExtensions.push(rHeaderExtension);\n break;\n }\n }\n });\n\n // FIXME: fecMechanisms\n return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n return {\n offer: {\n setLocalDescription: ['stable', 'have-local-offer'],\n setRemoteDescription: ['stable', 'have-remote-offer']\n },\n answer: {\n setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n }\n }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n // Edge's internal representation adds some fields therefore\n // not all fieldѕ are taken into account.\n var alreadyAdded = iceTransport.getRemoteCandidates()\n .find(function(remoteCandidate) {\n return candidate.foundation === remoteCandidate.foundation &&\n candidate.ip === remoteCandidate.ip &&\n candidate.port === remoteCandidate.port &&\n candidate.priority === remoteCandidate.priority &&\n candidate.protocol === remoteCandidate.protocol &&\n candidate.type === remoteCandidate.type;\n });\n if (!alreadyAdded) {\n iceTransport.addRemoteCandidate(candidate);\n }\n return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n var e = new Error(description);\n e.name = name;\n // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n e.code = {\n NotSupportedError: 9,\n InvalidStateError: 11,\n InvalidAccessError: 15,\n TypeError: undefined,\n OperationError: undefined\n }[name];\n return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n // https://w3c.github.io/mediacapture-main/#mediastream\n // Helper function to add the track to the stream and\n // dispatch the event ourselves.\n function addTrackToStreamAndFireEvent(track, stream) {\n stream.addTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n {track: track}));\n }\n\n function removeTrackFromStreamAndFireEvent(track, stream) {\n stream.removeTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n {track: track}));\n }\n\n function fireAddTrack(pc, track, receiver, streams) {\n var trackEvent = new Event('track');\n trackEvent.track = track;\n trackEvent.receiver = receiver;\n trackEvent.transceiver = {receiver: receiver};\n trackEvent.streams = streams;\n window.setTimeout(function() {\n pc._dispatchEvent('track', trackEvent);\n });\n }\n\n var RTCPeerConnection = function(config) {\n var pc = this;\n\n var _eventTarget = document.createDocumentFragment();\n ['addEventListener', 'removeEventListener', 'dispatchEvent']\n .forEach(function(method) {\n pc[method] = _eventTarget[method].bind(_eventTarget);\n });\n\n this.canTrickleIceCandidates = null;\n\n this.needNegotiation = false;\n\n this.localStreams = [];\n this.remoteStreams = [];\n\n this._localDescription = null;\n this._remoteDescription = null;\n\n this.signalingState = 'stable';\n this.iceConnectionState = 'new';\n this.connectionState = 'new';\n this.iceGatheringState = 'new';\n\n config = JSON.parse(JSON.stringify(config || {}));\n\n this.usingBundle = config.bundlePolicy === 'max-bundle';\n if (config.rtcpMuxPolicy === 'negotiate') {\n throw(makeError('NotSupportedError',\n 'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n } else if (!config.rtcpMuxPolicy) {\n config.rtcpMuxPolicy = 'require';\n }\n\n switch (config.iceTransportPolicy) {\n case 'all':\n case 'relay':\n break;\n default:\n config.iceTransportPolicy = 'all';\n break;\n }\n\n switch (config.bundlePolicy) {\n case 'balanced':\n case 'max-compat':\n case 'max-bundle':\n break;\n default:\n config.bundlePolicy = 'balanced';\n break;\n }\n\n config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n this._iceGatherers = [];\n if (config.iceCandidatePoolSize) {\n for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n this._iceGatherers.push(new window.RTCIceGatherer({\n iceServers: config.iceServers,\n gatherPolicy: config.iceTransportPolicy\n }));\n }\n } else {\n config.iceCandidatePoolSize = 0;\n }\n\n this._config = config;\n\n // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n // everything that is needed to describe a SDP m-line.\n this.transceivers = [];\n\n this._sdpSessionId = SDPUtils.generateSessionId();\n this._sdpSessionVersion = 0;\n\n this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n this._isClosed = false;\n };\n\n Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n configurable: true,\n get: function() {\n return this._localDescription;\n }\n });\n Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n configurable: true,\n get: function() {\n return this._remoteDescription;\n }\n });\n\n // set up event handlers on prototype\n RTCPeerConnection.prototype.onicecandidate = null;\n RTCPeerConnection.prototype.onaddstream = null;\n RTCPeerConnection.prototype.ontrack = null;\n RTCPeerConnection.prototype.onremovestream = null;\n RTCPeerConnection.prototype.onsignalingstatechange = null;\n RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n RTCPeerConnection.prototype.onconnectionstatechange = null;\n RTCPeerConnection.prototype.onicegatheringstatechange = null;\n RTCPeerConnection.prototype.onnegotiationneeded = null;\n RTCPeerConnection.prototype.ondatachannel = null;\n\n RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n if (this._isClosed) {\n return;\n }\n this.dispatchEvent(event);\n if (typeof this['on' + name] === 'function') {\n this['on' + name](event);\n }\n };\n\n RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n var event = new Event('icegatheringstatechange');\n this._dispatchEvent('icegatheringstatechange', event);\n };\n\n RTCPeerConnection.prototype.getConfiguration = function() {\n return this._config;\n };\n\n RTCPeerConnection.prototype.getLocalStreams = function() {\n return this.localStreams;\n };\n\n RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this.remoteStreams;\n };\n\n // internal helper to create a transceiver object.\n // (which is not yet the same as the WebRTC 1.0 transceiver)\n RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n var hasBundleTransport = this.transceivers.length > 0;\n var transceiver = {\n track: null,\n iceGatherer: null,\n iceTransport: null,\n dtlsTransport: null,\n localCapabilities: null,\n remoteCapabilities: null,\n rtpSender: null,\n rtpReceiver: null,\n kind: kind,\n mid: null,\n sendEncodingParameters: null,\n recvEncodingParameters: null,\n stream: null,\n associatedRemoteMediaStreams: [],\n wantReceive: true\n };\n if (this.usingBundle && hasBundleTransport) {\n transceiver.iceTransport = this.transceivers[0].iceTransport;\n transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n } else {\n var transports = this._createIceAndDtlsTransports();\n transceiver.iceTransport = transports.iceTransport;\n transceiver.dtlsTransport = transports.dtlsTransport;\n }\n if (!doNotAdd) {\n this.transceivers.push(transceiver);\n }\n return transceiver;\n };\n\n RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call addTrack on a closed peerconnection.');\n }\n\n var alreadyExists = this.transceivers.find(function(s) {\n return s.track === track;\n });\n\n if (alreadyExists) {\n throw makeError('InvalidAccessError', 'Track already exists.');\n }\n\n var transceiver;\n for (var i = 0; i < this.transceivers.length; i++) {\n if (!this.transceivers[i].track &&\n this.transceivers[i].kind === track.kind) {\n transceiver = this.transceivers[i];\n }\n }\n if (!transceiver) {\n transceiver = this._createTransceiver(track.kind);\n }\n\n this._maybeFireNegotiationNeeded();\n\n if (this.localStreams.indexOf(stream) === -1) {\n this.localStreams.push(stream);\n }\n\n transceiver.track = track;\n transceiver.stream = stream;\n transceiver.rtpSender = new window.RTCRtpSender(track,\n transceiver.dtlsTransport);\n return transceiver.rtpSender;\n };\n\n RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n if (edgeVersion >= 15025) {\n stream.getTracks().forEach(function(track) {\n pc.addTrack(track, stream);\n });\n } else {\n // Clone is necessary for local demos mostly, attaching directly\n // to two different senders does not work (build 10547).\n // Fixed in 15025 (or earlier)\n var clonedStream = stream.clone();\n stream.getTracks().forEach(function(track, idx) {\n var clonedTrack = clonedStream.getTracks()[idx];\n track.addEventListener('enabled', function(event) {\n clonedTrack.enabled = event.enabled;\n });\n });\n clonedStream.getTracks().forEach(function(track) {\n pc.addTrack(track, clonedStream);\n });\n }\n };\n\n RTCPeerConnection.prototype.removeTrack = function(sender) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call removeTrack on a closed peerconnection.');\n }\n\n if (!(sender instanceof window.RTCRtpSender)) {\n throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.');\n }\n\n var transceiver = this.transceivers.find(function(t) {\n return t.rtpSender === sender;\n });\n\n if (!transceiver) {\n throw makeError('InvalidAccessError',\n 'Sender was not created by this connection.');\n }\n var stream = transceiver.stream;\n\n transceiver.rtpSender.stop();\n transceiver.rtpSender = null;\n transceiver.track = null;\n transceiver.stream = null;\n\n // remove the stream from the set of local streams\n var localStreams = this.transceivers.map(function(t) {\n return t.stream;\n });\n if (localStreams.indexOf(stream) === -1 &&\n this.localStreams.indexOf(stream) > -1) {\n this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n }\n\n this._maybeFireNegotiationNeeded();\n };\n\n RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n stream.getTracks().forEach(function(track) {\n var sender = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc.removeTrack(sender);\n }\n });\n };\n\n RTCPeerConnection.prototype.getSenders = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpSender;\n })\n .map(function(transceiver) {\n return transceiver.rtpSender;\n });\n };\n\n RTCPeerConnection.prototype.getReceivers = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpReceiver;\n })\n .map(function(transceiver) {\n return transceiver.rtpReceiver;\n });\n };\n\n\n RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n usingBundle) {\n var pc = this;\n if (usingBundle && sdpMLineIndex > 0) {\n return this.transceivers[0].iceGatherer;\n } else if (this._iceGatherers.length) {\n return this._iceGatherers.shift();\n }\n var iceGatherer = new window.RTCIceGatherer({\n iceServers: this._config.iceServers,\n gatherPolicy: this._config.iceTransportPolicy\n });\n Object.defineProperty(iceGatherer, 'state',\n {value: 'new', writable: true}\n );\n\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n var end = !event.candidate || Object.keys(event.candidate).length === 0;\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n iceGatherer.state = end ? 'completed' : 'gathering';\n if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n }\n };\n iceGatherer.addEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n return iceGatherer;\n };\n\n // start gathering from an RTCIceGatherer.\n RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n var pc = this;\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer.onlocalcandidate) {\n return;\n }\n var bufferedCandidateEvents =\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n iceGatherer.removeEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n iceGatherer.onlocalcandidate = function(evt) {\n if (pc.usingBundle && sdpMLineIndex > 0) {\n // if we know that we use bundle we can drop candidates with\n // ѕdpMLineIndex > 0. If we don't do this then our state gets\n // confused since we dispose the extra ice gatherer.\n return;\n }\n var event = new Event('icecandidate');\n event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n var cand = evt.candidate;\n // Edge emits an empty object for RTCIceCandidateComplete‥\n var end = !cand || Object.keys(cand).length === 0;\n if (end) {\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n iceGatherer.state = 'completed';\n }\n } else {\n if (iceGatherer.state === 'new') {\n iceGatherer.state = 'gathering';\n }\n // RTCIceCandidate doesn't have a component, needs to be added\n cand.component = 1;\n // also the usernameFragment. TODO: update SDP to take both variants.\n cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n\n event.candidate.candidate = serializedCandidate;\n event.candidate.toJSON = function() {\n return {\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment\n };\n };\n }\n\n // update local description.\n var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n if (!end) {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=' + event.candidate.candidate + '\\r\\n';\n } else {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=end-of-candidates\\r\\n';\n }\n pc._localDescription.sdp =\n SDPUtils.getDescription(pc._localDescription.sdp) +\n sections.join('');\n var complete = pc.transceivers.every(function(transceiver) {\n return transceiver.iceGatherer &&\n transceiver.iceGatherer.state === 'completed';\n });\n\n if (pc.iceGatheringState !== 'gathering') {\n pc.iceGatheringState = 'gathering';\n pc._emitGatheringStateChange();\n }\n\n // Emit candidate. Also emit null candidate when all gatherers are\n // complete.\n if (!end) {\n pc._dispatchEvent('icecandidate', event);\n }\n if (complete) {\n pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n pc.iceGatheringState = 'complete';\n pc._emitGatheringStateChange();\n }\n };\n\n // emit already gathered candidates.\n window.setTimeout(function() {\n bufferedCandidateEvents.forEach(function(e) {\n iceGatherer.onlocalcandidate(e);\n });\n }, 0);\n };\n\n // Create ICE transport and DTLS transport.\n RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n var pc = this;\n var iceTransport = new window.RTCIceTransport(null);\n iceTransport.onicestatechange = function() {\n pc._updateIceConnectionState();\n pc._updateConnectionState();\n };\n\n var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n dtlsTransport.ondtlsstatechange = function() {\n pc._updateConnectionState();\n };\n dtlsTransport.onerror = function() {\n // onerror does not set state to failed by itself.\n Object.defineProperty(dtlsTransport, 'state',\n {value: 'failed', writable: true});\n pc._updateConnectionState();\n };\n\n return {\n iceTransport: iceTransport,\n dtlsTransport: dtlsTransport\n };\n };\n\n // Destroy ICE gatherer, ICE transport and DTLS transport.\n // Without triggering the callbacks.\n RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n sdpMLineIndex) {\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer) {\n delete iceGatherer.onlocalcandidate;\n delete this.transceivers[sdpMLineIndex].iceGatherer;\n }\n var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n if (iceTransport) {\n delete iceTransport.onicestatechange;\n delete this.transceivers[sdpMLineIndex].iceTransport;\n }\n var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n if (dtlsTransport) {\n delete dtlsTransport.ondtlsstatechange;\n delete dtlsTransport.onerror;\n delete this.transceivers[sdpMLineIndex].dtlsTransport;\n }\n };\n\n // Start the RTP Sender and Receiver for a transceiver.\n RTCPeerConnection.prototype._transceive = function(transceiver,\n send, recv) {\n var params = getCommonCapabilities(transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n if (send && transceiver.rtpSender) {\n params.encodings = transceiver.sendEncodingParameters;\n params.rtcp = {\n cname: SDPUtils.localCName,\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.recvEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n }\n transceiver.rtpSender.send(params);\n }\n if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n // remove RTX field in Edge 14942\n if (transceiver.kind === 'video'\n && transceiver.recvEncodingParameters\n && edgeVersion < 15019) {\n transceiver.recvEncodingParameters.forEach(function(p) {\n delete p.rtx;\n });\n }\n if (transceiver.recvEncodingParameters.length) {\n params.encodings = transceiver.recvEncodingParameters;\n } else {\n params.encodings = [{}];\n }\n params.rtcp = {\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.rtcpParameters.cname) {\n params.rtcp.cname = transceiver.rtcpParameters.cname;\n }\n if (transceiver.sendEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n }\n transceiver.rtpReceiver.receive(params);\n }\n };\n\n RTCPeerConnection.prototype.setLocalDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setLocalDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set local ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var sections;\n var sessionpart;\n if (description.type === 'offer') {\n // VERY limited support for SDP munging. Limited to:\n // * changing the order of codecs\n sections = SDPUtils.splitSections(description.sdp);\n sessionpart = sections.shift();\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var caps = SDPUtils.parseRtpParameters(mediaSection);\n pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n });\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n });\n } else if (description.type === 'answer') {\n sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var transceiver = pc.transceivers[sdpMLineIndex];\n var iceGatherer = transceiver.iceGatherer;\n var iceTransport = transceiver.iceTransport;\n var dtlsTransport = transceiver.dtlsTransport;\n var localCapabilities = transceiver.localCapabilities;\n var remoteCapabilities = transceiver.remoteCapabilities;\n\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n if (!rejected && !transceiver.rejected) {\n var remoteIceParameters = SDPUtils.getIceParameters(\n mediaSection, sessionpart);\n var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n mediaSection, sessionpart);\n if (isIceLite) {\n remoteDtlsParameters.role = 'server';\n }\n\n if (!pc.usingBundle || sdpMLineIndex === 0) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n isIceLite ? 'controlling' : 'controlled');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // Calculate intersection of capabilities.\n var params = getCommonCapabilities(localCapabilities,\n remoteCapabilities);\n\n // Start the RTCRtpSender. The RTCRtpReceiver for this\n // transceiver has already been started in setRemoteDescription.\n pc._transceive(transceiver,\n params.codecs.length > 0,\n false);\n }\n });\n }\n\n pc._localDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-local-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setRemoteDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set remote ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var streams = {};\n pc.remoteStreams.forEach(function(stream) {\n streams[stream.id] = stream;\n });\n var receiverList = [];\n var sections = SDPUtils.splitSections(description.sdp);\n var sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n var usingBundle = SDPUtils.matchPrefix(sessionpart,\n 'a=group:BUNDLE ').length > 0;\n pc.usingBundle = usingBundle;\n var iceOptions = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-options:')[0];\n if (iceOptions) {\n pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n .indexOf('trickle') >= 0;\n } else {\n pc.canTrickleIceCandidates = false;\n }\n\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var lines = SDPUtils.splitLines(mediaSection);\n var kind = SDPUtils.getKind(mediaSection);\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n var protocol = lines[0].substr(2).split(' ')[2];\n\n var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n // Reject datachannels which are not implemented yet.\n if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n protocol === 'UDP/DTLS/SCTP'))) {\n // TODO: this is dangerous in the case where a non-rejected m-line\n // becomes rejected.\n pc.transceivers[sdpMLineIndex] = {\n mid: mid,\n kind: kind,\n protocol: protocol,\n rejected: true\n };\n return;\n }\n\n if (!rejected && pc.transceivers[sdpMLineIndex] &&\n pc.transceivers[sdpMLineIndex].rejected) {\n // recycle a rejected transceiver.\n pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n }\n\n var transceiver;\n var iceGatherer;\n var iceTransport;\n var dtlsTransport;\n var rtpReceiver;\n var sendEncodingParameters;\n var recvEncodingParameters;\n var localCapabilities;\n\n var track;\n // FIXME: ensure the mediaSection has rtcp-mux set.\n var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n var remoteIceParameters;\n var remoteDtlsParameters;\n if (!rejected) {\n remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters.role = 'client';\n }\n recvEncodingParameters =\n SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n var isComplete = SDPUtils.matchPrefix(mediaSection,\n 'a=end-of-candidates', sessionpart).length > 0;\n var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n .map(function(cand) {\n return SDPUtils.parseCandidate(cand);\n })\n .filter(function(cand) {\n return cand.component === 1;\n });\n\n // Check if we can use BUNDLE and dispose transports.\n if ((description.type === 'offer' || description.type === 'answer') &&\n !rejected && usingBundle && sdpMLineIndex > 0 &&\n pc.transceivers[sdpMLineIndex]) {\n pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n pc.transceivers[sdpMLineIndex].iceGatherer =\n pc.transceivers[0].iceGatherer;\n pc.transceivers[sdpMLineIndex].iceTransport =\n pc.transceivers[0].iceTransport;\n pc.transceivers[sdpMLineIndex].dtlsTransport =\n pc.transceivers[0].dtlsTransport;\n if (pc.transceivers[sdpMLineIndex].rtpSender) {\n pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n }\n if (description.type === 'offer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex] ||\n pc._createTransceiver(kind);\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n usingBundle);\n }\n\n if (cands.length && transceiver.iceTransport.state === 'new') {\n if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n transceiver.iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n\n sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 2) * 1001\n }];\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n var isNewTrack = false;\n if (direction === 'sendrecv' || direction === 'sendonly') {\n isNewTrack = !transceiver.rtpReceiver;\n rtpReceiver = transceiver.rtpReceiver ||\n new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n if (isNewTrack) {\n var stream;\n track = rtpReceiver.track;\n // FIXME: does not work with Plan B.\n if (remoteMsid && remoteMsid.stream === '-') {\n // no-op. a stream id of '-' means: no associated stream.\n } else if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n Object.defineProperty(streams[remoteMsid.stream], 'id', {\n get: function() {\n return remoteMsid.stream;\n }\n });\n }\n Object.defineProperty(track, 'id', {\n get: function() {\n return remoteMsid.track;\n }\n });\n stream = streams[remoteMsid.stream];\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n stream = streams.default;\n }\n if (stream) {\n addTrackToStreamAndFireEvent(track, stream);\n transceiver.associatedRemoteMediaStreams.push(stream);\n }\n receiverList.push([track, rtpReceiver, stream]);\n }\n } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n var nativeTrack = s.getTracks().find(function(t) {\n return t.id === transceiver.rtpReceiver.track.id;\n });\n if (nativeTrack) {\n removeTrackFromStreamAndFireEvent(nativeTrack, s);\n }\n });\n transceiver.associatedRemoteMediaStreams = [];\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.remoteCapabilities = remoteCapabilities;\n transceiver.rtpReceiver = rtpReceiver;\n transceiver.rtcpParameters = rtcpParameters;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n transceiver.recvEncodingParameters = recvEncodingParameters;\n\n // Start the RTCRtpReceiver now. The RTPSender is started in\n // setLocalDescription.\n pc._transceive(pc.transceivers[sdpMLineIndex],\n false,\n isNewTrack);\n } else if (description.type === 'answer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex];\n iceGatherer = transceiver.iceGatherer;\n iceTransport = transceiver.iceTransport;\n dtlsTransport = transceiver.dtlsTransport;\n rtpReceiver = transceiver.rtpReceiver;\n sendEncodingParameters = transceiver.sendEncodingParameters;\n localCapabilities = transceiver.localCapabilities;\n\n pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n recvEncodingParameters;\n pc.transceivers[sdpMLineIndex].remoteCapabilities =\n remoteCapabilities;\n pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n if (cands.length && iceTransport.state === 'new') {\n if ((isIceLite || isComplete) &&\n (!usingBundle || sdpMLineIndex === 0)) {\n iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n if (!usingBundle || sdpMLineIndex === 0) {\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n 'controlling');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // If the offer contained RTX but the answer did not,\n // remove RTX from sendEncodingParameters.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n pc._transceive(transceiver,\n direction === 'sendrecv' || direction === 'recvonly',\n direction === 'sendrecv' || direction === 'sendonly');\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n if (rtpReceiver &&\n (direction === 'sendrecv' || direction === 'sendonly')) {\n track = rtpReceiver.track;\n if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams.default);\n receiverList.push([track, rtpReceiver, streams.default]);\n }\n } else {\n // FIXME: actually the receiver should be created later.\n delete transceiver.rtpReceiver;\n }\n }\n });\n\n if (pc._dtlsRole === undefined) {\n pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n }\n\n pc._remoteDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-remote-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n Object.keys(streams).forEach(function(sid) {\n var stream = streams[sid];\n if (stream.getTracks().length) {\n if (pc.remoteStreams.indexOf(stream) === -1) {\n pc.remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n window.setTimeout(function() {\n pc._dispatchEvent('addstream', event);\n });\n }\n\n receiverList.forEach(function(item) {\n var track = item[0];\n var receiver = item[1];\n if (stream.id !== item[2].id) {\n return;\n }\n fireAddTrack(pc, track, receiver, [stream]);\n });\n }\n });\n receiverList.forEach(function(item) {\n if (item[2]) {\n return;\n }\n fireAddTrack(pc, item[0], item[1], []);\n });\n\n // check whether addIceCandidate({}) was called within four seconds after\n // setRemoteDescription.\n window.setTimeout(function() {\n if (!(pc && pc.transceivers)) {\n return;\n }\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport &&\n transceiver.iceTransport.state === 'new' &&\n transceiver.iceTransport.getRemoteCandidates().length > 0) {\n console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n 'an end-of-candidates notification');\n transceiver.iceTransport.addRemoteCandidate({});\n }\n });\n }, 4000);\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.close = function() {\n this.transceivers.forEach(function(transceiver) {\n /* not yet\n if (transceiver.iceGatherer) {\n transceiver.iceGatherer.close();\n }\n */\n if (transceiver.iceTransport) {\n transceiver.iceTransport.stop();\n }\n if (transceiver.dtlsTransport) {\n transceiver.dtlsTransport.stop();\n }\n if (transceiver.rtpSender) {\n transceiver.rtpSender.stop();\n }\n if (transceiver.rtpReceiver) {\n transceiver.rtpReceiver.stop();\n }\n });\n // FIXME: clean up tracks, local streams, remote streams, etc\n this._isClosed = true;\n this._updateSignalingState('closed');\n };\n\n // Update the signaling state.\n RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n this.signalingState = newState;\n var event = new Event('signalingstatechange');\n this._dispatchEvent('signalingstatechange', event);\n };\n\n // Determine whether to fire the negotiationneeded event.\n RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n var pc = this;\n if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n return;\n }\n this.needNegotiation = true;\n window.setTimeout(function() {\n if (pc.needNegotiation) {\n pc.needNegotiation = false;\n var event = new Event('negotiationneeded');\n pc._dispatchEvent('negotiationneeded', event);\n }\n }, 0);\n };\n\n // Update the ice connection state.\n RTCPeerConnection.prototype._updateIceConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n checking: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n }\n });\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.checking > 0) {\n newState = 'checking';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n } else if (states.completed > 0) {\n newState = 'completed';\n }\n\n if (newState !== this.iceConnectionState) {\n this.iceConnectionState = newState;\n var event = new Event('iceconnectionstatechange');\n this._dispatchEvent('iceconnectionstatechange', event);\n }\n };\n\n // Update the connection state.\n RTCPeerConnection.prototype._updateConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n connecting: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && transceiver.dtlsTransport &&\n !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\n }\n });\n // ICETransport.completed and connected are the same for this purpose.\n states.connected += states.completed;\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.connecting > 0) {\n newState = 'connecting';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n }\n\n if (newState !== this.connectionState) {\n this.connectionState = newState;\n var event = new Event('connectionstatechange');\n this._dispatchEvent('connectionstatechange', event);\n }\n };\n\n RTCPeerConnection.prototype.createOffer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createOffer after close'));\n }\n\n var numAudioTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'audio';\n }).length;\n var numVideoTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'video';\n }).length;\n\n // Determine number of audio and video tracks we need to send/recv.\n var offerOptions = arguments[0];\n if (offerOptions) {\n // Reject Chrome legacy constraints.\n if (offerOptions.mandatory || offerOptions.optional) {\n throw new TypeError(\n 'Legacy mandatory/optional constraints not supported.');\n }\n if (offerOptions.offerToReceiveAudio !== undefined) {\n if (offerOptions.offerToReceiveAudio === true) {\n numAudioTracks = 1;\n } else if (offerOptions.offerToReceiveAudio === false) {\n numAudioTracks = 0;\n } else {\n numAudioTracks = offerOptions.offerToReceiveAudio;\n }\n }\n if (offerOptions.offerToReceiveVideo !== undefined) {\n if (offerOptions.offerToReceiveVideo === true) {\n numVideoTracks = 1;\n } else if (offerOptions.offerToReceiveVideo === false) {\n numVideoTracks = 0;\n } else {\n numVideoTracks = offerOptions.offerToReceiveVideo;\n }\n }\n }\n\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.kind === 'audio') {\n numAudioTracks--;\n if (numAudioTracks < 0) {\n transceiver.wantReceive = false;\n }\n } else if (transceiver.kind === 'video') {\n numVideoTracks--;\n if (numVideoTracks < 0) {\n transceiver.wantReceive = false;\n }\n }\n });\n\n // Create M-lines for recvonly streams.\n while (numAudioTracks > 0 || numVideoTracks > 0) {\n if (numAudioTracks > 0) {\n pc._createTransceiver('audio');\n numAudioTracks--;\n }\n if (numVideoTracks > 0) {\n pc._createTransceiver('video');\n numVideoTracks--;\n }\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n // For each track, create an ice gatherer, ice transport,\n // dtls transport, potentially rtpsender and rtpreceiver.\n var track = transceiver.track;\n var kind = transceiver.kind;\n var mid = transceiver.mid || SDPUtils.generateIdentifier();\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n pc.usingBundle);\n }\n\n var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n localCapabilities.codecs.forEach(function(codec) {\n // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n // by adding level-asymmetry-allowed=1\n if (codec.name === 'H264' &&\n codec.parameters['level-asymmetry-allowed'] === undefined) {\n codec.parameters['level-asymmetry-allowed'] = '1';\n }\n\n // for subsequent offers, we might have to re-use the payload\n // type of the last offer.\n if (transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.codecs) {\n transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n codec.clockRate === remoteCodec.clockRate) {\n codec.preferredPayloadType = remoteCodec.payloadType;\n }\n });\n }\n });\n localCapabilities.headerExtensions.forEach(function(hdrExt) {\n var remoteExtensions = transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.headerExtensions || [];\n remoteExtensions.forEach(function(rHdrExt) {\n if (hdrExt.uri === rHdrExt.uri) {\n hdrExt.id = rHdrExt.id;\n }\n });\n });\n\n // generate an ssrc now, to be used later in rtpSender.send\n var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 1) * 1001\n }];\n if (track) {\n // add RTX\n if (edgeVersion >= 15019 && kind === 'video' &&\n !sendEncodingParameters[0].rtx) {\n sendEncodingParameters[0].rtx = {\n ssrc: sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n\n if (transceiver.wantReceive) {\n transceiver.rtpReceiver = new window.RTCRtpReceiver(\n transceiver.dtlsTransport, kind);\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n });\n\n // always offer BUNDLE and dispose on return if not supported.\n if (pc._config.bundlePolicy !== 'max-compat') {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n 'offer', transceiver.stream, pc._dtlsRole);\n sdp += 'a=rtcp-rsize\\r\\n';\n\n if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n (sdpMLineIndex === 0 || !pc.usingBundle)) {\n transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n cand.component = 1;\n sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n });\n\n if (transceiver.iceGatherer.state === 'completed') {\n sdp += 'a=end-of-candidates\\r\\n';\n }\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'offer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.createAnswer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer after close'));\n }\n\n if (!(pc.signalingState === 'have-remote-offer' ||\n pc.signalingState === 'have-local-pranswer')) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer in signalingState ' + pc.signalingState));\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n if (pc.usingBundle) {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n var mediaSectionsInOffer = SDPUtils.getMediaSections(\n pc._remoteDescription.sdp).length;\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n return;\n }\n if (transceiver.rejected) {\n if (transceiver.kind === 'application') {\n if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n } else {\n sdp += 'm=application 0 ' + transceiver.protocol +\n ' webrtc-datachannel\\r\\n';\n }\n } else if (transceiver.kind === 'audio') {\n sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n 'a=rtpmap:0 PCMU/8000\\r\\n';\n } else if (transceiver.kind === 'video') {\n sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n 'a=rtpmap:120 VP8/90000\\r\\n';\n }\n sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n 'a=inactive\\r\\n' +\n 'a=mid:' + transceiver.mid + '\\r\\n';\n return;\n }\n\n // FIXME: look at direction.\n if (transceiver.stream) {\n var localTrack;\n if (transceiver.kind === 'audio') {\n localTrack = transceiver.stream.getAudioTracks()[0];\n } else if (transceiver.kind === 'video') {\n localTrack = transceiver.stream.getVideoTracks()[0];\n }\n if (localTrack) {\n // add RTX\n if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n !transceiver.sendEncodingParameters[0].rtx) {\n transceiver.sendEncodingParameters[0].rtx = {\n ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n }\n\n // Calculate intersection of capabilities.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n sdp += writeMediaSection(transceiver, commonCapabilities,\n 'answer', transceiver.stream, pc._dtlsRole);\n if (transceiver.rtcpParameters &&\n transceiver.rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'answer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n var pc = this;\n var sections;\n if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n candidate.sdpMid)) {\n return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n }\n\n // TODO: needs to go into ops queue.\n return new Promise(function(resolve, reject) {\n if (!pc._remoteDescription) {\n return reject(makeError('InvalidStateError',\n 'Can not add ICE candidate without a remote description'));\n } else if (!candidate || candidate.candidate === '') {\n for (var j = 0; j < pc.transceivers.length; j++) {\n if (pc.transceivers[j].rejected) {\n continue;\n }\n pc.transceivers[j].iceTransport.addRemoteCandidate({});\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[j] += 'a=end-of-candidates\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n if (pc.usingBundle) {\n break;\n }\n }\n } else {\n var sdpMLineIndex = candidate.sdpMLineIndex;\n if (candidate.sdpMid) {\n for (var i = 0; i < pc.transceivers.length; i++) {\n if (pc.transceivers[i].mid === candidate.sdpMid) {\n sdpMLineIndex = i;\n break;\n }\n }\n }\n var transceiver = pc.transceivers[sdpMLineIndex];\n if (transceiver) {\n if (transceiver.rejected) {\n return resolve();\n }\n var cand = Object.keys(candidate.candidate).length > 0 ?\n SDPUtils.parseCandidate(candidate.candidate) : {};\n // Ignore Chrome's invalid candidates since Edge does not like them.\n if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n return resolve();\n }\n // Ignore RTCP candidates, we assume RTCP-MUX.\n if (cand.component && cand.component !== 1) {\n return resolve();\n }\n // when using bundle, avoid adding candidates to the wrong\n // ice transport. And avoid adding candidates added in the SDP.\n if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n\n // update the remoteDescription.\n var candidateString = candidate.candidate.trim();\n if (candidateString.indexOf('a=') === 0) {\n candidateString = candidateString.substr(2);\n }\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[sdpMLineIndex] += 'a=' +\n (cand.type ? candidateString : 'end-of-candidates')\n + '\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n } else {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n resolve();\n });\n };\n\n RTCPeerConnection.prototype.getStats = function(selector) {\n if (selector && selector instanceof window.MediaStreamTrack) {\n var senderOrReceiver = null;\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.rtpSender &&\n transceiver.rtpSender.track === selector) {\n senderOrReceiver = transceiver.rtpSender;\n } else if (transceiver.rtpReceiver &&\n transceiver.rtpReceiver.track === selector) {\n senderOrReceiver = transceiver.rtpReceiver;\n }\n });\n if (!senderOrReceiver) {\n throw makeError('InvalidAccessError', 'Invalid selector.');\n }\n return senderOrReceiver.getStats();\n }\n\n var promises = [];\n this.transceivers.forEach(function(transceiver) {\n ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n 'dtlsTransport'].forEach(function(method) {\n if (transceiver[method]) {\n promises.push(transceiver[method].getStats());\n }\n });\n });\n return Promise.all(promises).then(function(allStats) {\n var results = new Map();\n allStats.forEach(function(stats) {\n stats.forEach(function(stat) {\n results.set(stat.id, stat);\n });\n });\n return results;\n });\n };\n\n // fix low-level stat names and return Map instead of object.\n var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n 'RTCIceTransport', 'RTCDtlsTransport'];\n ortcObjects.forEach(function(ortcObjectName) {\n var obj = window[ortcObjectName];\n if (obj && obj.prototype && obj.prototype.getStats) {\n var nativeGetstats = obj.prototype.getStats;\n obj.prototype.getStats = function() {\n return nativeGetstats.apply(this)\n .then(function(nativeStats) {\n var mapStats = new Map();\n Object.keys(nativeStats).forEach(function(id) {\n nativeStats[id].type = fixStatsType(nativeStats[id]);\n mapStats.set(id, nativeStats[id]);\n });\n return mapStats;\n });\n };\n }\n });\n\n // legacy callback shims. Should be moved to adapter.js some days.\n var methods = ['createOffer', 'createAnswer'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[0] === 'function' ||\n typeof args[1] === 'function') { // legacy\n return nativeMethod.apply(this, [arguments[2]])\n .then(function(description) {\n if (typeof args[0] === 'function') {\n args[0].apply(null, [description]);\n }\n }, function(error) {\n if (typeof args[1] === 'function') {\n args[1].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function' ||\n typeof args[2] === 'function') { // legacy\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n }, function(error) {\n if (typeof args[2] === 'function') {\n args[2].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // getStats is special. It doesn't have a spec legacy method yet we support\n // getStats(something, cb) without error callbacks.\n ['getStats'].forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function') {\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n return RTCPeerConnection;\n};\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n const shimError_ = function(e) {\n return {\n name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).catch(e => Promise.reject(shimError_(e)));\n };\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window) {\n if (!('getDisplayMedia' in window.navigator)) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n window.navigator.getDisplayMedia.bind(window.navigator);\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nimport {filterIceServers} from './filtericeservers';\nimport shimRTCPeerConnection from 'rtcpeerconnection-shim';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimPeerConnection(window, browserDetails) {\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function RTCSessionDescription(args) {\n return args;\n };\n }\n // this adds an additional event listener to MediaStrackTrack that signals\n // when a tracks enabled property was changed. Workaround for a bug in\n // addStream, see below. No longer required in 15025+\n if (browserDetails.version < 15025) {\n const origMSTEnabled = Object.getOwnPropertyDescriptor(\n window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set(value) {\n origMSTEnabled.set.call(this, value);\n const ev = new Event('enabled');\n ev.enabled = value;\n this.dispatchEvent(ev);\n }\n });\n }\n }\n\n // ORTC defines the DTMF sender a bit different.\n // https://github.com/w3c/ortc/issues/714\n if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = new window.RTCDtmfSender(this);\n } else if (this.track.kind === 'video') {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n // Edge currently only implements the RTCDtmfSender, not the\n // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n window.RTCDTMFSender = window.RTCDtmfSender;\n }\n\n const RTCPeerConnectionShim = shimRTCPeerConnection(window,\n browserDetails.version);\n window.RTCPeerConnection = function RTCPeerConnection(config) {\n if (config && config.iceServers) {\n config.iceServers = filterIceServers(config.iceServers,\n browserDetails.version);\n utils.log('ICE servers after filtering:', config.iceServers);\n }\n return new RTCPeerConnectionShim(config);\n };\n window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n}\n\nexport function shimReplaceTrack(window) {\n // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n if (window.RTCRtpSender &&\n !('replaceTrack' in window.RTCRtpSender.prototype)) {\n window.RTCRtpSender.prototype.replaceTrack =\n window.RTCRtpSender.prototype.setTrack;\n }\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n const initParameters = arguments[1];\n const shouldPerformCheck = initParameters &&\n 'sendEncodings' in initParameters;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n initParameters.sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = initParameters.sendEncodings;\n sender.sendEncodings = initParameters.sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') &&\n server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio');\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substr(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n const augmentedCandidate = Object.assign(nativeCandidate,\n parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function toJSON() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment,\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substr(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\nimport * as utils from './utils';\n\n // Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as edgeShim from './edge/edge_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'edge':\n if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n logging('MS edge shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming edge.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = edgeShim;\n\n edgeShim.shimGetUserMedia(window, browserDetails);\n edgeShim.shimGetDisplayMedia(window, browserDetails);\n edgeShim.shimPeerConnection(window, browserDetails);\n edgeShim.shimReplaceTrack(window, browserDetails);\n\n // the edge shim implements the full RTCIceCandidate object.\n\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","\n'use strict';\nimport * as utils from './utils.js';\nimport * as MediaFormatModule from './mediaformat.js';\nimport adapter from 'webrtc-adapter';\n\n/**\n * @class AudioTrackConstraints\n * @classDesc Constraints for creating an audio MediaStreamTrack.\n * @memberof Owt.Base\n * @constructor\n * @param {Owt.Base.AudioSourceInfo} source Source info of this audio track.\n */\nexport class AudioTrackConstraints {\n // eslint-disable-next-line require-jsdoc\n constructor(source) {\n if (!Object.values(MediaFormatModule.AudioSourceInfo)\n .some((v) => v === source)) {\n throw new TypeError('Invalid source.');\n }\n /**\n * @member {string} source\n * @memberof Owt.Base.AudioTrackConstraints\n * @desc Values could be \"mic\", \"screen-cast\", \"file\" or \"mixed\".\n * @instance\n */\n this.source = source;\n /**\n * @member {string} deviceId\n * @memberof Owt.Base.AudioTrackConstraints\n * @desc Do not provide deviceId if source is not \"mic\".\n * @instance\n * @see https://w3c.github.io/mediacapture-main/#def-constraint-deviceId\n */\n this.deviceId = undefined;\n }\n}\n\n/**\n * @class VideoTrackConstraints\n * @classDesc Constraints for creating a video MediaStreamTrack.\n * @memberof Owt.Base\n * @constructor\n * @param {Owt.Base.VideoSourceInfo} source Source info of this video track.\n */\nexport class VideoTrackConstraints {\n // eslint-disable-next-line require-jsdoc\n constructor(source) {\n if (!Object.values(MediaFormatModule.VideoSourceInfo)\n .some((v) => v === source)) {\n throw new TypeError('Invalid source.');\n }\n /**\n * @member {string} source\n * @memberof Owt.Base.VideoTrackConstraints\n * @desc Values could be \"camera\", \"screen-cast\", \"file\" or \"mixed\".\n * @instance\n */\n this.source = source;\n /**\n * @member {string} deviceId\n * @memberof Owt.Base.VideoTrackConstraints\n * @desc Do not provide deviceId if source is not \"camera\".\n * @instance\n * @see https://w3c.github.io/mediacapture-main/#def-constraint-deviceId\n */\n\n this.deviceId = undefined;\n\n /**\n * @member {Owt.Base.Resolution} resolution\n * @memberof Owt.Base.VideoTrackConstraints\n * @instance\n */\n this.resolution = undefined;\n\n /**\n * @member {number} frameRate\n * @memberof Owt.Base.VideoTrackConstraints\n * @instance\n */\n this.frameRate = undefined;\n }\n}\n/**\n * @class StreamConstraints\n * @classDesc Constraints for creating a MediaStream from screen mic and camera.\n * @memberof Owt.Base\n * @constructor\n * @param {?Owt.Base.AudioTrackConstraints} audioConstraints\n * @param {?Owt.Base.VideoTrackConstraints} videoConstraints\n */\nexport class StreamConstraints {\n // eslint-disable-next-line require-jsdoc\n constructor(audioConstraints = false, videoConstraints = false) {\n /**\n * @member {Owt.Base.MediaStreamTrackDeviceConstraintsForAudio} audio\n * @memberof Owt.Base.MediaStreamDeviceConstraints\n * @instance\n */\n this.audio = audioConstraints;\n /**\n * @member {Owt.Base.MediaStreamTrackDeviceConstraintsForVideo} Video\n * @memberof Owt.Base.MediaStreamDeviceConstraints\n * @instance\n */\n this.video = videoConstraints;\n }\n}\n\n// eslint-disable-next-line require-jsdoc\nfunction isVideoConstrainsForScreenCast(constraints) {\n return (typeof constraints.video === 'object' && constraints.video.source ===\n MediaFormatModule.VideoSourceInfo.SCREENCAST);\n}\n\n/**\n * @class MediaStreamFactory\n * @classDesc A factory to create MediaStream. You can also create MediaStream by yourself.\n * @memberof Owt.Base\n */\nexport class MediaStreamFactory {\n /**\n * @function createMediaStream\n * @static\n * @desc Create a MediaStream with given constraints. If you want to create a MediaStream for screen cast, please make sure both audio and video's source are \"screen-cast\".\n * @memberof Owt.Base.MediaStreamFactory\n * @return {Promise} Return a promise that is resolved when stream is successfully created, or rejected if one of the following error happened:\n * - One or more parameters cannot be satisfied.\n * - Specified device is busy.\n * - Cannot obtain necessary permission or operation is canceled by user.\n * - Video source is screen cast, while audio source is not.\n * - Audio source is screen cast, while video source is disabled.\n * @param {Owt.Base.StreamConstraints} constraints\n */\n static createMediaStream(constraints) {\n if (typeof constraints !== 'object' ||\n (!constraints.audio && !constraints.video)) {\n return Promise.reject(new TypeError('Invalid constrains'));\n }\n if (!isVideoConstrainsForScreenCast(constraints) &&\n (typeof constraints.audio === 'object') &&\n constraints.audio.source ===\n MediaFormatModule.AudioSourceInfo.SCREENCAST) {\n return Promise.reject(\n new TypeError('Cannot share screen without video.'));\n }\n if (isVideoConstrainsForScreenCast(constraints) && !utils.isChrome() &&\n !utils.isFirefox()) {\n return Promise.reject(\n new TypeError('Screen sharing only supports Chrome and Firefox.'));\n }\n if (isVideoConstrainsForScreenCast(constraints) &&\n typeof constraints.audio === 'object' &&\n constraints.audio.source !==\n MediaFormatModule.AudioSourceInfo.SCREENCAST) {\n return Promise.reject(new TypeError(\n 'Cannot capture video from screen cast while capture audio from'\n + ' other source.'));\n }\n\n // Check and convert constraints.\n if (!constraints.audio && !constraints.video) {\n return Promise.reject(new TypeError(\n 'At least one of audio and video must be requested.'));\n }\n const mediaConstraints = Object.create({});\n if (typeof constraints.audio === 'object' &&\n constraints.audio.source === MediaFormatModule.AudioSourceInfo.MIC) {\n mediaConstraints.audio = Object.create({});\n if (utils.isEdge()) {\n mediaConstraints.audio.deviceId = constraints.audio.deviceId;\n } else {\n mediaConstraints.audio.deviceId = {\n exact: constraints.audio.deviceId,\n };\n }\n } else {\n if (constraints.audio.source ===\n MediaFormatModule.AudioSourceInfo.SCREENCAST) {\n mediaConstraints.audio = true;\n } else {\n mediaConstraints.audio = constraints.audio;\n }\n }\n if (typeof constraints.video === 'object') {\n mediaConstraints.video = Object.create({});\n if (typeof constraints.video.frameRate === 'number') {\n mediaConstraints.video.frameRate = constraints.video.frameRate;\n }\n if (constraints.video.resolution &&\n constraints.video.resolution.width &&\n constraints.video.resolution.height) {\n if (constraints.video.source ===\n MediaFormatModule.VideoSourceInfo.SCREENCAST) {\n mediaConstraints.video.width = constraints.video.resolution.width;\n mediaConstraints.video.height = constraints.video.resolution.height;\n } else {\n mediaConstraints.video.width = Object.create({});\n mediaConstraints.video.width.exact =\n constraints.video.resolution.width;\n mediaConstraints.video.height = Object.create({});\n mediaConstraints.video.height.exact =\n constraints.video.resolution.height;\n }\n }\n if (typeof constraints.video.deviceId === 'string') {\n mediaConstraints.video.deviceId = {exact: constraints.video.deviceId};\n }\n if (utils.isFirefox() &&\n constraints.video.source ===\n MediaFormatModule.VideoSourceInfo.SCREENCAST) {\n mediaConstraints.video.mediaSource = 'screen';\n }\n } else {\n mediaConstraints.video = constraints.video;\n }\n\n if (isVideoConstrainsForScreenCast(constraints)) {\n return navigator.mediaDevices.getDisplayMedia(mediaConstraints);\n } else {\n return navigator.mediaDevices.getUserMedia(mediaConstraints);\n }\n }\n}\n","// Copyright (C) <2018> Intel Corporation\n//\n// SPDX-License-Identifier: Apache-2.0\n\n'use strict';\n\nexport * from './mediastream-factory.js';\nexport * from './mediaformat.js';","let logger;\nlet errorLogger;\n\nexport function setLogger() {\n /*eslint-disable */\n logger = console.log;\n errorLogger = console.error;\n /*eslint-enable */\n}\n\nexport function isEnable() {\n return logger != null;\n}\n\nexport function log(message, ...optionalParams) {\n if (logger) {\n logger(message, ...optionalParams);\n }\n}\nexport function error(message, ...optionalParams) {\n if (errorLogger) {\n errorLogger(message, ...optionalParams);\n }\n}\n","export default class Event {\n constructor(type) {\n this.listener = {};\n this.type = type | '';\n }\n\n on(event, fn) {\n if (!this.listener[event]) {\n this.listener[event] = [];\n }\n this.listener[event].push(fn);\n return true;\n }\n\n off(event, fn) {\n if (this.listener[event]) {\n var index = this.listener[event].indexOf(fn);\n if (index > -1) {\n this.listener[event].splice(index, 1);\n }\n return true;\n }\n return false;\n }\n\n offAll() {\n this.listener = {};\n }\n\n dispatch(event, data) {\n if (this.listener[event]) {\n this.listener[event].map((each) => {\n each.apply(null, [data]);\n });\n return true;\n }\n return false;\n }\n}\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n// eslint-disable-next-line func-names\nvar kindOf = (function(cache) {\n // eslint-disable-next-line func-names\n return function(thing) {\n var str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n };\n})(Object.create(null));\n\nfunction kindOfTest(type) {\n type = type.toLowerCase();\n return function isKindOf(thing) {\n return kindOf(thing) === type;\n };\n}\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return Array.isArray(val);\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nvar isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nvar isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nvar isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nvar isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nvar isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} thing The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(thing) {\n var pattern = '[object FormData]';\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) ||\n toString.call(thing) === pattern ||\n (isFunction(thing.toString) && thing.toString() === pattern)\n );\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n * @function\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nvar isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n */\n\nfunction inherits(constructor, superConstructor, props, descriptors) {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function} [filter]\n * @returns {Object}\n */\n\nfunction toFlatObject(sourceObj, destObj, filter) {\n var props;\n var i;\n var prop;\n var merged = {};\n\n destObj = destObj || {};\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if (!merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = Object.getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/*\n * determines whether a string ends with the characters of a specified string\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n * @returns {boolean}\n */\nfunction endsWith(str, searchString, position) {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n var lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object\n * @param {*} [thing]\n * @returns {Array}\n */\nfunction toArray(thing) {\n if (!thing) return null;\n var i = thing.length;\n if (isUndefined(i)) return null;\n var arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n// eslint-disable-next-line func-names\nvar isTypedArray = (function(TypedArray) {\n // eslint-disable-next-line func-names\n return function(thing) {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && Object.getPrototypeOf(Uint8Array));\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM,\n inherits: inherits,\n toFlatObject: toFlatObject,\n kindOf: kindOf,\n kindOfTest: kindOfTest,\n endsWith: endsWith,\n toArray: toArray,\n isTypedArray: isTypedArray,\n isFileList: isFileList\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nvar prototype = AxiosError.prototype;\nvar descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED'\n// eslint-disable-next-line func-names\n].forEach(function(code) {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = function(error, code, config, request, response, customProps) {\n var axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nmodule.exports = AxiosError;\n","'use strict';\n\nmodule.exports = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Convert a data object to FormData\n * @param {Object} obj\n * @param {?Object} [formData]\n * @returns {Object}\n **/\n\nfunction toFormData(obj, formData) {\n // eslint-disable-next-line no-param-reassign\n formData = formData || new FormData();\n\n var stack = [];\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n function build(data, parentKey) {\n if (utils.isPlainObject(data) || utils.isArray(data)) {\n if (stack.indexOf(data) !== -1) {\n throw Error('Circular reference detected in ' + parentKey);\n }\n\n stack.push(data);\n\n utils.forEach(data, function each(value, key) {\n if (utils.isUndefined(value)) return;\n var fullKey = parentKey ? parentKey + '.' + key : key;\n var arr;\n\n if (value && !parentKey && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (utils.endsWith(key, '[]') && (arr = utils.toArray(value))) {\n // eslint-disable-next-line func-names\n arr.forEach(function(el) {\n !utils.isUndefined(el) && formData.append(fullKey, convertValue(el));\n });\n return;\n }\n }\n\n build(value, fullKey);\n });\n\n stack.pop();\n } else {\n formData.append(parentKey, convertValue(data));\n }\n }\n\n build(obj);\n\n return formData;\n}\n\nmodule.exports = toFormData;\n","'use strict';\n\nvar AxiosError = require('./AxiosError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\nvar AxiosError = require('../core/AxiosError');\nvar utils = require('../utils');\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction CanceledError(message) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nmodule.exports = CanceledError;\n","'use strict';\n\nmodule.exports = function parseProtocol(url) {\n var match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar cookies = require('./../helpers/cookies');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar transitionalDefaults = require('../defaults/transitional');\nvar AxiosError = require('../core/AxiosError');\nvar CanceledError = require('../cancel/CanceledError');\nvar parseProtocol = require('../helpers/parseProtocol');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n var onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData) && utils.isStandardBrowserEnv()) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n var transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = function(cancel) {\n if (!request) {\n return;\n }\n reject(!cancel || (cancel && cancel.type) ? new CanceledError() : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n var protocol = parseProtocol(fullPath);\n\n if (protocol && [ 'http', 'https', 'file' ].indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData);\n });\n};\n","// eslint-disable-next-line strict\nmodule.exports = null;\n","'use strict';\n\nvar utils = require('../utils');\nvar normalizeHeaderName = require('../helpers/normalizeHeaderName');\nvar AxiosError = require('../core/AxiosError');\nvar transitionalDefaults = require('./transitional');\nvar toFormData = require('../helpers/toFormData');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('../adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('../adapters/http');\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n\n var isObjectPayload = utils.isObject(data);\n var contentType = headers && headers['Content-Type'];\n\n var isFileList;\n\n if ((isFileList = utils.isFileList(data)) || (isObjectPayload && contentType === 'multipart/form-data')) {\n var _FormData = this.env && this.env.FormData;\n return toFormData(isFileList ? {'files[]': data} : data, _FormData && new _FormData());\n } else if (isObjectPayload || contentType === 'application/json') {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional || defaults.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: require('./env/FormData')\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nvar utils = require('./../utils');\nvar defaults = require('../defaults');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n var context = this || defaults;\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn.call(context, data, headers);\n });\n\n return data;\n};\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar CanceledError = require('../cancel/CanceledError');\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n var mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'beforeRedirect': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n var merge = mergeMap[prop] || mergeDeepProperties;\n var configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n};\n","module.exports = {\n \"version\": \"0.27.2\"\n};","'use strict';\n\nvar VERSION = require('../env/data').version;\nvar AxiosError = require('../core/AxiosError');\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nmodule.exports = {\n assertOptions: assertOptions,\n validators: validators\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\nvar buildFullPath = require('./buildFullPath');\nvar validator = require('../helpers/validator');\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n var fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url: url,\n data: data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nvar CanceledError = require('./CanceledError');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(function(cancel) {\n if (!token._listeners) return;\n\n var i;\n var l = token._listeners.length;\n\n for (i = 0; i < l; i++) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = function(onfulfilled) {\n var _resolve;\n // eslint-disable-next-line func-names\n var promise = new Promise(function(resolve) {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Subscribe to the cancel signal\n */\n\nCancelToken.prototype.subscribe = function subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n};\n\n/**\n * Unsubscribe from the cancel signal\n */\n\nCancelToken.prototype.unsubscribe = function unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n var index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = require('./cancel/CanceledError');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\naxios.VERSION = require('./env/data').version;\naxios.toFormData = require('./helpers/toFormData');\n\n// Expose AxiosError class\naxios.AxiosError = require('../lib/core/AxiosError');\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\n// Expose isAxiosError\naxios.isAxiosError = require('./helpers/isAxiosError');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","module.exports = require('./lib/axios');","\nimport { setLogger } from '../ulity/debug';\nimport * as debug from '../ulity/debug';\nimport Event from '../ulity/event';\nimport Events from '../base/event';\nimport axios from 'axios';\nimport * as Base from '../base/export';\n\nexport default class RTCEndpoint extends Event\n{\n constructor(options)\n {\n super('RTCPusherPlayer');\n this.TAG = '[RTCPusherPlayer]';\n\n let defaults = {\n element: '',// html video element\n debug: false,// if output debug log\n zlmsdpUrl:'',\n simulcast:false,\n useCamera:true,\n audioEnable:true,\n videoEnable:true,\n recvOnly:false,\n resolution:{w:0,h:0},\n usedatachannel:false,\n };\n \n this.options = Object.assign({}, defaults, options);\n\n if(this.options.debug)\n {\n setLogger();\n }\n\n this.e = {\n onicecandidate:this._onIceCandidate.bind(this),\n ontrack:this._onTrack.bind(this),\n onicecandidateerror:this._onIceCandidateError.bind(this),\n onconnectionstatechange:this._onconnectionstatechange.bind(this),\n ondatachannelopen:this._onDataChannelOpen.bind(this),\n ondatachannelmsg:this._onDataChannelMsg.bind(this),\n ondatachannelerr:this._onDataChannelErr.bind(this),\n ondatachannelclose:this._onDataChannelClose.bind(this),\n };\n\n this._remoteStream = null;\n this._localStream = null;\n\n this._tracks = [];\n this.pc = new RTCPeerConnection(null);\n\n this.pc.onicecandidate = this.e.onicecandidate;\n this.pc.onicecandidateerror = this.e.onicecandidateerror;\n this.pc.ontrack = this.e.ontrack;\n this.pc.onconnectionstatechange = this.e.onconnectionstatechange;\n\n this.datachannel = null;\n if(this.options.usedatachannel){\n this.datachannel = this.pc.createDataChannel('chat');\n this.datachannel.onclose = this.e.ondatachannelclose;\n this.datachannel.onerror = this.e.ondatachannelerr;\n this.datachannel.onmessage = this.e.ondatachannelmsg;\n this.datachannel.onopen = this.e.ondatachannelopen;\n }\n\n if(!this.options.recvOnly && (this.options.audioEnable || this.options.videoEnable))\n this.start();\n else\n this.receive();\n \n }\n\n receive()\n {\n let audioTransceiver = null;\n let videoTransceiver = null;\n\n //debug.error(this.TAG,'this not implement');\n const AudioTransceiverInit = {\n direction: 'recvonly',\n sendEncodings:[]\n };\n const VideoTransceiverInit= {\n direction: 'recvonly',\n sendEncodings:[],\n };\n \n if(this.options.videoEnable){\n videoTransceiver = this.pc.addTransceiver('video',VideoTransceiverInit);\n }\n if(this.options.audioEnable){\n audioTransceiver = this.pc.addTransceiver('audio',AudioTransceiverInit);\n }\n \n this.pc.createOffer().then((desc)=>{\n debug.log(this.TAG,'offer:',desc.sdp);\n this.pc.setLocalDescription(desc).then(() => {\n axios({\n method: 'post',\n url:this.options.zlmsdpUrl,\n responseType:'json',\n data:desc.sdp,\n headers:{\n 'Content-Type':'text/plain;charset=utf-8'\n }\n }).then(response=>{\n let ret = response.data;//JSON.parse(response.data);\n if(ret.code != 0)\n {// mean failed for offer/anwser exchange \n this.dispatch(Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED,ret);\n return;\n }\n let anwser = {};\n anwser.sdp = ret.sdp;\n anwser.type = 'answer';\n debug.log(this.TAG,'answer:',ret.sdp);\n\n this.pc.setRemoteDescription(anwser).then(()=>{\n debug.log(this.TAG,'set remote sucess');\n }).catch(e=>{\n debug.error(this.TAG,e);\n });\n });\n });\n }).catch(e=>{\n debug.error(this.TAG,e);\n });\n }\n\n start()\n {\n let videoConstraints = false;\n let audioConstraints = false;\n\n if(this.options.useCamera)\n {\n if(this.options.videoEnable)\n videoConstraints = new Base.VideoTrackConstraints(Base.VideoSourceInfo.CAMERA);\n if(this.options.audioEnable)\n audioConstraints = new Base.AudioTrackConstraints(Base.AudioSourceInfo.MIC);\n }\n else\n {\n if(this.options.videoEnable)\n {\n videoConstraints = new Base.VideoTrackConstraints(Base.VideoSourceInfo.SCREENCAST);\n if(this.options.audioEnable)\n audioConstraints = new Base.AudioTrackConstraints(Base.AudioSourceInfo.SCREENCAST);\n }\n else\n {\n if(this.options.audioEnable)\n audioConstraints = new Base.AudioTrackConstraints(Base.AudioSourceInfo.MIC);\n else\n {// error shared display media not only audio\n debug.error(this.TAG,'error paramter');\n }\n }\n \n }\n\n if(this.options.resolution.w !=0 && this.options.resolution.h!=0 && typeof videoConstraints == 'object'){\n videoConstraints.resolution = new Base.Resolution(this.options.resolution.w ,this.options.resolution.h);\n }\n\n Base.MediaStreamFactory.createMediaStream(new Base.StreamConstraints(\n audioConstraints, videoConstraints)).then(stream => {\n\n this._localStream = stream;\n\n this.dispatch(Events.WEBRTC_ON_LOCAL_STREAM,stream);\n\n const AudioTransceiverInit = {\n direction: 'sendrecv',\n sendEncodings:[]\n };\n const VideoTransceiverInit= {\n direction: 'sendrecv',\n sendEncodings:[],\n };\n \n if(this.options.simulcast && stream.getVideoTracks().length>0)\n {\n VideoTransceiverInit.sendEncodings = [\n { rid: 'h', active: true, maxBitrate: 1000000 },\n { rid: 'm', active: true, maxBitrate: 500000, scaleResolutionDownBy: 2 },\n { rid: 'l', active: true, maxBitrate: 200000, scaleResolutionDownBy: 4 }\n ];\n }\n let audioTransceiver = null;\n let videoTransceiver = null;\n if (this.options.audioEnable) {\n if (stream.getAudioTracks().length > 0) {\n audioTransceiver = this.pc.addTransceiver(stream.getAudioTracks()[0],\n AudioTransceiverInit);\n }\n else {\n AudioTransceiverInit.direction = 'recvonly';\n audioTransceiver = this.pc.addTransceiver('audio', AudioTransceiverInit);\n }\n }\n \n if (this.options.videoEnable) {\n if (stream.getVideoTracks().length > 0) {\n videoTransceiver = this.pc.addTransceiver(stream.getVideoTracks()[0],\n VideoTransceiverInit);\n }\n else {\n VideoTransceiverInit.direction = 'recvonly';\n videoTransceiver = this.pc.addTransceiver('video',\n VideoTransceiverInit);\n }\n }\n\n /*\n stream.getTracks().forEach((track,idx)=>{\n debug.log(this.TAG,track);\n this.pc.addTrack(track);\n });\n */\n this.pc.createOffer().then((desc)=>{\n debug.log(this.TAG,'offer:',desc.sdp);\n this.pc.setLocalDescription(desc).then(() => {\n axios({\n method: 'post',\n url:this.options.zlmsdpUrl,\n responseType:'json',\n data:desc.sdp,\n headers:{\n 'Content-Type':'text/plain;charset=utf-8'\n }\n }).then(response=>{\n let ret = response.data;//JSON.parse(response.data);\n if(ret.code != 0)\n {// mean failed for offer/anwser exchange \n this.dispatch(Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED,ret);\n return;\n }\n let anwser = {};\n anwser.sdp = ret.sdp;\n anwser.type = 'answer';\n debug.log(this.TAG,'answer:',ret.sdp);\n \n this.pc.setRemoteDescription(anwser).then(()=>{\n debug.log(this.TAG,'set remote sucess');\n }).catch(e=>{\n debug.error(this.TAG,e);\n });\n });\n });\n }).catch(e=>{\n debug.error(this.TAG,e);\n });\n\n }).catch(e=>{\n this.dispatch(Events.CAPTURE_STREAM_FAILED);\n //debug.error(this.TAG,e);\n });\n \n //const offerOptions = {};\n /*\n if (typeof this.pc.addTransceiver === 'function') {\n // |direction| seems not working on Safari.\n this.pc.addTransceiver('audio', { direction: 'recvonly' });\n this.pc.addTransceiver('video', { direction: 'recvonly' });\n } else {\n offerOptions.offerToReceiveAudio = true;\n offerOptions.offerToReceiveVideo = true;\n }\n */\n\n\n\n }\n _onIceCandidate(event) {\n if (event.candidate) { \n debug.log(this.TAG,'Remote ICE candidate: \\n ' + event.candidate.candidate);\n // Send the candidate to the remote peer\n }\n else {\n // All ICE candidates have been sent\n }\n }\n\n _onTrack(event){\n this._tracks.push(event.track);\n if(this.options.element && event.streams && event.streams.length>0)\n {\n this.options.element.srcObject = event.streams[0];\n this._remoteStream = event.streams[0];\n\n this.dispatch(Events.WEBRTC_ON_REMOTE_STREAMS,event);\n }\n else\n {\n if(this.pc.getReceivers().length ==this._tracks.length){\n debug.log(this.TAG,'play remote stream ');\n this._remoteStream = new MediaStream(this._tracks);\n this.options.element.srcObject = this._remoteStream;\n }else{\n debug.error(this.TAG,'wait stream track finish');\n }\n }\n }\n\n _onIceCandidateError(event){\n this.dispatch(Events.WEBRTC_ICE_CANDIDATE_ERROR,event);\n }\n\n _onconnectionstatechange(event) {\n this.dispatch(Events.WEBRTC_ON_CONNECTION_STATE_CHANGE, this.pc.connectionState);\n }\n\n _onDataChannelOpen(event) {\n debug.log(this.TAG,'ondatachannel open:',event);\n this.dispatch(Events.WEBRTC_ON_DATA_CHANNEL_OPEN,event);\n }\n _onDataChannelMsg(event) {\n debug.log(this.TAG,'ondatachannel msg:',event);\n this.dispatch(Events.WEBRTC_ON_DATA_CHANNEL_MSG,event);\n }\n _onDataChannelErr(event){\n debug.log(this.TAG,'ondatachannel err:',event);\n this.dispatch(Events.WEBRTC_ON_DATA_CHANNEL_ERR,event);\n }\n _onDataChannelClose(event){\n debug.log(this.TAG,'ondatachannel close:',event);\n this.dispatch(Events.WEBRTC_ON_DATA_CHANNEL_CLOSE,event);\n }\n sendMsg(data){\n if(this.datachannel !=null){\n this.datachannel.send(data);\n }else{\n debug.error(this.TAG,'data channel is null');\n }\n }\n closeDataChannel(){\n if(this.datachannel){\n this.datachannel.close();\n this.datachannel = null;\n }\n }\n close()\n { \n this.closeDataChannel();\n if(this.pc)\n {\n this.pc.close();\n this.pc=null;\n }\n\n if(this.options)\n {\n this.options=null;\n }\n\n if(this._localStream)\n {\n this._localStream.getTracks().forEach((track,idx)=>{\n track.stop();\n });\n }\n\n if(this._remoteStream)\n {\n this._remoteStream.getTracks().forEach((track,idx)=>{\n track.stop();\n });\n }\n\n this._tracks.forEach((track, idx) => {\n track.stop();\n });\n this._tracks = [];\n }\n\n get remoteStream()\n {\n return this._remoteStream;\n }\n \n get localStream()\n {\n return this._localStream;\n }\n}\n","import * as mediaformat from './mediaformat';\nimport * as MediaFactory from './mediastream-factory';\n\n\nconst quickScan=[\n {\n 'label': '4K(UHD)',\n 'width': 3840,\n 'height': 2160\n },\n {\n 'label': '1080p(FHD)',\n 'width': 1920,\n 'height': 1080\n },\n {\n 'label': 'UXGA',\n 'width': 1600,\n 'height': 1200,\n 'ratio': '4:3'\n },\n {\n 'label': '720p(HD)',\n 'width': 1280,\n 'height': 720\n },\n {\n 'label': 'SVGA',\n 'width': 800,\n 'height': 600\n },\n {\n 'label': 'VGA',\n 'width': 640,\n 'height': 480\n },\n {\n 'label': '360p(nHD)',\n 'width': 640,\n 'height': 360\n },\n {\n 'label': 'CIF',\n 'width': 352,\n 'height': 288\n },\n {\n 'label': 'QVGA',\n 'width': 320,\n 'height': 240\n },\n {\n 'label': 'QCIF',\n 'width': 176,\n 'height': 144\n },\n {\n 'label': 'QQVGA',\n 'width': 160,\n 'height': 120\n }\n];\n\n\n\n\nexport default function GetSupportCameraResolutions(){\n return new Promise(function (resolve, reject) {\n let resolutions = [];\n let ok = 0;\n let err = 0;\n for (let i = 0; i < quickScan.length; ++i) {\n let videoConstraints = new MediaFactory.VideoTrackConstraints(mediaformat.VideoSourceInfo.CAMERA);\n videoConstraints.resolution = new mediaformat.Resolution(quickScan[i].width, quickScan[i].height);\n\n MediaFactory.MediaStreamFactory.createMediaStream(new MediaFactory.StreamConstraints(\n false, videoConstraints)).then(stream => {\n resolutions.push(quickScan[i]);\n ok++;\n if(ok+err == quickScan.length)\n {\n resolve(resolutions);\n }\n }).catch(e => {\n err++;\n if(ok+err == quickScan.length)\n {\n resolve(resolutions);\n }\n });\n }\n });\n}\n\nexport function GetAllScanResolution()\n{\n return quickScan;\n}\nexport function isSupportResolution(w,h)\n{\n return new Promise(function (resolve, reject) {\n let videoConstraints = new MediaFactory.VideoTrackConstraints(mediaformat.VideoSourceInfo.CAMERA);\n videoConstraints.resolution = new mediaformat.Resolution(w,h);\n\n MediaFactory.MediaStreamFactory.createMediaStream(new MediaFactory.StreamConstraints(\n false, videoConstraints)).then(stream => {\n resolve();\n }).catch(e => {\n reject(e);\n });\n });\n}","import * as events from './base/event';\nimport * as compile from './ulity/version';\nimport * as media from './base/export';\nimport * as endpoint from './endpoint/endpoint';\nimport * as resolution from './base/resolutionfind';\n\n\n\nconsole.log('build date:',compile.BUILD_DATE);\nconsole.log('version:',compile.VERSION);\n\nexport const Events = events.default;\nexport const Media = media;\nexport const Endpoint = endpoint.default;\nexport const GetSupportCameraResolutions = resolution.default;\nexport const GetAllScanResolution = resolution.GetAllScanResolution;\nexport const isSupportResolution = resolution.isSupportResolution;"],"names":["Events","WEBRTC_NOT_SUPPORT","WEBRTC_ICE_CANDIDATE_ERROR","WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED","WEBRTC_ON_REMOTE_STREAMS","WEBRTC_ON_LOCAL_STREAM","WEBRTC_ON_CONNECTION_STATE_CHANGE","WEBRTC_ON_DATA_CHANNEL_OPEN","WEBRTC_ON_DATA_CHANNEL_CLOSE","WEBRTC_ON_DATA_CHANNEL_ERR","WEBRTC_ON_DATA_CHANNEL_MSG","CAPTURE_STREAM_FAILED","VERSION","BUILD_DATE","isFirefox","window","navigator","userAgent","match","isChrome","isEdge","AudioSourceInfo","MIC","SCREENCAST","FILE","MIXED","VideoSourceInfo","CAMERA","TrackKind","AUDIO","VIDEO","AUDIO_AND_VIDEO","Resolution","constructor","width","height","log","isObject","utils.log","shimGetUserMedia","shimGetDisplayMedia","shimOnTrack","utils.wrapPeerConnectionEvent","utils.filterStats","shimPeerConnection","filterIceServers","utils.deprecated","sdp","SDPUtils","shimRTCPeerConnection","utils.compactObject","utils.detectBrowser","utils.extractVersion","utils.disableLog","utils.disableWarnings","chromeShim.shimPeerConnection","commonShim.shimAddIceCandidateNullOrEmpty","chromeShim.shimGetUserMedia","chromeShim.shimMediaStream","chromeShim.shimOnTrack","chromeShim.shimAddTrackRemoveTrack","chromeShim.shimGetSendersWithDtmf","chromeShim.shimGetStats","chromeShim.shimSenderReceiverGetStats","chromeShim.fixNegotiationNeeded","commonShim.shimRTCIceCandidate","commonShim.shimConnectionState","commonShim.shimMaxMessageSize","commonShim.shimSendThrowTypeError","commonShim.removeExtmapAllowMixed","firefoxShim.shimPeerConnection","firefoxShim.shimGetUserMedia","firefoxShim.shimOnTrack","firefoxShim.shimRemoveStream","firefoxShim.shimSenderGetStats","firefoxShim.shimReceiverGetStats","firefoxShim.shimRTCDataChannel","firefoxShim.shimAddTransceiver","firefoxShim.shimGetParameters","firefoxShim.shimCreateOffer","firefoxShim.shimCreateAnswer","edgeShim.shimPeerConnection","edgeShim.shimGetUserMedia","edgeShim.shimGetDisplayMedia","edgeShim.shimReplaceTrack","safariShim.shimRTCIceServerUrls","safariShim.shimCreateOfferLegacy","safariShim.shimCallbacksAPI","safariShim.shimLocalStreamsAPI","safariShim.shimRemoteStreamsAPI","safariShim.shimTrackEventTransceiver","safariShim.shimGetUserMedia","safariShim.shimAudioContext","AudioTrackConstraints","source","Object","values","MediaFormatModule","some","v","TypeError","deviceId","undefined","VideoTrackConstraints","resolution","frameRate","StreamConstraints","audioConstraints","videoConstraints","audio","video","isVideoConstrainsForScreenCast","constraints","MediaStreamFactory","createMediaStream","Promise","reject","utils","mediaConstraints","create","exact","mediaSource","mediaDevices","getDisplayMedia","getUserMedia","logger","errorLogger","setLogger","console","error","message","optionalParams","Event","type","listener","on","event","fn","push","off","index","indexOf","splice","offAll","dispatch","data","map","each","apply","AxiosError","transitional","transitionalDefaults","CanceledError","require$$0","require$$1","toFormData","require$$2","defaults","validators","InterceptorManager","Axios","axios","require$$3","require$$4","require$$5","require$$6","require$$7","RTCEndpoint","options","TAG","element","debug","zlmsdpUrl","simulcast","useCamera","audioEnable","videoEnable","recvOnly","w","h","usedatachannel","assign","e","onicecandidate","_onIceCandidate","bind","ontrack","_onTrack","onicecandidateerror","_onIceCandidateError","onconnectionstatechange","_onconnectionstatechange","ondatachannelopen","_onDataChannelOpen","ondatachannelmsg","_onDataChannelMsg","ondatachannelerr","_onDataChannelErr","ondatachannelclose","_onDataChannelClose","_remoteStream","_localStream","_tracks","pc","RTCPeerConnection","datachannel","createDataChannel","onclose","onerror","onmessage","onopen","start","receive","AudioTransceiverInit","direction","sendEncodings","VideoTransceiverInit","addTransceiver","createOffer","then","desc","setLocalDescription","method","url","responseType","headers","response","ret","code","anwser","setRemoteDescription","catch","Base","stream","getVideoTracks","length","rid","active","maxBitrate","scaleResolutionDownBy","getAudioTracks","audioTransceiver","videoTransceiver","candidate","track","streams","srcObject","getReceivers","MediaStream","connectionState","sendMsg","send","closeDataChannel","close","getTracks","forEach","idx","stop","remoteStream","localStream","quickScan","GetSupportCameraResolutions","resolve","resolutions","ok","err","i","MediaFactory","mediaformat","GetAllScanResolution","isSupportResolution","compile","events","Media","media","Endpoint","endpoint"],"mappings":"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"} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3ff205 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..d51af04 --- /dev/null +++ b/main.js @@ -0,0 +1,26 @@ +import App from './App' +import uviewPlus from '@/uni_modules/uview-plus' + +// #ifndef VUE3 +import Vue from 'vue' +import './uni.promisify.adaptor' +Vue.config.productionTip = false +App.mpType = 'app' +const app = new Vue({ + ...App +}) +app.$mount() +// #endif + +// #ifdef VUE3 +import { + createSSRApp +} from 'vue' +export function createApp() { + const app = createSSRApp(App) + app.use(uviewPlus) + return { + app + } +} +// #endif \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..2e1045d --- /dev/null +++ b/manifest.json @@ -0,0 +1,74 @@ +{ + "name" : "uniApp", + "appid" : "", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : {} + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "", + "setting" : { + "urlCheck" : false + }, + "usingComponents" : true, + "mergeVirtualHostAttributes" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true, + "mergeVirtualHostAttributes" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "3" +} diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 0000000..3416f15 --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,45 @@ +{ + "name": "uniApp", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + } + } +} diff --git a/node_modules/clipboard/.babelrc.json b/node_modules/clipboard/.babelrc.json new file mode 100644 index 0000000..b442199 --- /dev/null +++ b/node_modules/clipboard/.babelrc.json @@ -0,0 +1,11 @@ +{ + "presets": [ + [ + "@babel/env", + { + "forceAllTransforms": true, + "modules": false + } + ] + ] +} diff --git a/node_modules/clipboard/.editorconfig b/node_modules/clipboard/.editorconfig new file mode 100644 index 0000000..202ee21 --- /dev/null +++ b/node_modules/clipboard/.editorconfig @@ -0,0 +1,22 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# http://editorconfig.org + +root = true + +[*] +# Change these settings to your own preference +indent_style = space +indent_size = 2 + +# We recommend you to keep these unchanged +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[{package.json,bower.json}] +indent_size = 2 diff --git a/node_modules/clipboard/.eslintignore b/node_modules/clipboard/.eslintignore new file mode 100644 index 0000000..8730547 --- /dev/null +++ b/node_modules/clipboard/.eslintignore @@ -0,0 +1,12 @@ +# Ignore artifacts: +dist + +lib +npm-debug.log +bower_components +node_modules +yarn-error.log +yarn.lock + +src/*.ts +/*.js diff --git a/node_modules/clipboard/.eslintrc.json b/node_modules/clipboard/.eslintrc.json new file mode 100644 index 0000000..a6890ef --- /dev/null +++ b/node_modules/clipboard/.eslintrc.json @@ -0,0 +1,24 @@ +{ + "env": { + "browser": true, + "es2021": true, + "mocha": true + }, + "extends": ["airbnb-base", "plugin:prettier/recommended"], + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": ["prettier"], + "rules": { + "prettier/prettier": "error", + "prefer-const": "off", + "camelcase": "off", + "no-underscore-dangle": "off", + "consistent-return": "off", + /* Remove the necessity to use this on classes */ + "class-methods-use-this": "off", + /* Enable variables declarations from shadowing variables declared in the outer scope */ + "no-shadow": "off" + } +} diff --git a/node_modules/clipboard/.github/ISSUE_TEMPLATE/bug_report.md b/node_modules/clipboard/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..99fe3e6 --- /dev/null +++ b/node_modules/clipboard/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,57 @@ +--- +name: 🐛 Bug Report +about: Submit a bug report to help us improve +labels: 'bug, needs triage' +--- + + + +## 🐛 Bug Report + +> Fork this [JSFiddle](https://jsfiddle.net/zenorocha/5kk0eysw/) and reproduce your issue. + +(A clear and concise description of what the issue is.) + +### Have you read the [Contributing Guidelines on issues](https://github.com/zenorocha/clipboard.js/blob/master/contributing.md)? + +(Write your answer here.) + +### Expected Behaviour + + + +I thought that by going to the page '...' and pressing the button '...' then '...' would happen. + +_Tip: Try to use screenshots, gifs, videos, always remember people better understand with a visual way._ + +### Actual Behaviour + +Instead of '...', what I saw was that '...' happened instead. + +### To Reproduce + +(Write your steps such as:) + +1. Step 1... +1. Step 2... +1. Step 3... + +### Browsers Affected + +I tested on all major browsers and only IE 11 does not work. + +### Operational System + +(Place here your Operational System.) diff --git a/node_modules/clipboard/.github/ISSUE_TEMPLATE/documentation.md b/node_modules/clipboard/.github/ISSUE_TEMPLATE/documentation.md new file mode 100644 index 0000000..adbcf5c --- /dev/null +++ b/node_modules/clipboard/.github/ISSUE_TEMPLATE/documentation.md @@ -0,0 +1,13 @@ +--- +name: 📚 Documentation +about: Report an issue related to documentation +labels: 'documentation, needs triage' +--- + +## 📚 Documentation + +(A clear and concise description of what the issue is.) + +### Have you read the [Contributing Guidelines on issues](https://github.com/zenorocha/clipboard.js/blob/master/contributing.md)? + +(Write your answer here.) diff --git a/node_modules/clipboard/.github/ISSUE_TEMPLATE/proposal.md b/node_modules/clipboard/.github/ISSUE_TEMPLATE/proposal.md new file mode 100644 index 0000000..f7ce878 --- /dev/null +++ b/node_modules/clipboard/.github/ISSUE_TEMPLATE/proposal.md @@ -0,0 +1,26 @@ +--- +name: 💥 Proposal +about: Propose a non-trivial change to Clipboard.js +labels: 'proposal, needs triage' +--- + +## 💥 Proposal + +**Is your feature request related to a problem? Please describe** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Are you able to assist to bring the feature to reality?** +no | yes, I can... + +**Additional context** +Add any other context or screenshots about the feature request here. + +### Have you read the [Contributing Guidelines on issues](https://github.com/zenorocha/clipboard.js/blob/master/contributing.md)? + +(Write your answer here.) diff --git a/node_modules/clipboard/.github/PULL_REQUEST_TEMPLATE.md b/node_modules/clipboard/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..b2f50c8 --- /dev/null +++ b/node_modules/clipboard/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,35 @@ + + + + + +**What kind of change does this PR introduce?** (check at least one) + +- [ ] Bugfix +- [ ] Feature +- [ ] Code style update +- [ ] Refactor +- [ ] Build-related changes +- [ ] Other, please describe: + +**Does this PR introduce a breaking change?** (check one) + +- [ ] Yes +- [ ] No + +If yes, please describe the impact and migration path for existing applications: + +**The PR fulfills these requirements:** + +- [ ] It's submitted to the `dev` branch for v2.x (or to a previous version branch), _not_ the `master` branch +- [ ] When resolving a specific issue, it's referenced in the PR's title (e.g. `fix #xxx[,#xxx]`, where "xxx" is the issue number) +- [ ] New/updated tests are included + +If adding a **new feature**, the PR's description includes: + +- [ ] A convincing reason for adding this feature (to avoid wasting your time, it's best to open a suggestion issue first and wait for approval before working on it) + +**Other information:** diff --git a/node_modules/clipboard/.github/stale.yml b/node_modules/clipboard/.github/stale.yml new file mode 100644 index 0000000..efee0d1 --- /dev/null +++ b/node_modules/clipboard/.github/stale.yml @@ -0,0 +1,21 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 + +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 + +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + +# Label to use when marking an issue as stale +staleLabel: stale + +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/node_modules/clipboard/.github/workflows/publish.yml b/node_modules/clipboard/.github/workflows/publish.yml new file mode 100644 index 0000000..e0dadfc --- /dev/null +++ b/node_modules/clipboard/.github/workflows/publish.yml @@ -0,0 +1,47 @@ +# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created +# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages + +name: publish + +on: + release: + types: [created] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 14 + - run: npm ci + - run: npm test + + publish-npm: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 14 + registry-url: https://registry.npmjs.org/ + - run: npm ci + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{secrets.npm_token}} + + publish-gpr: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 14 + registry-url: https://npm.pkg.github.com/ + - run: npm ci + - run: npm publish + env: + NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/node_modules/clipboard/.github/workflows/test.js.yml b/node_modules/clipboard/.github/workflows/test.js.yml new file mode 100644 index 0000000..04f169a --- /dev/null +++ b/node_modules/clipboard/.github/workflows/test.js.yml @@ -0,0 +1,34 @@ +# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: build + +on: + push: + branches: [master] + pull_request: + branches: [master] + +env: + FORCE_COLOR: 2 + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x, 14.x, 15.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + # For now is not possible to target LTS verssions =/ check progress here https://github.com/actions/setup-node/issues/26 + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - run: npm ci + - run: npm run build --if-present + - run: npm run lint + - run: npm test diff --git a/node_modules/clipboard/.husky/pre-commit b/node_modules/clipboard/.husky/pre-commit new file mode 100644 index 0000000..d37daa0 --- /dev/null +++ b/node_modules/clipboard/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install lint-staged diff --git a/node_modules/clipboard/.nvmrc b/node_modules/clipboard/.nvmrc new file mode 100644 index 0000000..8351c19 --- /dev/null +++ b/node_modules/clipboard/.nvmrc @@ -0,0 +1 @@ +14 diff --git a/node_modules/clipboard/.prettierignore b/node_modules/clipboard/.prettierignore new file mode 100644 index 0000000..0069bdb --- /dev/null +++ b/node_modules/clipboard/.prettierignore @@ -0,0 +1,9 @@ +# Ignore artifacts: +dist + +lib +npm-debug.log +bower_components +node_modules +yarn-error.log +yarn.lock diff --git a/node_modules/clipboard/.prettierrc.json b/node_modules/clipboard/.prettierrc.json new file mode 100644 index 0000000..471698f --- /dev/null +++ b/node_modules/clipboard/.prettierrc.json @@ -0,0 +1,9 @@ +{ + "printWidth": 80, + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "trailingComma": "es5", + "bracketSpacing": true, + "arrowParens": "always" +} diff --git a/node_modules/clipboard/LICENSE b/node_modules/clipboard/LICENSE new file mode 100644 index 0000000..01cdf07 --- /dev/null +++ b/node_modules/clipboard/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) Zeno Rocha + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/clipboard/bower.json b/node_modules/clipboard/bower.json new file mode 100644 index 0000000..c0b31e4 --- /dev/null +++ b/node_modules/clipboard/bower.json @@ -0,0 +1,18 @@ +{ + "name": "clipboard", + "version": "2.0.11", + "description": "Modern copy to clipboard. No Flash. Just 3kb", + "license": "MIT", + "main": "dist/clipboard.js", + "ignore": [ + "/.*/", + "/demo/", + "/test/", + "/.*", + "/bower.json", + "/karma.conf.js", + "/src", + "/lib" + ], + "keywords": ["clipboard", "copy", "cut"] +} diff --git a/node_modules/clipboard/composer.json b/node_modules/clipboard/composer.json new file mode 100644 index 0000000..50a9405 --- /dev/null +++ b/node_modules/clipboard/composer.json @@ -0,0 +1,25 @@ +{ + "name": "zenorocha/clipboardjs", + "description": "Modern copy to clipboard. No Flash. Just 3kb gzipped https://clipboardjs.com", + "type": "component", + "homepage": "https://clipboardjs.com/", + "authors": [ + { + "name": "Zeno Rocha", + "homepage": "http://zenorocha.com/" + } + ], + "require": { + "oomphinc/composer-installers-extender": "*" + }, + "extra": { + "component": { + "scripts": [ + "dist/clipboard.js" + ], + "files": [ + "dist/clipboard.min.js" + ] + } + } +} diff --git a/node_modules/clipboard/contributing.md b/node_modules/clipboard/contributing.md new file mode 100644 index 0000000..9146adc --- /dev/null +++ b/node_modules/clipboard/contributing.md @@ -0,0 +1,29 @@ +# Contributing guide + +Want to contribute to Clipboard.js? Awesome! +There are many ways you can contribute, see below. + +## Opening issues + +Open an issue to report bugs or to propose new features. + +- Reporting bugs: describe the bug as clearly as you can, including steps to reproduce, what happened and what you were expecting to happen. Also include browser version, OS and other related software's (npm, Node.js, etc) versions when applicable. + +- Proposing features: explain the proposed feature, what it should do, why it is useful, how users should use it. Give us as much info as possible so it will be easier to discuss, access and implement the proposed feature. When you're unsure about a certain aspect of the feature, feel free to leave it open for others to discuss and find an appropriate solution. + +## Proposing pull requests + +Pull requests are very welcome. Note that if you are going to propose drastic changes, be sure to open an issue for discussion first, to make sure that your PR will be accepted before you spend effort coding it. + +Fork the Clipboard.js repository, clone it locally and create a branch for your proposed bug fix or new feature. Avoid working directly on the master branch. + +Implement your bug fix or feature, write tests to cover it and make sure all tests are passing (run a final `npm test` to make sure everything is correct). Then commit your changes, push your bug fix/feature branch to the origin (your forked repo) and open a pull request to the upstream (the repository you originally forked)'s master branch. + +## Documentation + +Documentation is extremely important and takes a fair deal of time and effort to write and keep updated. Please submit any and all improvements you can make to the repository's docs. + +## Known issues + +If you're using npm@3 you'll probably face some issues related to peerDependencies. +https://github.com/npm/npm/issues/9204 diff --git a/node_modules/clipboard/demo/constructor-node.html b/node_modules/clipboard/demo/constructor-node.html new file mode 100644 index 0000000..2780ebc --- /dev/null +++ b/node_modules/clipboard/demo/constructor-node.html @@ -0,0 +1,35 @@ + + + + + constructor-node + + + + +
+ Copy +
+ + + + + + + + diff --git a/node_modules/clipboard/demo/constructor-nodelist.html b/node_modules/clipboard/demo/constructor-nodelist.html new file mode 100644 index 0000000..31dd419 --- /dev/null +++ b/node_modules/clipboard/demo/constructor-nodelist.html @@ -0,0 +1,35 @@ + + + + + constructor-nodelist + + + + + + + + + + + + + + + diff --git a/node_modules/clipboard/demo/constructor-selector.html b/node_modules/clipboard/demo/constructor-selector.html new file mode 100644 index 0000000..33e3d56 --- /dev/null +++ b/node_modules/clipboard/demo/constructor-selector.html @@ -0,0 +1,34 @@ + + + + + constructor-selector + + + + + + + + + + + + + + + diff --git a/node_modules/clipboard/demo/function-target.html b/node_modules/clipboard/demo/function-target.html new file mode 100644 index 0000000..74b7460 --- /dev/null +++ b/node_modules/clipboard/demo/function-target.html @@ -0,0 +1,37 @@ + + + + + function-target + + + + + +
hello
+ + + + + + + + diff --git a/node_modules/clipboard/demo/function-text.html b/node_modules/clipboard/demo/function-text.html new file mode 100644 index 0000000..d7b00a5 --- /dev/null +++ b/node_modules/clipboard/demo/function-text.html @@ -0,0 +1,36 @@ + + + + + function-text + + + + + + + + + + + + + diff --git a/node_modules/clipboard/demo/target-div.html b/node_modules/clipboard/demo/target-div.html new file mode 100644 index 0000000..61a039f --- /dev/null +++ b/node_modules/clipboard/demo/target-div.html @@ -0,0 +1,39 @@ + + + + + target-div + + + + +
hello
+ + + + + + + + + diff --git a/node_modules/clipboard/demo/target-input-number.html b/node_modules/clipboard/demo/target-input-number.html new file mode 100644 index 0000000..c537384 --- /dev/null +++ b/node_modules/clipboard/demo/target-input-number.html @@ -0,0 +1,37 @@ + + + + + target-input-number + + + + + + + + + + + + + + diff --git a/node_modules/clipboard/demo/target-input.html b/node_modules/clipboard/demo/target-input.html new file mode 100644 index 0000000..b34d26d --- /dev/null +++ b/node_modules/clipboard/demo/target-input.html @@ -0,0 +1,37 @@ + + + + + target-input + + + + + + + + + + + + + + diff --git a/node_modules/clipboard/demo/target-programmatic-copy.html b/node_modules/clipboard/demo/target-programmatic-copy.html new file mode 100644 index 0000000..0f00ded --- /dev/null +++ b/node_modules/clipboard/demo/target-programmatic-copy.html @@ -0,0 +1,28 @@ + + + + + target-programmatic-copy + + + + + + + + + + + + + + diff --git a/node_modules/clipboard/demo/target-programmatic-cut.html b/node_modules/clipboard/demo/target-programmatic-cut.html new file mode 100644 index 0000000..3b5e9f0 --- /dev/null +++ b/node_modules/clipboard/demo/target-programmatic-cut.html @@ -0,0 +1,28 @@ + + + + + target-programmatic-cut + + + + + + + + + + + + + + diff --git a/node_modules/clipboard/demo/target-textarea.html b/node_modules/clipboard/demo/target-textarea.html new file mode 100644 index 0000000..0ef462b --- /dev/null +++ b/node_modules/clipboard/demo/target-textarea.html @@ -0,0 +1,39 @@ + + + + + target-textarea + + + + + + + + + + + + + + diff --git a/node_modules/clipboard/demo/text-programmatic-copy.html b/node_modules/clipboard/demo/text-programmatic-copy.html new file mode 100644 index 0000000..7cb7ed0 --- /dev/null +++ b/node_modules/clipboard/demo/text-programmatic-copy.html @@ -0,0 +1,27 @@ + + + + + text-programmatic-copy + + + + + + + + + + + + + diff --git a/node_modules/clipboard/dist/clipboard.js b/node_modules/clipboard/dist/clipboard.js new file mode 100644 index 0000000..aeb826f --- /dev/null +++ b/node_modules/clipboard/dist/clipboard.js @@ -0,0 +1,890 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["ClipboardJS"] = factory(); + else + root["ClipboardJS"] = factory(); +})(this, function() { +return /******/ (function() { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 686: +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, { + "default": function() { return /* binding */ clipboard; } +}); + +// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js +var tiny_emitter = __webpack_require__(279); +var tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter); +// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js +var listen = __webpack_require__(370); +var listen_default = /*#__PURE__*/__webpack_require__.n(listen); +// EXTERNAL MODULE: ./node_modules/select/src/select.js +var src_select = __webpack_require__(817); +var select_default = /*#__PURE__*/__webpack_require__.n(src_select); +;// CONCATENATED MODULE: ./src/common/command.js +/** + * Executes a given operation type. + * @param {String} type + * @return {Boolean} + */ +function command(type) { + try { + return document.execCommand(type); + } catch (err) { + return false; + } +} +;// CONCATENATED MODULE: ./src/actions/cut.js + + +/** + * Cut action wrapper. + * @param {String|HTMLElement} target + * @return {String} + */ + +var ClipboardActionCut = function ClipboardActionCut(target) { + var selectedText = select_default()(target); + command('cut'); + return selectedText; +}; + +/* harmony default export */ var actions_cut = (ClipboardActionCut); +;// CONCATENATED MODULE: ./src/common/create-fake-element.js +/** + * Creates a fake textarea element with a value. + * @param {String} value + * @return {HTMLElement} + */ +function createFakeElement(value) { + var isRTL = document.documentElement.getAttribute('dir') === 'rtl'; + var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS + + fakeElement.style.fontSize = '12pt'; // Reset box model + + fakeElement.style.border = '0'; + fakeElement.style.padding = '0'; + fakeElement.style.margin = '0'; // Move element out of screen horizontally + + fakeElement.style.position = 'absolute'; + fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically + + var yPosition = window.pageYOffset || document.documentElement.scrollTop; + fakeElement.style.top = "".concat(yPosition, "px"); + fakeElement.setAttribute('readonly', ''); + fakeElement.value = value; + return fakeElement; +} +;// CONCATENATED MODULE: ./src/actions/copy.js + + + +/** + * Create fake copy action wrapper using a fake element. + * @param {String} target + * @param {Object} options + * @return {String} + */ + +var fakeCopyAction = function fakeCopyAction(value, options) { + var fakeElement = createFakeElement(value); + options.container.appendChild(fakeElement); + var selectedText = select_default()(fakeElement); + command('copy'); + fakeElement.remove(); + return selectedText; +}; +/** + * Copy action wrapper. + * @param {String|HTMLElement} target + * @param {Object} options + * @return {String} + */ + + +var ClipboardActionCopy = function ClipboardActionCopy(target) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + container: document.body + }; + var selectedText = ''; + + if (typeof target === 'string') { + selectedText = fakeCopyAction(target, options); + } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) { + // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange + selectedText = fakeCopyAction(target.value, options); + } else { + selectedText = select_default()(target); + command('copy'); + } + + return selectedText; +}; + +/* harmony default export */ var actions_copy = (ClipboardActionCopy); +;// CONCATENATED MODULE: ./src/actions/default.js +function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + + + +/** + * Inner function which performs selection from either `text` or `target` + * properties and then executes copy or cut operations. + * @param {Object} options + */ + +var ClipboardActionDefault = function ClipboardActionDefault() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + // Defines base properties passed from constructor. + var _options$action = options.action, + action = _options$action === void 0 ? 'copy' : _options$action, + container = options.container, + target = options.target, + text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'. + + if (action !== 'copy' && action !== 'cut') { + throw new Error('Invalid "action" value, use either "copy" or "cut"'); + } // Sets the `target` property using an element that will be have its content copied. + + + if (target !== undefined) { + if (target && _typeof(target) === 'object' && target.nodeType === 1) { + if (action === 'copy' && target.hasAttribute('disabled')) { + throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); + } + + if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) { + throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); + } + } else { + throw new Error('Invalid "target" value, use a valid Element'); + } + } // Define selection strategy based on `text` property. + + + if (text) { + return actions_copy(text, { + container: container + }); + } // Defines which selection strategy based on `target` property. + + + if (target) { + return action === 'cut' ? actions_cut(target) : actions_copy(target, { + container: container + }); + } +}; + +/* harmony default export */ var actions_default = (ClipboardActionDefault); +;// CONCATENATED MODULE: ./src/clipboard.js +function clipboard_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return clipboard_typeof(obj); } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + +function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + +function _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + +function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } } + +function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + + + + + + +/** + * Helper function to retrieve attribute value. + * @param {String} suffix + * @param {Element} element + */ + +function getAttributeValue(suffix, element) { + var attribute = "data-clipboard-".concat(suffix); + + if (!element.hasAttribute(attribute)) { + return; + } + + return element.getAttribute(attribute); +} +/** + * Base class which takes one or more elements, adds event listeners to them, + * and instantiates a new `ClipboardAction` on each click. + */ + + +var Clipboard = /*#__PURE__*/function (_Emitter) { + _inherits(Clipboard, _Emitter); + + var _super = _createSuper(Clipboard); + + /** + * @param {String|HTMLElement|HTMLCollection|NodeList} trigger + * @param {Object} options + */ + function Clipboard(trigger, options) { + var _this; + + _classCallCheck(this, Clipboard); + + _this = _super.call(this); + + _this.resolveOptions(options); + + _this.listenClick(trigger); + + return _this; + } + /** + * Defines if attributes would be resolved using internal setter functions + * or custom functions that were passed in the constructor. + * @param {Object} options + */ + + + _createClass(Clipboard, [{ + key: "resolveOptions", + value: function resolveOptions() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + this.action = typeof options.action === 'function' ? options.action : this.defaultAction; + this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; + this.text = typeof options.text === 'function' ? options.text : this.defaultText; + this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body; + } + /** + * Adds a click event listener to the passed trigger. + * @param {String|HTMLElement|HTMLCollection|NodeList} trigger + */ + + }, { + key: "listenClick", + value: function listenClick(trigger) { + var _this2 = this; + + this.listener = listen_default()(trigger, 'click', function (e) { + return _this2.onClick(e); + }); + } + /** + * Defines a new `ClipboardAction` on each click event. + * @param {Event} e + */ + + }, { + key: "onClick", + value: function onClick(e) { + var trigger = e.delegateTarget || e.currentTarget; + var action = this.action(trigger) || 'copy'; + var text = actions_default({ + action: action, + container: this.container, + target: this.target(trigger), + text: this.text(trigger) + }); // Fires an event based on the copy operation result. + + this.emit(text ? 'success' : 'error', { + action: action, + text: text, + trigger: trigger, + clearSelection: function clearSelection() { + if (trigger) { + trigger.focus(); + } + + window.getSelection().removeAllRanges(); + } + }); + } + /** + * Default `action` lookup function. + * @param {Element} trigger + */ + + }, { + key: "defaultAction", + value: function defaultAction(trigger) { + return getAttributeValue('action', trigger); + } + /** + * Default `target` lookup function. + * @param {Element} trigger + */ + + }, { + key: "defaultTarget", + value: function defaultTarget(trigger) { + var selector = getAttributeValue('target', trigger); + + if (selector) { + return document.querySelector(selector); + } + } + /** + * Allow fire programmatically a copy action + * @param {String|HTMLElement} target + * @param {Object} options + * @returns Text copied. + */ + + }, { + key: "defaultText", + + /** + * Default `text` lookup function. + * @param {Element} trigger + */ + value: function defaultText(trigger) { + return getAttributeValue('text', trigger); + } + /** + * Destroy lifecycle. + */ + + }, { + key: "destroy", + value: function destroy() { + this.listener.destroy(); + } + }], [{ + key: "copy", + value: function copy(target) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : { + container: document.body + }; + return actions_copy(target, options); + } + /** + * Allow fire programmatically a cut action + * @param {String|HTMLElement} target + * @returns Text cutted. + */ + + }, { + key: "cut", + value: function cut(target) { + return actions_cut(target); + } + /** + * Returns the support of the given action, or all actions if no action is + * given. + * @param {String} [action] + */ + + }, { + key: "isSupported", + value: function isSupported() { + var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut']; + var actions = typeof action === 'string' ? [action] : action; + var support = !!document.queryCommandSupported; + actions.forEach(function (action) { + support = support && !!document.queryCommandSupported(action); + }); + return support; + } + }]); + + return Clipboard; +}((tiny_emitter_default())); + +/* harmony default export */ var clipboard = (Clipboard); + +/***/ }), + +/***/ 828: +/***/ (function(module) { + +var DOCUMENT_NODE_TYPE = 9; + +/** + * A polyfill for Element.matches() + */ +if (typeof Element !== 'undefined' && !Element.prototype.matches) { + var proto = Element.prototype; + + proto.matches = proto.matchesSelector || + proto.mozMatchesSelector || + proto.msMatchesSelector || + proto.oMatchesSelector || + proto.webkitMatchesSelector; +} + +/** + * Finds the closest parent that matches a selector. + * + * @param {Element} element + * @param {String} selector + * @return {Function} + */ +function closest (element, selector) { + while (element && element.nodeType !== DOCUMENT_NODE_TYPE) { + if (typeof element.matches === 'function' && + element.matches(selector)) { + return element; + } + element = element.parentNode; + } +} + +module.exports = closest; + + +/***/ }), + +/***/ 438: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var closest = __webpack_require__(828); + +/** + * Delegates event to a selector. + * + * @param {Element} element + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @param {Boolean} useCapture + * @return {Object} + */ +function _delegate(element, selector, type, callback, useCapture) { + var listenerFn = listener.apply(this, arguments); + + element.addEventListener(type, listenerFn, useCapture); + + return { + destroy: function() { + element.removeEventListener(type, listenerFn, useCapture); + } + } +} + +/** + * Delegates event to a selector. + * + * @param {Element|String|Array} [elements] + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @param {Boolean} useCapture + * @return {Object} + */ +function delegate(elements, selector, type, callback, useCapture) { + // Handle the regular Element usage + if (typeof elements.addEventListener === 'function') { + return _delegate.apply(null, arguments); + } + + // Handle Element-less usage, it defaults to global delegation + if (typeof type === 'function') { + // Use `document` as the first parameter, then apply arguments + // This is a short way to .unshift `arguments` without running into deoptimizations + return _delegate.bind(null, document).apply(null, arguments); + } + + // Handle Selector-based usage + if (typeof elements === 'string') { + elements = document.querySelectorAll(elements); + } + + // Handle Array-like based usage + return Array.prototype.map.call(elements, function (element) { + return _delegate(element, selector, type, callback, useCapture); + }); +} + +/** + * Finds closest match and invokes callback. + * + * @param {Element} element + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @return {Function} + */ +function listener(element, selector, type, callback) { + return function(e) { + e.delegateTarget = closest(e.target, selector); + + if (e.delegateTarget) { + callback.call(element, e); + } + } +} + +module.exports = delegate; + + +/***/ }), + +/***/ 879: +/***/ (function(__unused_webpack_module, exports) { + +/** + * Check if argument is a HTML element. + * + * @param {Object} value + * @return {Boolean} + */ +exports.node = function(value) { + return value !== undefined + && value instanceof HTMLElement + && value.nodeType === 1; +}; + +/** + * Check if argument is a list of HTML elements. + * + * @param {Object} value + * @return {Boolean} + */ +exports.nodeList = function(value) { + var type = Object.prototype.toString.call(value); + + return value !== undefined + && (type === '[object NodeList]' || type === '[object HTMLCollection]') + && ('length' in value) + && (value.length === 0 || exports.node(value[0])); +}; + +/** + * Check if argument is a string. + * + * @param {Object} value + * @return {Boolean} + */ +exports.string = function(value) { + return typeof value === 'string' + || value instanceof String; +}; + +/** + * Check if argument is a function. + * + * @param {Object} value + * @return {Boolean} + */ +exports.fn = function(value) { + var type = Object.prototype.toString.call(value); + + return type === '[object Function]'; +}; + + +/***/ }), + +/***/ 370: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +var is = __webpack_require__(879); +var delegate = __webpack_require__(438); + +/** + * Validates all params and calls the right + * listener function based on its target type. + * + * @param {String|HTMLElement|HTMLCollection|NodeList} target + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listen(target, type, callback) { + if (!target && !type && !callback) { + throw new Error('Missing required arguments'); + } + + if (!is.string(type)) { + throw new TypeError('Second argument must be a String'); + } + + if (!is.fn(callback)) { + throw new TypeError('Third argument must be a Function'); + } + + if (is.node(target)) { + return listenNode(target, type, callback); + } + else if (is.nodeList(target)) { + return listenNodeList(target, type, callback); + } + else if (is.string(target)) { + return listenSelector(target, type, callback); + } + else { + throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList'); + } +} + +/** + * Adds an event listener to a HTML element + * and returns a remove listener function. + * + * @param {HTMLElement} node + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listenNode(node, type, callback) { + node.addEventListener(type, callback); + + return { + destroy: function() { + node.removeEventListener(type, callback); + } + } +} + +/** + * Add an event listener to a list of HTML elements + * and returns a remove listener function. + * + * @param {NodeList|HTMLCollection} nodeList + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listenNodeList(nodeList, type, callback) { + Array.prototype.forEach.call(nodeList, function(node) { + node.addEventListener(type, callback); + }); + + return { + destroy: function() { + Array.prototype.forEach.call(nodeList, function(node) { + node.removeEventListener(type, callback); + }); + } + } +} + +/** + * Add an event listener to a selector + * and returns a remove listener function. + * + * @param {String} selector + * @param {String} type + * @param {Function} callback + * @return {Object} + */ +function listenSelector(selector, type, callback) { + return delegate(document.body, selector, type, callback); +} + +module.exports = listen; + + +/***/ }), + +/***/ 817: +/***/ (function(module) { + +function select(element) { + var selectedText; + + if (element.nodeName === 'SELECT') { + element.focus(); + + selectedText = element.value; + } + else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') { + var isReadOnly = element.hasAttribute('readonly'); + + if (!isReadOnly) { + element.setAttribute('readonly', ''); + } + + element.select(); + element.setSelectionRange(0, element.value.length); + + if (!isReadOnly) { + element.removeAttribute('readonly'); + } + + selectedText = element.value; + } + else { + if (element.hasAttribute('contenteditable')) { + element.focus(); + } + + var selection = window.getSelection(); + var range = document.createRange(); + + range.selectNodeContents(element); + selection.removeAllRanges(); + selection.addRange(range); + + selectedText = selection.toString(); + } + + return selectedText; +} + +module.exports = select; + + +/***/ }), + +/***/ 279: +/***/ (function(module) { + +function E () { + // Keep this empty so it's easier to inherit from + // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) +} + +E.prototype = { + on: function (name, callback, ctx) { + var e = this.e || (this.e = {}); + + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + + return this; + }, + + once: function (name, callback, ctx) { + var self = this; + function listener () { + self.off(name, listener); + callback.apply(ctx, arguments); + }; + + listener._ = callback + return this.on(name, listener, ctx); + }, + + emit: function (name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + + return this; + }, + + off: function (name, callback) { + var e = this.e || (this.e = {}); + var evts = e[name]; + var liveEvents = []; + + if (evts && callback) { + for (var i = 0, len = evts.length; i < len; i++) { + if (evts[i].fn !== callback && evts[i].fn._ !== callback) + liveEvents.push(evts[i]); + } + } + + // Remove event from queue to prevent memory leak + // Suggested by https://github.com/lazd + // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 + + (liveEvents.length) + ? e[name] = liveEvents + : delete e[name]; + + return this; + } +}; + +module.exports = E; +module.exports.TinyEmitter = E; + + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ if(__webpack_module_cache__[moduleId]) { +/******/ return __webpack_module_cache__[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/************************************************************************/ +/******/ // module exports must be returned from runtime so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ return __webpack_require__(686); +/******/ })() +.default; +}); \ No newline at end of file diff --git a/node_modules/clipboard/dist/clipboard.min.js b/node_modules/clipboard/dist/clipboard.min.js new file mode 100644 index 0000000..1103f81 --- /dev/null +++ b/node_modules/clipboard/dist/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1 Modern copy to clipboard. No Flash. Just 3kb gzipped. + +Demo + +## Why + +Copying text to the clipboard shouldn't be hard. It shouldn't require dozens of steps to configure or hundreds of KBs to load. But most of all, it shouldn't depend on Flash or any bloated framework. + +That's why clipboard.js exists. + +## Install + +You can get it on npm. + +``` +npm install clipboard --save +``` + +Or if you're not into package management, just [download a ZIP](https://github.com/zenorocha/clipboard.js/archive/master.zip) file. + +## Setup + +First, include the script located on the `dist` folder or load it from [a third-party CDN provider](https://github.com/zenorocha/clipboard.js/wiki/CDN-Providers). + +```html + +``` + +Now, you need to instantiate it by [passing a DOM selector](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-selector.html#L18), [HTML element](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-node.html#L16-L17), or [list of HTML elements](https://github.com/zenorocha/clipboard.js/blob/master/demo/constructor-nodelist.html#L18-L19). + +```js +new ClipboardJS('.btn'); +``` + +Internally, we need to fetch all elements that matches with your selector and attach event listeners for each one. But guess what? If you have hundreds of matches, this operation can consume a lot of memory. + +For this reason we use [event delegation](https://stackoverflow.com/questions/1687296/what-is-dom-event-delegation) which replaces multiple event listeners with just a single listener. After all, [#perfmatters](https://twitter.com/hashtag/perfmatters). + +# Usage + +We're living a _declarative renaissance_, that's why we decided to take advantage of [HTML5 data attributes](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Using_data_attributes) for better usability. + +### Copy text from another element + +A pretty common use case is to copy content from another element. You can do that by adding a `data-clipboard-target` attribute in your trigger element. + +The value you include on this attribute needs to match another's element selector. + +example-2 + +```html + + + + + +``` + +### Cut text from another element + +Additionally, you can define a `data-clipboard-action` attribute to specify if you want to either `copy` or `cut` content. + +If you omit this attribute, `copy` will be used by default. + +example-3 + +```html + + + + + +``` + +As you may expect, the `cut` action only works on `` or ` + + + + + + + + diff --git a/node_modules/select/demo/nested.html b/node_modules/select/demo/nested.html new file mode 100644 index 0000000..11e11f3 --- /dev/null +++ b/node_modules/select/demo/nested.html @@ -0,0 +1,34 @@ + + + + + non-editable + + + + +
+

Item 1

+

Item 2

+
    +
  • Item 3
  • +
  • Item 4
  • +
  • Item 5
  • +
+
+ + + + + + + + diff --git a/node_modules/select/demo/non-editable.html b/node_modules/select/demo/non-editable.html new file mode 100644 index 0000000..2c34be9 --- /dev/null +++ b/node_modules/select/demo/non-editable.html @@ -0,0 +1,26 @@ + + + + + non-editable + + + + +

Lorem ipsum

+ + + + + + + + diff --git a/node_modules/select/dist/select.js b/node_modules/select/dist/select.js new file mode 100644 index 0000000..c3bdfe2 --- /dev/null +++ b/node_modules/select/dist/select.js @@ -0,0 +1,47 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.select = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o +``` + +```js +var input = document.querySelector('input'); +var result = select(input); +``` + +### Browserify + +```js +var select = require('select'); +``` + +```js +var input = document.querySelector('input'); +var result = select(input); +``` + +## License + +[MIT License](http://zenorocha.mit-license.org/) © Zeno Rocha diff --git a/node_modules/select/src/select.js b/node_modules/select/src/select.js new file mode 100644 index 0000000..3e36485 --- /dev/null +++ b/node_modules/select/src/select.js @@ -0,0 +1,43 @@ +function select(element) { + var selectedText; + + if (element.nodeName === 'SELECT') { + element.focus(); + + selectedText = element.value; + } + else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') { + var isReadOnly = element.hasAttribute('readonly'); + + if (!isReadOnly) { + element.setAttribute('readonly', ''); + } + + element.select(); + element.setSelectionRange(0, element.value.length); + + if (!isReadOnly) { + element.removeAttribute('readonly'); + } + + selectedText = element.value; + } + else { + if (element.hasAttribute('contenteditable')) { + element.focus(); + } + + var selection = window.getSelection(); + var range = document.createRange(); + + range.selectNodeContents(element); + selection.removeAllRanges(); + selection.addRange(range); + + selectedText = selection.toString(); + } + + return selectedText; +} + +module.exports = select; diff --git a/node_modules/select/test/select.js b/node_modules/select/test/select.js new file mode 100644 index 0000000..604dc94 --- /dev/null +++ b/node_modules/select/test/select.js @@ -0,0 +1,93 @@ +var select = require('../src/select'); + +describe('select editable elements', function() { + before(function() { + global.input = document.createElement('input'); + global.input.value = 'lorem ipsum'; + + global.textarea = document.createElement('textarea'); + global.textarea.value = 'lorem ipsum'; + + document.body.appendChild(global.input); + document.body.appendChild(global.textarea); + }); + + after(function() { + document.body.innerHTML = ''; + }); + + it('should return the selected text on input', function() { + var result = select(global.input); + assert.equal(result, global.input.value); + }); + + it('should return the selected text on textarea', function() { + var result = select(global.textarea); + assert.equal(result, global.textarea.value); + }); +}); + +describe('select non-editable element with no children', function() { + before(function() { + global.paragraph = document.createElement('p'); + global.paragraph.textContent = 'lorem ipsum'; + + document.body.appendChild(global.paragraph); + }); + + after(function() { + document.body.innerHTML = ''; + }); + + it('should return the selected text', function() { + var result = select(global.paragraph); + assert.equal(result, global.paragraph.textContent); + }); +}); + +describe('select non-editable element with child node', function() { + before(function() { + global.li = document.createElement('li'); + global.li.textContent = 'lorem ipsum'; + + global.ul = document.createElement('ul'); + global.ul.appendChild(global.li); + + document.body.appendChild(global.ul); + }); + + after(function() { + document.body.innerHTML = ''; + }); + + it('should return the selected text', function() { + var result = select(global.ul); + assert.equal(result, global.ul.textContent); + }); +}); + +describe('select non-editable svg element w/ multiple text children', function() { + before(function() { + global.text1 = document.createElement('text'); + global.text1.textContent = 'lorem ipsum'; + + global.text2 = document.createElement('text'); + global.text2.textContent = 'dolor zet'; + + global.svg = document.createElement('svg'); + global.svg.appendChild(global.text1); + global.svg.appendChild(global.text2); + + document.body.appendChild(global.svg); + }); + + after(function() { + document.body.innerHTML = ''; + }); + + it('should return the selected text', function() { + var result = select(global.svg); + assert.equal(result, global.text1.textContent + + global.text2.textContent); + }); +}); diff --git a/node_modules/tiny-emitter/LICENSE b/node_modules/tiny-emitter/LICENSE new file mode 100644 index 0000000..24f1024 --- /dev/null +++ b/node_modules/tiny-emitter/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2017 Scott Corgan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/node_modules/tiny-emitter/README.md b/node_modules/tiny-emitter/README.md new file mode 100644 index 0000000..cd474cd --- /dev/null +++ b/node_modules/tiny-emitter/README.md @@ -0,0 +1,88 @@ +# tiny-emitter + +A tiny (less than 1k) event emitter library. + +## Install + +### npm + +``` +npm install tiny-emitter --save +``` + +## Usage + +```js +var Emitter = require('tiny-emitter'); +var emitter = new Emitter(); + +emitter.on('some-event', function (arg1, arg2, arg3) { + // +}); + +emitter.emit('some-event', 'arg1 value', 'arg2 value', 'arg3 value'); +``` + +Alternatively, you can skip the initialization step by requiring `tiny-emitter/instance` instead. This pulls in an already initialized emitter. + +```js +var emitter = require('tiny-emitter/instance'); + +emitter.on('some-event', function (arg1, arg2, arg3) { + // +}); + +emitter.emit('some-event', 'arg1 value', 'arg2 value', 'arg3 value'); +``` + +## Instance Methods + +### on(event, callback[, context]) + +Subscribe to an event + +* `event` - the name of the event to subscribe to +* `callback` - the function to call when event is emitted +* `context` - (OPTIONAL) - the context to bind the event callback to + +### once(event, callback[, context]) + +Subscribe to an event only **once** + +* `event` - the name of the event to subscribe to +* `callback` - the function to call when event is emitted +* `context` - (OPTIONAL) - the context to bind the event callback to + +### off(event[, callback]) + +Unsubscribe from an event or all events. If no callback is provided, it unsubscribes you from all events. + +* `event` - the name of the event to unsubscribe from +* `callback` - the function used when binding to the event + +### emit(event[, arguments...]) + +Trigger a named event + +* `event` - the event name to emit +* `arguments...` - any number of arguments to pass to the event subscribers + +## Test and Build + +Build (Tests, Browserifies, and minifies) + +``` +npm install +npm run build +``` + +Test + +``` +npm install +npm test +``` + +## License + +[MIT](https://github.com/scottcorgan/tiny-emitter/blob/master/LICENSE) diff --git a/node_modules/tiny-emitter/dist/tinyemitter.js b/node_modules/tiny-emitter/dist/tinyemitter.js new file mode 100644 index 0000000..6e25e05 --- /dev/null +++ b/node_modules/tiny-emitter/dist/tinyemitter.js @@ -0,0 +1,71 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.TinyEmitter = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o dist/tinyemitter.js -s TinyEmitter && echo 'Bundled'", + "minify": "node_modules/.bin/uglifyjs dist/tinyemitter.js -o dist/tinyemitter.min.js -m && echo 'Minified'", + "build": "npm test && npm run bundle && npm run minify", + "size": "node_modules/.bin/uglifyjs index.js -o minified.js -m && ls -l && rm minified.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/scottcorgan/tiny-emitter.git" + }, + "keywords": [ + "event", + "emitter", + "pubsub", + "tiny", + "events", + "bind" + ], + "author": "Scott Corgan", + "license": "MIT", + "bugs": { + "url": "https://github.com/scottcorgan/tiny-emitter/issues" + }, + "devDependencies": { + "@tap-format/spec": "0.2.0", + "browserify": "11.2.0", + "tape": "4.2.1", + "testling": "1.7.1", + "uglify-js": "2.5.0" + }, + "testling": { + "files": [ + "test/index.js" + ], + "browsers": [ + "iexplore/10.0", + "iexplore/9.0", + "firefox/16..latest", + "chrome/22..latest", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/node_modules/tiny-emitter/test/index.js b/node_modules/tiny-emitter/test/index.js new file mode 100644 index 0000000..7f95f62 --- /dev/null +++ b/node_modules/tiny-emitter/test/index.js @@ -0,0 +1,217 @@ +var Emitter = require('../index'); +var emitter = require('../instance'); +var test = require('tape'); + +test('subscribes to an event', function (t) { + var emitter = new Emitter(); + emitter.on('test', function () {}); + + t.equal(emitter.e.test.length, 1, 'subscribed to event'); + t.end(); +}); + +test('subscribes to an event with context', function (t) { + var emitter = new Emitter(); + var context = { + contextValue: true + }; + + emitter.on('test', function () { + t.ok(this.contextValue, 'is in context'); + t.end(); + }, context); + + emitter.emit('test'); +}); + +test('subscibes only once to an event', function (t) { + var emitter = new Emitter(); + + emitter.once('test', function () { + t.notOk(emitter.e.test, 'removed event from list'); + t.end(); + }); + + emitter.emit('test'); +}); + +test('keeps context when subscribed only once', function (t) { + var emitter = new Emitter(); + var context = { + contextValue: true + }; + + emitter.once('test', function () { + t.ok(this.contextValue, 'is in context'); + t.notOk(emitter.e.test, 'not subscribed anymore'); + t.end(); + }, context); + + emitter.emit('test'); +}); + +test('emits an event', function (t) { + var emitter = new Emitter(); + + emitter.on('test', function () { + t.ok(true, 'triggered event'); + t.end(); + }); + + emitter.emit('test'); +}); + +test('passes all arguments to event listener', function (t) { + var emitter = new Emitter(); + + emitter.on('test', function (arg1, arg2) { + t.equal(arg1, 'arg1', 'passed the first argument'); + t.equal(arg2, 'arg2', 'passed the second argument'); + t.end(); + }); + + emitter.emit('test', 'arg1', 'arg2'); +}); + +test('unsubscribes from all events with name', function (t) { + var emitter = new Emitter(); + emitter.on('test', function () { + t.fail('should not get called'); + }); + emitter.off('test'); + emitter.emit('test') + + process.nextTick(function () { + t.end(); + }); +}); + +test('unsubscribes single event with name and callback', function (t) { + var emitter = new Emitter(); + var fn = function () { + t.fail('should not get called'); + } + + emitter.on('test', fn); + emitter.off('test', fn); + emitter.emit('test') + + process.nextTick(function () { + t.end(); + }); +}); + +// Test added by https://github.com/lazd +// From PR: https://github.com/scottcorgan/tiny-emitter/pull/6 +test('unsubscribes single event with name and callback when subscribed twice', function (t) { + var emitter = new Emitter(); + var fn = function () { + t.fail('should not get called'); + }; + + emitter.on('test', fn); + emitter.on('test', fn); + + emitter.off('test', fn); + emitter.emit('test'); + + process.nextTick(function () { + t.notOk(emitter.e['test'], 'removes all events'); + t.end(); + }); +}); + +test('unsubscribes single event with name and callback when subscribed twice out of order', function (t) { + var emitter = new Emitter(); + var calls = 0; + var fn = function () { + t.fail('should not get called'); + }; + var fn2 = function () { + calls++; + }; + + emitter.on('test', fn); + emitter.on('test', fn2); + emitter.on('test', fn); + emitter.off('test', fn); + emitter.emit('test'); + + process.nextTick(function () { + t.equal(calls, 1, 'callback was called'); + t.end(); + }); +}); + +test('removes an event inside another event', function (t) { + var emitter = new Emitter(); + + emitter.on('test', function () { + t.equal(emitter.e.test.length, 1, 'event is still in list'); + + emitter.off('test'); + + t.notOk(emitter.e.test, 0, 'event is gone from list'); + t.end(); + }); + + emitter.emit('test'); +}); + +test('event is emitted even if unsubscribed in the event callback', function (t) { + var emitter = new Emitter(); + var calls = 0; + var fn = function () { + calls += 1; + emitter.off('test', fn); + }; + + emitter.on('test', fn); + + emitter.on('test', function () { + calls += 1; + }); + + emitter.on('test', function () { + calls += 1; + }); + + process.nextTick(function () { + t.equal(calls, 3, 'all callbacks were called'); + t.end(); + }); + + emitter.emit('test'); +}); + +test('calling off before any events added does nothing', function (t) { + var emitter = new Emitter(); + emitter.off('test', function () {}); + t.end(); +}); + +test('emitting event that has not been subscribed to yet', function (t) { + var emitter = new Emitter(); + + emitter.emit('some-event', 'some message'); + t.end(); +}); + +test('unsubscribes single event with name and callback which was subscribed once', function (t) { + var emitter = new Emitter(); + var fn = function () { + t.fail('event not unsubscribed'); + } + + emitter.once('test', fn); + emitter.off('test', fn); + emitter.emit('test'); + + t.end(); +}); + +test('exports an instance', function (t) { + t.ok(emitter, 'exports an instance') + t.ok(emitter instanceof Emitter, 'an instance of the Emitter class'); + t.end(); +}); diff --git a/node_modules/tiny-emitter/yarn.lock b/node_modules/tiny-emitter/yarn.lock new file mode 100644 index 0000000..730a024 --- /dev/null +++ b/node_modules/tiny-emitter/yarn.lock @@ -0,0 +1,1857 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@tap-format/exit@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@tap-format/exit/-/exit-0.2.0.tgz#b58736bc55d30802c012c5adfca51b47040310cd" + dependencies: + ramda "^0.18.0" + rx "^4.0.7" + +"@tap-format/failures@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@tap-format/failures/-/failures-0.2.0.tgz#bb6f5edc3bc3c57c62885bc7c214cc7abdfc2a07" + dependencies: + chalk "^1.1.1" + diff "^2.2.1" + figures "^1.4.0" + ramda "^0.18.0" + rx "^4.0.7" + +"@tap-format/parser@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@tap-format/parser/-/parser-0.2.0.tgz#bdc1d95e694781157593283bb3c3fec132a3115d" + dependencies: + duplexer "^0.1.1" + js-yaml "^3.4.6" + ramda "^0.18.0" + readable-stream "^2.0.4" + rx "^4.0.7" + rx-node "^1.0.1" + split "^1.0.0" + +"@tap-format/results@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@tap-format/results/-/results-0.2.0.tgz#192d64ac41f146fa2722db1c0a22ed80478f54fd" + dependencies: + chalk "^1.1.1" + hirestime "^1.0.6" + pretty-ms "^2.1.0" + rx "^4.0.7" + +"@tap-format/spec@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@tap-format/spec/-/spec-0.2.0.tgz#93f7d2f0dcefe526b4776800b9bd7f80db5aaec7" + dependencies: + "@tap-format/exit" "0.2.0" + "@tap-format/failures" "0.2.0" + "@tap-format/parser" "0.2.0" + "@tap-format/results" "0.2.0" + chalk "^1.1.1" + figures "^1.4.0" + rx "^4.0.7" + +Base64@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/Base64/-/Base64-0.2.1.tgz#ba3a4230708e186705065e66babdd4c35cf60028" + +JSONStream@^1.0.3: + version "1.3.2" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +JSONStream@~0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.6.4.tgz#4b2c8063f8f512787b2375f7ee9db69208fa2dcb" + dependencies: + jsonparse "0.0.5" + through "~2.2.7" + +JSONStream@~0.7.1: + version "0.7.4" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.7.4.tgz#734290e41511eea7c2cfe151fbf9a563a97b9786" + dependencies: + jsonparse "0.0.5" + through ">=2.2.7 <3" + +acorn-node@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.3.0.tgz#5f86d73346743810ef1269b901dbcbded020861b" + dependencies: + acorn "^5.4.1" + xtend "^4.0.1" + +acorn@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + +acorn@^4.0.3: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + +acorn@^5.2.1, acorn@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.1.2.tgz#adaa04c46bb58c6dd1f294da3eb26e6228eb6e44" + dependencies: + util "0.10.3" + +assert@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.3.0.tgz#03939a622582a812cc202320a0b9a56c9b815849" + dependencies: + util "0.10.3" + +astw@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917" + dependencies: + acorn "^4.0.3" + +async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base64-js@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784" + +base64-js@0.0.8, base64-js@~0.0.4: + version "0.0.8" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.8.tgz#1101e9544f4a76b1bc3b26d452ca96d7a35e7978" + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + +bops@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/bops/-/bops-0.0.6.tgz#082d1d55fa01e60dbdc2ebc2dba37f659554cf3a" + dependencies: + base64-js "0.0.2" + to-utf8 "0.0.1" + +bouncy@~3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/bouncy/-/bouncy-3.2.2.tgz#82ab4ad7beae05890eed54b9af3c45394b185dc7" + dependencies: + optimist "~0.3.5" + through "~2.3.4" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + +browser-launcher@~0.3.2: + version "0.3.5" + resolved "https://registry.yarnpkg.com/browser-launcher/-/browser-launcher-0.3.5.tgz#d9a3663fa064d8155044991c00e61dbcb6730a16" + dependencies: + headless "~0.1.3" + merge "~1.0.0" + minimist "0.0.5" + mkdirp "~0.3.3" + plist "0.2.1" + xtend "^4.0.0" + +browser-pack@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-5.0.1.tgz#4197719b20c6e0aaa09451c5111e53efb6fbc18d" + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.6.1" + defined "^1.0.0" + through2 "^1.0.0" + umd "^3.0.0" + +browser-pack@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-2.0.1.tgz#5d1c527f56c582677411c4db2a128648ff6bf150" + dependencies: + JSONStream "~0.6.4" + combine-source-map "~0.3.0" + through "~2.3.4" + +browser-resolve@^1.7.0, browser-resolve@^1.7.1: + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + dependencies: + resolve "1.1.7" + +browser-resolve@~1.2.1, browser-resolve@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.2.4.tgz#59ae7820a82955ecd32f5fb7c468ac21c4723806" + dependencies: + resolve "0.6.3" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + +browserify-zlib@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + dependencies: + pako "~0.2.0" + +browserify@11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-11.2.0.tgz#a11bb9dd209d79572b813f7eeeaf828a5f5c0e4e" + dependencies: + JSONStream "^1.0.3" + assert "~1.3.0" + browser-pack "^5.0.0" + browser-resolve "^1.7.1" + browserify-zlib "~0.1.2" + buffer "^3.0.0" + builtins "~0.0.3" + commondir "0.0.1" + concat-stream "~1.4.1" + console-browserify "^1.1.0" + constants-browserify "~0.0.1" + crypto-browserify "^3.0.0" + defined "^1.0.0" + deps-sort "^1.3.7" + domain-browser "~1.1.0" + duplexer2 "~0.0.2" + events "~1.0.0" + glob "^4.0.5" + has "^1.0.0" + htmlescape "^1.1.0" + https-browserify "~0.0.0" + inherits "~2.0.1" + insert-module-globals "^6.4.1" + isarray "0.0.1" + labeled-stream-splicer "^1.0.0" + module-deps "^3.7.11" + os-browserify "~0.1.1" + parents "^1.0.1" + path-browserify "~0.0.0" + process "~0.11.0" + punycode "^1.3.2" + querystring-es3 "~0.2.0" + read-only-stream "^1.1.1" + readable-stream "^2.0.2" + resolve "^1.1.4" + shasum "^1.0.0" + shell-quote "~0.0.1" + stream-browserify "^2.0.0" + stream-http "^1.2.0" + string_decoder "~0.10.0" + subarg "^1.0.0" + syntax-error "^1.1.1" + through2 "^1.0.0" + timers-browserify "^1.0.1" + tty-browserify "~0.0.0" + url "~0.10.1" + util "~0.10.1" + vm-browserify "~0.0.1" + xtend "^4.0.0" + +browserify@3.x.x: + version "3.46.1" + resolved "https://registry.yarnpkg.com/browserify/-/browserify-3.46.1.tgz#2c2e4a7f2f408178e78c223b5b57b37c2185ad8e" + dependencies: + JSONStream "~0.7.1" + assert "~1.1.0" + browser-pack "~2.0.0" + browser-resolve "~1.2.1" + browserify-zlib "~0.1.2" + buffer "~2.1.4" + builtins "~0.0.3" + commondir "0.0.1" + concat-stream "~1.4.1" + console-browserify "~1.0.1" + constants-browserify "~0.0.1" + crypto-browserify "~1.0.9" + deep-equal "~0.1.0" + defined "~0.0.0" + deps-sort "~0.1.1" + derequire "~0.8.0" + domain-browser "~1.1.0" + duplexer "~0.1.1" + events "~1.0.0" + glob "~3.2.8" + http-browserify "~1.3.1" + https-browserify "~0.0.0" + inherits "~2.0.1" + insert-module-globals "~6.0.0" + module-deps "~2.0.0" + os-browserify "~0.1.1" + parents "~0.0.1" + path-browserify "~0.0.0" + process "^0.7.0" + punycode "~1.2.3" + querystring-es3 "0.2.0" + resolve "~0.6.1" + shallow-copy "0.0.1" + shell-quote "~0.0.1" + stream-browserify "~0.1.0" + stream-combiner "~0.0.2" + string_decoder "~0.0.0" + subarg "0.0.1" + syntax-error "~1.1.0" + through2 "~0.4.1" + timers-browserify "~1.0.1" + tty-browserify "~0.0.0" + umd "~2.0.0" + url "~0.10.1" + util "~0.10.1" + vm-browserify "~0.0.1" + xtend "^3.0.0" + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^3.0.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-3.6.0.tgz#a72c936f77b96bf52f5f7e7b467180628551defb" + dependencies: + base64-js "0.0.8" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@~2.1.4: + version "2.1.13" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-2.1.13.tgz#c88838ebf79f30b8b4a707788470bea8a62c2355" + dependencies: + base64-js "~0.0.4" + ieee754 "~1.1.1" + +builtin-status-codes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-1.0.0.tgz#30637ee262978ac07174e16d7f82f0ad06e085ad" + +builtins@~0.0.3: + version "0.0.7" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" + +callsite@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +combine-source-map@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.3.0.tgz#d9e74f593d9cd43807312cb5d846d451efaa9eb7" + dependencies: + convert-source-map "~0.3.0" + inline-source-map "~0.3.0" + source-map "~0.1.31" + +combine-source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.6.1.tgz#9b4a09c316033d768e0f11e029fa2730e079ad96" + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.5.0" + lodash.memoize "~3.0.3" + source-map "~0.4.2" + +commondir@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-0.0.1.tgz#89f00fdcd51b519c578733fec563e6a6da7f5be2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-0.1.1.tgz#d7f4e278b90cfc4f0f3ef77fe4c03b40eb3f7900" + +concat-stream@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.0.1.tgz#018b18bc1c7d073a2dc82aa48442341a2c4dd79f" + dependencies: + bops "0.0.6" + +concat-stream@~1.4.1, concat-stream@~1.4.5: + version "1.4.10" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.4.10.tgz#acc3bbf5602cb8cc980c6ac840fa7d8603e3ef36" + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.9" + typedarray "~0.0.5" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-browserify@~1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.0.3.tgz#d3898d2c3a93102f364197f8874b4f92b5286a8e" + +constants-browserify@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-0.0.1.tgz#92577db527ba6c4cf0a4568d84bc031f441e21f2" + +convert-source-map@~0.3.0: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +create-ecdh@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^2.0.0" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +crypto-browserify@^3.0.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +crypto-browserify@~1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-1.0.9.tgz#cc5449685dfb85eb11c9828acc7cb87ab5bbfcc0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-equal@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.0.0.tgz#99679d3bbd047156fcd450d3d01eeb9068691e83" + +deep-equal@~0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.1.2.tgz#b246c2b80a570a47c11be1d9bd1070ec878b87ce" + +deep-equal@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +defined@^1.0.0, defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +defined@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" + +deps-sort@^1.3.7: + version "1.3.9" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-1.3.9.tgz#29dfff53e17b36aecae7530adbbbf622c2ed1a71" + dependencies: + JSONStream "^1.0.3" + shasum "^1.0.0" + subarg "^1.0.0" + through2 "^1.0.0" + +deps-sort@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-0.1.2.tgz#daa2fb614a17c9637d801e2f55339ae370f3611a" + dependencies: + JSONStream "~0.6.4" + minimist "~0.0.1" + through "~2.3.4" + +derequire@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/derequire/-/derequire-0.8.0.tgz#c1f7f1da2cede44adede047378f03f444e9c4c0d" + dependencies: + esprima-fb "^3001.1.0-dev-harmony-fb" + esrefactor "~0.1.0" + estraverse "~1.5.0" + +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detective@^4.0.0: + version "4.7.1" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e" + dependencies: + acorn "^5.2.1" + defined "^1.0.0" + +detective@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-3.1.0.tgz#77782444ab752b88ca1be2e9d0a0395f1da25eed" + dependencies: + escodegen "~1.1.0" + esprima-fb "3001.1.0-dev-harmony-fb" + +diff@^2.2.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" + +diffie-hellman@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@~1.1.0: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +duplexer2@0.0.2, duplexer2@~0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer@^0.1.1, duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +ecstatic@~0.4.5: + version "0.4.13" + resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-0.4.13.tgz#9cb6eaffe211b9c84efb3f553cde2c3002717b29" + dependencies: + ent "0.0.x" + mime "1.2.x" + optimist "~0.3.5" + +elliptic@^6.0.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +ent@0.0.x, ent@~0.0.5: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ent/-/ent-0.0.7.tgz#835d4e7f9e7a8d4921c692e9010ec976da5e9949" + +es-abstract@^1.5.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.1.0.tgz#c663923f6e20aad48d0c0fa49f31c6d4f49360cf" + dependencies: + esprima "~1.0.4" + estraverse "~1.5.0" + esutils "~1.0.0" + optionalDependencies: + source-map "~0.1.30" + +escope@~0.0.13: + version "0.0.16" + resolved "https://registry.yarnpkg.com/escope/-/escope-0.0.16.tgz#418c7a0afca721dafe659193fd986283e746538f" + dependencies: + estraverse ">= 0.0.2" + +esprima-fb@3001.1.0-dev-harmony-fb, esprima-fb@^3001.1.0-dev-harmony-fb: + version "3001.1.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-3001.0001.0000-dev-harmony-fb.tgz#b77d37abcd38ea0b77426bb8bc2922ce6b426411" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esprima@~1.0.2, esprima@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" + +esrefactor@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/esrefactor/-/esrefactor-0.1.0.tgz#d142795a282339ab81e936b5b7a21b11bf197b13" + dependencies: + escope "~0.0.13" + esprima "~1.0.2" + estraverse "~0.0.4" + +"estraverse@>= 0.0.2": + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-0.0.4.tgz#01a0932dfee574684a598af5a67c3bf9b6428db2" + +estraverse@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" + +esutils@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" + +events@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/events/-/events-1.0.2.tgz#75849dcfe93d10fb057c30055afdbd51d06a8e24" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +figures@^1.4.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +function-bind@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.0.2.tgz#c2873b69c5e6d7cefae47d2555172926c8c2e05e" + +glob@^4.0.5: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@~3.2.1, glob@~3.2.8: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +glob@~5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has@^1.0.0, has@^1.0.1, has@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + +hash-base@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +headless@~0.1.3: + version "0.1.7" + resolved "https://registry.yarnpkg.com/headless/-/headless-0.1.7.tgz#6e62fae668947f88184d5c156ede7c5695a7e9c8" + +hirestime@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/hirestime/-/hirestime-1.0.7.tgz#2d5271ea84356cec3f25da8c56a9402f8fc0a700" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +htmlescape@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351" + +http-browserify@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/http-browserify/-/http-browserify-1.3.2.tgz#b562c34479349a690d7a6597df495aefa8c604f5" + dependencies: + Base64 "~0.2.0" + inherits "~2.0.1" + +https-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + +ieee754@^1.1.4, ieee754@~1.1.1: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +inline-source-map@~0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.3.1.tgz#a528b514e689fce90db3089e870d92f527acb5eb" + dependencies: + source-map "~0.3.0" + +inline-source-map@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.5.0.tgz#4a4c5dd8e4fb5e9b3cda60c822dfadcaee66e0af" + dependencies: + source-map "~0.4.0" + +insert-module-globals@^6.4.1: + version "6.6.3" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-6.6.3.tgz#20638e29a30f9ed1ca2e3a825fbc2cba5246ddfc" + dependencies: + JSONStream "^1.0.3" + combine-source-map "~0.6.1" + concat-stream "~1.4.1" + is-buffer "^1.1.0" + lexical-scope "^1.2.0" + process "~0.11.0" + through2 "^1.0.0" + xtend "^4.0.0" + +insert-module-globals@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-6.0.0.tgz#ee8aeb9dee16819e33aa14588a558824af0c15dc" + dependencies: + JSONStream "~0.7.1" + concat-stream "~1.4.1" + lexical-scope "~1.1.0" + process "~0.6.0" + through "~2.3.4" + xtend "^3.0.0" + +is-buffer@^1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-finite@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +isarray@0.0.1, isarray@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +js-yaml@^3.4.6: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-stable-stringify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45" + dependencies: + jsonify "~0.0.0" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonparse@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" + +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + +labeled-stream-splicer@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-1.0.2.tgz#4615331537784981e8fd264e1f3a434c4e0ddd65" + dependencies: + inherits "^2.0.1" + isarray "~0.0.1" + stream-splicer "^1.1.0" + +lexical-scope@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4" + dependencies: + astw "^2.0.0" + +lexical-scope@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.1.1.tgz#debac1067435f1359d90fcfd9e94bcb2ee47b2bf" + dependencies: + astw "^2.0.0" + +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +md5.js@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +merge@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.0.0.tgz#b443ab46d837c491e6222056ab0f7933ecb3568f" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime@1.2.x: + version "1.2.11" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" + +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +"minimatch@2 || 3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.5.tgz#d7aa327bcecf518f9106ac6b8f003fa3bcea8566" + +minimist@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1, minimist@~0.0.7, minimist@~0.0.9: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@~0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + +module-deps@^3.7.11: + version "3.9.1" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-3.9.1.tgz#ea75caf9199090d25b0d5512b5acacb96e7f87f3" + dependencies: + JSONStream "^1.0.3" + browser-resolve "^1.7.0" + concat-stream "~1.4.5" + defined "^1.0.0" + detective "^4.0.0" + duplexer2 "0.0.2" + inherits "^2.0.1" + parents "^1.0.0" + readable-stream "^1.1.13" + resolve "^1.1.3" + stream-combiner2 "~1.0.0" + subarg "^1.0.0" + through2 "^1.0.0" + xtend "^4.0.0" + +module-deps@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-2.0.6.tgz#b999321c73ac33580f00712c0f3075fdca42563f" + dependencies: + JSONStream "~0.7.1" + browser-resolve "~1.2.4" + concat-stream "~1.4.5" + detective "~3.1.0" + duplexer2 "0.0.2" + inherits "~2.0.1" + minimist "~0.0.9" + parents "0.0.2" + readable-stream "^1.0.27-1" + resolve "~0.6.3" + stream-combiner "~0.1.0" + through2 "~0.4.1" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-inspect@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-0.1.3.tgz#d05a65c2e34fe8225d9fda2e484e4e47b7e2f490" + dependencies: + tape "~1.0.4" + +object-inspect@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.0.2.tgz#a97885b553e575eb4009ebc09bdda9b1cd21979a" + +object-keys@^1.0.4, object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +optimist@~0.3.5: + version "0.3.7" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" + dependencies: + wordwrap "~0.0.2" + +optimist@~0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.5.2.tgz#85c8c1454b3315e4a78947e857b1df033450bfbc" + dependencies: + wordwrap "~0.0.2" + +ordered-emitter@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ordered-emitter/-/ordered-emitter-0.1.1.tgz#aa20bdafbdcc1631834a350f68b4ef8eb34eed7b" + +os-browserify@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54" + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + +parents@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/parents/-/parents-0.0.2.tgz#67147826e497d40759aaf5ba4c99659b6034d302" + +parents@^1.0.0, parents@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751" + dependencies: + path-platform "~0.11.15" + +parents@~0.0.1: + version "0.0.3" + resolved "https://registry.yarnpkg.com/parents/-/parents-0.0.3.tgz#fa212f024d9fa6318dbb6b4ce676c8be493b9c43" + dependencies: + path-platform "^0.0.1" + +parse-asn1@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + +parse-ms@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-1.0.1.tgz#56346d4749d78f23430ca0c713850aef91aa361d" + +path-browserify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-platform@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.0.1.tgz#b5585d7c3c463d89aa0060d86611cf1afd617e2a" + +path-platform@~0.11.15: + version "0.11.15" + resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2" + +pbkdf2@^3.0.3: + version "3.0.14" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +plist@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-0.2.1.tgz#f3a3de07885d773e66d8a96782f1bec28cf2b2d0" + dependencies: + sax "0.1.x" + +plur@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156" + +pretty-ms@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-2.1.0.tgz#4257c256df3fb0b451d6affaab021884126981dc" + dependencies: + is-finite "^1.0.1" + parse-ms "^1.0.0" + plur "^1.0.0" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/process/-/process-0.7.0.tgz#c52208161a34adf3812344ae85d3e6150469389d" + +process@~0.11.0: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + +process@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/process/-/process-0.6.0.tgz#7dd9be80ffaaedd4cb628f1827f1cbab6dc0918f" + +public-encrypt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +punycode@~1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.2.4.tgz#54008ac972aec74175def9cba6df7fa9d3918740" + +querystring-es3@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.0.tgz#c365a08a69c443accfeb3a9deab35e3f0abaa476" + +querystring-es3@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +ramda@^0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.18.0.tgz#c6e3c5d4b9ab1f7906727fdeeb039152a85d4db3" + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +read-only-stream@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-1.1.1.tgz#5da77c799ed1388d3ef88a18471bb5924f8a0ba1" + dependencies: + readable-stream "^1.0.31" + readable-wrap "^1.0.0" + +"readable-stream@>=1.1.13-1 <1.2.0-0", readable-stream@^1.0.27-1, readable-stream@^1.0.31, readable-stream@^1.1.13, readable-stream@^1.1.13-1, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.2, readable-stream@^2.0.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.0.17: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-wrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/readable-wrap/-/readable-wrap-1.0.0.tgz#3b5a211c631e12303a54991c806c17e7ae206bff" + dependencies: + readable-stream "^1.1.13-1" + +resolve@0.6.3, resolve@~0.6.1, resolve@~0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.3, resolve@^1.1.4: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + +resolve@~0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.3.1.tgz#34c63447c664c70598d1c9b126fc43b2a24310a4" + +resolve@~0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.4.3.tgz#dcadad202e7cacc2467e3a38800211f42f9c13df" + +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + dependencies: + through "~2.3.4" + +rfile@~1.0, rfile@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rfile/-/rfile-1.0.0.tgz#59708cf90ca1e74c54c3cfc5c36fdb9810435261" + dependencies: + callsite "~1.0.0" + resolve "~0.3.0" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + dependencies: + hash-base "^2.0.0" + inherits "^2.0.1" + +ruglify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ruglify/-/ruglify-1.0.0.tgz#dc8930e2a9544a274301cc9972574c0d0986b675" + dependencies: + rfile "~1.0" + uglify-js "~2.2" + +rx-node@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/rx-node/-/rx-node-1.0.2.tgz#151240725a79e857360ab06cc626799965e094de" + dependencies: + rx "*" + +rx@*, rx@^4.0.7: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +sax@0.1.x: + version "0.1.5" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.1.5.tgz#d1829a6120fa01665eb4dbff6c43f29fd6d61471" + +sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4: + version "2.4.10" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b" + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-copy@0.0.1, shallow-copy@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" + +shasum@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f" + dependencies: + json-stable-stringify "~0.0.0" + sha.js "~2.4.4" + +shell-quote@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-0.0.1.tgz#1a41196f3c0333c482323593d6886ecf153dd986" + +shell-quote@~1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.3.3.tgz#07b8826f427c052511e8b5627639e172596e8e4b" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +source-map@0.1.34: + version "0.1.34" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.34.tgz#a7cfe89aec7b1682c3b198d0acfb47d7d090566b" + dependencies: + amdefine ">=0.0.4" + +source-map@~0.1.30, source-map@~0.1.31, source-map@~0.1.7: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.3.0.tgz#8586fb9a5a005e5b501e21cd18b6f21b457ad1f9" + dependencies: + amdefine ">=0.0.4" + +source-map@~0.4.0, source-map@~0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +split@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + dependencies: + through "2" + +split@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/split/-/split-0.1.2.tgz#f0710744c453d551fc7143ead983da6014e336cc" + dependencies: + through "1" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +stream-browserify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-browserify@~0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-0.1.3.tgz#95cf1b369772e27adaf46352265152689c6c4be9" + dependencies: + inherits "~2.0.1" + process "~0.5.1" + +stream-combiner2@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.0.2.tgz#ba72a6b50cbfabfa950fc8bc87604bd01eb60671" + dependencies: + duplexer2 "~0.0.2" + through2 "~0.5.1" + +stream-combiner@~0.0.2: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-combiner@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.1.0.tgz#0dc389a3c203f8f4d56368f95dde52eb9269b5be" + dependencies: + duplexer "~0.1.1" + through "~2.3.4" + +stream-http@^1.2.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-1.7.1.tgz#d3d2a6e14c36a38b9dafb199aee7bbc570519978" + dependencies: + builtin-status-codes "^1.0.0" + foreach "^2.0.5" + indexof "0.0.1" + inherits "^2.0.1" + object-keys "^1.0.4" + xtend "^4.0.0" + +stream-splicer@^1.1.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-1.3.2.tgz#3c0441be15b9bf4e226275e6dc83964745546661" + dependencies: + indexof "0.0.1" + inherits "^2.0.1" + isarray "~0.0.1" + readable-stream "^1.1.13-1" + readable-wrap "^1.0.0" + through2 "^1.0.0" + +string.prototype.trim@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.0" + function-bind "^1.0.2" + +string_decoder@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.0.1.tgz#f5472d0a8d1650ec823752d24e6fd627b39bf141" + +string_decoder@~0.10.0, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +subarg@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-0.0.1.tgz#3d56b07dacfbc45bbb63f7672b43b63e46368e3a" + dependencies: + minimist "~0.0.7" + +subarg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" + dependencies: + minimist "^1.1.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +syntax-error@^1.1.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.4.0.tgz#2d9d4ff5c064acb711594a3e3b95054ad51d907c" + dependencies: + acorn-node "^1.2.0" + +syntax-error@~1.1.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.1.6.tgz#b4549706d386cc1c1dc7c2423f18579b6cade710" + dependencies: + acorn "^2.7.0" + +tap-finished@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tap-finished/-/tap-finished-0.0.1.tgz#08b5b543fdc04830290c6c561279552e71c4bd67" + dependencies: + tap-parser "~0.2.0" + through "~2.3.4" + +tap-parser@~0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tap-parser/-/tap-parser-0.2.1.tgz#8e1e823f2114ee21d032e2f31e4fb642a296f50b" + dependencies: + split "~0.1.2" + +tape@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.2.1.tgz#1a0ed63cc86bfaa84ebb3bb311f09d8520416216" + dependencies: + deep-equal "~1.0.0" + defined "~1.0.0" + function-bind "~1.0.2" + glob "~5.0.3" + has "~1.0.1" + inherits "~2.0.1" + object-inspect "~1.0.0" + resumer "~0.0.0" + string.prototype.trim "^1.1.1" + through "~2.3.4" + +tape@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tape/-/tape-1.0.4.tgz#e2e8e5c6dd3f00fdc2a5e4514f62fc221e59f9c4" + dependencies: + deep-equal "~0.0.0" + defined "~0.0.0" + jsonify "~0.0.0" + through "~2.3.4" + +testling@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/testling/-/testling-1.7.1.tgz#bfcfa877c8b15dd28d920692c03d8d64ca47874e" + dependencies: + bouncy "~3.2.0" + browser-launcher "~0.3.2" + browserify "3.x.x" + concat-stream "~1.0.0" + ecstatic "~0.4.5" + ent "~0.0.5" + glob "~3.2.1" + jsonify "~0.0.0" + object-inspect "~0.1.3" + optimist "~0.5.2" + resolve "~0.4.0" + shallow-copy "~0.0.0" + shell-quote "~1.3.1" + tap-finished "~0.0.0" + win-spawn "~2.0.0" + xhr-write-stream "~0.1.2" + +through2@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-1.1.1.tgz#0847cbc4449f3405574dbdccd9bb841b83ac3545" + dependencies: + readable-stream ">=1.1.13-1 <1.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through2@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +through@1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/through/-/through-1.1.2.tgz#344a5425a3773314ca7e0eb6512fbafaf76c0bfe" + +through@2, "through@>=2.2.7 <3", through@~2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +through@~2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz#6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd" + +timers-browserify@^1.0.1: + version "1.4.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + dependencies: + process "~0.11.0" + +timers-browserify@~1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.0.3.tgz#ffba70c9c12eed916fd67318e629ac6f32295551" + dependencies: + process "~0.5.1" + +to-utf8@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852" + +tty-browserify@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + +typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-js@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.5.0.tgz#4ab5d65a4730ecb7a4fb62d3f499e2054d98fba1" + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.5.4" + +uglify-js@~2.2: + version "2.2.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.2.5.tgz#a6e02a70d839792b9780488b7b8b184c095c99c7" + dependencies: + optimist "~0.3.5" + source-map "~0.1.7" + +uglify-js@~2.4.0: + version "2.4.24" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.4.24.tgz#fad5755c1e1577658bb06ff9ab6e548c95bebd6e" + dependencies: + async "~0.2.6" + source-map "0.1.34" + uglify-to-browserify "~1.0.0" + yargs "~3.5.4" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +umd@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e" + +umd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/umd/-/umd-2.0.0.tgz#749683b0d514728ae0e1b6195f5774afc0ad4f8f" + dependencies: + rfile "~1.0.0" + ruglify "~1.0.0" + through "~2.3.4" + uglify-js "~2.4.0" + +url@~0.10.1: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, util@~0.10.1: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +vm-browserify@~0.0.1: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +win-spawn@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/win-spawn/-/win-spawn-2.0.0.tgz#397a29130ec98d0aa0bc86baa4621393effd0b07" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +xhr-write-stream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/xhr-write-stream/-/xhr-write-stream-0.1.2.tgz#e357848e0d039b411fdd5b3bf81be47ee5ce26aa" + dependencies: + concat-stream "~0.1.0" + ordered-emitter "~0.1.0" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@^3.0.0, xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0" + +yargs@~3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.5.4.tgz#d8aff8f665e94c34bd259bdebd1bfaf0ddd35361" + dependencies: + camelcase "^1.0.2" + decamelize "^1.0.0" + window-size "0.1.0" + wordwrap "0.0.2" diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ee9cec1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,51 @@ +{ + "name": "uniApp", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "clipboard": "^2.0.11", + "dayjs": "^1.11.13" + } + }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..38d2636 --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "clipboard": "^2.0.11", + "dayjs": "^1.11.13" + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..7a911db --- /dev/null +++ b/pages.json @@ -0,0 +1,68 @@ +{ + "pages": [{ + "path": "pages/login/login", + "style": { + "topWindow": false, + "leftWindow": false, + "rightWindow": false + } + }, + { + "path": "pages/tabbar/order/order", + "needLogin": true, + "style": { + "navigationBarTitleText": "随行记录" + } + }, + { + "path": "pages/tabbar/stock/stock", + "needLogin": true, + "style": { + "navigationBarTitleText": "盘点记录" + } + }, + { + "path": "pages/tabbar/video/video", + "needLogin": true, + "style": { + "navigationBarTitleText": "视频直播" + } + }, + { + "path": "pages/tabbar/stock/detail", + "style": { + "navigationBarTitleText": "" + } + } + ], + "tabBar": { + "color": "#8f8f94", + "selectedColor": "#ed874d", + "list": [{ + "pagePath": "pages/tabbar/video/video", + "text": "视频", + "iconPath": "/static/tabbar/icon/video.png", + "selectedIconPath": "/static/tabbar/icon/video2.png" + }, + { + "pagePath": "pages/tabbar/order/order", + "text": "随行", + "iconPath": "/static/tabbar/icon/order.png", + "selectedIconPath": "/static/tabbar/icon/order2.png" + }, + { + "pagePath": "pages/tabbar/stock/stock", + "text": "盘点", + "iconPath": "static/tabbar/icon/stock.png", + "selectedIconPath": "/static/tabbar/icon/stock2.png" + } + ] + }, + "globalStyle": { + "navigationBarTextStyle": "black", + + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "uniIdRouter": {} +} \ No newline at end of file diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..42e132b --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,137 @@ + + + + + \ No newline at end of file diff --git a/pages/live/player.vue b/pages/live/player.vue new file mode 100644 index 0000000..54421fc --- /dev/null +++ b/pages/live/player.vue @@ -0,0 +1,97 @@ + + + + + \ No newline at end of file diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..31a7bf3 --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,146 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/order/order.vue b/pages/tabbar/order/order.vue new file mode 100644 index 0000000..ac1be94 --- /dev/null +++ b/pages/tabbar/order/order.vue @@ -0,0 +1,175 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/stock/detail.vue b/pages/tabbar/stock/detail.vue new file mode 100644 index 0000000..d4ccf4d --- /dev/null +++ b/pages/tabbar/stock/detail.vue @@ -0,0 +1,128 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/stock/stock.vue b/pages/tabbar/stock/stock.vue new file mode 100644 index 0000000..f34ab81 --- /dev/null +++ b/pages/tabbar/stock/stock.vue @@ -0,0 +1,238 @@ + + + + + \ No newline at end of file diff --git a/pages/tabbar/video/video.spec.js b/pages/tabbar/video/video.spec.js new file mode 100644 index 0000000..4e76cc4 --- /dev/null +++ b/pages/tabbar/video/video.spec.js @@ -0,0 +1,65 @@ +import { mount } from '@vue/test-utils'; +import video from './video.vue'; +import axios from 'axios'; +import MockAdapter from 'axios-mock-adapter'; + +// 模拟后端接口 +const mock = new MockAdapter(axios); +const mockCameras = [ + { name: '相机1', id: 1, streamName: 'stream123' }, + { name: '相机2', id: 2, streamName: 'stream456' } +]; + +// 模拟API响应 +mock.onGet('/api/list').reply(200, mockCameras); + +describe('video.vue', () => { + let wrapper; + + beforeEach(() => { + wrapper = mount(video, { + global: { + mocks: { + $nextTick: jest.fn(), + uni: { + createVideoContext: jest.fn(() => ({ + play: jest.fn(), + stop: jest.fn() + })), + request: jest.fn(), + showToast: jest.fn() + } + } + } + }); + }); + + // 测试相机列表加载 + it('加载相机列表', async () => { + await wrapper.vm.$nextTick(); + expect(wrapper.vm.cameras).toEqual(mockCameras); + }); + + // 测试流媒体地址生成 + it('生成正确的RTMP地址', () => { + const currentIp = '127.0.0.1'; + window.location.hostname = currentIp; + wrapper.vm.currentCamera = mockCameras[0]; + wrapper.vm.updateStreamUrl(); + expect(wrapper.vm.streamUrl).toBe(`rtmp://${currentIp}/live/camera1`); + }); + + // 测试相机切换 + it('切换相机并更新地址', () => { + wrapper.vm.handleCameraChange({ detail: { value: 1 } }); + expect(wrapper.vm.currentCamera).toEqual(mockCameras[1]); + expect(wrapper.vm.streamUrl).toBe(`rtmp://${window.location.hostname}/live/camera2`); + }); + + // 测试播放失败处理 + it('处理播放失败', async () => { + wrapper.vm.uni.request.mockRejectedValue(new Error('API请求失败')); + await wrapper.vm.startPlay(); + expect(wrapper.vm.uni.showToast).toHaveBeenCalledWith({ title: '播放失败', icon: 'none' }); + }); +}); \ No newline at end of file diff --git a/pages/tabbar/video/video.vue b/pages/tabbar/video/video.vue new file mode 100644 index 0000000..c54d8bc --- /dev/null +++ b/pages/tabbar/video/video.vue @@ -0,0 +1,176 @@ + + + + + \ No newline at end of file diff --git a/static/login.png b/static/login.png new file mode 100644 index 0000000000000000000000000000000000000000..e930a1a9696953591294b0f8d4379c6638fb8a25 GIT binary patch literal 17262 zcmZ|1cQjnz_djgLgwbNOL^p;Iy?0@Bf*?8(y#+z^PW0ZQMoqM+5xpmf61@jOwCKI} z-yQGIcRhbSYq6G@bM8Lp?6d1@?<-vOg&ZC>IW`&^8lHl@^h-1}P#o$PiUEA%-^SmM zh6Y1Zke1MJ2W@9!W$0_3bPsu?Jz|FIe@uD7sLr2cfHYJ4fe7nCNCKY-APJcV=aC_yw27S*U$I^LgQew>!XOpkERjPChQ)>K z=Q<@omA*ELe_%K;0H>^aNTNb#P@gIEOxF(&w8K!OwM81L2 z>mXn9V90l3f{99R@divbO0`pJ`n8?3t>$z~VuPpXmehNa82e2;lHWG^WjKHW7#Pt& z)`ytL(Xj=yU2*!2S{OhtKuXGNSOm z1pfZ+#HvJ6M&46P;kr%Et^4(s&WTq|+8O})w zg7!E#JFq*0iPnzarm!S)@C5zi8ENROwqBQjEblv5q<=;nhUv2Ugs`#@MN#Nb1)#mS zl1BqC(J7@CXZu?ViENY{v;29ZnNqxBTT>lBIZi?n@1t<;nRo`sg5p~B{G^DOivl9I z0APc4dTxy6C!&aFP5(+qCpz;KHJw9bgJ}Bb%0(TyAyCE-8!s)cB1OhH%FAlxG{*^jUpy<&p4RfM8nftCK#q;OkUBaZ&<+0!5um1LbNmQ13r4t0q4X8?w!-Y;f)zscUFkoM(B*N$t|wO znC=XTLxW`|zfPZ09GjlZ)4dH)jIA}shRD)$z5$Vq5R&tf1iY&JW388O$fNeSs&0B# zW22ixw}7t4Wp8-3!$YXVS@IezEp1H?Y-+g(BQCnLLt@9wexa`{#tpRL9m2y}+i;KI7 zCkK|{?PbZ`B;MI*-M6ae`cuXa43I`TC}Vc;H?K9}nZg#4327TF0Y5-~30jSFaFMYX zEF2@ArNg?DRgVjEu*E_mO+2Hb|%QCiN1V+L-ovCF!2@4)P zgKTfzt$ngtJCqV({{FnZNc`k~1(P@wTSVPL+;18W(Blwdup|S$MnLV)cc&)Mp!@UGc;67x{!3P92DN49E8MLI^;%v;b0yl z;eWJwI9W4Yo`sLGhLfDA1YFM6$Pr`xWyB$v`l!pB@FGSpvy|ikL>9rRMd6)n zaOP;RS*_gUT{JHT3YY*?t3)ktuPf-&5xdU=562oA=PwZ!FoIT$SF}0fFOX;Q!eJ{f zNa8W849u^~6?dTO)9B!Yc4Iy^OU60en_SvztXrZ!!aHya!l^j_0{jRA{jXLJsI>R}kAcam&Jerlx>3pB6pNAZs1_#6h*^<(1dTL0xJGfu}tMMy% z$bqHL0k@aQNE&&wx_cN7h>kq~9y5bwrhRK`Yh7!zPse(=F~bJ=jb89E(to`m&%@F(CkIu8i+c83RIE(`o&&THMYRnR>uheDYa(XdSvO*~xFxw`wkn~$C~GbX|+eyXE;uh)hbF-GCFWhPq5^c_42a(A47AyH8LM#=Pc_J zyD#0Ugn-#6tdf`=zr5;VrnGG9UwzQ;T@w;op`i^mesqo{O2xvbNUOZ z&-S^Ja&|#dVpypSYnlD86jy>*7&5^gx`>M@!cG`^Q2?ZQnEllhe3Mc?j1m=kL_h z6P2I8g~j>H{o39XLIy9p21a)~f7$HxpZg&S&CB#ZTkK41xns=ioh_J)UU(Yr&`Api z{Sb(J7MkX|k+Ra*rnM-@3>V_ro+#{zFWfzJ|BJSNLfqjh9|Q{y?GIREOV4;TE2Rk^9T z4ZGWJp5f#CP1LdE8SJ?A3HZ_Q@r47pR19&?h3KS9`rFhKz217$;@J4GDNISgJW$rKn| zy1Ht8*$^|z5C(Cr9hn@e`2i$nUb7>$p=cYirx1(GBH?zMkR} zPY%GNdfwKvwj&o=TQRzD$%XNe^t}HLf}n$Uc1N<{0|v0Kbd{1o7Y-7MQALvX*-APd zlmpShGIMm=kffoS%}3Op02?AmAefQ%uP9D5qv|I;r-mw7Tmp4VH-w9Cm~`6~ju5vPh+pYl5+NZ&!=2Uj#4H zmo>VPkTVK`12hPb-0=jzgL}?@cusKPQ~|EaU7UnKmtIUTrp14y^pKXB(kX0Jpwl@D zU#J5D^+$tBD`;8rjEhjhWx=WDUq#^jS2}^S* zCl?>;4aD752rr6~Jp33gMy;3%#YSDVH^X-X zBXmS`ZaMQ~ror=0x8t8uNY-96wlybaN)_%tWnuR4m&VbL@8#l}7JjV2?_MrOGZ=X# zQimXk!_vA7DVVsCN$kT(-5^KIsH4m(8WdM1CoM)L95sg^E~CcmefdeI<^C2{=>&qY+@#EI21&0BNfe z3o(eyzU4ftbm!H})nZ1<$Ls&xXXQ&B#7Mzku>oCn2bU}~-YaH?#|nheOicIK70k8xIb=;%+m?FNReH@&JuY$h zBUvt*oBU#Ov&5$+^ncqY2IYPZkHV}6J8za25R_BaH7ck zxrzPQVzM)QY0*UKTDn)L{h&ccrN3XnKAjnNil_ZNoT_qC)SpWDBMeU1Vy5{NV$sm9 zQj!b!1N9bJKrM?tq6xo8_G1ASCNXGlANw|OH}P83=8Re}Jxm*?hr!8krn9l@gE1u5=yyMFDXn2Qt-AiOM4TrA1OrI#?V$>np@!>sta)h8? zhg&7DoicU)h-q}m4zfQ6rj1}USw)*lDE&t*o*?eCv-tJuk3STW?|v9DI^f>(4Hrpd|0x#h;gq2^!~H(ef|K+LA`G`vu@#{AToEFy8l>(G;#npBSiKg z5HmR59}K{ffMBG2K*m<2HZcbCxxcX%AgJ1)(l^6E=|BLXzdt16aToCTCj?sC4 z5GnQj#3W$i7fLPq2dIhvjR>Yu!}w5}h(ZEU1Q?$2za=uzAZ8Bif`Gc9fz=4)qYR<) zCL!1X@6iCO(F}y8OMKK}825K61wcWmxso}bpZL21lNW*PC8&e!_5Fe_s0Arr(gPk8 zHKL=91R@I#;BVju3qWcV&e0Iws3V0%0I?VI;XV$a>E8)p^28vh{HG9{ANT8dqt@ej z6b89pPX?|DPI!69W5`Pxv|e61;1f@b@VomH(Ev2O{h>st zdBah_whl;Lq(P{CgadiD!k;)=qx*ee0uPCHfz(juR0hp=3&^LxP*4fq@52e;CGXie zofm2*AZd`ix6bS544~@=Aea>@ld_=lSiwWl!~-sY7Ydt0-65PAtacUbFZ~R>kAHve zC%}5^-)U{{*GmV^y-DDIw+{Wz1F%*K*cslUlqG7+>NP;}AC;Hc!+VkhRsaTc7&(YK z!T&G!@L))7SQt8R2ufKH7jOuFBp66^2?ed7WGH?uA#;Qt&_7%uKu6s6Am8|ZC0sfUA5aJnW2l1!iuQ&izZh-0s zyr-l0>wN`oD}?dJAwSMigY&y-ju18arStyR$>St{?)Ux>$RmsU9q$0#vZgU!!9;Nc z1i*2qkuhns2HC1k_K=>%sATw?==P<=YTp9KD-?h zb)q6*?N12&HaH9ebdK`dNF+E2XYBsy7QjT_SoU`)qW2>q!I6o91U-YhS;jMi&G1d5 zTa>cHvrqy?nL;nkClh$wRIGr?Ir0Eb(VOSN7@@pmpgamcfYf;`0Rn;|r31)I=Q|x3 zF^Y?w*#H-BO*IUI*6$S+gi>K#!59CWCKGm+iSbPU7RdwLlmFIjKR)s?xhioV+vd9T zut{!?DHl(eO|WW*dUT zM1nithrxgZ^eI3u$NjT_nD6A$9Im$L!EaY{UZuVK&BG?^ki56sKu(O8zFeuN{V1&G zIqo?+IDkNYE>YenkI>59q_Wzpt49Y>efn);_uuL2LKk1Y=hA3e_mIv?P|cO3^d!Uk zEBId;5H!q>)zq9xU~0O9q}F-k&6WhZ=?sgdNbEyTc4JHcVRgd0Fe?iLmdMd@fI-Ls z<+CO=zQ#2xJDmUa-Zt7+u}ta_?Tnnj6b<<|2?*mi8Ot@jKX0z<2oJ(}+aDnA?N>k& z$~X-;-hy$$KH!WYe@anCa-MGib zL7}oPM2P~hM?zyUU9l=n}ng)TR5Unvtg#}{o#l#o0K&9ldxMj z5(1dz&u|+TzYir#;objk^V-MK&W~O{(*2`{hWUT$sr1L=T>oeoPC>EvfoV1t* zE;Hd61{SV(GOd)fi4ZH4`5!RGMUzw0F{ZrR;X*Y1(IZO#igHMZ~7{UsO%^TXhGU}-3Shgrq0Phbvqn_PJaM=0N-Aum4z zqD015Y(;UZY{&9#_>a|REAl;8!`y)@X}>Z0C~1itYJjq5k<55uMO^lCgq!S&FQo49 zvEv+0@C7e{@XMa_91U{{?OS`g3eP%i>Z3sqyXrFX>(7(*Buy`S+`8DFcJknYG9pkG zko)*VsNA{MPcl1aucV@GuZ4PKHOu~6^|mTg_1wCKsBjoo)mM< z6jI+5%0w^x*{k}cm5A*J<4`;BTnl|lA9*QqMDtLX@i%4wFG@hYHCU+ZXhw;%M#<&X4g_;6KJQdNx4cye5G3td zXQriHs(Kn1*<6HZwt*KI6GLPr;2X+txB`ttv|%>nj6S~bq#%1$9HZ|_Q}pfenANjd z=HObIP42PynKQmJF_PDMOx5-~iCn3mfC3cy-1}8qc=pUFq1#6xbYp1ww#uYEA?DQ5 zyK*g%z`!D1pXzF%lzm!AEY-_EhG{F1DitlD00pIw>^GHP7aTaBH$0c~E&R#&c4N8Z zrt9+|E31h2te>{{Ey2`q7xS>4#1cP04zbbroZN|aqe*K*S6BGhX?>t+4M(`m>e<(QNyO)~7u+ zEAa5uCuJr$Wmqf`0l7u;E&s%(`#Q>U7hiY z18m$_Jm2cLIpw9Z#e#U7Sp}P?ebE4a1d}HOd{&e!;6DIZB3`dJEJI5LThiIyk5;@e ztJQIP%rMoPDDsb?ifzrlZ^=%x=XDM~G%p%ZP&+!|U*5P0O|sLxTmwPTazsS7@6csd z;9r4g%#1JMU!$?S;w3~H$`km{lay{Y47er)wg1yUk;6VMnPvG;y)iec{8mG88bsu2 zz5)T?J}Q=(WtD6o!DO^meRC={`Hv||w`WGlfd=v(RRoBzjoPu8?CXzqbjJ%xZf(iL z2*?qELVys3kaXrZ`K{cZaao@Ug~8_lvg8K?SPTdW&T)A`|6bleno5D1(~;u$WgJ?50)Qh#c&EQK@^{I4e(hG?jZN!L zkQz>+(qkAWF!P>rrqF3`Z~5ij|eC)_3|UJcVf0wk1oHdV1P<*S(z33${t z)_R44EMNpGZ}#JdBMf5JfkN&c2dxVJE^Tbqr(8nf!iRAIVgsDNY*yDTqUa`tKcqL= z?&p3{zzFvT@;#uIBZmAD)cu77M(DO+lqzFJ@>T-g1w6tw`jZKr^vGEi=XC z^aq9966Fht94z3ubcf-V54yNM-%j4<7e+uWXg0`Rm?fZrnI6YMqP{oMij{`GDVxck zY!989p_|;P@UXy*-=^6jC7^`np^UvO`iyo@p(YTJ{;w}U{1wy6SxL=gBABR!!$v5( zq|l!7%1odytGEB86`ck0BZiKz69SG#@t})?q2(f^5p4WC*gpy=<-~^%mBxY=bW4o9 zcD4>D%rfKNUIKf3$=Ss^uBk$vk)SIt%MFAxQyu<6RFQHtO4JdBqm^(Q0X5FSLeP89_%n?HN$HE}6eI zKH(|*sZZFO8GW9}Y%neFcMN16aNAFX8xlq{`Du;0qLuL(xVd+H_M5Xg1QZgdc5O9Y z>P!8R(dV#)?#tLWez^n`0Fn&{?D>Ex+%kpz$o5%@JrgbY>&ty8r`;Mh?WqgVt5je6L3SSocK7~IPVs}3tl3M` zzl@fr8cf_wPQATo@TO8vD{DurOi*@Qfndn)zUSeK5MqCdK~Z<6pi0;o9Q=h z!RvkTAp_2wiGQ9pw~x5*{+fQ4T_LB`FXY!(Oq!W@!tQxg)}S54wM?2oHRj7+ai>$e zzAb7-kpU#TI?8C^Z{#x9_AA?mbzv(uToKOCqSs)wXUrstzL^sJJdvxqo;P$rp-bCX zkZDR&tg~c(C#lW|ZSvaxr#TKn&ufl`vXROEP(tSct*|}&R!opZUh7ah= z6$%*G=SE^Y*wy9D(!1Ol2!=F_>tDQT=({HqHt1b4Kpe4WPRDhgd4Pu>AAl4E+}#q_ z!_N_)DtP=r1b(3oSjqk@-N!D~7bj_nMyA0ou&_8l|0T~)>dT2|1{o6~H#Z{1=!k}I z@|T&%X6$Ji%>U@YsbNr5I_Lcl&#RPprf`dhN~~#^vzHHV{oBOBP4IP@4fW3!K|)f$ zqor`6*|db3zQR=3i+6L{P5NikS;Jd01v}Rjli%j=nygb^^VrGF7gwyGd@J1%Z1{Af z{j9>SudPpa&<7~x%>YdW;+9D-ILi*@nmI`3{!x!SYZbJh$xa1gak9vC#0X>Kk#on{ zXu5FjK^#P9rStZSodEtc8sjHAxQSV0e(dV@Xg)Jq+tlSy|7F^19|FEu1>a(x!zyRP z9iutRS;dNlk^s+zr_U7j?4Ng{%NS7-*p=T2*ddPJ0{bwxH@+kdztUy6P3BxcvbG(x zY8)@zv3V^Wg#s|F^&>^O*lcy*x>GqaBpUdTAxipohh?Sh)19cx9fmw2@gc%0Iq_0> z){h{_`gdvU_n@UEgDR~J+bW&gB;D>4QKn_@W$;LS91Cbo`T;O|h~Xd26Vd4PcDD_uq?prexyNXt6$qpGnHJ4S z=IqR>=dol7y5IX#;(LrQ5!M}=b|wxj(OnMJoHzBqCf1aic=auxcE_}tZpeBzZ(svf zR_ZlioCvuLHcXi-F0A?t)s-r)%vB9Xvh>oD@6rrUjS5}C_pJd16FdXe&#SCT4_K>S zG4v~36yG>X|M|l6L7&^c`SjHw`yIWd2u&eFBVgLOe*>{KS!2vyV%OLrI&<)~pyMhp z!Z&8g$wMK`!YXTPOMKfmIwZg1t@whW)lqA2y_)*EA!fkjtY`NY#`(ovR{d>N=Ps+s zshBvgL))i^CGoD-Bnj##T%NJkBKVt1o9gkhL7uKT*aEtkrqivA!ht~$EtpE}cuc!@TjEpFckGqF?6P@H*h^{Lzy&Q7-0>^yfz zhZMia|aV|q(Lr=-E!(6B!pAvRTALdjJwSlbbNF^ez$LYh}IwjY|S z2>O-|)=tg53id#iTwd#H`Mx?+z_xx)4NfQ+p^S?Z!^+O%38BEGBtK@T@{-IS7PA>n z#1hnDQfiHKp>xVpbx~PkNs4i8UiF|?70VLXIlR@|GfV!M`gDK6<$&v0?PGC%Za4Cd zk&Pst0x-rJP$o!TvK+E~W;1FLGB-tf*x`uSW%8j)lp{{7FPzi1s!BT_lls{!y|$6{ zP|R6~7@i%gk}=klsmr?cIzv>RKJ?O7?BJhD&ZBZaH?VzWb0m zSQuJPS%J z5#o?q^8z8ji7NT^Kd^ZKCS*0#!3@wKM4^JYON%>hdE9M1iQMaQjfKvRD~?exAjyCr z1@XXv1Xlk{S$=kKvRheT(60JsMfAkkci=OH7|#Ll=g+`I0CPmgS|^%`ZC2657Y&&W zAQXI&wm?!8iV-D+B=-+3hYu@3luCHzj+8rRn!C~p-i2AG(1e*v0+BSO0-OPe`Dn39 zy}_n0`kMknl;|rNS3V09h0o!4OCSla{3F;M=0samw|phW*T21A%Z08)yoi?<6CU@V z#E<@-Ce$bNjMx6N0|cnQ)AQ;kA`NNp9O7J*?d#Wg0@C|8O6FOlt==eS4hwRE+mB7F z`h=J`G5N?t{KuiV0}?s9P@q5c)xZgE*;7Zv-%%Ic+3=r*x3q9aPa`0C3&R49y^A6E zq-a9;uw5t8pPgpm)78tGyPO$4SMnAd(3g04dLVKJ3n*eX!H9fCo}8kyEl~M&k4AsO zB?1#Z@j1r`s3!oLPciz;$+fg>MkCLT`V{%X*J{M1I@{k8kZ-di z2PcGt61+ndpHusOWx0EIGCGNU)a}kF>9ajbyI@4@9+>UV%hojdOcd2x+-6PZyzHqc zWed4jdkFynHY;UrkTh2-)eJQIuc|5~j0;rWf0Bvk0Y?qjD zCx${-E?O(%UeVa}TIBC+`8&0E3p$zw1` zH&HHqk5&Lin&2<-E+8w)SxW1sLO1m-;}ZID?{!aWO!HZwCh=*08{J(ufNb?$;atQL z9T*FvHzqE52(?#dCU!i;0~7K)o};67HvNndd#rnjFq!kNJ*i&|aDQBYZ?In?OzC>3 zo&R}w={q2zuLL&nnJAscr8W;NRR!JKolq?q zp(y;A!*|N15c0EIyJ=77;7Ltg;-nSMSjwgFQTLg$ouBXwQg+WLDGsV0dU_c;NlGl# zSN)3yiv;`OQPqU{_6o za4B}okdxp@Sln+hdIC}?L=G-eSIw80L7EY|$cED^z!H3IoV4t8N7ZWnZZKKosN(eT z;Z=mH_PAP=V)jEi45&QmhedQ?i~c2DYUHDWWx0WYS?i(_Q|tm@b73`5fp3kJAG$VacygV>J|>s@SxNJ9pEHXaqECbP95s z)!EdWE`7HIPQ(|t{1BQ4^!=v9AabdshCXckx@}*vkvyY_2bNH1dlc`4cvtaum8fBQ z_2yXC2(XN#dZZX2M8p%wL%-7>wwl6+%4f?OH<>#rLcy7V$~MWfN6kCreM38+oDoS7gg5v@lK6qCRfK={Awe5M?0s0{)4FzA zGbM+wCxtdDOokmxc0)Y}oOM)h0qi0^7{E8k0!mlimk4I|WWV;TDvBHqb>m8zExKpx zJf3Rd+(rwsqNyrr)`t1g0$4||GK^M|zv=(5fG}E6;A&z`(1faffrn4Ov!k)3A+E@WI@2*P)H zls#flpgqkvNCX!4{yS;Mz6Fi(jnO#O&DdeQU#1*!hTL-1x1V_|E>b=tRx_8sEkd`q z6ZYCJOwLK+N_eOWGmH*guF+Dr7eW+oEWM8{k}>Xm@J)n6TV#=k+Y0|=%O=48Jc6hT z2``7ZcXJ|4b3d}EGd?2?si40qa{gB_bxt!vu4laT?8X%Xbnx-%b^x*;8ifjvm5y8E z+OhAFP8!3XEI}z~_ky8-e>vzu#-Y|sBdOSf$qE9%oT26I7f$c|A94%hwV$xBd~#RY zd3~=-e>Pog;Pb%5t=k_#JLCK{%z?JVQN|9hj{QVt8un*Ow6FEJO}%eKf#Y}nP>f*d zOk)Sz232{lVoM<3_^gMCYS^U6&fqk735@#fw8G+Q!vBf^IG_J8JMs1EVt(dD+k-s@ z1M16|H)pM82OP%c`Bl<}DLk}r<7mojf20}2z3Hz(lN)4@E}uH}UrVO$*Sa9Vy+TZA zST?UQ4ocBqYBxm7gYVFCS-K3k6rXV|hMDc+a_EpPcv|j>TpwbB4kGEd{Q>!7t$V(~zaP+%N*N(rt<7kmj2^g?;nks+q+tWb6gd^w} zfR5mT5ro&c(yyTMfq@%@cU2NZpLf|cu`DpSH=)BYRMB-F0WSxEJR)UUv@yoSH+S@% z#5+i}ow8|#jWD<&q?AB$oRliS_vit%XI&L<`WJ~nH5rs=(LhHk2J*rmiNK=gU#Fh2 zZzBnh7GnsY=t|wUfP+EdyOT~k`Z9}B#Me%6XL8&ntc^SAVwagPxgg3M6^D>W;8<{!?sdb!aM z-LV9xXSqHMb~C<^A#_F6QvV=32&dnJT>$kjp=hRitW}_N{LQcx)kzve1q)*g(0-4r z7*+=z^{x8-s33fC^;h5Z;e-EO3M-aF4p@>N2BYaRC^p6hwj+kC`$`G^5C)C$Z~ca+ zgS5KAnpDhXYlFx!>-B{g2X(2^5b3l>xYjRHK?o(kyBOjLzwDq2)Rhm6lcBGE!fN39 z-k(?S_4-4wvcz{IY)=fy4~|4Ea4t_+5Ca?mJULQNM+^(&0nxdGeuz|hyQ4W+DeAC8 zIztcMW5KMz;P&06?_<2&SD3qWKOdr0K7F3JEcXMKW*4E>)4WA9cd#IZ7x-mT8wPb= z56CXLO82kt%S|KPvC7vU!K{pbv3`qrN2Xpo^Rz_)d2NrCG2we@MU0B~N>jNetgfIjNFM!Yo`M^FU z3#5ustAi`?BJq}U;sQHx>COH+q)395lSe;s9-6=RA8(`mhW(ze-{RGr=YeFC&M z5JX8>I?l;ezb1Y2B)u}Et!A%jxA7oqnBnOMn@%B}S6G6Nh(CI6H!7V?j8(*l(a`wG zeW{7@9hjCm|G-H!HE?;+_b_|kUfhS=mprg+gkU|J-$Qo2Ca%o^FWY8;hP8lTCW?J_ zM(+ejTq_9Hj2xe==-8!UPI+3(-Fg6-_4_v4WRDI(Hg|#Ev$&52^Rey(F&bH8-(Vy$R|yy{1SX>mTo<0!!{GQwS)q9Bj5@ix*~IoKcJFez|L zcQrd*LBnEj7XU?hc)H&%Z7~Tnt+Z@y_RAwa7$sLUzk?f(24-xktCZ*s*IzRhkgOw$7?DcM`2`{BmH@FY-b^9(}rHU;t zl>ilNOMdDw&a9>@pp-=M!4E30YG(WxV)7i>iRbZ1vQudaD3>j^U4?yW(P(IV`U@)k zUcdG5@ICP6Re~D96X?0*cT$nl$8XjR^*Y$fuWYJHyhbBbRFx? zpKta9pKs>_{m=V|CXsLgNb$rQUhpSppw^VJDt+Lpb@JMh%v>PTg|aDQ!yLgSH~pl@ zLNS_zg&ptLIdc;%PLtjN53DS0G_9u3I_wkv@$+-tRNo58cd{C{f%`U(`ck$^my_YP zQ?`j0pISfH9b2UHxs~OkL-HQ!S>b@05b*Z+0m=Dx_uz=0f%`7&g~se27W-aiZPv#M zE2V<;-}`ZxsqDm|bdOL0-^Y1Ow9a@W5FSxPZ#^tiOJ443J^VFhe=8>Y!FYVl>-{Qa z^`D$8Y5HUPDJo_Y$BXvd!3!Ts@RESqZ}b2N!QbNkaR!{!8mDA z#^~%CcY)|L*}#q0gr0t8`;(6SZN<(nu#Ypf(G3_(zG7fR%>p+6mSA0^_{Q4gRJv3A zvx}a|lHvf>uOpYh8)t(@sl#Q^Hkt^1j#<3Q@!CqM>QCUB!=` z2zH>}ROLF9qW|h3Xt|GkOsA}pS@NBWVRvU+5E(IqUTMbug76bg^`N4s4-3^oMZ)0E z$OV@qYT?Jd?r zLi0*(16jJw&Xrq!5tctR2k-r*d4D_LfF0>ng~ZMbxz8zme$w2YnN2)2rPz7Lie=D8 zcKeatiEWasqe2sH_m}RA12)Ho7iVhazexI0HZIbDzU;TPI;}sdGp}lH)waH+G+Z}U zS2uUEwwWf_6R3aklZof~_Ee1k}g}&?GO88r;|5+<^aCDIBh2kxxkIbDB z9sjU^2^gpa?6|pLUb-9tnM60~t^_<8V)0e6v+=lNE=bV?tNFHAEz9V{o>T)UZRPZ| zvjc5#{_N&A3IfS0bhIRiL5yR~i)|f$1z!JN3Q3v72Lmq#JS`Rkn(&Z5!PhO4+jgRX zvL;yarxSSkSx*$XeG7s2^zOsqU(jQ>+PQw#!a~+E3q?!C#0(iJ&I`mGzL3yQrUG%k+!m$TgPl1SSlqF=SsX3& zTox%XS@C!g|J(u=@(KR6Eux3x#sL>}5NOhG3#WuZ6a06>MdKGqX1~O$wh6zw$vv0* z>tHb0Sfl0yi<8CrBo5`J4VaH%%l_P-8f&%bW+S730OguGGrY5-%LUM++|X7y(6r1f z_wSNrc~*>xzVXL=Cwx-=nWLMS&CF_JTNe#Dq5eSjJ1VBXI*0(W$qmVC>*!)Rmgh^* z9$lbnm6!FE7Ji~CMFZeYe9+^^GjD%6{6l*tsLk@c9m+Y*P zS1wwvzWH$rjcuG41)3XAvww$&kvcn0GH13hcjcDT!lmMYS~VJI0ebB6uOd(T^_@S= zPd%D{%03EuqaD^Nw?|o}nLm6>HQ<*y`nV$v%429TGf1`t5%~)MfM~dXAOV+HIcxF| z=5G5j0NTGgCC!}+imI@>TB|N-g!WFzD*n3xDnuShv8%Ttuf91F6GWdy0I#eRzsA>t z!vjrzNC14!fqoD<^4sH3Y8)pbv{-hYL)RhwQ1Nt|`(U}z%+q#S5 zj}eT3MqW!>A_9HG86alWbdjiz-BvDu``Z)LQUbSQ<-s;6(wUV-1T2qVnk@U@n%AEY0eZmetbd|0L+7*YLA(wzj zJa(zgR^RB^GXs!)!n7|cJu2Ol(%D_^Y&bM}Oe=1~zuW%#jO5X9b*o8BuRONU-s3_) z0;12n0F*0>;5k7oEu2a2m+jos=(i*Jgt2%nVLUGtt zOTNtHlW7;=oohxZ6ZB`Z45-C2wzvRz&jYYFe7G87lHqQ+)@jL-d9hWKRa$ZAR@$m% z$CoOsp}{`+)qX;Gv-?=Vr*huyq}6a$Ttodx}>{77biMn!i%gOUhx7IIc8itAoxzO;!*bTuATgGV?R?9Pu&; z|9&z(MKZ6cXGZZWii^i@$Tr7SV3VbK52#`cl{#17HIK&M-F)j{y#9!2>{OM0$ZNkd z|EmK8I(V7`^eNM4eecV>pxz_ezoFVWJG<{PJFL?xP`*vW{!XID0Te4+)tQuTb0Y>$ ze5mZSfF7~EQOPS)MUmM@Cp06s@6S$-TMDaN3FTnqHl<>=PffYAj|C-=qS$zv&Zu7M zfWKIs3evdmV)wa2P%psWx8i~zO9({!b*^2xyYDloJeZmnN&xf%IDiM-dD#(%djs7s zfUIem4ki=`Y%v{4DcwoMQ$PYvSPvz55A@vv{nKiZVG{4jp zvi^}+D#(57G;w~I5f%mO%sc@_H}wm0Vt z@~$OBO&5+%-XUaezi(m#4Y#S|z8OZ|bes6-_ z1RsV5v<`+3oi^Rg==YpQz>?&wOXxcbwXiSfSTY+@FiyElPKJc{v24O-xzm@?vyI-^ ziGQsS8^I4+o!YszPP7bqjdOuBwcl`h^TUKZH`-7XW9Fb>=D$o#h@X?=4@SUm*!rKv z=-c)@#VMM#-O@faIfAj1%VuH2<*kX$q}O|`aj%p+LtAJmw*MGfHHBa_T#Ez$EaUFZ jU+$_3_yYqa{^)3JXZm{aShnwhZ_pHEUPzZq8omF2IOj)= literal 0 HcmV?d00001 diff --git a/static/logo.png b/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 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 SYs}WS&%*SCNx89m_dRTBa!_Wt&2gw2~z) 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 N^t6qxmumhM{C~THl7|2Q literal 0 HcmV?d00001 diff --git a/static/tabbar/icon/stock2.png b/static/tabbar/icon/stock2.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0c542ae2242f0cba66731cac93f10b35702008 GIT binary patch literal 3878 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 literal 0 HcmV?d00001 diff --git a/static/tabbar/icon/video.png b/static/tabbar/icon/video.png new file mode 100644 index 0000000000000000000000000000000000000000..088fa78613061250305099b7ec565a6fce3b9939 GIT binary patch literal 3964 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 literal 0 HcmV?d00001 diff --git a/static/tabbar/icon/箭头_右上.png b/static/tabbar/icon/箭头_右上.png new file mode 100644 index 0000000000000000000000000000000000000000..7cffe41f761de3ca9cd930ae61978632dbcf108b GIT binary patch literal 7922 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 literal 0 HcmV?d00001 diff --git a/static/tabbar/icon/箭头_右下.png b/static/tabbar/icon/箭头_右下.png new file mode 100644 index 0000000000000000000000000000000000000000..fec07399909c0da47aba8f9e00667c2af4e6575b GIT binary patch literal 7873 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 V>CnxsJ|uX8(bG1fKGd|k^*^n4@pS+I literal 0 HcmV?d00001 diff --git a/static/tabbar/icon/箭头_左上.png b/static/tabbar/icon/箭头_左上.png new file mode 100644 index 0000000000000000000000000000000000000000..802509d15cd160c147dfc6acdb890b3f38bc3ab7 GIT binary patch literal 7695 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 z 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 literal 0 HcmV?d00001 diff --git a/uni.promisify.adaptor.js b/uni.promisify.adaptor.js new file mode 100644 index 0000000..5fec4f3 --- /dev/null +++ b/uni.promisify.adaptor.js @@ -0,0 +1,13 @@ +uni.addInterceptor({ + returnValue (res) { + if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) { + return res; + } + return new Promise((resolve, reject) => { + res.then((res) => { + if (!res) return resolve(res) + return res[0] ? reject(res[0]) : resolve(res[1]) + }); + }); + }, +}); \ No newline at end of file diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..111f60c --- /dev/null +++ b/uni.scss @@ -0,0 +1,77 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ +/* uni.scss */ +@import '@/uni_modules/uview-plus/theme.scss'; +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16px; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md new file mode 100644 index 0000000..1681eae --- /dev/null +++ b/uni_modules/uni-data-select/changelog.md @@ -0,0 +1,51 @@ +## 1.1.0(2025-08-19) +- 新增 插槽 selected empty option +- 新增 mutiple 属性,支持多选功能 +- 新增 wrap 属性,支持选中的文字超过一行显示 +- 新增 align 属性,支持修改选中的文字显示的位置 +- 新增 hideRight 属性,支持隐藏右侧所有按钮 +- 新增 mode 属性,支持修改边框样式 +- 新增 事件 open close clear +## 1.0.10(2025-04-14) +- 修复 清除按钮不展示问题 +## 1.0.9(2025-03-26) +- 优化 默认背景为白色与整体组件保持风格统一 +## 1.0.8(2024-03-28) +- 修复 在vue2下:style动态绑定导致编译失败的bug +## 1.0.7(2024-01-20) +- 修复 长文本回显超过容器的bug,超过容器部分显示省略号 +## 1.0.6(2023-04-12) +- 修复 微信小程序点击时会改变背景颜色的 bug +## 1.0.5(2023-02-03) +- 修复 禁用时会显示清空按钮 +## 1.0.4(2023-02-02) +- 优化 查询条件短期内多次变更只查询最后一次变更后的结果 +- 调整 内部缓存键名调整为 uni-data-select-lastSelectedValue +## 1.0.3(2023-01-16) +- 修复 不关联服务空间报错的问题 +## 1.0.2(2023-01-14) +- 新增 属性 `format` 可用于格式化显示选项内容 +## 1.0.1(2022-12-06) +- 修复 当where变化时,数据不会自动更新的问题 +## 0.1.9(2022-09-05) +- 修复 微信小程序下拉框出现后选择会点击到蒙板后面的输入框 +## 0.1.8(2022-08-29) +- 修复 点击的位置不准确 +## 0.1.7(2022-08-12) +- 新增 支持 disabled 属性 +## 0.1.6(2022-07-06) +- 修复 pc端宽度异常的bug +## 0.1.5 +- 修复 pc端宽度异常的bug +## 0.1.4(2022-07-05) +- 优化 显示样式 +## 0.1.3(2022-06-02) +- 修复 localdata 赋值不生效的 bug +- 新增 支持 uni.scss 修改颜色 +- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用) +## 0.1.2(2022-05-08) +- 修复 当 value 为 0 时选择不生效的 bug +## 0.1.1(2022-05-07) +- 新增 记住上次的选项(仅 collection 存在时有效) +## 0.1.0(2022-04-22) +- 初始化 diff --git a/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue new file mode 100644 index 0000000..85b2d7b --- /dev/null +++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue @@ -0,0 +1,837 @@ + + + + + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json new file mode 100644 index 0000000..4033502 --- /dev/null +++ b/uni_modules/uni-data-select/package.json @@ -0,0 +1,106 @@ +{ + "id": "uni-data-select", + "displayName": "uni-data-select 下拉框选择器", + "version": "1.1.0", + "description": "通过数据驱动的下拉框选择器", + "keywords": [ + "uni-ui", + "select", + "uni-data-select", + "下拉框", + "下拉选" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.1", + "uni-app": "^4.45", + "uni-app-x": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue", + "darkmode": "x", + "i18n": "x", + "widescreen": "x" + }, + "uni_modules": { + "dependencies": [ + "uni-load-more" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "√", + "aliyun": "√", + "alipay": "√" + }, + "client": { + "uni-app": { + "vue": { + "vue2": "√", + "vue3": "√" + }, + "web": { + "safari": "√", + "chrome": "√" + }, + "app": { + "vue": "√", + "nvue": "-", + "android": "√", + "ios": "√", + "harmony": "√" + }, + "mp": { + "weixin": "√", + "alipay": "√", + "toutiao": "√", + "baidu": "-", + "kuaishou": "-", + "jd": "-", + "harmony": "-", + "qq": "-", + "lark": "-" + }, + "quickapp": { + "huawei": "-", + "union": "-" + } + }, + "uni-app-x": { + "web": { + "safari": "-", + "chrome": "-" + }, + "app": { + "android": "-", + "ios": "-", + "harmony": "-" + }, + "mp": { + "weixin": "-" + } + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-data-select/readme.md b/uni_modules/uni-data-select/readme.md new file mode 100644 index 0000000..eb58de3 --- /dev/null +++ b/uni_modules/uni-data-select/readme.md @@ -0,0 +1,8 @@ +## DataSelect 下拉框选择器 +> **组件名:uni-data-select** +> 代码块: `uDataSelect` + +当选项过多时,使用下拉菜单展示并选择内容 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-load-more/changelog.md b/uni_modules/uni-load-more/changelog.md new file mode 100644 index 0000000..c5750ac --- /dev/null +++ b/uni_modules/uni-load-more/changelog.md @@ -0,0 +1,23 @@ +## 1.3.7(2025-08-20) +- 修复 微信小程序css警告问题 +## 1.3.6(2024-10-15) +- 修复 微信小程序中的getSystemInfo警告 +## 1.3.3(2022-01-20) +- 新增 showText属性 ,是否显示文本 +## 1.3.2(2022-01-19) +- 修复 nvue 平台下不显示文本的bug +## 1.3.1(2022-01-19) +- 修复 微信小程序平台样式选择器报警告的问题 +## 1.3.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more) +## 1.2.1(2021-08-24) +- 新增 支持国际化 +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-05-12) +- 新增 组件示例地址 +## 1.1.7(2021-03-30) +- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug +## 1.1.6(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json new file mode 100644 index 0000000..a4f14a5 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "Pull up to show more", + "uni-load-more.contentrefresh": "loading...", + "uni-load-more.contentnomore": "No more data" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json new file mode 100644 index 0000000..f15d510 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉显示更多", + "uni-load-more.contentrefresh": "正在加载...", + "uni-load-more.contentnomore": "没有更多数据了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json new file mode 100644 index 0000000..a255c6d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉顯示更多", + "uni-load-more.contentrefresh": "正在加載...", + "uni-load-more.contentnomore": "沒有更多數據了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue new file mode 100644 index 0000000..0fa17e8 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,404 @@ + + + + + diff --git a/uni_modules/uni-load-more/package.json b/uni_modules/uni-load-more/package.json new file mode 100644 index 0000000..3397e8a --- /dev/null +++ b/uni_modules/uni-load-more/package.json @@ -0,0 +1,105 @@ +{ + "id": "uni-load-more", + "displayName": "uni-load-more 加载更多", + "version": "1.3.7", + "description": "LoadMore 组件,常用在列表里面,做滚动加载使用。", + "keywords": [ + "uni-ui", + "uniui", + "加载更多", + "load-more" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "", + "uni-app": "^4.07", + "uni-app-x": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue", + "darkmode": "x", + "i18n": "x", + "widescreen": "x" + }, + "uni_modules": { + "dependencies": [ + "uni-scss" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "x", + "aliyun": "x", + "alipay": "x" + }, + "client": { + "uni-app": { + "vue": { + "vue2": "√", + "vue3": "√" + }, + "web": { + "safari": "√", + "chrome": "√" + }, + "app": { + "vue": "√", + "nvue": "-", + "android": "√", + "ios": "√", + "harmony": "√" + }, + "mp": { + "weixin": "√", + "alipay": "√", + "toutiao": "√", + "baidu": "√", + "kuaishou": "-", + "jd": "-", + "harmony": "-", + "qq": "√", + "lark": "-" + }, + "quickapp": { + "huawei": "√", + "union": "√" + } + }, + "uni-app-x": { + "web": { + "safari": "-", + "chrome": "-" + }, + "app": { + "android": "-", + "ios": "-", + "harmony": "-" + }, + "mp": { + "weixin": "-" + } + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-load-more/readme.md b/uni_modules/uni-load-more/readme.md new file mode 100644 index 0000000..54dc1fa --- /dev/null +++ b/uni_modules/uni-load-more/readme.md @@ -0,0 +1,14 @@ + + +### LoadMore 加载更多 +> **组件名:uni-load-more** +> 代码块: `uLoadMore` + + +用于列表中,做滚动加载使用,展示 loading 的各种状态。 + + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4); diff --git a/uni_modules/uview-plus/LICENSE b/uni_modules/uview-plus/LICENSE new file mode 100644 index 0000000..c0ffd3e --- /dev/null +++ b/uni_modules/uview-plus/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 https://uiadmin.net/uview-plus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/uni_modules/uview-plus/README.md b/uni_modules/uview-plus/README.md new file mode 100644 index 0000000..d5ba135 --- /dev/null +++ b/uni_modules/uview-plus/README.md @@ -0,0 +1,74 @@ +

+ logo +

+

uview-plus 3.0

+

多平台快速开发的UI框架

+ +[![stars](https://img.shields.io/github/stars/ijry/uview-plus?style=flat-square&logo=GitHub)](https://github.com/ijry/uview-plus) +[![forks](https://img.shields.io/github/forks/ijry/uview-plus?style=flat-square&logo=GitHub)](https://github.com/ijry/uview-plus) +[![issues](https://img.shields.io/github/issues/ijry/uview-plus?style=flat-square&logo=GitHub)](https://github.com/ijry/uview-plus/issues) +[![release](https://img.shields.io/github/v/release/ijry/uview-plus?style=flat-square)](https://gitee.com/jry/uview-plus/releases) +[![license](https://img.shields.io/github/license/ijry/uview-plus?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License) + +## 说明 + +uview-plus,是uni-app全面兼容vue3/nvue/鸿蒙/uni-app-x(即将发布)的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水。uview-plus是基于uView2.x移植的支持vue3的版本,感谢uView。 + +## 可视化设计 + +uview-plus现已推出免费可视化设计,可以方便的进行页面可视化设计,导出源码即可使用。极大提高前端页面开发效率;如产品经理设计师直接使用更可作为高保真高可用原型制作工具,让设计稿即代码,无需传统的设计稿开发还原步骤。 + + + + + +## 文档 +[官方文档:https://uview-plus.jiangruyi.com](https://uview-plus.jiangruyi.com) +[备用文档:https://uiadmin.net/uview-plus](https://uiadmin.net/uview-plus) + + +## 预览 + +您可以通过**微信**扫码,查看最佳的演示效果。 +
+
+ + +## 链接 + +- [官方文档](https://uview-plus.jiangruyi.com) +- [更新日志](https://uview-plus.jiangruyi.com/components/changelog.html) +- [升级指南](https://uview-plus.jiangruyi.com/components/changeGuide.html) +- [关于我们](https://uview-plus.jiangruyi.com/cooperation/about.html) + +## 交流反馈 + +欢迎加入我们的QQ群交流反馈:[点此跳转](https://uview-plus.jiangruyi.com/components/addQQGroup.html) + +## 关于PR + +> 我们非常乐意接受各位的优质PR,但在此之前我希望您了解uview-plus是一个需要兼容多个平台的(小程序、h5、ios app、android app)包括nvue页面、vue页面。 +> 所以希望在您修复bug并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢! + +## 安装 + +#### **uni-app插件市场链接** —— [https://ext.dcloud.net.cn/plugin?name=uview-plus](https://ext.dcloud.net.cn/plugin?name=uview-plus) + +请通过[官网安装文档](https://uview-plus.jiangruyi.com/components/install.html)了解更详细的内容 + +## 快速上手 + +请通过[快速上手](https://uview-plus.jiangruyi.com/components/quickstart.html)了解更详细的内容 + +## 使用方法 +配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。 + +```html + +``` + +## 版权信息 +uview-plus遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uview-plus应用到您的产品中。 + diff --git a/uni_modules/uview-plus/changelog.md b/uni_modules/uview-plus/changelog.md new file mode 100644 index 0000000..aaaeaa9 --- /dev/null +++ b/uni_modules/uview-plus/changelog.md @@ -0,0 +1,1094 @@ +## 3.4.99(2025-08-18) +fix: 修复parse富文本组件可能导致无限循环的问题 + +## 3.4.98(2025-08-17) +feat: alert组件新增transitionMode/icon/duration/modelValue等参数 + +improvment: 完善alert组件注释 + +## 3.4.97(2025-08-16) +improvment: 完善album组件注释 + +## 3.4.96(2025-08-16) +improvment: 完善action-sheet注释 + +## 3.4.95(2025-08-16) +del: 去除不再需要的重复组件 + +## 3.4.94(2025-08-15) +improvment: 组件库内部icon前缀统一 + +## 3.4.93(2025-08-15) +fix: 修复dropdown组件在打开下拉菜单时content高度为NANpx的问题 + +## 3.4.92(2025-08-14) +fix: 修复多余空格导致cropper编译出错 #830 + +## 3.4.91(2025-08-14) +feat: 新增agreement弹窗协议组件 + +## 3.4.90(2025-08-13) +feat: datetimepicker新增datehour类型 + +## 3.4.89(2025-08-13) +fix: 修复u-form-item组件缺少对labelPosition的判断 + +## 3.4.88(2025-08-13) +fix: subsection组件的disabled属性应为Boolean类型 + +## 3.4.87(2025-08-12) +improvment: 签名组件示例前缀改为up + +## 3.4.86(2025-08-12) +feat: 新增signature签名签字组件 + +## 3.4.85(2025-08-11) +feat: 完善图片裁剪功能支持props及JS两种方式 + +fix: 修复H5下裁剪后图片黑屏 + +## 3.4.84(2025-08-11) +feat: 新增cropper图片裁剪组件 + +## 3.4.83(2025-08-11) +feat: 新增barcode无三方依赖条码组 + +## 3.4.82(2025-08-11) +improvment: 优化table2递归组件逻辑 + +feat: 支持树状列表复选框 + +## 3.4.81(2025-08-10) +feat: table2新增树状结构递归支持 + +## 3.4.80(2025-08-10) +feat: 新增table2固定列对树状支持 + +## 3.4.79(2025-08-09) +feat: table2组件支持左侧固定列功能 + +## 3.4.78(2025-08-09) +fix: 修复table2在popup弹窗中无法横向滚动 + +## 3.4.77(2025-08-08) +feat: 优化waterfall瀑布流组件逻辑 + +feat: waterfall瀑布流组件支持多列 + +feat: waterfall瀑布流组件支持响应式列数 + +## 3.4.76(2025-08-08) +feat: 取消props中tabs组件默认颜色影响主题色生效 + +fix: 修复parse富文本组件报错$options + +feat: timeFormat时间格式化方法支持UTC格式时间 #596 + +## 3.4.75(2025-08-07) +feat: 新增loadFontOnce参数控制是否全局只加载一次字体图标 + +## 3.4.74(2025-08-07) +feat: input组件新增cursorColor属性 + +## 3.4.73(2025-08-05) +improvment: 优化下拉刷新默认图标 + +## 3.4.72(2025-08-05) +improvment: 优化virtual-list虚拟列表样式 + +feat: 新增virtual-list虚拟列表演示 + +## 3.4.71(2025-08-05) +feat: 新增virtual-list虚拟列表组件 + +feat: 新增pull-refresh下拉刷新结合虚拟列表使用 + +## 3.4.70(2025-08-05) +fix: 修复qrcode组件长按事件传入错误cid导致的报错 + +fix: 修复index-list组件key为undefined导致的索引报错消失 + +## 3.4.69(2025-08-04) +feat: pull-refresh下拉刷新新增上拉加载特性 + +## 3.4.68(2025-08-03) +feat: 新增pull-refresh下拉刷新组件 + +## 3.4.67(2025-08-02) +feat: number-box支持disabledBgColor参数 + +## 3.4.66(2025-08-01) +improvment: 增加组件图标 + +feat: table2组件新增列排序插槽 + +fix: 分段器组件onWindowResize使用条件编译 + +fix: 修复u-line-1单行省略样式 + +## 3.4.65(2025-07-26) +fix: 修复部分环境下字体图标全局加载问题 + +## 3.4.64(2025-07-25) +feat: 新增dragsort拖动排序组件 + +## 3.4.63(2025-07-24) +feat: count-down支持slot传递时间参数 + +## 3.4.62(2025-07-24) +feat: divider支持默认插槽 + +## 3.4.61(2025-07-24) +feat: divider支持默认插槽 + +## 3.4.60(2025-07-23) +fix: 修复use阶段全局加载图标引起App端不明$page报错 + +## 3.4.59(2025-07-23) +fix: 修复album组件和CateTab组件watch和emits重复 + +fix: 修复样式优先级导致form表单labelPosition属性top失效 + +## 3.4.58(2025-07-22) +fix: 修复样式优先级影响grid宫格组件布局 + +## 3.4.57(2025-07-22) +feat: 新增title标题组件 + +## 3.4.56(2025-07-21) +fix: 去除多余hotCity参数 + +## 3.4.55(2025-07-21) +feat: 新增city-locate城市定位选择组件 + +feat: 优化index-list组件索引 + +## 3.4.54(2025-07-18) +feat: dropdown组件的highlight方法支持同时高亮多个菜单项 + +feat: 支持一次性全局加载icon字体 + +## 3.4.53(2025-07-18) +feat: dropdown组件的highlight方法支持同时高亮多个菜单项 感谢@keeplearning66 + +## 3.4.52(2025-07-16) +fix: 修复底部安全区域组件兼容性 + +## 3.4.51(2025-07-14) +fix: 修复u-slider在click后没有触发change事件 + +## 3.4.50(2025-07-13) +feat: subsection分段器添加禁用参数 + +## 3.4.49(2025-07-11) +feat: picker支持bgColor、round、duration和overlayOpacity属性 + +## 3.4.48(2025-07-10) +fix: 官方文档Card示例组件多行显示省略号样式异常 + +feat: album组件支持自定义preview事件 + +## 3.4.47(2025-07-09) +fix: 修复datetime-picker打开时,数值可能出现对不上的问题 + +feat: Subsection 分段器添加支持从 list中读取激活文字颜色和未激活文字颜色 + +fix: 修复modal定义confirmButton + +fix: safe-bottom底部安全距离在小程序优先用JS计算 + +feat: 新增tree树形组件 + +## 3.4.46(2025-07-08) +feat: 上传组件预览视频支持videoPreviewObjectFit参数 + +feat: td增加多个样式props + +fix: 修复noticeBar字号增大时文字遮挡 + +feat: 项目工程增加pinia + +## 3.4.45(2025-07-01) +fix: 修复picker-data组件缺少name + +fix: 优化picker高度单位 + +## 3.4.44(2025-06-30) +fix: 修复indexList中stikcy属性写死的问题(always true) + +feat: 搜索框添加新的右侧插槽 + +fix: 修复indexList中丢失的select event + +fix: 解决因为层级问题导致点击picker选择器无法正常弹出 + +## 3.4.43(2025-06-16) +feat: table2支持header插槽 + +## 3.4.42(2025-06-12) +fix: 修复qrcode中默认id问题及canvas2时App无法绘制二维码 感谢@jiaruiyan + +## 3.4.41(2025-06-11) +feat: qrcode支持 新参数useRootHeightAndWidth 是否使用根节点的宽高 感谢@YJR + +feat: toast支持设置zIndex层级 + + + +## 3.4.40(2025-06-06) +fix: 升级二维码 canvas -> canvas2 感谢@yjr + +## 3.4.39(2025-05-31) +fix: 修改步骤条微信小程序下的布局 感谢@jiaruiyan + +fix: u-tabs在屏幕尺寸发生变化时滑块位置没有发生变化 感谢@aqzhft + +fix: 鸿蒙平台不支持plus.runtime.openWeb 感谢@aqzhft + +## 3.4.38(2025-05-30) +fix: 修复picker-data快捷组件缺少index + +fix: 修复picker组件双向绑定初始化及取消后复原再次打开后的当前项目 + +## 3.4.37(2025-05-29) +feat: modal支持设置动画时间 + +fix: DatetimePicker v-model 绑定异步设置无效 (#803) + +## 3.4.36(2025-05-28) +fix: lazy-load图片为空时显示错误 + +## 3.4.35(2025-05-28) +feat: 进度条支持从右往左加载 + +## 3.4.34(2025-05-28) +feat: table2支持自定义标题和单元格样式 + +## 3.4.33(2025-05-27) +fix: 修复小程序cate-tab第一次切换时没反应 感谢@jiaruiyan + +fix: 修复datetimepicker传入空字符串时导致组件崩溃 感谢@jiaruiyan + +fix: 修复album带单位的字符串参与计算导致的计算数据错误 感谢@jiaruiyan + +## 3.4.32(2025-05-26) +feat: 增加状态栏独立颜色配置支持支付宝小程序状态栏对背景色识别的不友好的情况 + +fix: 抖音二维码兼容修复 + +feat: cate-tab组件增加rightTop插槽 #715 + +fix: 修改 test.promise(res) 预期结果不一致 + +## 3.4.31(2025-05-17) +fix: 修复parse富文本组件导致鸿蒙运行白屏 + +fix: 去除演示项目中uni.$u用法便于兼容鸿蒙 + +feat: modal新增popupBottom插槽适用类似关闭按钮与内容区域分离的场景 + +## 3.4.30(2025-05-16) +feat: 新增pagination分页器组件 + +feat: popup新增bottom插槽适用类似关闭按钮与内容区域分离的场景 + +## 3.4.29(2025-05-15) +fix: 修复table2横向滚动样式 + +fix: 修复table2组件宽度兼容 + +fix: 修复image显示png图片时默认背景色问题 + +feat: cate-tab新增height参数便于设置组件高度 + +feat: 在index.js种导出digit.js便于使用 + +fix: 修复tag组件缺失iconColor属性 + +fix: 优化index-list的setValueForTouch方法逻辑 #708 + +feat: number-box支持change事件返回变动是点击了增加还是减少按钮 + +fix: 修复table2在小程序下部分情形不显示表格 + +## 3.4.28(2025-05-12) +feat: 新增table表格组件 + +feat: 新增element-plus风格的table2组件 + +## 3.4.27(2025-05-06) +fix: 修复card组件props + +## 3.4.26(2025-05-06) +fix: 修复test工具引入 + +feat: card组件支持全局设置props默认值 + +fix: 修复image在加载错误情况下高度和宽度不正确问题 + +fix: 修复picker-data快捷组件默认picker选中 + +fix: 修复日历month子组件缺失emits定义 + +## 3.4.25(2025-04-27) +fix: up-form编译在微信小程序里样式缺失 #640 + +fix: number-box输入为空时自动设为最小值 + +feat: picker与datetimepicke组件hasInput模式支持inputProps属性 + +## 3.4.24(2025-04-25) +fix: 修复upload上传逻辑(感谢@semdy) + +## 3.4.23(2025-04-24) +chore: 补全chooseFile TS类型(感谢@semdy) + +feat: u-search组件的图标支持显示在右边(感谢@semdy) + +chore: 修正chooseFile返回的数据TS类型(感谢@semdy) + +fix: PR导致缺失name影响uplad自动上传扩展名 + + +## 3.4.22(2025-04-22) +fix: 修复自动上传偶发的success被覆盖为uploading + +fix: float-button缺少key #677 + +fix: upload组件完善优化(感谢@semdy) + +fix: toolbar组件confirmColor属性默认改为空,以便默认使用主题色、标题字体加粗(感谢@semdy) + +## 3.4.21(2025-04-21) +feat: subsection分段器支持双向绑定current + +feat: select组件支持maxHeight属性 + +feat: datetime-picker支持inputBorder属性 + +## 3.4.20(2025-04-17) +fix: 修复navbar-mini提示border不存在 + +feat: status-bar支持对外暴露状态栏高度值 + +feat: upload支持自定义自动上传后处理逻辑便于对接不同规范后端 + +feat: 优化tag组件插槽 + + +## 3.4.19(2025-04-14) +fix: 修复model组件增加contentStyle带来的语法问题 + +## 3.4.18(2025-04-14) +fix: upload组件支持所有文件类型的onClickPreview事件 + +## 3.4.17(2025-04-11) +feat: select组件text插槽增加scope传递currentLabel + +## 3.4.16(2025-04-10) +fix: 修复安卓新加载字体方式导致Cannot read property '$page' of undefined + +## 3.4.15(2025-04-10) +improvment: 优化移步加载数据时swiper组件displayMultipleItems报错 + +feat: modal增加contentStyle属性 + +fix: 修复下拉菜单收起动画缺失 + +fix: 修复sticky的offset属性值为响应式数据时失效 #237 + + +## 3.4.14(2025-04-09) +feat: 支持自托管内置图标及扩展自定义图标 + +## 3.4.13(2025-04-08) +fix: tabs点击当前tab触发change事件 + +## 3.4.12(2025-04-02) +fix: dropdown关闭后遮挡页面内容 #653 + +fix u-sticky.vue Uncaught TypeError: e.querySelector is not a function at uni-app-view.umd.js + +## 3.4.11(2025-03-31) +fix: 优化upload组件预览视频的弹窗占位 + +## 3.4.10(2025-03-28) +feat: select组件新增多个props属性及优化 + +fix: 修复cate-tab报错index is not defined #661 + + +## 3.4.9(2025-03-27) +fix: 修复upload组件split报错 + +fix: 修复float-button缺少flex样式 + +## 3.4.8(2025-03-27) +fix: 修复upload组件split报错 + +fix: 移除mapState + +## 3.4.7(2025-03-26) +fix: 修复action-sheet-data和picker-data数据回显 + +fix: 优化upload组件视频封面兼容 + +## 3.4.6(2025-03-25) +feat: checkbox触发change时携带name参数 + +feat: upload组件支持服务器本机和阿里云OSS自动上传功能及上传进度条 + +feat: upload组件支持视频预览及oss上传时获取视频封面图 + +feat: 新增up-action-sheet-data快捷组件 + +feat: 新增up-picker-data快捷组件 + +## 3.4.5(2025-03-24) +feat: tag组件新增textSize/height/padding/borderRadius属性 + +feat: 新增genLightColor自动计算浅色方法及tag组件支持autoBgColor自动计算背景色 + +## 3.4.4(2025-03-13) +feat: modal增加异步操作进行中点击取消弹出提示特性防止操作被中断 + +fix: 修复toast组件show方法类型声明 + +## 3.4.3(2025-03-12) +fix: 修复textarea自动增高时在输入时高度异常 + +## 3.4.2(2025-03-11) +feat: step组件增加title插槽及增加辅助class便于自定义样式 + +## 3.4.1(2025-03-11) +feat: 新机制确保setConfig与http在nvue等环境下生效 + +## 3.3.74(2025-03-06) +fix: CateTab语法问题 + +## 3.3.73(2025-03-06) +feat: CateTab新增v-model:current属性 + +## 3.3.72(2025-02-28) +feat: tabs组件支持icon图标及插槽 + +## 3.3.71(2025-02-27) +feat: 折叠面板collapse增加titileStyle/iconStyle/rightIconStyle属性 + +feat: 折叠面板组件新增cellCustomStyle/cellCustomClass属性 + +fix: select组件盒模型 + +## 3.3.70(2025-02-24) +fix: 修改u-checkbox-group组件changes事件发生位置 + +## 3.3.69(2025-02-19) +picker允许传递禁用颜色props + +slider组件isRange状态下增加min max插槽分开显示内容 + +feat: 新增经典下拉框组件up-select + +## 3.3.68(2025-02-12) +fix: 修复weekText类型 + +feat: 日历增加单选与多选指定禁止选中的日期功能 + +fix: NumberBox删除数字时取值有误 #613 + +## 3.3.67(2025-02-11) +feat: navbar支持返回全局拦截器配置 + +feat: 表单-校验-支持无提示-得到校验结果 + +feat: picker传递hasInput属性时候,可以禁用输入框点击 + +## 3.3.66(2025-02-09) +feat: steps-item增加content插槽 + +## 3.3.65(2025-02-05) +feat: number-box组件新增按钮圆角/按钮宽度/数据框背景色/迷你模式 +## 3.3.64(2025-01-18) +feat: 日历组件支持自定义星期文案 + +## 3.3.63(2025-01-13) +fix: cate-tab支持支付宝小程序 + +fix: textarea 修复 placeholder-style + +fix: 修复在图片加载及加载失败时容器宽度 + +fix: waterfall组件报错Maximum recursive updates + +## 3.3.62(2025-01-10) +feat: sleder滑动选择器双滑块增加外层触发值的变动功能 + +fix: picker支持hasInput优化 + +## 3.3.61(2024-12-31) +fix: 修复微信getSystemInfoSync接口废弃警告 + +fix: 'u-status-bar' symbol missing + +## 3.3.60(2024-12-30) +feat: 日期组件支持禁用 + +fix: ts定义修复 #600 + +feat: Tabs组件选中时增加一个active的class #595 + +## 3.3.59(2024-12-30) +fix: Property "isH5" was accessed during render + +## 3.3.58(2024-12-26) +fix: slider组件change事件传参 + +## 3.3.57(2024-12-23) +fix: slider组件change事件传参 + +feat: 更新u-picker组件增加当前选中class类名 + +## 3.3.56(2024-12-18) +feat: 在u-alert组件中添加关闭事件 + +## 3.3.55(2024-12-17) +add: swiper增加双向绑定 + +## 3.3.54(2024-12-11) +add: qrcode支持props控制是否开启点击预览 + +add: 新增cate-tab垂直分类组件 + +## 3.3.53(2024-12-10) +fix: 修复popup居中模式点击内容区域触发关闭 + +## 3.3.52(2024-12-09) +add: notice-bar支持justifyContent属性 + +## 3.3.51(2024-12-09) +add: radio增加label插槽 + +## 3.3.50(2024-12-05) +fix: 优化popup等对禁止背景滚动机制 + +add: slider在弹窗使用示例 + +fix: card组件类名问题 + +## 3.3.49(2024-12-02) +fix: 去除album多余的$u引用 + +fix: 优化图片组件兼容性 + +add: picker组件增加zIndex属性 + +add: text增加是否占满剩余空间属性 + +add: input颜色示例 + +## 3.3.48(2024-11-29) +add: 文本行数限制样式提高到10行 + +del: 去除不跨端的inputmode +## 3.3.47(2024-11-28) +fix: 时间选择器在hasInput模式下部分机型键盘弹出 + +## 3.3.46(2024-11-26) +fix: 修复text传递事件参数 + +## 3.3.45(2024-11-24) +add: navbar组件支持配置标题颜色 + +fix: 边框按钮警告类型下颜色变量使用错误 + +## 3.3.43(2024-11-18) +fix: 支持瀑布流组件v-model置为[] + +add: 新增字符串路径访问工具方法getValueByPath + +add: 新增float-button悬浮按钮组件 + +## 3.3.42(2024-11-15) +add: button组件支持stop参数阻止冒泡 + +## 3.3.41(2024-11-13) +fix: u-radio-group invalid import + +improvement: 优化图片组件宽高及修复事件event传递 + +## 3.3.40(2024-11-11) +add: 组件radioGroup增加gap属性用于设置item间隔 + +fix: 修复H5全局导入 + +## 3.3.39(2024-11-04) +fix: 修复相册组件 + +## 3.3.38(2024-11-04) +fix: 修复视频预览报错 #510 + +add: album组件增加stop参数支持阻止事件冒泡 + +## 3.3.37(2024-10-21) +fix: 修复因为修改组件名称前缀,导致h5打包后$parent方法内找不到父组件的问题 + +fix: 修复datetime-picker选择2000年以前日期出错 + +## 3.3.36(2024-10-09) +fix: toast 自动关闭 + +feat: 增加微信小程序用户昵称审核完毕回调及修改 ts 定义文件 + +## 3.3.35(2024-10-08) +feat: modal和picker支持v-model:show双向绑定 + +feat: 支持checkbox使用slot自定义label后自带点击事件 #522 + +feat: swipe-action支持自动关闭特性及初始化打开状态 + +## 3.3.34(2024-09-23) +feat: 支持toast设置duration值为-1时不自动关闭 + +## 3.3.33(2024-09-18) +fix: 修复test.date('008')等验证结果不准确 + +## 3.3.32(2024-09-09) +fix: u-keyboard名称冲突warning + +## 3.3.31(2024-08-31) +feat: qrcode初步支持nvue + +## 3.3.30(2024-08-30) +fix: slider兼容step为字符串类型 + +## 3.3.29(2024-08-30) +fix: 修复tabs组件current参数为字符串处理逻辑 + +## 3.3.28(2024-08-26) +fix: list组件滑动偏移量不一样取绝对值导致iOS下拉偏移量计算错误 + +## 3.3.27(2024-08-22) +fix: 修复up-datetime-picker组件toolbarRightSlot定义缺失 + +fix: 修复FormItem的rules更新错误的问题 + +## 3.3.26(2024-08-22) +fix: 批量注册全局组件优化 + +## 3.3.25(2024-08-21) +fix: 修复slider在app-vue下样式问题 + +## 3.3.24(2024-08-19) +fix: 修复时间选择器hasInput模式小程序不生效 + +feat: 支持H5导入所有组件 + +## 3.3.23(2024-08-17) +feat: swipe-action增加closeAll方法 + +fix: 兼容tabs在某些场景下index小于0时自动设置为0 + +add: 通用mixin新增navTo页面跳转方法 + +## 3.3.21(2024-08-15) +improvement: 优化二维码组件loading及支持预览与长按事件 #351 + +fix: 修复swipe-action自动关闭其它功能及组件卸载自动关闭 + +## 3.3.20(2024-08-15) +refactor: props默认值文件移至组件文件夹内便于查找 +## 3.3.19(2024-08-14) +fix: 修复2被rpx兼容处理只在数字值生效 + +add: 增加swiper自定义插槽示例 + +## 3.3.18(2024-08-13) +feat: 新增支持datetime-picker工具栏插槽及picker插槽支持修复 +## 3.3.17(2024-08-12) +feat: swiper组件增加默认slot便于自定义 + +feat: grid新增间隔参数 + +feat: picker新增toolbar-right和toolbar-bottom插槽 + +## 3.3.16(2024-08-12) +fix: 解决swiper中title换行后多余的内容未被遮挡问题 + +fix: 修复迷你导航适配异形屏 + +## 3.3.15(2024-08-09) +fix: 修复默认单位设置为rpx时一些组件高度间距异常 + +fix: 修复日历在rpx单位下布局异常 + +feat: code-input支持App端展示输入光标 + +## 3.3.14(2024-08-09) +add: 增加box组件 + +add: 增加card卡片组件 + + +## 3.3.13(2024-08-08) +feat: input支持调用原生组件的focus和blur方法 + +improvement: grid-item条件编译优化 + +add: 新增迷你导航组件 + +## 3.3.12(2024-08-06) +improvement: $u挂载时机调整便于打包分离chunk + +fix: steps新增itemStyle属性名称冲突 + +## 3.3.11(2024-08-05) +feat: 新增支持upload组件的deletable/maxCount/accept变更监听 #333 + +feat: 新增支持tabs在swiper中使用 + +feat: 新增FormItem支持独立设置验证规则rules + +fix: 修复index-list未设置$slots.header时索引高亮失效 + +## 3.3.10(2024-08-02) +fix: 修复index-list偶发的滑动最后一个索引报错top不存在 + +fix: 修复gird在QQ、抖音小程序下布局 + +feat: 优化step支持自定义样式prop + +feat: action-sheet组件支持v-model:show双向绑定 + +fix: 小程序下steps和grid都统一采用grid布局 + +fix: 修复支付宝小程序下input类型为数字时双向绑定失效 + +feat : form 表单 validate 校验不通过后 error增加字段prop信息 #304 + +fix: form组件异步校异常验问题 #393 + +## 3.3.9(2024-08-01) +fix: 优化获取nvue元素 + +feat: modal新增contentTextAlign设置文案对齐方式 + +fix: 修复NVUE下tabbar文字不显示 #458 + +feat: loading-page增加zIndex属性 + +fix: 相册在宽度较小时换行问题 + +feat: album相册增加自适应自动换行模式 + +feat: album相册增加图片尺寸单位prop + +fix: 修复calendar日历月份居中 + +## 3.3.8(2024-07-31) +feat: slider支持进度条任意位置触发按钮拖动 + +fix: 修复app-vue下modal标题不居中 + +fix: #459 TS setConfig 声明异常 + +feat: tabs组件增加longPress长按事件 + +feat: 新增showRight属性控制collapse右侧图标显隐 + +fix: 优化nvue下css警告 + +## 3.3.7(2024-07-29) +feat: 支持IndexList组件支持在弹窗等场景下使用及联动优化 + +feat: popup组件支持v-model:show双向绑定 + +feat: 优化tabs的current双向绑定 + +fix: checkbox独立使用时checked赋初始值可以,但是手动切换时值没有做双向绑定! #455 + +feat: slider组件支持区间双滑块 + +fix: toast 支持自定义图标?可传入了决对路径的 icon也没有用 #409 + +feat: form-item校验失败时 增加class方便自定义显示错误的展示方式 #394 + +fix: up-cell的required配置不生效 #395 + +fix: 横向滚动组件,微信小程序编译后会有警告 #415 + +fix: u-picker内部对默认值defaultIndex的监听 #425 + +feat: toast 组件支持遮掩层穿透 #417 + +fix: 兼容vue的slot编译bug #423 + +fix: upload 微信小程序 点击预览视频报错 #424 + +fix: u-number-box 组件修改【integer, decimalLength, min, max 】props时没有触发绑定值更新 #429 + +feat: Tabs组件能否支持自定义插槽 #439 + +feat: ActionSheet 可以配置最大高度吗, 我当做select使用了。 #445 + +fix: cursor-pointer优化 + +feat: 新版slider组件兼容NVUE改造 + +feat: 新增slider组件手动实现以支持样式自定义 + +perf:补充TS声明提示信息 + +修复:ActionSheet 操作菜单cancelText属性为空DOM节点还存在并且可以点击问题 + +fix: 去除预留的beforeDestroy兼容容易在某些sdk下不识别条件编译 + +## 3.3.6(2024-07-23) +feat: u-album组件添加radius,shape参数,定义参考当前u-image参数 + +fix: 修复了calendar组件title和日期title未垂直居中的问题 + +fix: update:modelValue缺失emit定义 + +## 3.3.5(2024-07-10) +picker组件支持hasInput模式 + +## 3.3.4(2024-07-07) +fix: input组件双向绑定问题 #419 + +lazy-load完善emit + +优化通用小程序分享 + +## 3.3.2(2024-06-27) +fix: 在Nvue环境中编译,出现大量警告 #406 +## 3.3.1(2024-06-27) +u-button组件报错,找不到button mixins #407 +## 3.3.0(2024-06-27) +feat: checkbox支持label设置slot + +feat: modal增加customClass + +feat: navbar、popup、tabs、text支持customClass + +fix: cell组建缺少flex布局 + +fix: 修复微信小程序真机调试时快速输入出现文本回退问题 + +feat: tag增加默认slot + +公共mixin改造为按需导入语法 + +refactor: 组件props混入mixin改造为按需导入语法 + +fix: u-tabbar 安卓手机点击按钮变蓝问题 #396 + +feat: upload组建增加extension属性 + +fix: upload组件参数mode添加left + +fix: 修复阴影在非nvue时白色背景色不显示 + +## 3.2.24(2024-06-11) +fix: 修复时间选择器confirm事件触发时机导致2次才会触发v-model更新 +## 3.2.23(2024-05-30) +fix: #378 H5 u-input 在表单中初始值为空也会触发一次 formValidate(this,"change")事件导致进入页面直接校验了一次 + +fix: #373 搜索组件up-search的@clear事件无效 + +fix: #372 ActionSheet 组件的取消按钮触发区域太小 + +## 3.2.22(2024-05-13) +上传组件支持微信小程序预览视频 + +修复折叠面板右侧箭头不显示 + +修复uxp2px + +## 3.2.21(2024-05-10) +fix: loading-icon修复flex布局 +## 3.2.20(2024-05-10) +修复瀑布流大小写#355 +## 3.2.19(2024-05-10) +去除意外的文件引入 +## 3.2.18(2024-05-09) +fix: 349 popup 组件设置 zIndex 属性后,组件渲染异常# +feat: 搜索框增加adjustPosition属性 +fix: #331增加u-action-sheet__cancel +优化mixin兼容性 +feat: #326 up-list增加下拉刷新功能 +fix: #319 优化up-tabs参数与定义匹配 +fix: index-list组件微信小程序端使用自定义导航栏异常 +fix: #285 pickerimmediateChange 写死为true +fix: #111 u-scroll-list组件,隐藏指示器后报错, 提示找不到ref +list增加微信小程序防抖配置 + +## 3.2.17(2024-05-08) +fix: 支付宝小程序二维码渲染 +## 3.2.16(2024-05-06) +修复tabs中,当前激活样式的undefined bug + +fix: #341u-code 倒计时没结束前退出,再次进入结束后退出界面,再次进入重新开始倒计时bug + +受到uni-app内置text样式影响修复 + +## 3.2.15(2024-04-28) +优化时间选择器hasInput模式初始化值 +## 3.2.14(2024-04-24) +去除pleaseSetTranspileDependencies + +http采用useStore + +## 3.2.13(2024-04-22) +修复modal标题样式 + +优化日期选择器hasInput模式宽度 + +## 3.2.12(2024-04-22) +修复color应用 +## 3.2.11(2024-04-18) +修复import化带来的问题 +## 3.2.10(2024-04-17) +完善input清空事件App端失效的兼容性 + +修复日历组件二次打开后当前月份显示不正确 + +## 3.2.9(2024-04-16) +组件内uni.$u用法改为import引入 + +规范化及兼容性增强 + +## 3.2.8(2024-04-15) +修复up-tag语法错 +## 3.2.7(2024-04-15) +修复下拉菜单背景色在支付宝小程序无效 + +setConfig改为浅拷贝解决无法用import导入代替uni.$u.props设置 + +## 3.2.6(2024-04-14) +修复某些情况下滑动单元格默认右侧按钮是展开的问题 +## 3.2.5(2024-04-13) +调整分段器尺寸及修复窗口大小改变时重新计算尺寸 + +多个组件支持cursor-pointer增强PC端体验 + +## 3.2.4(2024-04-12) +初步支持typescript +## 3.2.3(2024-04-12) +fix: 修复square属性在小程序下无效问题 + +fix:修复lastIndex异常导致的column异常问题 + +fix: alipayapp picker style + +feat(button): 添加用户同意隐私协议事件回调 + +fix: input switch password + +fix: 修复u-code组件keepRuning失效问题 + +feat: form-item添加labelPosition属性 + +新增dropdown组件 + +分段器支持内部current值 + +优化cell和action-sheet视觉大小 + +修复tabs文字换行 + +## 3.2.2(2024-04-11) +修复换行符问题 +## 3.2.1(2024-04-11) +修复演示H5二维码 + +fix: #270 ReadMore 展开阅读更多内容变化兼容 + +fix: #238Calendar组件maxDate修改为不能小于minDate + +checkbox支持独立使用 + +修复popup中在微信小程序中真机调试滚动失效 + +## 3.2.0(2024-04-10) +修复轮播图在nvue显示 +修复疑似u-slider名称被占用导致slider在App下不显示 +解决微信小程序提示 Some selectors are not allowed in component wxss +示例中u-前缀统一为up- +增加瀑布流与图片懒加载组件 +fix: #308修复tag组件缺失iconColor参数 +fix: #297使用grid布局解决目前编译为抖音小程序无法开启virtualHost +## 3.1.52(2024-04-07) +工具类方法调用import化改造 +新增up-copy复制组件 +## 3.1.51(2024-04-07) +优化时间选择器自带输入框格式化显示 +防止按钮文字换行 +修复订单列表模板滑动 +增加u-qrcode二维码组件 +## 3.1.49(2024-03-27) +日期时间组件支持自带输入框 +fix: popup弹窗滚动穿透问题 +fix: 修复小程序numberbox bug +## 3.1.48(2024-03-18) +fix:[plugin:uni:pre-css] Unbalanced delimiter found in string +## 3.1.47(2024-03-18) +fix: setConfig设置组件默认参数无效问题 +fix: 修复自定义图标无效问题 +feat: 增加u-form-item单独设置规则变量 +fix:#293小程序是自定义导航栏的时候即传了customNavHeight的时候会出现跳转偏移的情况 + +## 3.1.46(2024-01-29) +beforeUnmount +## 3.1.45(2024-01-24) +fix: #262ext组件为超链接的情况下size属性不生效 +fix: #263最新版本3.1.42中微信小程序u-swipe-action-item报错 +fix: #224最新版本3.1.42中微信小程序u-swipe-action-item报错 +fix: #263支持支付宝小程序 +fix: #261u-input在直接修改v-model的绑定值时,每隔一次会无法出发change事件 +优化折叠面板兼容微信小程序 +## 3.1.42(2024-01-15) +修复u-number-box默认值0时在小程序不显示值 +优化u-code的timer判断 +优化支付宝小程序下textarea字数统计兼容 +优化u-calendar +## 3.1.41(2023-11-18) +#215优化u-cell图标容器间距问题 +## 3.1.40(2023-11-16) +修复u-slider双向绑定 +## 3.1.39(2023-11-10) +修复头条小程序不支持env(safe-area-inset-bottom) +优化#201u-grid 指定列数导致闪烁 +#193IndexList 索引列表 高度错误 +其他优化 +## 3.1.38(2023-10-08) +修复u-slider +## 3.1.37(2023-09-13) +完善emits定义及修复code-input双向数据绑定 +## 3.1.36(2023-08-08) +修复富文本事件名称大小写 +## 3.1.35(2023-08-02) +修复编译到支付宝小程序u-form报错 +## 3.1.34(2023-07-27) +修复App打包uni.$u.mpMixin方式sdk暂时不支持导致报错 +## 3.1.33(2023-07-13) +修复弹窗进入动画、模板页面样式等 +## 3.1.31(2023-07-11) +修复dayjs引用 +## 3.0.8(2022-07-12) +修复u-tag默认宽度撑满容器 +## 3.0.7(2022-07-12) +修复u-navbar自定义插槽演示示例 +## 3.0.6(2022-07-11) +修复u-image缺少emits申明 +## 3.0.5(2022-07-11) +修复u-upload缺少emits申明 +## 3.0.4(2022-07-10) +修复u-textarea/u-input/u-datetime-picker/u-number-box/u-radio-group/u-switch/u-rate在vue3下数据绑定 +## 3.0.3(2022-07-09) +启用自建演示二维码 +## 3.0.2(2022-07-09) +修复dayjs/clipboard等导致打包报错 +## 3.0.1(2022-07-09) +增加插件市场地址 +## 3.0.0(2022-07-09) +# uview-plus(vue3)初步发布 diff --git a/uni_modules/uview-plus/components/u-action-sheet-data/u-action-sheet-data.vue b/uni_modules/uview-plus/components/u-action-sheet-data/u-action-sheet-data.vue new file mode 100644 index 0000000..234d5cf --- /dev/null +++ b/uni_modules/uview-plus/components/u-action-sheet-data/u-action-sheet-data.vue @@ -0,0 +1,109 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uview-plus/components/u-action-sheet/actionSheet.js b/uni_modules/uview-plus/components/u-action-sheet/actionSheet.js new file mode 100644 index 0000000..6cb1e48 --- /dev/null +++ b/uni_modules/uview-plus/components/u-action-sheet/actionSheet.js @@ -0,0 +1,26 @@ +/* + * @Author : LQ + * @Description : + * @version : 3.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : jry + * @lastTime : 2025-08-16 10:52:35 + * @FilePath : /uview-plus/libs/config/props/actionSheet.js + */ +export default { + // action-sheet组件 + actionSheet: { + show: false, + title: '', + description: '', + actions: [], + index: '', + cancelText: '', + closeOnClickAction: true, + safeAreaInsetBottom: true, + openType: '', + closeOnClickOverlay: true, + round: 0, + wrapMaxHeight: '600px' + } +} diff --git a/uni_modules/uview-plus/components/u-action-sheet/props.js b/uni_modules/uview-plus/components/u-action-sheet/props.js new file mode 100644 index 0000000..408f32f --- /dev/null +++ b/uni_modules/uview-plus/components/u-action-sheet/props.js @@ -0,0 +1,70 @@ +/* + * @Author : LQ + * @Description : + * @version : 3.0 + * @LastAuthor : jry + * @lastTime : 2025-08-16 10:52:35 + * @FilePath : /uview-plus/libs/config/props/props.js + */ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + // 操作菜单是否展示 (默认false) + show: { + type: Boolean, + default: () => defProps.actionSheet.show + }, + // 标题 + title: { + type: String, + default: () => defProps.actionSheet.title + }, + // 选项上方的描述信息 + description: { + type: String, + default: () => defProps.actionSheet.description + }, + // 数据 + actions: { + type: Array, + default: () => defProps.actionSheet.actions + }, + // 取消按钮的文字,不为空时显示按钮 + cancelText: { + type: String, + default: () => defProps.actionSheet.cancelText + }, + // 点击某个菜单项时是否关闭弹窗 + closeOnClickAction: { + type: Boolean, + default: () => defProps.actionSheet.closeOnClickAction + }, + // 处理底部安全区(默认true) + safeAreaInsetBottom: { + type: Boolean, + default: () => defProps.actionSheet.safeAreaInsetBottom + }, + // 小程序的打开方式 + openType: { + type: String, + default: () => defProps.actionSheet.openType + }, + // 点击遮罩是否允许关闭 (默认true) + closeOnClickOverlay: { + type: Boolean, + default: () => defProps.actionSheet.closeOnClickOverlay + }, + // 圆角值 + round: { + type: [Boolean, String, Number], + default: () => defProps.actionSheet.round + }, + // 选项区域最大高度 + wrapMaxHeight: { + type: [String], + default: () => defProps.actionSheet.wrapMaxHeight + }, + } +}) diff --git a/uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue b/uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue new file mode 100644 index 0000000..c2bc007 --- /dev/null +++ b/uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue @@ -0,0 +1,291 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uview-plus/components/u-agreement/u-agreement.vue b/uni_modules/uview-plus/components/u-agreement/u-agreement.vue new file mode 100644 index 0000000..438c467 --- /dev/null +++ b/uni_modules/uview-plus/components/u-agreement/u-agreement.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-album/album.js b/uni_modules/uview-plus/components/u-album/album.js new file mode 100644 index 0000000..24f8eaa --- /dev/null +++ b/uni_modules/uview-plus/components/u-album/album.js @@ -0,0 +1,28 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : jry + * @lastTime : 2025-08-16 16:32:24 + * @FilePath : /uview-plus/libs/config/props/album.js + */ +export default { + // album 组件 + album: { + urls: [], + keyName: '', + singleSize: 180, + multipleSize: 70, + space: 6, + singleMode: 'scaleToFill', + multipleMode: 'aspectFill', + maxCount: 9, + previewFullImage: true, + rowCount: 3, + showMore: true, + autoWrap: false, + unit: 'px', + stop: true, + } +} diff --git a/uni_modules/uview-plus/components/u-album/props.js b/uni_modules/uview-plus/components/u-album/props.js new file mode 100644 index 0000000..a8d5474 --- /dev/null +++ b/uni_modules/uview-plus/components/u-album/props.js @@ -0,0 +1,95 @@ +/* + * @Author : jry + * @Description : + * @version : 3.0 + * @LastAuthor : jry + * @lastTime : 2025-08-16 16:35:24 + * @FilePath : /uview-plus/components/u-album/props.js + */ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + // 图片地址,Array|Array形式 + urls: { + type: Array, + default: () => defProps.album.urls + }, + // 指定从数组的对象元素中读取哪个属性作为图片地址 + keyName: { + type: String, + default: () => defProps.album.keyName + }, + // 单图时,图片长边的长度 + singleSize: { + type: [String, Number], + default: () => defProps.album.singleSize + }, + // 多图时,图片边长 + multipleSize: { + type: [String, Number], + default: () => defProps.album.multipleSize + }, + // 多图时,图片水平和垂直之间的间隔 + space: { + type: [String, Number], + default: () => defProps.album.space + }, + // 单图时,图片缩放裁剪的模式 + singleMode: { + type: String, + default: () => defProps.album.singleMode + }, + // 多图时,图片缩放裁剪的模式 + multipleMode: { + type: String, + default: () => defProps.album.multipleMode + }, + // 最多展示的图片数量,超出时最后一个位置将会显示剩余图片数量 + maxCount: { + type: [String, Number], + default: () => defProps.album.maxCount + }, + // 是否可以预览图片 + previewFullImage: { + type: Boolean, + default: () => defProps.album.previewFullImage + }, + // 每行展示图片数量,如设置,singleSize和multipleSize将会无效 + rowCount: { + type: [String, Number], + default: () => defProps.album.rowCount + }, + // 超出maxCount时是否显示查看更多的提示 + showMore: { + type: Boolean, + default: () => defProps.album.showMore + }, + // 图片形状,circle-圆形,square-方形 + shape: { + type: String, + default: () => defProps.image.shape + }, + // 圆角,单位任意 + radius: { + type: [String, Number], + default: () => defProps.image.radius + }, + // 自适应换行 + autoWrap: { + type: Boolean, + default: () => defProps.album.autoWrap + }, + // 单位 + unit: { + type: [String], + default: () => defProps.album.unit + }, + // 阻止点击冒泡 + stop: { + type: Boolean, + default: () => defProps.album.stop + } + } +}) diff --git a/uni_modules/uview-plus/components/u-album/u-album.vue b/uni_modules/uview-plus/components/u-album/u-album.vue new file mode 100644 index 0000000..f9d79d1 --- /dev/null +++ b/uni_modules/uview-plus/components/u-album/u-album.vue @@ -0,0 +1,344 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uview-plus/components/u-alert/alert.js b/uni_modules/uview-plus/components/u-alert/alert.js new file mode 100644 index 0000000..fb543c0 --- /dev/null +++ b/uni_modules/uview-plus/components/u-alert/alert.js @@ -0,0 +1,26 @@ +/* + * @Author : LQ + * @Description : + * @version : 3.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : jry + * @lastTime : 2025-08-17 17:23:53 + * @FilePath : /uview-plus/libs/config/props/alert.js + */ +export default { + // alert警告组件 + alert: { + title: '', + type: 'warning', + description: '', + closable: false, + showIcon: false, + effect: 'light', + center: false, + fontSize: 14, + transitionMode: 'fade', + duration: 0, + icon: '', + value: true + } +} diff --git a/uni_modules/uview-plus/components/u-alert/props.js b/uni_modules/uview-plus/components/u-alert/props.js new file mode 100644 index 0000000..acf450e --- /dev/null +++ b/uni_modules/uview-plus/components/u-alert/props.js @@ -0,0 +1,75 @@ +/* + * @Author : jry + * @Description : + * @version : 3.0 + * @LastAuthor : jry + * @lastTime : 2025-08-17 17:23:53 + * @FilePath : /uview-plus/libs/config/props/props.js + */ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + // 显示文字 + title: { + type: String, + default: () => defProps.alert.title + }, + // 主题,success/warning/info/error + type: { + type: String, + default: () => defProps.alert.type + }, + // 辅助性文字 + description: { + type: String, + default: () => defProps.alert.description + }, + // 是否可关闭 + closable: { + type: Boolean, + default: () => defProps.alert.closable + }, + // 是否显示图标 + showIcon: { + type: Boolean, + default: () => defProps.alert.showIcon + }, + // 浅或深色调,light-浅色,dark-深色 + effect: { + type: String, + default: () => defProps.alert.effect + }, + // 文字是否居中 + center: { + type: Boolean, + default: () => defProps.alert.center + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: () => defProps.alert.fontSize + }, + // 动画类型 + transitionMode: { + type: [String], + default: () => defProps.alert.transitionMode + }, + // 自动定时关闭毫秒 + duration: { + type: [Number], + default: () => defProps.alert.duration + }, + // 自定义图标 + icon: { + type: [String], + default: () => defProps.alert.icon + }, + // 是否显示 + modelValue: { + type: [String], + default: () => defProps.alert.value + } + } +}) diff --git a/uni_modules/uview-plus/components/u-alert/u-alert.vue b/uni_modules/uview-plus/components/u-alert/u-alert.vue new file mode 100644 index 0000000..553c52f --- /dev/null +++ b/uni_modules/uview-plus/components/u-alert/u-alert.vue @@ -0,0 +1,293 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-avatar-group/avatarGroup.js b/uni_modules/uview-plus/components/u-avatar-group/avatarGroup.js new file mode 100644 index 0000000..29ad008 --- /dev/null +++ b/uni_modules/uview-plus/components/u-avatar-group/avatarGroup.js @@ -0,0 +1,23 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:49:55 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/avatarGroup.js + */ +export default { + // avatarGroup 组件 + avatarGroup: { + urls: [], + maxCount: 5, + shape: 'circle', + mode: 'scaleToFill', + showMore: true, + size: 40, + keyName: '', + gap: 0.5, + extraValue: 0 + } +} diff --git a/uni_modules/uview-plus/components/u-avatar-group/props.js b/uni_modules/uview-plus/components/u-avatar-group/props.js new file mode 100644 index 0000000..96ed871 --- /dev/null +++ b/uni_modules/uview-plus/components/u-avatar-group/props.js @@ -0,0 +1,54 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 头像图片组 + urls: { + type: Array, + default: () => defProps.avatarGroup.urls + }, + // 最多展示的头像数量 + maxCount: { + type: [String, Number], + default: () => defProps.avatarGroup.maxCount + }, + // 头像形状 + shape: { + type: String, + default: () => defProps.avatarGroup.shape + }, + // 图片裁剪模式 + mode: { + type: String, + default: () => defProps.avatarGroup.mode + }, + // 超出maxCount时是否显示查看更多的提示 + showMore: { + type: Boolean, + default: () => defProps.avatarGroup.showMore + }, + // 头像大小 + size: { + type: [String, Number], + default: () => defProps.avatarGroup.size + }, + // 指定从数组的对象元素中读取哪个属性作为图片地址 + keyName: { + type: String, + default: () => defProps.avatarGroup.keyName + }, + // 头像之间的遮挡比例 + gap: { + type: [String, Number], + validator(value) { + return value >= 0 && value <= 1 + }, + default: () => defProps.avatarGroup.gap + }, + // 需额外显示的值 + extraValue: { + type: [Number, String], + default: () => defProps.avatarGroup.extraValue + } + } +}) diff --git a/uni_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue b/uni_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue new file mode 100644 index 0000000..67d1576 --- /dev/null +++ b/uni_modules/uview-plus/components/u-avatar-group/u-avatar-group.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-avatar/avatar.js b/uni_modules/uview-plus/components/u-avatar/avatar.js new file mode 100644 index 0000000..c097d4e --- /dev/null +++ b/uni_modules/uview-plus/components/u-avatar/avatar.js @@ -0,0 +1,28 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:49:22 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/avatar.js + */ +export default { + // avatar 组件 + avatar: { + src: '', + shape: 'circle', + size: 40, + mode: 'scaleToFill', + text: '', + bgColor: '#c0c4cc', + color: '#ffffff', + fontSize: 18, + icon: '', + mpAvatar: false, + randomBgColor: false, + defaultUrl: '', + colorIndex: '', + name: '' + } +} diff --git a/uni_modules/uview-plus/components/u-avatar/props.js b/uni_modules/uview-plus/components/u-avatar/props.js new file mode 100644 index 0000000..8fa15ac --- /dev/null +++ b/uni_modules/uview-plus/components/u-avatar/props.js @@ -0,0 +1,81 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +import test from '../../libs/function/test'; +export const props = defineMixin({ + props: { + // 头像图片路径(不能为相对路径) + src: { + type: String, + default: () => defProps.avatar.src + }, + // 头像形状,circle-圆形,square-方形 + shape: { + type: String, + default: () => defProps.avatar.shape + }, + // 头像尺寸 + size: { + type: [String, Number], + default: () => defProps.avatar.size + }, + // 裁剪模式 + mode: { + type: String, + default: () => defProps.avatar.mode + }, + // 显示的文字 + text: { + type: String, + default: () => defProps.avatar.text + }, + // 背景色 + bgColor: { + type: String, + default: () => defProps.avatar.bgColor + }, + // 文字颜色 + color: { + type: String, + default: () => defProps.avatar.color + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: () => defProps.avatar.fontSize + }, + // 显示的图标 + icon: { + type: String, + default: () => defProps.avatar.icon + }, + // 显示小程序头像,只对百度,微信,QQ小程序有效 + mpAvatar: { + type: Boolean, + default: () => defProps.avatar.mpAvatar + }, + // 是否使用随机背景色 + randomBgColor: { + type: Boolean, + default: () => defProps.avatar.randomBgColor + }, + // 加载失败的默认头像(组件有内置默认图片) + defaultUrl: { + type: String, + default: () => defProps.avatar.defaultUrl + }, + // 如果配置了randomBgColor为true,且配置了此值,则从默认的背景色数组中取出对应索引的颜色值,取值0-19之间 + colorIndex: { + type: [String, Number], + // 校验参数规则,索引在0-19之间 + validator(n) { + return test.range(n, [0, 19]) || n === '' + }, + default: () => defProps.avatar.colorIndex + }, + // 组件标识符 + name: { + type: String, + default: () => defProps.avatar.name + } + } +}) diff --git a/uni_modules/uview-plus/components/u-avatar/u-avatar.vue b/uni_modules/uview-plus/components/u-avatar/u-avatar.vue new file mode 100644 index 0000000..831f51e --- /dev/null +++ b/uni_modules/uview-plus/components/u-avatar/u-avatar.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-back-top/backtop.js b/uni_modules/uview-plus/components/u-back-top/backtop.js new file mode 100644 index 0000000..13052ab --- /dev/null +++ b/uni_modules/uview-plus/components/u-back-top/backtop.js @@ -0,0 +1,27 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:50:18 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/backtop.js + */ +export default { + // backtop组件 + backtop: { + mode: 'circle', + icon: 'arrow-upward', + text: '', + duration: 100, + scrollTop: 0, + top: 400, + bottom: 100, + right: 20, + zIndex: 9, + iconStyle: { + color: '#909399', + fontSize: '19px' + } + } +} diff --git a/uni_modules/uview-plus/components/u-back-top/props.js b/uni_modules/uview-plus/components/u-back-top/props.js new file mode 100644 index 0000000..b714641 --- /dev/null +++ b/uni_modules/uview-plus/components/u-back-top/props.js @@ -0,0 +1,56 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 返回顶部的形状,circle-圆形,square-方形 + mode: { + type: String, + default: () => defProps.backtop.mode + }, + // 自定义图标 + icon: { + type: String, + default: () => defProps.backtop.icon + }, + // 提示文字 + text: { + type: String, + default: () => defProps.backtop.text + }, + // 返回顶部滚动时间 + duration: { + type: [String, Number], + default: () => defProps.backtop.duration + }, + // 滚动距离 + scrollTop: { + type: [String, Number], + default: () => defProps.backtop.scrollTop + }, + // 距离顶部多少距离显示,单位px + top: { + type: [String, Number], + default: () => defProps.backtop.top + }, + // 返回顶部按钮到底部的距离,单位px + bottom: { + type: [String, Number], + default: () => defProps.backtop.bottom + }, + // 返回顶部按钮到右边的距离,单位px + right: { + type: [String, Number], + default: () => defProps.backtop.right + }, + // 层级 + zIndex: { + type: [String, Number], + default: () => defProps.backtop.zIndex + }, + // 图标的样式,对象形式 + iconStyle: { + type: Object, + default: () => defProps.backtop.iconStyle + } + } +}) diff --git a/uni_modules/uview-plus/components/u-back-top/u-back-top.vue b/uni_modules/uview-plus/components/u-back-top/u-back-top.vue new file mode 100644 index 0000000..d9d8b52 --- /dev/null +++ b/uni_modules/uview-plus/components/u-back-top/u-back-top.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-badge/badge.js b/uni_modules/uview-plus/components/u-badge/badge.js new file mode 100644 index 0000000..8818f98 --- /dev/null +++ b/uni_modules/uview-plus/components/u-badge/badge.js @@ -0,0 +1,27 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-23 19:51:50 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/badge.js + */ +export default { + // 徽标数组件 + badge: { + isDot: false, + value: '', + show: true, + max: 999, + type: 'error', + showZero: false, + bgColor: null, + color: null, + shape: 'circle', + numberType: 'overflow', + offset: [], + inverted: false, + absolute: false + } +} diff --git a/uni_modules/uview-plus/components/u-badge/props.js b/uni_modules/uview-plus/components/u-badge/props.js new file mode 100644 index 0000000..5ed924b --- /dev/null +++ b/uni_modules/uview-plus/components/u-badge/props.js @@ -0,0 +1,79 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 是否显示圆点 + isDot: { + type: Boolean, + default: () => defProps.badge.isDot + }, + // 显示的内容 + value: { + type: [Number, String], + default: () => defProps.badge.value + }, + // 显示的内容 + modelValue: { + type: [Number, String], + default: () => defProps.badge.modelValue + }, + // 是否显示 + show: { + type: Boolean, + default: () => defProps.badge.show + }, + // 最大值,超过最大值会显示 '{max}+' + max: { + type: [Number, String], + default: () => defProps.badge.max + }, + // 主题类型,error|warning|success|primary + type: { + type: String, + default: () => defProps.badge.type + }, + // 当数值为 0 时,是否展示 Badge + showZero: { + type: Boolean, + default: () => defProps.badge.showZero + }, + // 背景颜色,优先级比type高,如设置,type参数会失效 + bgColor: { + type: [String, null], + default: () => defProps.badge.bgColor + }, + // 字体颜色 + color: { + type: [String, null], + default: () => defProps.badge.color + }, + // 徽标形状,circle-四角均为圆角,horn-左下角为直角 + shape: { + type: String, + default: () => defProps.badge.shape + }, + // 设置数字的显示方式,overflow|ellipsis|limit + // overflow会根据max字段判断,超出显示`${max}+` + // ellipsis会根据max判断,超出显示`${max}...` + // limit会依据1000作为判断条件,超出1000,显示`${value/1000}K`,比如2.2k、3.34w,最多保留2位小数 + numberType: { + type: String, + default: () => defProps.badge.numberType + }, + // 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,absolute为true时有效 + offset: { + type: Array, + default: () => defProps.badge.offset + }, + // 是否反转背景和字体颜色 + inverted: { + type: Boolean, + default: () => defProps.badge.inverted + }, + // 是否绝对定位 + absolute: { + type: Boolean, + default: () => defProps.badge.absolute + } + } +}) diff --git a/uni_modules/uview-plus/components/u-badge/u-badge.vue b/uni_modules/uview-plus/components/u-badge/u-badge.vue new file mode 100644 index 0000000..6e03954 --- /dev/null +++ b/uni_modules/uview-plus/components/u-badge/u-badge.vue @@ -0,0 +1,176 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-barcode/u-barcode.vue b/uni_modules/uview-plus/components/u-barcode/u-barcode.vue new file mode 100644 index 0000000..3a55ec8 --- /dev/null +++ b/uni_modules/uview-plus/components/u-barcode/u-barcode.vue @@ -0,0 +1,1048 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-box/props.js b/uni_modules/uview-plus/components/u-box/props.js new file mode 100644 index 0000000..cfe75e4 --- /dev/null +++ b/uni_modules/uview-plus/components/u-box/props.js @@ -0,0 +1,27 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const propsBox = defineMixin({ + props: { + // 背景色 + bgColors: { + type: [Array], + default: ['#EEFCFF', '#FCF8FF', '#FDF8F2'] + }, + // 高度 + height: { + type: [String], + default: "160px" + }, + // 圆角 + borderRadius: { + type: [String], + default: "6px" + }, + // 间隔 + gap: { + type: [String], + default: "15px" + }, + } +}) diff --git a/uni_modules/uview-plus/components/u-box/u-box.vue b/uni_modules/uview-plus/components/u-box/u-box.vue new file mode 100644 index 0000000..8ad979a --- /dev/null +++ b/uni_modules/uview-plus/components/u-box/u-box.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-button/button.js b/uni_modules/uview-plus/components/u-button/button.js new file mode 100644 index 0000000..4519ff8 --- /dev/null +++ b/uni_modules/uview-plus/components/u-button/button.js @@ -0,0 +1,43 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:51:27 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/button.js + */ +export default { + // button组件 + button: { + hairline: false, + type: 'info', + size: 'normal', + shape: 'square', + plain: false, + disabled: false, + loading: false, + loadingText: '', + loadingMode: 'spinner', + loadingSize: 15, + openType: '', + formType: '', + appParameter: '', + hoverStopPropagation: true, + lang: 'en', + sessionFrom: '', + sendMessageTitle: '', + sendMessagePath: '', + sendMessageImg: '', + showMessageCard: false, + dataName: '', + throttleTime: 0, + hoverStartTime: 0, + hoverStayTime: 200, + text: '', + icon: '', + iconColor: '', + color: '', + stop: true, + } +} diff --git a/uni_modules/uview-plus/components/u-button/nvue.scss b/uni_modules/uview-plus/components/u-button/nvue.scss new file mode 100644 index 0000000..490db7d --- /dev/null +++ b/uni_modules/uview-plus/components/u-button/nvue.scss @@ -0,0 +1,46 @@ +$u-button-active-opacity:0.75 !default; +$u-button-loading-text-margin-left:4px !default; +$u-button-text-color: #FFFFFF !default; +$u-button-text-plain-error-color:$u-error !default; +$u-button-text-plain-warning-color:$u-warning !default; +$u-button-text-plain-success-color:$u-success !default; +$u-button-text-plain-info-color:$u-info !default; +$u-button-text-plain-primary-color:$u-primary !default; +.u-button { + &--active { + opacity: $u-button-active-opacity; + } + + &--active--plain { + background-color: rgb(217, 217, 217); + } + + &__loading-text { + margin-left:$u-button-loading-text-margin-left; + } + + &__text, + &__loading-text { + color:$u-button-text-color; + } + + &__text--plain--error { + color:$u-button-text-plain-error-color; + } + + &__text--plain--warning { + color:$u-button-text-plain-warning-color; + } + + &__text--plain--success{ + color:$u-button-text-plain-success-color; + } + + &__text--plain--info { + color:$u-button-text-plain-info-color; + } + + &__text--plain--primary { + color:$u-button-text-plain-primary-color; + } +} \ No newline at end of file diff --git a/uni_modules/uview-plus/components/u-button/props.js b/uni_modules/uview-plus/components/u-button/props.js new file mode 100644 index 0000000..c42d019 --- /dev/null +++ b/uni_modules/uview-plus/components/u-button/props.js @@ -0,0 +1,159 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 是否细边框 + hairline: { + type: Boolean, + default: () => defProps.button.hairline + }, + // 按钮的预置样式,info,primary,error,warning,success + type: { + type: String, + default: () => defProps.button.type + }, + // 按钮尺寸,large,normal,small,mini + size: { + type: String, + default: () => defProps.button.size + }, + // 按钮形状,circle(两边为半圆),square(带圆角) + shape: { + type: String, + default: () => defProps.button.shape + }, + // 按钮是否镂空 + plain: { + type: Boolean, + default: () => defProps.button.plain + }, + // 是否禁止状态 + disabled: { + type: Boolean, + default: () => defProps.button.disabled + }, + // 是否加载中 + loading: { + type: Boolean, + default: () => defProps.button.loading + }, + // 加载中提示文字 + loadingText: { + type: [String, Number], + default: () => defProps.button.loadingText + }, + // 加载状态图标类型 + loadingMode: { + type: String, + default: () => defProps.button.loadingMode + }, + // 加载图标大小 + loadingSize: { + type: [String, Number], + default: () => defProps.button.loadingSize + }, + // 开放能力,具体请看uniapp稳定关于button组件部分说明 + // https://uniapp.dcloud.io/component/button + openType: { + type: String, + default: () => defProps.button.openType + }, + // 用于
组件,点击分别会触发 组件的 submit/reset 事件 + // 取值为submit(提交表单),reset(重置表单) + formType: { + type: String, + default: () => defProps.button.formType + }, + // 打开 APP 时,向 APP 传递的参数,open-type=launchApp时有效 + // 只微信小程序、QQ小程序有效 + appParameter: { + type: String, + default: () => defProps.button.appParameter + }, + // 指定是否阻止本节点的祖先节点出现点击态,微信小程序有效 + hoverStopPropagation: { + type: Boolean, + default: () => defProps.button.hoverStopPropagation + }, + // 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。只微信小程序有效 + lang: { + type: String, + default: () => defProps.button.lang + }, + // 会话来源,open-type="contact"时有效。只微信小程序有效 + sessionFrom: { + type: String, + default: () => defProps.button.sessionFrom + }, + // 会话内消息卡片标题,open-type="contact"时有效 + // 默认当前标题,只微信小程序有效 + sendMessageTitle: { + type: String, + default: () => defProps.button.sendMessageTitle + }, + // 会话内消息卡片点击跳转小程序路径,open-type="contact"时有效 + // 默认当前分享路径,只微信小程序有效 + sendMessagePath: { + type: String, + default: () => defProps.button.sendMessagePath + }, + // 会话内消息卡片图片,open-type="contact"时有效 + // 默认当前页面截图,只微信小程序有效 + sendMessageImg: { + type: String, + default: () => defProps.button.sendMessageImg + }, + // 是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示, + // 用户点击后可以快速发送小程序消息,open-type="contact"时有效 + showMessageCard: { + type: Boolean, + default: () => defProps.button.showMessageCard + }, + // 额外传参参数,用于小程序的data-xxx属性,通过target.dataset.name获取 + dataName: { + type: String, + default: () => defProps.button.dataName + }, + // 节流,一定时间内只能触发一次 + throttleTime: { + type: [String, Number], + default: () => defProps.button.throttleTime + }, + // 按住后多久出现点击态,单位毫秒 + hoverStartTime: { + type: [String, Number], + default: () => defProps.button.hoverStartTime + }, + // 手指松开后点击态保留时间,单位毫秒 + hoverStayTime: { + type: [String, Number], + default: () => defProps.button.hoverStayTime + }, + // 按钮文字,之所以通过props传入,是因为slot传入的话 + // nvue中无法控制文字的样式 + text: { + type: [String, Number], + default: () => defProps.button.text + }, + // 按钮图标 + icon: { + type: String, + default: () => defProps.button.icon + }, + // 按钮图标 + iconColor: { + type: String, + default: () => defProps.button.icon + }, + // 按钮颜色,支持传入linear-gradient渐变色 + color: { + type: String, + default: () => defProps.button.color + }, + // 停止冒泡 + stop: { + type: Boolean, + default: () => defProps.button.stop + }, + } +}) diff --git a/uni_modules/uview-plus/components/u-button/u-button.vue b/uni_modules/uview-plus/components/u-button/u-button.vue new file mode 100644 index 0000000..b1e3c0a --- /dev/null +++ b/uni_modules/uview-plus/components/u-button/u-button.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-button/vue.scss b/uni_modules/uview-plus/components/u-button/vue.scss new file mode 100644 index 0000000..35fe999 --- /dev/null +++ b/uni_modules/uview-plus/components/u-button/vue.scss @@ -0,0 +1,81 @@ +// nvue下hover-class无效 +$u-button-before-top:50% !default; +$u-button-before-left:50% !default; +$u-button-before-width:100% !default; +$u-button-before-height:100% !default; +$u-button-before-transform:translate(-50%, -50%) !default; +$u-button-before-opacity:0 !default; +$u-button-before-background-color:#000 !default; +$u-button-before-border-color:#000 !default; +$u-button-active-before-opacity:.15 !default; +$u-button-icon-margin-left:4px !default; +$u-button-plain-u-button-info-color:$u-info; +$u-button-plain-u-button-success-color:$u-success; +$u-button-plain-u-button-error-color:$u-error; +$u-button-plain-u-button-warning-color:$u-warning; + +.u-button { + width: 100%; + white-space: nowrap; + + &__text { + white-space: nowrap; + line-height: 1; + } + + &:before { + position: absolute; + top:$u-button-before-top; + left:$u-button-before-left; + width:$u-button-before-width; + height:$u-button-before-height; + border: inherit; + border-radius: inherit; + transform:$u-button-before-transform; + opacity:$u-button-before-opacity; + content: " "; + background-color:$u-button-before-background-color; + border-color:$u-button-before-border-color; + } + + &--active { + &:before { + opacity: .15 + } + } + + &__icon+&__text:not(:empty), + &__loading-text { + margin-left:$u-button-icon-margin-left; + } + + &--plain { + &.u-button--primary { + color: $u-primary; + } + } + + &--plain { + &.u-button--info { + color:$u-button-plain-u-button-info-color; + } + } + + &--plain { + &.u-button--success { + color:$u-button-plain-u-button-success-color; + } + } + + &--plain { + &.u-button--error { + color:$u-button-plain-u-button-error-color; + } + } + + &--plain { + &.u-button--warning { + color:$u-button-plain-u-button-warning-color; + } + } +} diff --git a/uni_modules/uview-plus/components/u-calendar/calendar.js b/uni_modules/uview-plus/components/u-calendar/calendar.js new file mode 100644 index 0000000..f0fb3bb --- /dev/null +++ b/uni_modules/uview-plus/components/u-calendar/calendar.js @@ -0,0 +1,45 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:52:43 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/calendar.js + */ +export default { + // calendar 组件 + calendar: { + title: '日期选择', + showTitle: true, + showSubtitle: true, + mode: 'single', + startText: '开始', + endText: '结束', + customList: [], + color: '#3c9cff', + minDate: 0, + maxDate: 0, + defaultDate: null, + maxCount: Number.MAX_SAFE_INTEGER, // Infinity + rowHeight: 56, + formatter: null, + showLunar: false, + showMark: true, + confirmText: '确定', + confirmDisabledText: '确定', + show: false, + closeOnClickOverlay: false, + readonly: false, + showConfirm: true, + maxRange: Number.MAX_SAFE_INTEGER, // Infinity + rangePrompt: '', + showRangePrompt: true, + allowSameDay: false, + round: 0, + monthNum: 3, + weekText: ['一', '二', '三', '四', '五', '六', '日'], + forbidDays: [], + forbidDaysToast: '该日期已禁用', + } +} diff --git a/uni_modules/uview-plus/components/u-calendar/header.vue b/uni_modules/uview-plus/components/u-calendar/header.vue new file mode 100644 index 0000000..7861fb4 --- /dev/null +++ b/uni_modules/uview-plus/components/u-calendar/header.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-calendar/month.vue b/uni_modules/uview-plus/components/u-calendar/month.vue new file mode 100644 index 0000000..1bb772b --- /dev/null +++ b/uni_modules/uview-plus/components/u-calendar/month.vue @@ -0,0 +1,608 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-calendar/props.js b/uni_modules/uview-plus/components/u-calendar/props.js new file mode 100644 index 0000000..7c0fb7c --- /dev/null +++ b/uni_modules/uview-plus/components/u-calendar/props.js @@ -0,0 +1,160 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + // 日历顶部标题 + title: { + type: String, + default: () => defProps.calendar.title + }, + // 是否显示标题 + showTitle: { + type: Boolean, + default: () => defProps.calendar.showTitle + }, + // 是否显示副标题 + showSubtitle: { + type: Boolean, + default: () => defProps.calendar.showSubtitle + }, + // 日期类型选择,single-选择单个日期,multiple-可以选择多个日期,range-选择日期范围 + mode: { + type: String, + default: () => defProps.calendar.mode + }, + // mode=range时,第一个日期底部的提示文字 + startText: { + type: String, + default: () => defProps.calendar.startText + }, + // mode=range时,最后一个日期底部的提示文字 + endText: { + type: String, + default: () => defProps.calendar.endText + }, + // 自定义列表 + customList: { + type: Array, + default: () => defProps.calendar.customList + }, + // 主题色,对底部按钮和选中日期有效 + color: { + type: String, + default: () => defProps.calendar.color + }, + // 最小的可选日期 + minDate: { + type: [String, Number], + default: () => defProps.calendar.minDate + }, + // 最大可选日期 + maxDate: { + type: [String, Number], + default: () => defProps.calendar.maxDate + }, + // 默认选中的日期,mode为multiple或range是必须为数组格式 + defaultDate: { + type: [Array, String, Date, null], + default: () => defProps.calendar.defaultDate + }, + // mode=multiple时,最多可选多少个日期 + maxCount: { + type: [String, Number], + default: () => defProps.calendar.maxCount + }, + // 日期行高 + rowHeight: { + type: [String, Number], + default: () => defProps.calendar.rowHeight + }, + // 日期格式化函数 + formatter: { + type: [Function, null], + default: () => defProps.calendar.formatter + }, + // 是否显示农历 + showLunar: { + type: Boolean, + default: () => defProps.calendar.showLunar + }, + // 是否显示月份背景色 + showMark: { + type: Boolean, + default: () => defProps.calendar.showMark + }, + // 确定按钮的文字 + confirmText: { + type: String, + default: () => defProps.calendar.confirmText + }, + // 确认按钮处于禁用状态时的文字 + confirmDisabledText: { + type: String, + default: () => defProps.calendar.confirmDisabledText + }, + // 是否显示日历弹窗 + show: { + type: Boolean, + default: () => defProps.calendar.show + }, + // 是否允许点击遮罩关闭日历 + closeOnClickOverlay: { + type: Boolean, + default: () => defProps.calendar.closeOnClickOverlay + }, + // 是否为只读状态,只读状态下禁止选择日期 + readonly: { + type: Boolean, + default: () => defProps.calendar.readonly + }, + // 是否展示确认按钮 + showConfirm: { + type: Boolean, + default: () => defProps.calendar.showConfirm + }, + // 日期区间最多可选天数,默认无限制,mode = range时有效 + maxRange: { + type: [Number, String], + default: () => defProps.calendar.maxRange + }, + // 范围选择超过最多可选天数时的提示文案,mode = range时有效 + rangePrompt: { + type: String, + default: () => defProps.calendar.rangePrompt + }, + // 范围选择超过最多可选天数时,是否展示提示文案,mode = range时有效 + showRangePrompt: { + type: Boolean, + default: () => defProps.calendar.showRangePrompt + }, + // 是否允许日期范围的起止时间为同一天,mode = range时有效 + allowSameDay: { + type: Boolean, + default: () => defProps.calendar.allowSameDay + }, + // 圆角值 + round: { + type: [Boolean, String, Number], + default: () => defProps.calendar.round + }, + // 最多展示月份数量 + monthNum: { + type: [Number, String], + default: 3 + }, + // 星期文案 + weekText: { + type: Array, + default: defProps.calendar.weekText + }, + forbidDays: { + type: Array, + default: defProps.calendar.forbidDays + }, + forbidDaysToast:{ + type: String, + default: defProps.calendar.forbidDaysToast + }, + } +}) diff --git a/uni_modules/uview-plus/components/u-calendar/u-calendar.vue b/uni_modules/uview-plus/components/u-calendar/u-calendar.vue new file mode 100644 index 0000000..a64718f --- /dev/null +++ b/uni_modules/uview-plus/components/u-calendar/u-calendar.vue @@ -0,0 +1,411 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-calendar/util.js b/uni_modules/uview-plus/components/u-calendar/util.js new file mode 100644 index 0000000..18762c1 --- /dev/null +++ b/uni_modules/uview-plus/components/u-calendar/util.js @@ -0,0 +1,86 @@ +import dayjs from 'dayjs/esm/index' +export default { + methods: { + // 设置月份数据 + setMonth() { + // 月初是周几 + const day = dayjs(this.date).date(1).day() + const start = day == 0 ? 6 : day - 1 + + // 本月天数 + const days = dayjs(this.date).endOf('month').format('D') + + // 上个月天数 + const prevDays = dayjs(this.date).endOf('month').subtract(1, 'month').format('D') + + // 日期数据 + const arr = [] + // 清空表格 + this.month = [] + + // 添加上月数据 + arr.push( + ...new Array(start).fill(1).map((e, i) => { + const day = prevDays - start + i + 1 + + return { + value: day, + disabled: true, + date: dayjs(this.date).subtract(1, 'month').date(day).format('YYYY-MM-DD') + } + }) + ) + + // 添加本月数据 + arr.push( + ...new Array(days - 0).fill(1).map((e, i) => { + const day = i + 1 + + return { + value: day, + date: dayjs(this.date).date(day).format('YYYY-MM-DD') + } + }) + ) + + // 添加下个月 + arr.push( + ...new Array(42 - days - start).fill(1).map((e, i) => { + const day = i + 1 + + return { + value: day, + disabled: true, + date: dayjs(this.date).add(1, 'month').date(day).format('YYYY-MM-DD') + } + }) + ) + + // 分割数组 + for (let n = 0; n < arr.length; n += 7) { + this.month.push( + arr.slice(n, n + 7).map((e, i) => { + e.index = i + n + + // 自定义信息 + const custom = this.customList.find((c) => c.date == e.date) + + // 农历 + if (this.lunar) { + const { + IDayCn, + IMonthCn + } = this.getLunar(e.date) + e.lunar = IDayCn == '初一' ? IMonthCn : IDayCn + } + + return { + ...e, + ...custom + } + }) + ) + } + } + } +} diff --git a/uni_modules/uview-plus/components/u-car-keyboard/carKeyboard.js b/uni_modules/uview-plus/components/u-car-keyboard/carKeyboard.js new file mode 100644 index 0000000..af1baa0 --- /dev/null +++ b/uni_modules/uview-plus/components/u-car-keyboard/carKeyboard.js @@ -0,0 +1,15 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:53:20 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/carKeyboard.js + */ +export default { + // 车牌号键盘 + carKeyboard: { + random: false + } +} diff --git a/uni_modules/uview-plus/components/u-car-keyboard/props.js b/uni_modules/uview-plus/components/u-car-keyboard/props.js new file mode 100644 index 0000000..7cca0ae --- /dev/null +++ b/uni_modules/uview-plus/components/u-car-keyboard/props.js @@ -0,0 +1,17 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: false + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: false + } + } +}) diff --git a/uni_modules/uview-plus/components/u-car-keyboard/u-car-keyboard.vue b/uni_modules/uview-plus/components/u-car-keyboard/u-car-keyboard.vue new file mode 100644 index 0000000..cf0f7f0 --- /dev/null +++ b/uni_modules/uview-plus/components/u-car-keyboard/u-car-keyboard.vue @@ -0,0 +1,314 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-card/card.js b/uni_modules/uview-plus/components/u-card/card.js new file mode 100644 index 0000000..9d71214 --- /dev/null +++ b/uni_modules/uview-plus/components/u-card/card.js @@ -0,0 +1,40 @@ +/* + * @Author : jry + * @Description : + * @version : 3.0 + * @Date : 2025-04-26 16:37:21 + * @LastAuthor : jry + * @lastTime : 2025-04-26 16:37:21 + * @FilePath : /uview-plus/libs/config/props/card.js + */ +export default { + // card组件的props + card: { + full: false, + title: '', + titleColor: '#303133', + titleSize: '15px', + subTitle: '', + subTitleColor: '#909399', + subTitleSize: '13px', + border: true, + index: '', + margin: '15px', + borderRadius: '8px', + headStyle: {}, + bodyStyle: {}, + footStyle: {}, + headBorderBottom: true, + footBorderTop: true, + thumb: '', + thumbWidth: '30px', + thumbCircle: false, + padding: '15px', + paddingHead: '', + paddingBody: '', + paddingFoot: '', + showHead: true, + showFoot: true, + boxShadow: 'none' + } +} diff --git a/uni_modules/uview-plus/components/u-card/props.js b/uni_modules/uview-plus/components/u-card/props.js new file mode 100644 index 0000000..fa8d72a --- /dev/null +++ b/uni_modules/uview-plus/components/u-card/props.js @@ -0,0 +1,134 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const propsCard = defineMixin({ + props: { + // 与屏幕两侧是否留空隙 + full: { + type: Boolean, + default: () => defProps.card.full + }, + // 标题 + title: { + type: String, + default: () => defProps.card.title + }, + // 标题颜色 + titleColor: { + type: String, + default: () => defProps.card.titleColor + }, + // 标题字体大小 + titleSize: { + type: [Number, String], + default: () => defProps.card.titleSize + }, + // 副标题 + subTitle: { + type: String, + default: () => defProps.card.subTitle + }, + // 副标题颜色 + subTitleColor: { + type: String, + default: () => defProps.card.subTitleColor + }, + // 副标题字体大小 + subTitleSize: { + type: [Number, String], + default: () => defProps.card.subTitleSize + }, + // 是否显示外部边框,只对full=false时有效(卡片与边框有空隙时) + border: { + type: Boolean, + default: () => defProps.card.border + }, + // 用于标识点击了第几个 + index: { + type: [Number, String, Object], + default: () => defProps.card.index + }, + // 用于隔开上下左右的边距,带单位的写法,如:"30px 30px","20px 20px 30px 30px" + margin: { + type: String, + default: () => defProps.card.margin + }, + // card卡片的圆角 + borderRadius: { + type: [Number, String], + default: () => defProps.card.borderRadius + }, + // 头部自定义样式,对象形式 + headStyle: { + type: Object, + default: () => defProps.card.headStyle + }, + // 主体自定义样式,对象形式 + bodyStyle: { + type: Object, + default: () => defProps.card.bodyStyle + }, + // 底部自定义样式,对象形式 + footStyle: { + type: Object, + default: () => defProps.card.footStyle + }, + // 头部是否下边框 + headBorderBottom: { + type: Boolean, + default: () => defProps.card.headBorderBottom + }, + // 底部是否有上边框 + footBorderTop: { + type: Boolean, + default: () => defProps.card.footBorderTop + }, + // 标题左边的缩略图 + thumb: { + type: String, + default: () => defProps.card.thumb + }, + // 缩略图宽高 + thumbWidth: { + type: [String, Number], + default: () => defProps.card.thumbWidth + }, + // 缩略图是否为圆形 + thumbCircle: { + type: Boolean, + default: () => defProps.card.thumbCircle + }, + // 给head,body,foot的内边距 + padding: { + type: [String, Number], + default: () => defProps.card.padding + }, + paddingHead: { + type: [String, Number], + default: () => defProps.card.paddingHead + }, + paddingBody: { + type: [String, Number], + default: () => defProps.card.paddingBody + }, + paddingFoot: { + type: [String, Number], + default: () => defProps.card.paddingFoot + }, + // 是否显示头部 + showHead: { + type: Boolean, + default: () => defProps.card.showHead + }, + // 是否显示尾部 + showFoot: { + type: Boolean, + default: () => defProps.card.showFoot + }, + // 卡片外围阴影,字符串形式 + boxShadow: { + type: String, + default: () => defProps.card.boxShadow + } + } +}) diff --git a/uni_modules/uview-plus/components/u-card/u-card.vue b/uni_modules/uview-plus/components/u-card/u-card.vue new file mode 100644 index 0000000..0d98131 --- /dev/null +++ b/uni_modules/uview-plus/components/u-card/u-card.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-cate-tab/u-cate-tab.vue b/uni_modules/uview-plus/components/u-cate-tab/u-cate-tab.vue new file mode 100644 index 0000000..3687998 --- /dev/null +++ b/uni_modules/uview-plus/components/u-cate-tab/u-cate-tab.vue @@ -0,0 +1,340 @@ + + + + diff --git a/uni_modules/uview-plus/components/u-cell-group/cellGroup.js b/uni_modules/uview-plus/components/u-cell-group/cellGroup.js new file mode 100644 index 0000000..d48a9cd --- /dev/null +++ b/uni_modules/uview-plus/components/u-cell-group/cellGroup.js @@ -0,0 +1,17 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:54:16 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/cellGroup.js + */ +export default { + // cell-group组件的props + cellGroup: { + title: '', + border: true, + customStyle: {} + } +} diff --git a/uni_modules/uview-plus/components/u-cell-group/props.js b/uni_modules/uview-plus/components/u-cell-group/props.js new file mode 100644 index 0000000..59c2012 --- /dev/null +++ b/uni_modules/uview-plus/components/u-cell-group/props.js @@ -0,0 +1,16 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 分组标题 + title: { + type: String, + default: () => defProps.cellGroup.title + }, + // 是否显示外边框 + border: { + type: Boolean, + default: () => defProps.cellGroup.border + } + } +}) diff --git a/uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue b/uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue new file mode 100644 index 0000000..0fd1fb4 --- /dev/null +++ b/uni_modules/uview-plus/components/u-cell-group/u-cell-group.vue @@ -0,0 +1,66 @@ + + + + + + diff --git a/uni_modules/uview-plus/components/u-cell/cell.js b/uni_modules/uview-plus/components/u-cell/cell.js new file mode 100644 index 0000000..425ea3f --- /dev/null +++ b/uni_modules/uview-plus/components/u-cell/cell.js @@ -0,0 +1,35 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-23 20:53:09 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/cell.js + */ +export default { + // cell组件的props + cell: { + customClass: '', + title: '', + label: '', + value: '', + icon: '', + disabled: false, + border: true, + center: false, + url: '', + linkType: 'navigateTo', + clickable: false, + isLink: false, + required: false, + arrowDirection: '', + iconStyle: {}, + rightIconStyle: {}, + rightIcon: 'arrow-right', + titleStyle: {}, + size: '', + stop: true, + name: '' + } +} diff --git a/uni_modules/uview-plus/components/u-cell/props.js b/uni_modules/uview-plus/components/u-cell/props.js new file mode 100644 index 0000000..73f5210 --- /dev/null +++ b/uni_modules/uview-plus/components/u-cell/props.js @@ -0,0 +1,112 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 标题 + title: { + type: [String, Number], + default: () => defProps.cell.title + }, + // 标题下方的描述信息 + label: { + type: [String, Number], + default: () => defProps.cell.label + }, + // 右侧的内容 + value: { + type: [String, Number], + default: () => defProps.cell.value + }, + // 左侧图标名称,或者图片链接(本地文件建议使用绝对地址) + icon: { + type: String, + default: () => defProps.cell.icon + }, + // 是否禁用cell + disabled: { + type: Boolean, + default: () => defProps.cell.disabled + }, + // 是否显示下边框 + border: { + type: Boolean, + default: () => defProps.cell.border + }, + // 内容是否垂直居中(主要是针对右侧的value部分) + center: { + type: Boolean, + default: () => defProps.cell.center + }, + // 点击后跳转的URL地址 + url: { + type: String, + default: () => defProps.cell.url + }, + // 链接跳转的方式,内部使用的是uView封装的route方法,可能会进行拦截操作 + linkType: { + type: String, + default: () => defProps.cell.linkType + }, + // 是否开启点击反馈(表现为点击时加上灰色背景) + clickable: { + type: Boolean, + default: () => defProps.cell.clickable + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: () => defProps.cell.isLink + }, + // 是否显示表单状态下的必填星号(此组件可能会内嵌入input组件) + required: { + type: Boolean, + default: () => defProps.cell.required + }, + // 右侧的图标箭头 + rightIcon: { + type: String, + default: () => defProps.cell.rightIcon + }, + // 右侧箭头的方向,可选值为:left,up,down + arrowDirection: { + type: String, + default: () => defProps.cell.arrowDirection + }, + // 左侧图标样式 + iconStyle: { + type: [Object, String], + default: () => { + return defProps.cell.iconStyle + } + }, + // 右侧箭头图标的样式 + rightIconStyle: { + type: [Object, String], + default: () => { + return defProps.cell.rightIconStyle + } + }, + // 标题的样式 + titleStyle: { + type: [Object, String], + default: () => { + return defProps.cell.titleStyle + } + }, + // 单位元的大小,可选值为large + size: { + type: String, + default: () => defProps.cell.size + }, + // 点击cell是否阻止事件传播 + stop: { + type: Boolean, + default: () => defProps.cell.stop + }, + // 标识符,cell被点击时返回 + name: { + type: [Number, String], + default: () => defProps.cell.name + } + } +}) diff --git a/uni_modules/uview-plus/components/u-cell/u-cell.vue b/uni_modules/uview-plus/components/u-cell/u-cell.vue new file mode 100644 index 0000000..fd00a90 --- /dev/null +++ b/uni_modules/uview-plus/components/u-cell/u-cell.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-checkbox-group/checkboxGroup.js b/uni_modules/uview-plus/components/u-checkbox-group/checkboxGroup.js new file mode 100644 index 0000000..d0e22b6 --- /dev/null +++ b/uni_modules/uview-plus/components/u-checkbox-group/checkboxGroup.js @@ -0,0 +1,29 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:54:47 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/checkboxGroup.js + */ +export default { + // checkbox-group组件 + checkboxGroup: { + name: '', + value: [], + shape: 'square', + disabled: false, + activeColor: '#2979ff', + inactiveColor: '#c8c9cc', + size: 18, + placement: 'row', + labelSize: 14, + labelColor: '#303133', + labelDisabled: false, + iconColor: '#ffffff', + iconSize: 12, + iconPlacement: 'left', + borderBottom: false + } +} diff --git a/uni_modules/uview-plus/components/u-checkbox-group/props.js b/uni_modules/uview-plus/components/u-checkbox-group/props.js new file mode 100644 index 0000000..222d184 --- /dev/null +++ b/uni_modules/uview-plus/components/u-checkbox-group/props.js @@ -0,0 +1,93 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + // 标识符 + name: { + type: String, + default: () => defProps.checkboxGroup.name + }, + // #ifdef VUE3 + // 绑定的值 + modelValue: { + type: Array, + default: () => defProps.checkboxGroup.value + }, + // #endif + // #ifdef VUE2 + // 绑定的值 + value: { + type: Array, + default: () => defProps.checkboxGroup.value + }, + // #endif + // 形状,circle-圆形,square-方形 + shape: { + type: String, + default: () => defProps.checkboxGroup.shape + }, + // 是否禁用全部checkbox + disabled: { + type: Boolean, + default: () => defProps.checkboxGroup.disabled + }, + + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: () => defProps.checkboxGroup.activeColor + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: () => defProps.checkboxGroup.inactiveColor + }, + + // 整个组件的尺寸,默认px + size: { + type: [String, Number], + default: () => defProps.checkboxGroup.size + }, + // 布局方式,row-横向,column-纵向 + placement: { + type: String, + default: () => defProps.checkboxGroup.placement + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: () => defProps.checkboxGroup.labelSize + }, + // label的字体颜色 + labelColor: { + type: [String], + default: () => defProps.checkboxGroup.labelColor + }, + // 是否禁止点击文本操作 + labelDisabled: { + type: Boolean, + default: () => defProps.checkboxGroup.labelDisabled + }, + // 图标颜色 + iconColor: { + type: String, + default: () => defProps.checkboxGroup.iconColor + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: () => defProps.checkboxGroup.iconSize + }, + // 勾选图标的对齐方式,left-左边,right-右边 + iconPlacement: { + type: String, + default: () => defProps.checkboxGroup.iconPlacement + }, + // 竖向配列时,是否显示下划线 + borderBottom: { + type: Boolean, + default: () => defProps.checkboxGroup.borderBottom + } + } +}) diff --git a/uni_modules/uview-plus/components/u-checkbox-group/u-checkbox-group.vue b/uni_modules/uview-plus/components/u-checkbox-group/u-checkbox-group.vue new file mode 100644 index 0000000..fb30148 --- /dev/null +++ b/uni_modules/uview-plus/components/u-checkbox-group/u-checkbox-group.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-checkbox/checkbox.js b/uni_modules/uview-plus/components/u-checkbox/checkbox.js new file mode 100644 index 0000000..2310901 --- /dev/null +++ b/uni_modules/uview-plus/components/u-checkbox/checkbox.js @@ -0,0 +1,27 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-23 21:06:59 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/checkbox.js + */ +export default { + // checkbox组件 + checkbox: { + name: '', + shape: '', + size: '', + checkbox: false, + disabled: '', + activeColor: '', + inactiveColor: '', + iconSize: '', + iconColor: '', + label: '', + labelSize: '', + labelColor: '', + labelDisabled: '' + } +} diff --git a/uni_modules/uview-plus/components/u-checkbox/props.js b/uni_modules/uview-plus/components/u-checkbox/props.js new file mode 100644 index 0000000..66d8150 --- /dev/null +++ b/uni_modules/uview-plus/components/u-checkbox/props.js @@ -0,0 +1,76 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // checkbox的名称 + name: { + type: [String, Number, Boolean], + default: () => defProps.checkbox.name + }, + // 形状,square为方形,circle为圆型 + shape: { + type: String, + default: () => defProps.checkbox.shape + }, + // 整体的大小 + size: { + type: [String, Number], + default: () => defProps.checkbox.size + }, + // 是否默认选中 + checked: { + type: Boolean, + default: () => defProps.checkbox.checked + }, + // 是否禁用 + disabled: { + type: [String, Boolean], + default: () => defProps.checkbox.disabled + }, + // 选中状态下的颜色,如设置此值,将会覆盖parent的activeColor值 + activeColor: { + type: String, + default: () => defProps.checkbox.activeColor + }, + // 未选中的颜色 + inactiveColor: { + type: String, + default: () => defProps.checkbox.inactiveColor + }, + // 图标的大小,单位px + iconSize: { + type: [String, Number], + default: () => defProps.checkbox.iconSize + }, + // 图标颜色 + iconColor: { + type: String, + default: () => defProps.checkbox.iconColor + }, + // label提示文字,因为nvue下,直接slot进来的文字,由于特殊的结构,无法修改样式 + label: { + type: [String, Number], + default: () => defProps.checkbox.label + }, + // label的字体大小,px单位 + labelSize: { + type: [String, Number], + default: () => defProps.checkbox.labelSize + }, + // label的颜色 + labelColor: { + type: String, + default: () => defProps.checkbox.labelColor + }, + // 是否禁止点击提示语选中复选框 + labelDisabled: { + type: [String, Boolean], + default: () => defProps.checkbox.labelDisabled + }, + // 是否独立使用 + usedAlone: { + type: [Boolean], + default: () => false + } + } +}) diff --git a/uni_modules/uview-plus/components/u-checkbox/u-checkbox.vue b/uni_modules/uview-plus/components/u-checkbox/u-checkbox.vue new file mode 100644 index 0000000..1a78ae0 --- /dev/null +++ b/uni_modules/uview-plus/components/u-checkbox/u-checkbox.vue @@ -0,0 +1,388 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-circle-progress/circleProgress.js b/uni_modules/uview-plus/components/u-circle-progress/circleProgress.js new file mode 100644 index 0000000..b3a9b43 --- /dev/null +++ b/uni_modules/uview-plus/components/u-circle-progress/circleProgress.js @@ -0,0 +1,15 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:55:02 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/circleProgress.js + */ +export default { + // circleProgress 组件 + circleProgress: { + percentage: 30 + } +} diff --git a/uni_modules/uview-plus/components/u-circle-progress/props.js b/uni_modules/uview-plus/components/u-circle-progress/props.js new file mode 100644 index 0000000..ff1eeaa --- /dev/null +++ b/uni_modules/uview-plus/components/u-circle-progress/props.js @@ -0,0 +1,10 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + percentage: { + type: [String, Number], + default: () => defProps.circleProgress.percentage + } + } +}) diff --git a/uni_modules/uview-plus/components/u-circle-progress/u-circle-progress.vue b/uni_modules/uview-plus/components/u-circle-progress/u-circle-progress.vue new file mode 100644 index 0000000..f252ed0 --- /dev/null +++ b/uni_modules/uview-plus/components/u-circle-progress/u-circle-progress.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-city-locate/u-city-locate.vue b/uni_modules/uview-plus/components/u-city-locate/u-city-locate.vue new file mode 100644 index 0000000..59a6735 --- /dev/null +++ b/uni_modules/uview-plus/components/u-city-locate/u-city-locate.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-code-input/codeInput.js b/uni_modules/uview-plus/components/u-code-input/codeInput.js new file mode 100644 index 0000000..cac9265 --- /dev/null +++ b/uni_modules/uview-plus/components/u-code-input/codeInput.js @@ -0,0 +1,29 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:55:58 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/codeInput.js + */ +export default { + // codeInput 组件 + codeInput: { + adjustPosition: true, + maxlength: 6, + dot: false, + mode: 'box', + hairline: false, + space: 10, + value: '', + focus: false, + bold: false, + color: '#606266', + fontSize: 18, + size: 35, + disabledKeyboard: false, + borderColor: '#c9cacc', + disabledDot: true + } +} diff --git a/uni_modules/uview-plus/components/u-code-input/props.js b/uni_modules/uview-plus/components/u-code-input/props.js new file mode 100644 index 0000000..0a4b1e8 --- /dev/null +++ b/uni_modules/uview-plus/components/u-code-input/props.js @@ -0,0 +1,90 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: () => defProps.codeInput.adjustPosition + }, + // 最大输入长度 + maxlength: { + type: [String, Number], + default: () => defProps.codeInput.maxlength + }, + // 是否用圆点填充 + dot: { + type: Boolean, + default: () => defProps.codeInput.dot + }, + // 显示模式,box-盒子模式,line-底部横线模式 + mode: { + type: String, + default: () => defProps.codeInput.mode + }, + // 是否细边框 + hairline: { + type: Boolean, + default: () => defProps.codeInput.hairline + }, + // 字符间的距离 + space: { + type: [String, Number], + default: () => defProps.codeInput.space + }, + // #ifdef VUE3 + // 预置值 + modelValue: { + type: [String, Number], + default: () => defProps.codeInput.value + }, + // #endif + // #ifdef VUE2 + // 预置值 + value: { + type: [String, Number], + default: () => defProps.codeInput.value + }, + // #endif + // 是否自动获取焦点 + focus: { + type: Boolean, + default: () => defProps.codeInput.focus + }, + // 字体是否加粗 + bold: { + type: Boolean, + default: () => defProps.codeInput.bold + }, + // 字体颜色 + color: { + type: String, + default: () => defProps.codeInput.color + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: () => defProps.codeInput.fontSize + }, + // 输入框的大小,宽等于高 + size: { + type: [String, Number], + default: () => defProps.codeInput.size + }, + // 是否隐藏原生键盘,如果想用自定义键盘的话,需设置此参数为true + disabledKeyboard: { + type: Boolean, + default: () => defProps.codeInput.disabledKeyboard + }, + // 边框和线条颜色 + borderColor: { + type: String, + default: () => defProps.codeInput.borderColor + }, + // 是否禁止输入"."符号 + disabledDot: { + type: Boolean, + default: () => defProps.codeInput.disabledDot + } + } +}) diff --git a/uni_modules/uview-plus/components/u-code-input/u-code-input.vue b/uni_modules/uview-plus/components/u-code-input/u-code-input.vue new file mode 100644 index 0000000..d02a3aa --- /dev/null +++ b/uni_modules/uview-plus/components/u-code-input/u-code-input.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-code/code.js b/uni_modules/uview-plus/components/u-code/code.js new file mode 100644 index 0000000..693417a --- /dev/null +++ b/uni_modules/uview-plus/components/u-code/code.js @@ -0,0 +1,21 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:55:27 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/code.js + */ + +export default { + // code 组件 + code: { + seconds: 60, + startText: '获取验证码', + changeText: 'X秒重新获取', + endText: '重新获取', + keepRunning: false, + uniqueKey: '' + } +} diff --git a/uni_modules/uview-plus/components/u-code/props.js b/uni_modules/uview-plus/components/u-code/props.js new file mode 100644 index 0000000..60977b5 --- /dev/null +++ b/uni_modules/uview-plus/components/u-code/props.js @@ -0,0 +1,36 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 倒计时总秒数 + seconds: { + type: [String, Number], + default: () => defProps.code.seconds + }, + // 尚未开始时提示 + startText: { + type: String, + default: () => defProps.code.startText + }, + // 正在倒计时中的提示 + changeText: { + type: String, + default: () => defProps.code.changeText + }, + // 倒计时结束时的提示 + endText: { + type: String, + default: () => defProps.code.endText + }, + // 是否在H5刷新或各端返回再进入时继续倒计时 + keepRunning: { + type: Boolean, + default: () => defProps.code.keepRunning + }, + // 为了区分多个页面,或者一个页面多个倒计时组件本地存储的继续倒计时变了 + uniqueKey: { + type: String, + default: () => defProps.code.uniqueKey + } + } +}) diff --git a/uni_modules/uview-plus/components/u-code/u-code.vue b/uni_modules/uview-plus/components/u-code/u-code.vue new file mode 100644 index 0000000..24b09d8 --- /dev/null +++ b/uni_modules/uview-plus/components/u-code/u-code.vue @@ -0,0 +1,131 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-col/col.js b/uni_modules/uview-plus/components/u-col/col.js new file mode 100644 index 0000000..7621653 --- /dev/null +++ b/uni_modules/uview-plus/components/u-col/col.js @@ -0,0 +1,19 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:56:12 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/col.js + */ +export default { + // col 组件 + col: { + span: 12, + offset: 0, + justify: 'start', + align: 'stretch', + textAlign: 'left' + } +} diff --git a/uni_modules/uview-plus/components/u-col/props.js b/uni_modules/uview-plus/components/u-col/props.js new file mode 100644 index 0000000..b28decb --- /dev/null +++ b/uni_modules/uview-plus/components/u-col/props.js @@ -0,0 +1,31 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 占父容器宽度的多少等分,总分为12份 + span: { + type: [String, Number], + default: () => defProps.col.span + }, + // 指定栅格左侧的间隔数(总12栏) + offset: { + type: [String, Number], + default: () => defProps.col.offset + }, + // 水平排列方式,可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`) + justify: { + type: String, + default: () => defProps.col.justify + }, + // 垂直对齐方式,可选值为top、center、bottom、stretch + align: { + type: String, + default: () => defProps.col.align + }, + // 文字对齐方式 + textAlign: { + type: String, + default: () => defProps.col.textAlign + } + } +}) diff --git a/uni_modules/uview-plus/components/u-col/u-col.vue b/uni_modules/uview-plus/components/u-col/u-col.vue new file mode 100644 index 0000000..816bcbf --- /dev/null +++ b/uni_modules/uview-plus/components/u-col/u-col.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-collapse-item/collapseItem.js b/uni_modules/uview-plus/components/u-collapse-item/collapseItem.js new file mode 100644 index 0000000..9611c47 --- /dev/null +++ b/uni_modules/uview-plus/components/u-collapse-item/collapseItem.js @@ -0,0 +1,31 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:56:42 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/collapseItem.js + */ +export default { + // collapseItem 组件 + collapseItem: { + title: '', + value: '', + label: '', + disabled: false, + isLink: true, + clickable: true, + border: true, + align: 'left', + name: '', + icon: '', + duration: 300, + showRight: true, + titleStyle: {}, + iconStyle: {}, + rightIconStyle: {}, + cellCustomStyle: {}, + cellCustomClass: '' + } +} diff --git a/uni_modules/uview-plus/components/u-collapse-item/props.js b/uni_modules/uview-plus/components/u-collapse-item/props.js new file mode 100644 index 0000000..095c571 --- /dev/null +++ b/uni_modules/uview-plus/components/u-collapse-item/props.js @@ -0,0 +1,97 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 标题 + title: { + type: String, + default: () => defProps.collapseItem.title + }, + // 标题的样式 + titleStyle: { + type: [Object, String], + default: () => { + return defProps.collapseItem.titleStyle + } + }, + // 标题右侧内容 + value: { + type: String, + default: () => defProps.collapseItem.value + }, + // 标题下方的描述信息 + label: { + type: String, + default: () => defProps.collapseItem.label + }, + // 是否禁用折叠面板 + disabled: { + type: Boolean, + default: () => defProps.collapseItem.disabled + }, + // 是否展示右侧箭头并开启点击反馈 + isLink: { + type: Boolean, + default: () => defProps.collapseItem.isLink + }, + // 是否开启点击反馈 + clickable: { + type: Boolean, + default: () => defProps.collapseItem.clickable + }, + // 是否显示内边框 + border: { + type: Boolean, + default: () => defProps.collapseItem.border + }, + // 标题的对齐方式 + align: { + type: String, + default: () => defProps.collapseItem.align + }, + // 唯一标识符 + name: { + type: [String, Number], + default: () => defProps.collapseItem.name + }, + // 标题左侧图片,可为绝对路径的图片或内置图标 + icon: { + type: String, + default: () => defProps.collapseItem.icon + }, + // 面板展开收起的过渡时间,单位ms + duration: { + type: Number, + default: () => defProps.collapseItem.duration + }, + // 显示右侧图标 + showRight: { + type: Boolean, + default: () => defProps.collapseItem.showRight + }, + // 左侧图标样式 + iconStyle: { + type: [Object, String], + default: () => { + return defProps.collapseItem.iconStyle + } + }, + // 右侧箭头图标的样式 + rightIconStyle: { + type: [Object, String], + default: () => { + return defProps.collapseItem.rightIconStyle + } + }, + cellCustomStyle: { + type: [Object, String], + default: () => { + return defProps.collapseItem.cellCustomStyle + } + }, + cellCustomClass: { + type: String, + default: () => defProps.collapseItem.cellCustomClass + } + } +}) diff --git a/uni_modules/uview-plus/components/u-collapse-item/u-collapse-item.vue b/uni_modules/uview-plus/components/u-collapse-item/u-collapse-item.vue new file mode 100644 index 0000000..3f30e36 --- /dev/null +++ b/uni_modules/uview-plus/components/u-collapse-item/u-collapse-item.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-collapse/collapse.js b/uni_modules/uview-plus/components/u-collapse/collapse.js new file mode 100644 index 0000000..c2b9fdd --- /dev/null +++ b/uni_modules/uview-plus/components/u-collapse/collapse.js @@ -0,0 +1,17 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:56:30 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/collapse.js + */ +export default { + // collapse 组件 + collapse: { + value: null, + accordion: false, + border: true + } +} diff --git a/uni_modules/uview-plus/components/u-collapse/props.js b/uni_modules/uview-plus/components/u-collapse/props.js new file mode 100644 index 0000000..7712603 --- /dev/null +++ b/uni_modules/uview-plus/components/u-collapse/props.js @@ -0,0 +1,21 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 当前展开面板的name,非手风琴模式:[],手风琴模式:string | number + value: { + type: [String, Number, Array, null], + default: () => defProps.collapse.value + }, + // 是否手风琴模式 + accordion: { + type: Boolean, + default: () => defProps.collapse.accordion + }, + // 是否显示外边框 + border: { + type: Boolean, + default: () => defProps.collapse.border + } + } +}) diff --git a/uni_modules/uview-plus/components/u-collapse/u-collapse.vue b/uni_modules/uview-plus/components/u-collapse/u-collapse.vue new file mode 100644 index 0000000..f556522 --- /dev/null +++ b/uni_modules/uview-plus/components/u-collapse/u-collapse.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-column-notice/columnNotice.js b/uni_modules/uview-plus/components/u-column-notice/columnNotice.js new file mode 100644 index 0000000..f1497af --- /dev/null +++ b/uni_modules/uview-plus/components/u-column-notice/columnNotice.js @@ -0,0 +1,25 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:57:16 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/columnNotice.js + */ +export default { + // columnNotice 组件 + columnNotice: { + text: '', + icon: 'volume', + mode: '', + color: '#f9ae3d', + bgColor: '#fdf6ec', + fontSize: 14, + speed: 80, + step: false, + duration: 1500, + disableTouch: true, + justifyContent: 'flex-start' + } +} diff --git a/uni_modules/uview-plus/components/u-column-notice/props.js b/uni_modules/uview-plus/components/u-column-notice/props.js new file mode 100644 index 0000000..4e3cc1f --- /dev/null +++ b/uni_modules/uview-plus/components/u-column-notice/props.js @@ -0,0 +1,61 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 显示的内容,字符串 + text: { + type: [Array], + default: () => defProps.columnNotice.text + }, + // 是否显示左侧的音量图标 + icon: { + type: String, + default: () => defProps.columnNotice.icon + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: () => defProps.columnNotice.mode + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: () => defProps.columnNotice.color + }, + // 背景颜色 + bgColor: { + type: String, + default: () => defProps.columnNotice.bgColor + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: () => defProps.columnNotice.fontSize + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: () => defProps.columnNotice.speed + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: () => defProps.columnNotice.step + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: () => defProps.columnNotice.duration + }, + // 是否禁止用手滑动切换 + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: () => defProps.columnNotice.disableTouch + }, + justifyContent: { + type: String, + default: () => defProps.columnNotice.justifyContent + } + } +}) diff --git a/uni_modules/uview-plus/components/u-column-notice/u-column-notice.vue b/uni_modules/uview-plus/components/u-column-notice/u-column-notice.vue new file mode 100644 index 0000000..d001b4e --- /dev/null +++ b/uni_modules/uview-plus/components/u-column-notice/u-column-notice.vue @@ -0,0 +1,165 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-copy/u-copy.vue b/uni_modules/uview-plus/components/u-copy/u-copy.vue new file mode 100644 index 0000000..3a71910 --- /dev/null +++ b/uni_modules/uview-plus/components/u-copy/u-copy.vue @@ -0,0 +1,70 @@ + + + + diff --git a/uni_modules/uview-plus/components/u-count-down/countDown.js b/uni_modules/uview-plus/components/u-count-down/countDown.js new file mode 100644 index 0000000..81e33b1 --- /dev/null +++ b/uni_modules/uview-plus/components/u-count-down/countDown.js @@ -0,0 +1,18 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:11:29 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/countDown.js + */ +export default { + // u-count-down 计时器组件 + countDown: { + time: 0, + format: 'HH:mm:ss', + autoStart: true, + millisecond: false + } +} diff --git a/uni_modules/uview-plus/components/u-count-down/props.js b/uni_modules/uview-plus/components/u-count-down/props.js new file mode 100644 index 0000000..6dbf1c2 --- /dev/null +++ b/uni_modules/uview-plus/components/u-count-down/props.js @@ -0,0 +1,26 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 倒计时时长,单位ms + time: { + type: [String, Number], + default: () => defProps.countDown.time + }, + // 时间格式,DD-日,HH-时,mm-分,ss-秒,SSS-毫秒 + format: { + type: String, + default: () => defProps.countDown.format + }, + // 是否自动开始倒计时 + autoStart: { + type: Boolean, + default: () => defProps.countDown.autoStart + }, + // 是否展示毫秒倒计时 + millisecond: { + type: Boolean, + default: () => defProps.countDown.millisecond + } + } +}) diff --git a/uni_modules/uview-plus/components/u-count-down/u-count-down.vue b/uni_modules/uview-plus/components/u-count-down/u-count-down.vue new file mode 100644 index 0000000..0c6d231 --- /dev/null +++ b/uni_modules/uview-plus/components/u-count-down/u-count-down.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-count-down/utils.js b/uni_modules/uview-plus/components/u-count-down/utils.js new file mode 100644 index 0000000..8c75005 --- /dev/null +++ b/uni_modules/uview-plus/components/u-count-down/utils.js @@ -0,0 +1,62 @@ +// 补0,如1 -> 01 +function padZero(num, targetLength = 2) { + let str = `${num}` + while (str.length < targetLength) { + str = `0${str}` + } + return str +} +const SECOND = 1000 +const MINUTE = 60 * SECOND +const HOUR = 60 * MINUTE +const DAY = 24 * HOUR +export function parseTimeData(time) { + const days = Math.floor(time / DAY) + const hours = Math.floor((time % DAY) / HOUR) + const minutes = Math.floor((time % HOUR) / MINUTE) + const seconds = Math.floor((time % MINUTE) / SECOND) + const milliseconds = Math.floor(time % SECOND) + return { + days, + hours, + minutes, + seconds, + milliseconds + } +} +export function parseFormat(format, timeData) { + let { + days, + hours, + minutes, + seconds, + milliseconds + } = timeData + // 如果格式化字符串中不存在DD(天),则将天的时间转为小时中去 + if (format.indexOf('DD') === -1) { + hours += days * 24 + } else { + // 对天补0 + format = format.replace('DD', padZero(days)) + } + // 其他同理于DD的格式化处理方式 + if (format.indexOf('HH') === -1) { + minutes += hours * 60 + } else { + format = format.replace('HH', padZero(hours)) + } + if (format.indexOf('mm') === -1) { + seconds += minutes * 60 + } else { + format = format.replace('mm', padZero(minutes)) + } + if (format.indexOf('ss') === -1) { + milliseconds += seconds * 1000 + } else { + format = format.replace('ss', padZero(seconds)) + } + return format.replace('SSS', padZero(milliseconds, 3)) +} +export function isSameSecond(time1, time2) { + return Math.floor(time1 / 1000) === Math.floor(time2 / 1000) +} diff --git a/uni_modules/uview-plus/components/u-count-to/countTo.js b/uni_modules/uview-plus/components/u-count-to/countTo.js new file mode 100644 index 0000000..a536cde --- /dev/null +++ b/uni_modules/uview-plus/components/u-count-to/countTo.js @@ -0,0 +1,25 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:57:32 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/countTo.js + */ +export default { + // countTo 组件 + countTo: { + startVal: 0, + endVal: 0, + duration: 2000, + autoplay: true, + decimals: 0, + useEasing: true, + decimal: '.', + color: '#606266', + fontSize: 22, + bold: false, + separator: '' + } +} diff --git a/uni_modules/uview-plus/components/u-count-to/props.js b/uni_modules/uview-plus/components/u-count-to/props.js new file mode 100644 index 0000000..0b97c1f --- /dev/null +++ b/uni_modules/uview-plus/components/u-count-to/props.js @@ -0,0 +1,61 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 开始的数值,默认从0增长到某一个数 + startVal: { + type: [String, Number], + default: () => defProps.countTo.startVal + }, + // 要滚动的目标数值,必须 + endVal: { + type: [String, Number], + default: () => defProps.countTo.endVal + }, + // 滚动到目标数值的动画持续时间,单位为毫秒(ms) + duration: { + type: [String, Number], + default: () => defProps.countTo.duration + }, + // 设置数值后是否自动开始滚动 + autoplay: { + type: Boolean, + default: () => defProps.countTo.autoplay + }, + // 要显示的小数位数 + decimals: { + type: [String, Number], + default: () => defProps.countTo.decimals + }, + // 是否在即将到达目标数值的时候,使用缓慢滚动的效果 + useEasing: { + type: Boolean, + default: () => defProps.countTo.useEasing + }, + // 十进制分割 + decimal: { + type: [String, Number], + default: () => defProps.countTo.decimal + }, + // 字体颜色 + color: { + type: String, + default: () => defProps.countTo.color + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: () => defProps.countTo.fontSize + }, + // 是否加粗字体 + bold: { + type: Boolean, + default: () => defProps.countTo.bold + }, + // 千位分隔符,类似金额的分割(¥23,321.05中的",") + separator: { + type: String, + default: () => defProps.countTo.separator + } + } +}) diff --git a/uni_modules/uview-plus/components/u-count-to/u-count-to.vue b/uni_modules/uview-plus/components/u-count-to/u-count-to.vue new file mode 100644 index 0000000..92623a9 --- /dev/null +++ b/uni_modules/uview-plus/components/u-count-to/u-count-to.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-cropper/u-cropper.vue b/uni_modules/uview-plus/components/u-cropper/u-cropper.vue new file mode 100644 index 0000000..673c384 --- /dev/null +++ b/uni_modules/uview-plus/components/u-cropper/u-cropper.vue @@ -0,0 +1,1213 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-datetime-picker/datetimePicker.js b/uni_modules/uview-plus/components/u-datetime-picker/datetimePicker.js new file mode 100644 index 0000000..b2b87e4 --- /dev/null +++ b/uni_modules/uview-plus/components/u-datetime-picker/datetimePicker.js @@ -0,0 +1,42 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:57:48 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/datetimePicker.js + */ +export default { + // datetimePicker 组件 + datetimePicker: { + show: false, + popupMode: 'bottom', + showToolbar: true, + value: '', + title: '', + mode: 'datetime', + maxDate: new Date(new Date().getFullYear() + 10, 0, 1).getTime(), + minDate: new Date(new Date().getFullYear() - 10, 0, 1).getTime(), + minHour: 0, + maxHour: 23, + minMinute: 0, + maxMinute: 59, + filter: null, + formatter: null, + loading: false, + itemHeight: 44, + cancelText: '取消', + confirmText: '确认', + cancelColor: '#909193', + confirmColor: '#3c9cff', + visibleItemCount: 5, + closeOnClickOverlay: false, + defaultIndex: [], + inputBorder: 'surround', + disabled: false, + disabledColor: '', + placeholder: '请选择', + inputProps: {}, + } +} diff --git a/uni_modules/uview-plus/components/u-datetime-picker/props.js b/uni_modules/uview-plus/components/u-datetime-picker/props.js new file mode 100644 index 0000000..8dd338d --- /dev/null +++ b/uni_modules/uview-plus/components/u-datetime-picker/props.js @@ -0,0 +1,168 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 是否显示input + hasInput: { + type: Boolean, + default: false + }, + inputProps: { + type: Object, + default: () => { + return {} + } + }, + inputBorder: { + type: String, + default: () => defProps.input.inputBorder + }, + disabled: { + type: Boolean, + default: () => defProps.input.disabled + }, + disabledColor:{ + type: String, + default: () => defProps.input.disabledColor + }, + placeholder: { + type: String, + default: () => defProps.input.placeholder + }, + format: { + type: String, + default: () => '' + }, + // 是否打开组件 + show: { + type: Boolean, + default: () => defProps.datetimePicker.show + }, + // 弹出的方向,可选值为 top bottom right left center + popupMode: { + type: String, + default: () => defProps.picker.popupMode + }, + // 是否展示顶部的操作栏 + showToolbar: { + type: Boolean, + default: () => defProps.datetimePicker.showToolbar + }, + // 工具栏右侧内容 + toolbarRightSlot:{ + type: Boolean, + default: false + }, + // #ifdef VUE2 + // 绑定值 + value: { + type: [String, Number], + default: () => defProps.datetimePicker.value + }, + // #endif + // #ifdef VUE3 + // 绑定值 + modelValue: { + type: [String, Number], + default: () => defProps.datetimePicker.value + }, + // #endif + // 顶部标题 + title: { + type: String, + default: () => defProps.datetimePicker.title + }, + // 展示格式,mode=date为日期选择,mode=time为时间选择,mode=year-month为年月选择,mode=datetime为日期时间选择 + mode: { + type: String, + default: () => defProps.datetimePicker.mode + }, + // 可选的最大时间 + maxDate: { + type: Number, + // 最大默认值为后10年 + default: () => defProps.datetimePicker.maxDate + }, + // 可选的最小时间 + minDate: { + type: Number, + // 最小默认值为前10年 + default: () => defProps.datetimePicker.minDate + }, + // 可选的最小小时,仅mode=time有效 + minHour: { + type: Number, + default: () => defProps.datetimePicker.minHour + }, + // 可选的最大小时,仅mode=time有效 + maxHour: { + type: Number, + default: () => defProps.datetimePicker.maxHour + }, + // 可选的最小分钟,仅mode=time有效 + minMinute: { + type: Number, + default: () => defProps.datetimePicker.minMinute + }, + // 可选的最大分钟,仅mode=time有效 + maxMinute: { + type: Number, + default: () => defProps.datetimePicker.maxMinute + }, + // 选项过滤函数 + filter: { + type: [Function, null], + default: () => defProps.datetimePicker.filter + }, + // 选项格式化函数 + formatter: { + type: [Function, null], + default: () => defProps.datetimePicker.formatter + }, + // 是否显示加载中状态 + loading: { + type: Boolean, + default: () => defProps.datetimePicker.loading + }, + // 各列中,单个选项的高度 + itemHeight: { + type: [String, Number], + default: () => defProps.datetimePicker.itemHeight + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: () => defProps.datetimePicker.cancelText + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: () => defProps.datetimePicker.confirmText + }, + // 取消按钮的颜色 + cancelColor: { + type: String, + default: () => defProps.datetimePicker.cancelColor + }, + // 确认按钮的颜色 + confirmColor: { + type: String, + default: () => defProps.datetimePicker.confirmColor + }, + // 每列中可见选项的数量 + visibleItemCount: { + type: [String, Number], + default: () => defProps.datetimePicker.visibleItemCount + }, + // 是否允许点击遮罩关闭选择器 + closeOnClickOverlay: { + type: Boolean, + default: () => defProps.datetimePicker.closeOnClickOverlay + }, + // 各列的默认索引 + defaultIndex: { + type: Array, + default: () => defProps.datetimePicker.defaultIndex + } + } +}) diff --git a/uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.vue b/uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.vue new file mode 100644 index 0000000..8f86572 --- /dev/null +++ b/uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.vue @@ -0,0 +1,523 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-divider/divider.js b/uni_modules/uview-plus/components/u-divider/divider.js new file mode 100644 index 0000000..55a8ce4 --- /dev/null +++ b/uni_modules/uview-plus/components/u-divider/divider.js @@ -0,0 +1,23 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 16:58:03 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/divider.js + */ +export default { + // divider组件 + divider: { + dashed: false, + hairline: true, + dot: false, + textPosition: 'center', + text: '', + textSize: 14, + textColor: '#909399', + lineColor: '#dcdfe6' + } + +} diff --git a/uni_modules/uview-plus/components/u-divider/props.js b/uni_modules/uview-plus/components/u-divider/props.js new file mode 100644 index 0000000..ec3fd8f --- /dev/null +++ b/uni_modules/uview-plus/components/u-divider/props.js @@ -0,0 +1,46 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 是否虚线 + dashed: { + type: Boolean, + default: () => defProps.divider.dashed + }, + // 是否细线 + hairline: { + type: Boolean, + default: () => defProps.divider.hairline + }, + // 是否以点替代文字,优先于text字段起作用 + dot: { + type: Boolean, + default: () => defProps.divider.dot + }, + // 内容文本的位置,left-左边,center-中间,right-右边 + textPosition: { + type: String, + default: () => defProps.divider.textPosition + }, + // 文本内容 + text: { + type: [String, Number], + default: () => defProps.divider.text + }, + // 文本大小 + textSize: { + type: [String, Number], + default: () => defProps.divider.textSize + }, + // 文本颜色 + textColor: { + type: String, + default: () => defProps.divider.textColor + }, + // 线条颜色 + lineColor: { + type: String, + default: () => defProps.divider.lineColor + } + } +}) diff --git a/uni_modules/uview-plus/components/u-divider/u-divider.vue b/uni_modules/uview-plus/components/u-divider/u-divider.vue new file mode 100644 index 0000000..26bc710 --- /dev/null +++ b/uni_modules/uview-plus/components/u-divider/u-divider.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-dragsort/u-dragsort.vue b/uni_modules/uview-plus/components/u-dragsort/u-dragsort.vue new file mode 100644 index 0000000..9045b02 --- /dev/null +++ b/uni_modules/uview-plus/components/u-dragsort/u-dragsort.vue @@ -0,0 +1,367 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-dropdown-item/props.js b/uni_modules/uview-plus/components/u-dropdown-item/props.js new file mode 100644 index 0000000..e5e0265 --- /dev/null +++ b/uni_modules/uview-plus/components/u-dropdown-item/props.js @@ -0,0 +1,47 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // #ifdef VUE3 + // 当前选中项的value值 + modelValue: { + type: [Number, String, Array], + default: '' + }, + // #endif + // #ifdef VUE2 + // 当前选中项的value值 + value: { + type: [Number, String, Array], + default: '' + }, + // #endif + // 菜单项标题 + title: { + type: [String, Number], + default: '' + }, + // 选项数据,如果传入了默认slot,此参数无效 + options: { + type: Array, + default() { + return [] + } + }, + // 是否禁用此菜单项 + disabled: { + type: Boolean, + default: false + }, + // 下拉弹窗的高度 + height: { + type: [Number, String], + default: 'auto' + }, + // 点击遮罩是否可以收起弹窗 + closeOnClickOverlay: { + type: Boolean, + default: true + } + } +}) diff --git a/uni_modules/uview-plus/components/u-dropdown-item/u-dropdown-item.vue b/uni_modules/uview-plus/components/u-dropdown-item/u-dropdown-item.vue new file mode 100644 index 0000000..c31eddb --- /dev/null +++ b/uni_modules/uview-plus/components/u-dropdown-item/u-dropdown-item.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-dropdown/props.js b/uni_modules/uview-plus/components/u-dropdown/props.js new file mode 100644 index 0000000..4614b96 --- /dev/null +++ b/uni_modules/uview-plus/components/u-dropdown/props.js @@ -0,0 +1,61 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 菜单标题和选项的激活态颜色 + activeColor: { + type: String, + default: '#2979ff' + }, + // 菜单标题和选项的未激活态颜色 + inactiveColor: { + type: String, + default: '#606266' + }, + // 点击遮罩是否关闭菜单 + closeOnClickMask: { + type: Boolean, + default: true + }, + // 点击当前激活项标题是否关闭菜单 + closeOnClickSelf: { + type: Boolean, + default: true + }, + // 过渡时间 + duration: { + type: [Number, String], + default: 300 + }, + // 标题菜单的高度 + height: { + type: [Number, String], + default: 40 + }, + // 是否显示下边框 + borderBottom: { + type: Boolean, + default: false + }, + // 标题的字体大小 + titleSize: { + type: [Number, String], + default: 14 + }, + // 下拉出来的内容部分的圆角值 + borderRadius: { + type: [Number, String], + default: 0 + }, + // 菜单右侧的icon图标 + menuIcon: { + type: String, + default: 'arrow-down' + }, + // 菜单右侧图标的大小 + menuIconSize: { + type: [Number, String], + default: 14 + } + } +}) diff --git a/uni_modules/uview-plus/components/u-dropdown/u-dropdown.vue b/uni_modules/uview-plus/components/u-dropdown/u-dropdown.vue new file mode 100644 index 0000000..044a070 --- /dev/null +++ b/uni_modules/uview-plus/components/u-dropdown/u-dropdown.vue @@ -0,0 +1,258 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-empty/empty.js b/uni_modules/uview-plus/components/u-empty/empty.js new file mode 100644 index 0000000..fe20445 --- /dev/null +++ b/uni_modules/uview-plus/components/u-empty/empty.js @@ -0,0 +1,26 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:03:27 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/empty.js + */ +export default { + // empty组件 + empty: { + icon: '', + text: '', + textColor: '#c0c4cc', + textSize: 14, + iconColor: '#c0c4cc', + iconSize: 90, + mode: 'data', + width: 160, + height: 160, + show: true, + marginTop: 0 + } + +} diff --git a/uni_modules/uview-plus/components/u-empty/props.js b/uni_modules/uview-plus/components/u-empty/props.js new file mode 100644 index 0000000..40edd11 --- /dev/null +++ b/uni_modules/uview-plus/components/u-empty/props.js @@ -0,0 +1,61 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 内置图标名称,或图片路径,建议绝对路径 + icon: { + type: String, + default: () => defProps.empty.icon + }, + // 提示文字 + text: { + type: String, + default: () => defProps.empty.text + }, + // 文字颜色 + textColor: { + type: String, + default: () => defProps.empty.textColor + }, + // 文字大小 + textSize: { + type: [String, Number], + default: () => defProps.empty.textSize + }, + // 图标的颜色 + iconColor: { + type: String, + default: () => defProps.empty.iconColor + }, + // 图标的大小 + iconSize: { + type: [String, Number], + default: () => defProps.empty.iconSize + }, + // 选择预置的图标类型 + mode: { + type: String, + default: () => defProps.empty.mode + }, + // 图标宽度,单位px + width: { + type: [String, Number], + default: () => defProps.empty.width + }, + // 图标高度,单位px + height: { + type: [String, Number], + default: () => defProps.empty.height + }, + // 是否显示组件 + show: { + type: Boolean, + default: () => defProps.empty.show + }, + // 组件距离上一个元素之间的距离,默认px单位 + marginTop: { + type: [String, Number], + default: () => defProps.empty.marginTop + } + } +}) diff --git a/uni_modules/uview-plus/components/u-empty/u-empty.vue b/uni_modules/uview-plus/components/u-empty/u-empty.vue new file mode 100644 index 0000000..7d53559 --- /dev/null +++ b/uni_modules/uview-plus/components/u-empty/u-empty.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-float-button/u-float-button.vue b/uni_modules/uview-plus/components/u-float-button/u-float-button.vue new file mode 100644 index 0000000..c67f33a --- /dev/null +++ b/uni_modules/uview-plus/components/u-float-button/u-float-button.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-form-item/formItem.js b/uni_modules/uview-plus/components/u-form-item/formItem.js new file mode 100644 index 0000000..5afc562 --- /dev/null +++ b/uni_modules/uview-plus/components/u-form-item/formItem.js @@ -0,0 +1,24 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:04:32 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/formItem.js + */ +export default { + // formItem 组件 + formItem: { + label: '', + prop: '', + rules: [], + borderBottom: '', + labelPosition: '', + labelWidth: '', + rightIcon: '', + leftIcon: '', + required: false, + leftIconStyle: '', + } +} diff --git a/uni_modules/uview-plus/components/u-form-item/props.js b/uni_modules/uview-plus/components/u-form-item/props.js new file mode 100644 index 0000000..cd434ce --- /dev/null +++ b/uni_modules/uview-plus/components/u-form-item/props.js @@ -0,0 +1,55 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // input的label提示语 + label: { + type: String, + default: () => defProps.formItem.label + }, + // 绑定的值 + prop: { + type: String, + default: () => defProps.formItem.prop + }, + // 绑定的规则 + rules: { + type: Array, + default: () => defProps.formItem.rules + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: [String, Boolean], + default: () => defProps.formItem.borderBottom + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: () => defProps.formItem.labelPosition + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: () => defProps.formItem.labelWidth + }, + // 右侧图标 + rightIcon: { + type: String, + default: () => defProps.formItem.rightIcon + }, + // 左侧图标 + leftIcon: { + type: String, + default: () => defProps.formItem.leftIcon + }, + // 是否显示左边的必填星号,只作显示用,具体校验必填的逻辑,请在rules中配置 + required: { + type: Boolean, + default: () => defProps.formItem.required + }, + leftIconStyle: { + type: [String, Object], + default: () => defProps.formItem.leftIconStyle, + } + } +}) diff --git a/uni_modules/uview-plus/components/u-form-item/u-form-item.vue b/uni_modules/uview-plus/components/u-form-item/u-form-item.vue new file mode 100644 index 0000000..80183ab --- /dev/null +++ b/uni_modules/uview-plus/components/u-form-item/u-form-item.vue @@ -0,0 +1,261 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-form/form.js b/uni_modules/uview-plus/components/u-form/form.js new file mode 100644 index 0000000..204d845 --- /dev/null +++ b/uni_modules/uview-plus/components/u-form/form.js @@ -0,0 +1,22 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:03:49 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/form.js + */ +export default { + // form 组件 + form: { + model: {}, + rules: {}, + errorType: 'message', + borderBottom: true, + labelPosition: 'left', + labelWidth: 45, + labelAlign: 'left', + labelStyle: {} + } +} diff --git a/uni_modules/uview-plus/components/u-form/props.js b/uni_modules/uview-plus/components/u-form/props.js new file mode 100644 index 0000000..b80d623 --- /dev/null +++ b/uni_modules/uview-plus/components/u-form/props.js @@ -0,0 +1,47 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 当前form的需要验证字段的集合 + model: { + type: Object, + default: () => defProps.form.model + }, + // 验证规则 + rules: { + type: [Object, Function, Array], + default: () => defProps.form.rules + }, + // 有错误时的提示方式,message-提示信息,toast-进行toast提示 + // border-bottom-下边框呈现红色,none-无提示 + errorType: { + type: String, + default: () => defProps.form.errorType + }, + // 是否显示表单域的下划线边框 + borderBottom: { + type: Boolean, + default: () => defProps.form.borderBottom + }, + // label的位置,left-左边,top-上边 + labelPosition: { + type: String, + default: () => defProps.form.labelPosition + }, + // label的宽度,单位px + labelWidth: { + type: [String, Number], + default: () => defProps.form.labelWidth + }, + // lable字体的对齐方式 + labelAlign: { + type: String, + default: () => defProps.form.labelAlign + }, + // lable的样式,对象形式 + labelStyle: { + type: Object, + default: () => defProps.form.labelStyle + } + } +}) diff --git a/uni_modules/uview-plus/components/u-form/u-form.vue b/uni_modules/uview-plus/components/u-form/u-form.vue new file mode 100644 index 0000000..32fb721 --- /dev/null +++ b/uni_modules/uview-plus/components/u-form/u-form.vue @@ -0,0 +1,258 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-gap/gap.js b/uni_modules/uview-plus/components/u-gap/gap.js new file mode 100644 index 0000000..60a21af --- /dev/null +++ b/uni_modules/uview-plus/components/u-gap/gap.js @@ -0,0 +1,19 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:05:25 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/gap.js + */ +export default { + // gap组件 + gap: { + bgColor: 'transparent', + height: 20, + marginTop: 0, + marginBottom: 0, + customStyle: {} + } +} diff --git a/uni_modules/uview-plus/components/u-gap/props.js b/uni_modules/uview-plus/components/u-gap/props.js new file mode 100644 index 0000000..77b1d7c --- /dev/null +++ b/uni_modules/uview-plus/components/u-gap/props.js @@ -0,0 +1,26 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 背景颜色(默认transparent) + bgColor: { + type: String, + default: () => defProps.gap.bgColor + }, + // 分割槽高度,单位px(默认30) + height: { + type: [String, Number], + default: () => defProps.gap.height + }, + // 与上一个组件的距离 + marginTop: { + type: [String, Number], + default: () => defProps.gap.marginTop + }, + // 与下一个组件的距离 + marginBottom: { + type: [String, Number], + default: () => defProps.gap.marginBottom + } + } +}) diff --git a/uni_modules/uview-plus/components/u-gap/u-gap.vue b/uni_modules/uview-plus/components/u-gap/u-gap.vue new file mode 100644 index 0000000..5ed32d3 --- /dev/null +++ b/uni_modules/uview-plus/components/u-gap/u-gap.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-grid-item/gridItem.js b/uni_modules/uview-plus/components/u-grid-item/gridItem.js new file mode 100644 index 0000000..1b747f4 --- /dev/null +++ b/uni_modules/uview-plus/components/u-grid-item/gridItem.js @@ -0,0 +1,16 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:06:13 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/gridItem.js + */ +export default { + // grid-item组件 + gridItem: { + name: null, + bgColor: 'transparent' + } +} diff --git a/uni_modules/uview-plus/components/u-grid-item/props.js b/uni_modules/uview-plus/components/u-grid-item/props.js new file mode 100644 index 0000000..55f957c --- /dev/null +++ b/uni_modules/uview-plus/components/u-grid-item/props.js @@ -0,0 +1,16 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 宫格的name + name: { + type: [String, Number, null], + default: () => defProps.gridItem.name + }, + // 背景颜色 + bgColor: { + type: String, + default: () => defProps.gridItem.bgColor + } + } +}) diff --git a/uni_modules/uview-plus/components/u-grid-item/u-grid-item.vue b/uni_modules/uview-plus/components/u-grid-item/u-grid-item.vue new file mode 100644 index 0000000..65c320e --- /dev/null +++ b/uni_modules/uview-plus/components/u-grid-item/u-grid-item.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-grid/grid.js b/uni_modules/uview-plus/components/u-grid/grid.js new file mode 100644 index 0000000..60abeb7 --- /dev/null +++ b/uni_modules/uview-plus/components/u-grid/grid.js @@ -0,0 +1,17 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:05:57 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/grid.js + */ +export default { + // grid组件 + grid: { + col: 3, + border: false, + align: 'left' + } +} diff --git a/uni_modules/uview-plus/components/u-grid/props.js b/uni_modules/uview-plus/components/u-grid/props.js new file mode 100644 index 0000000..506baf7 --- /dev/null +++ b/uni_modules/uview-plus/components/u-grid/props.js @@ -0,0 +1,26 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 分成几列 + col: { + type: [String, Number], + default: () => defProps.grid.col + }, + // 是否显示边框 + border: { + type: Boolean, + default: () => defProps.grid.border + }, + // 宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右 + align: { + type: String, + default: () => defProps.grid.align + }, + // 间隔 + gap: { + type: String, + default: '0px' + } + } +}) diff --git a/uni_modules/uview-plus/components/u-grid/u-grid.vue b/uni_modules/uview-plus/components/u-grid/u-grid.vue new file mode 100644 index 0000000..31a0a78 --- /dev/null +++ b/uni_modules/uview-plus/components/u-grid/u-grid.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-icon/icon.js b/uni_modules/uview-plus/components/u-icon/icon.js new file mode 100644 index 0000000..86910f7 --- /dev/null +++ b/uni_modules/uview-plus/components/u-icon/icon.js @@ -0,0 +1,36 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 18:00:14 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/icon.js + */ +import config from '../../libs/config/config' + +const { + color +} = config +export default { + // icon组件 + icon: { + name: '', + color: color['u-content-color'], + size: '16px', + bold: false, + index: '', + hoverClass: '', + customPrefix: 'uicon', + label: '', + labelPos: 'right', + labelSize: '15px', + labelColor: color['u-content-color'], + space: '3px', + imgMode: '', + width: '', + height: '', + top: 0, + stop: false + } +} diff --git a/uni_modules/uview-plus/components/u-icon/icons.js b/uni_modules/uview-plus/components/u-icon/icons.js new file mode 100644 index 0000000..f4d0fe2 --- /dev/null +++ b/uni_modules/uview-plus/components/u-icon/icons.js @@ -0,0 +1,214 @@ +export default { + 'uicon-level': '\ue693', + 'uicon-column-line': '\ue68e', + 'uicon-checkbox-mark': '\ue807', + 'uicon-folder': '\ue7f5', + 'uicon-movie': '\ue7f6', + 'uicon-star-fill': '\ue669', + 'uicon-star': '\ue65f', + 'uicon-phone-fill': '\ue64f', + 'uicon-phone': '\ue622', + 'uicon-apple-fill': '\ue881', + 'uicon-chrome-circle-fill': '\ue885', + 'uicon-backspace': '\ue67b', + 'uicon-attach': '\ue632', + 'uicon-cut': '\ue948', + 'uicon-empty-car': '\ue602', + 'uicon-empty-coupon': '\ue682', + 'uicon-empty-address': '\ue646', + 'uicon-empty-favor': '\ue67c', + 'uicon-empty-permission': '\ue686', + 'uicon-empty-news': '\ue687', + 'uicon-empty-search': '\ue664', + 'uicon-github-circle-fill': '\ue887', + 'uicon-rmb': '\ue608', + 'uicon-person-delete-fill': '\ue66a', + 'uicon-reload': '\ue788', + 'uicon-order': '\ue68f', + 'uicon-server-man': '\ue6bc', + 'uicon-search': '\ue62a', + 'uicon-fingerprint': '\ue955', + 'uicon-more-dot-fill': '\ue630', + 'uicon-scan': '\ue662', + 'uicon-share-square': '\ue60b', + 'uicon-map': '\ue61d', + 'uicon-map-fill': '\ue64e', + 'uicon-tags': '\ue629', + 'uicon-tags-fill': '\ue651', + 'uicon-bookmark-fill': '\ue63b', + 'uicon-bookmark': '\ue60a', + 'uicon-eye': '\ue613', + 'uicon-eye-fill': '\ue641', + 'uicon-mic': '\ue64a', + 'uicon-mic-off': '\ue649', + 'uicon-calendar': '\ue66e', + 'uicon-calendar-fill': '\ue634', + 'uicon-trash': '\ue623', + 'uicon-trash-fill': '\ue658', + 'uicon-play-left': '\ue66d', + 'uicon-play-right': '\ue610', + 'uicon-minus': '\ue618', + 'uicon-plus': '\ue62d', + 'uicon-info': '\ue653', + 'uicon-info-circle': '\ue7d2', + 'uicon-info-circle-fill': '\ue64b', + 'uicon-question': '\ue715', + 'uicon-error': '\ue6d3', + 'uicon-close': '\ue685', + 'uicon-checkmark': '\ue6a8', + 'uicon-android-circle-fill': '\ue67e', + 'uicon-android-fill': '\ue67d', + 'uicon-ie': '\ue87b', + 'uicon-IE-circle-fill': '\ue889', + 'uicon-google': '\ue87a', + 'uicon-google-circle-fill': '\ue88a', + 'uicon-setting-fill': '\ue872', + 'uicon-setting': '\ue61f', + 'uicon-minus-square-fill': '\ue855', + 'uicon-plus-square-fill': '\ue856', + 'uicon-heart': '\ue7df', + 'uicon-heart-fill': '\ue851', + 'uicon-camera': '\ue7d7', + 'uicon-camera-fill': '\ue870', + 'uicon-more-circle': '\ue63e', + 'uicon-more-circle-fill': '\ue645', + 'uicon-chat': '\ue620', + 'uicon-chat-fill': '\ue61e', + 'uicon-bag-fill': '\ue617', + 'uicon-bag': '\ue619', + 'uicon-error-circle-fill': '\ue62c', + 'uicon-error-circle': '\ue624', + 'uicon-close-circle': '\ue63f', + 'uicon-close-circle-fill': '\ue637', + 'uicon-checkmark-circle': '\ue63d', + 'uicon-checkmark-circle-fill': '\ue635', + 'uicon-question-circle-fill': '\ue666', + 'uicon-question-circle': '\ue625', + 'uicon-share': '\ue631', + 'uicon-share-fill': '\ue65e', + 'uicon-shopping-cart': '\ue621', + 'uicon-shopping-cart-fill': '\ue65d', + 'uicon-bell': '\ue609', + 'uicon-bell-fill': '\ue640', + 'uicon-list': '\ue650', + 'uicon-list-dot': '\ue616', + 'uicon-zhihu': '\ue6ba', + 'uicon-zhihu-circle-fill': '\ue709', + 'uicon-zhifubao': '\ue6b9', + 'uicon-zhifubao-circle-fill': '\ue6b8', + 'uicon-weixin-circle-fill': '\ue6b1', + 'uicon-weixin-fill': '\ue6b2', + 'uicon-twitter-circle-fill': '\ue6ab', + 'uicon-twitter': '\ue6aa', + 'uicon-taobao-circle-fill': '\ue6a7', + 'uicon-taobao': '\ue6a6', + 'uicon-weibo-circle-fill': '\ue6a5', + 'uicon-weibo': '\ue6a4', + 'uicon-qq-fill': '\ue6a1', + 'uicon-qq-circle-fill': '\ue6a0', + 'uicon-moments-circel-fill': '\ue69a', + 'uicon-moments': '\ue69b', + 'uicon-qzone': '\ue695', + 'uicon-qzone-circle-fill': '\ue696', + 'uicon-baidu-circle-fill': '\ue680', + 'uicon-baidu': '\ue681', + 'uicon-facebook-circle-fill': '\ue68a', + 'uicon-facebook': '\ue689', + 'uicon-car': '\ue60c', + 'uicon-car-fill': '\ue636', + 'uicon-warning-fill': '\ue64d', + 'uicon-warning': '\ue694', + 'uicon-clock-fill': '\ue638', + 'uicon-clock': '\ue60f', + 'uicon-edit-pen': '\ue612', + 'uicon-edit-pen-fill': '\ue66b', + 'uicon-email': '\ue611', + 'uicon-email-fill': '\ue642', + 'uicon-minus-circle': '\ue61b', + 'uicon-minus-circle-fill': '\ue652', + 'uicon-plus-circle': '\ue62e', + 'uicon-plus-circle-fill': '\ue661', + 'uicon-file-text': '\ue663', + 'uicon-file-text-fill': '\ue665', + 'uicon-pushpin': '\ue7e3', + 'uicon-pushpin-fill': '\ue86e', + 'uicon-grid': '\ue673', + 'uicon-grid-fill': '\ue678', + 'uicon-play-circle': '\ue647', + 'uicon-play-circle-fill': '\ue655', + 'uicon-pause-circle-fill': '\ue654', + 'uicon-pause': '\ue8fa', + 'uicon-pause-circle': '\ue643', + 'uicon-eye-off': '\ue648', + 'uicon-eye-off-outline': '\ue62b', + 'uicon-gift-fill': '\ue65c', + 'uicon-gift': '\ue65b', + 'uicon-rmb-circle-fill': '\ue657', + 'uicon-rmb-circle': '\ue677', + 'uicon-kefu-ermai': '\ue656', + 'uicon-server-fill': '\ue751', + 'uicon-coupon-fill': '\ue8c4', + 'uicon-coupon': '\ue8ae', + 'uicon-integral': '\ue704', + 'uicon-integral-fill': '\ue703', + 'uicon-home-fill': '\ue964', + 'uicon-home': '\ue965', + 'uicon-hourglass-half-fill': '\ue966', + 'uicon-hourglass': '\ue967', + 'uicon-account': '\ue628', + 'uicon-plus-people-fill': '\ue626', + 'uicon-minus-people-fill': '\ue615', + 'uicon-account-fill': '\ue614', + 'uicon-thumb-down-fill': '\ue726', + 'uicon-thumb-down': '\ue727', + 'uicon-thumb-up': '\ue733', + 'uicon-thumb-up-fill': '\ue72f', + 'uicon-lock-fill': '\ue979', + 'uicon-lock-open': '\ue973', + 'uicon-lock-opened-fill': '\ue974', + 'uicon-lock': '\ue97a', + 'uicon-red-packet-fill': '\ue690', + 'uicon-photo-fill': '\ue98b', + 'uicon-photo': '\ue98d', + 'uicon-volume-off-fill': '\ue659', + 'uicon-volume-off': '\ue644', + 'uicon-volume-fill': '\ue670', + 'uicon-volume': '\ue633', + 'uicon-red-packet': '\ue691', + 'uicon-download': '\ue63c', + 'uicon-arrow-up-fill': '\ue6b0', + 'uicon-arrow-down-fill': '\ue600', + 'uicon-play-left-fill': '\ue675', + 'uicon-play-right-fill': '\ue676', + 'uicon-rewind-left-fill': '\ue679', + 'uicon-rewind-right-fill': '\ue67a', + 'uicon-arrow-downward': '\ue604', + 'uicon-arrow-leftward': '\ue601', + 'uicon-arrow-rightward': '\ue603', + 'uicon-arrow-upward': '\ue607', + 'uicon-arrow-down': '\ue60d', + 'uicon-arrow-right': '\ue605', + 'uicon-arrow-left': '\ue60e', + 'uicon-arrow-up': '\ue606', + 'uicon-skip-back-left': '\ue674', + 'uicon-skip-forward-right': '\ue672', + 'uicon-rewind-right': '\ue66f', + 'uicon-rewind-left': '\ue671', + 'uicon-arrow-right-double': '\ue68d', + 'uicon-arrow-left-double': '\ue68c', + 'uicon-wifi-off': '\ue668', + 'uicon-wifi': '\ue667', + 'uicon-empty-data': '\ue62f', + 'uicon-empty-history': '\ue684', + 'uicon-empty-list': '\ue68b', + 'uicon-empty-page': '\ue627', + 'uicon-empty-order': '\ue639', + 'uicon-man': '\ue697', + 'uicon-woman': '\ue69c', + 'uicon-man-add': '\ue61c', + 'uicon-man-add-fill': '\ue64c', + 'uicon-man-delete': '\ue61a', + 'uicon-man-delete-fill': '\ue66a', + 'uicon-zh': '\ue70a', + 'uicon-en': '\ue692' +} diff --git a/uni_modules/uview-plus/components/u-icon/props.js b/uni_modules/uview-plus/components/u-icon/props.js new file mode 100644 index 0000000..d5bdfdb --- /dev/null +++ b/uni_modules/uview-plus/components/u-icon/props.js @@ -0,0 +1,91 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 图标类名 + name: { + type: String, + default: () => defProps.icon.name + }, + // 图标颜色,可接受主题色 + color: { + type: String, + default: () => defProps.icon.color + }, + // 字体大小,单位px + size: { + type: [String, Number], + default: () => defProps.icon.size + }, + // 是否显示粗体 + bold: { + type: Boolean, + default: () => defProps.icon.bold + }, + // 点击图标的时候传递事件出去的index(用于区分点击了哪一个) + index: { + type: [String, Number], + default: () => defProps.icon.index + }, + // 触摸图标时的类名 + hoverClass: { + type: String, + default: () => defProps.icon.hoverClass + }, + // 自定义扩展前缀,方便用户扩展自己的图标库 + customPrefix: { + type: String, + default: () => defProps.icon.customPrefix + }, + // 图标右边或者下面的文字 + label: { + type: [String, Number], + default: () => defProps.icon.label + }, + // label的位置,只能右边或者下边 + labelPos: { + type: String, + default: () => defProps.icon.labelPos + }, + // label的大小 + labelSize: { + type: [String, Number], + default: () => defProps.icon.labelSize + }, + // label的颜色 + labelColor: { + type: String, + default: () => defProps.icon.labelColor + }, + // label与图标的距离 + space: { + type: [String, Number], + default: () => defProps.icon.space + }, + // 图片的mode + imgMode: { + type: String, + default: () => defProps.icon.imgMode + }, + // 用于显示图片小图标时,图片的宽度 + width: { + type: [String, Number], + default: () => defProps.icon.width + }, + // 用于显示图片小图标时,图片的高度 + height: { + type: [String, Number], + default: () => defProps.icon.height + }, + // 用于解决某些情况下,让图标垂直居中的用途 + top: { + type: [String, Number], + default: () => defProps.icon.top + }, + // 是否阻止事件传播 + stop: { + type: Boolean, + default: () => defProps.icon.stop + } + } +}) diff --git a/uni_modules/uview-plus/components/u-icon/u-icon.vue b/uni_modules/uview-plus/components/u-icon/u-icon.vue new file mode 100644 index 0000000..b7b24bd --- /dev/null +++ b/uni_modules/uview-plus/components/u-icon/u-icon.vue @@ -0,0 +1,238 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-icon/util.js b/uni_modules/uview-plus/components/u-icon/util.js new file mode 100644 index 0000000..907f8dd --- /dev/null +++ b/uni_modules/uview-plus/components/u-icon/util.js @@ -0,0 +1,68 @@ +import config from '../../libs/config/config'; + +let params = { + loaded: false +}; +// 加载字体方法 +const loadFont = () => { + // console.log('加载字体图标'); + // 全局加载不稳定,默认关闭,需要开启可以配置loadFontOnce。 + if (config.loadFontOnce) { + params.loaded = true; + } + // #ifdef APP-NVUE + // nvue通过weex的dom模块引入字体,相关文档地址如下: + // https://weex.apache.org/zh/docs/modules/dom.html#addrule + const domModule = weex.requireModule('dom'); + domModule.addRule('fontFace', { + 'fontFamily': "uicon-iconfont", + 'src': `url('${config.iconUrl}')` + }); + if (config.customIcon.family) { + domModule.addRule('fontFace', { + 'fontFamily': config.customIcon.family, + 'src': `url('${config.customIcon.url}')` + }); + } + // #endif + // #ifdef APP || H5 || MP-WEIXIN || MP-ALIPAY + uni.loadFontFace({ + global: true, // 是否全局生效。微信小程序 '2.10.0'起支持全局生效,需在 app.vue 中调用。 + family: 'uicon-iconfont', + source: 'url("' + config.iconUrl + '")', + success() { + // console.log('内置字体图标加载成功'); + }, + fail() { + // console.error('内置字体图标加载出错'); + } + }); + if (config.customIcon.family) { + uni.loadFontFace({ + global: true, // 是否全局生效。微信小程序 '2.10.0'起支持全局生效,需在 app.vue 中调用。 + family: config.customIcon.family, + source: 'url("' + config.customIcon.url + '")', + success() { + // console.log('扩展字体图标加载成功'); + }, + fail() { + // console.error('扩展字体图标加载出错'); + } + }); + } + // #endif + // #ifdef APP-NVUE + // if (this.customFontFamily) { + // domModule.addRule('fontFace', { + // 'fontFamily': `${this.customPrefix}-${this.customFontFamily}`, + // 'src': `url('${this.customFontUrl}')` + // }) + // } + // #endif + return true; +}; + +export default { + params: params, + loadFont +} diff --git a/uni_modules/uview-plus/components/u-image/image.js b/uni_modules/uview-plus/components/u-image/image.js new file mode 100644 index 0000000..2552db6 --- /dev/null +++ b/uni_modules/uview-plus/components/u-image/image.js @@ -0,0 +1,30 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:01:51 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/image.js + */ +export default { + // image组件 + image: { + src: '', + mode: 'aspectFill', + width: '300', + height: '225', + shape: 'square', + radius: 0, + lazyLoad: true, + showMenuByLongpress: true, + loadingIcon: 'photo', + errorIcon: 'error-circle', + showLoading: true, + showError: true, + fade: true, + webp: false, + duration: 500, + bgColor: '#f3f4f6' + } +} diff --git a/uni_modules/uview-plus/components/u-image/props.js b/uni_modules/uview-plus/components/u-image/props.js new file mode 100644 index 0000000..71bc6db --- /dev/null +++ b/uni_modules/uview-plus/components/u-image/props.js @@ -0,0 +1,86 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 图片地址 + src: { + type: String, + default: () => defProps.image.src + }, + // 裁剪模式 + mode: { + type: String, + default: () => defProps.image.mode + }, + // 宽度,单位任意 + width: { + type: [String, Number], + default: () => defProps.image.width + }, + // 高度,单位任意 + height: { + type: [String, Number], + default: () => defProps.image.height + }, + // 图片形状,circle-圆形,square-方形 + shape: { + type: String, + default: () => defProps.image.shape + }, + // 圆角,单位任意 + radius: { + type: [String, Number], + default: () => defProps.image.radius + }, + // 是否懒加载,微信小程序、App、百度小程序、字节跳动小程序 + lazyLoad: { + type: Boolean, + default: () => defProps.image.lazyLoad + }, + // 开启长按图片显示识别微信小程序码菜单 + showMenuByLongpress: { + type: Boolean, + default: () => defProps.image.showMenuByLongpress + }, + // 加载中的图标,或者小图片 + loadingIcon: { + type: String, + default: () => defProps.image.loadingIcon + }, + // 加载失败的图标,或者小图片 + errorIcon: { + type: String, + default: () => defProps.image.errorIcon + }, + // 是否显示加载中的图标或者自定义的slot + showLoading: { + type: Boolean, + default: () => defProps.image.showLoading + }, + // 是否显示加载错误的图标或者自定义的slot + showError: { + type: Boolean, + default: () => defProps.image.showError + }, + // 是否需要淡入效果 + fade: { + type: Boolean, + default: () => defProps.image.fade + }, + // 只支持网络资源,只对微信小程序有效 + webp: { + type: Boolean, + default: () => defProps.image.webp + }, + // 过渡时间,单位ms + duration: { + type: [String, Number], + default: () => defProps.image.duration + }, + // 背景颜色,用于深色页面加载图片时,为了和背景色融合 + bgColor: { + type: String, + default: () => defProps.image.bgColor + } + } +}) diff --git a/uni_modules/uview-plus/components/u-image/u-image.vue b/uni_modules/uview-plus/components/u-image/u-image.vue new file mode 100644 index 0000000..24e3b10 --- /dev/null +++ b/uni_modules/uview-plus/components/u-image/u-image.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-index-anchor/indexAnchor.js b/uni_modules/uview-plus/components/u-index-anchor/indexAnchor.js new file mode 100644 index 0000000..208a79c --- /dev/null +++ b/uni_modules/uview-plus/components/u-index-anchor/indexAnchor.js @@ -0,0 +1,19 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:13:15 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/indexAnchor.js + */ +export default { + // indexAnchor 组件 + indexAnchor: { + text: '', + color: '#606266', + size: 14, + bgColor: '#f1f1f1', + height: 32 + } +} diff --git a/uni_modules/uview-plus/components/u-index-anchor/props.js b/uni_modules/uview-plus/components/u-index-anchor/props.js new file mode 100644 index 0000000..f07e407 --- /dev/null +++ b/uni_modules/uview-plus/components/u-index-anchor/props.js @@ -0,0 +1,31 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 列表锚点文本内容 + text: { + type: [String, Number], + default: () => defProps.indexAnchor.text + }, + // 列表锚点文字颜色 + color: { + type: String, + default: () => defProps.indexAnchor.color + }, + // 列表锚点文字大小,单位默认px + size: { + type: [String, Number], + default: () => defProps.indexAnchor.size + }, + // 列表锚点背景颜色 + bgColor: { + type: String, + default: () => defProps.indexAnchor.bgColor + }, + // 列表锚点高度,单位默认px + height: { + type: [String, Number], + default: () => defProps.indexAnchor.height + } + } +}) diff --git a/uni_modules/uview-plus/components/u-index-anchor/u-index-anchor.vue b/uni_modules/uview-plus/components/u-index-anchor/u-index-anchor.vue new file mode 100644 index 0000000..4044d53 --- /dev/null +++ b/uni_modules/uview-plus/components/u-index-anchor/u-index-anchor.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-index-item/props.js b/uni_modules/uview-plus/components/u-index-item/props.js new file mode 100644 index 0000000..3461f1e --- /dev/null +++ b/uni_modules/uview-plus/components/u-index-item/props.js @@ -0,0 +1,8 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + + } +}) diff --git a/uni_modules/uview-plus/components/u-index-item/u-index-item.vue b/uni_modules/uview-plus/components/u-index-item/u-index-item.vue new file mode 100644 index 0000000..5d9346a --- /dev/null +++ b/uni_modules/uview-plus/components/u-index-item/u-index-item.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-index-list/indexList.js b/uni_modules/uview-plus/components/u-index-list/indexList.js new file mode 100644 index 0000000..4f31b37 --- /dev/null +++ b/uni_modules/uview-plus/components/u-index-list/indexList.js @@ -0,0 +1,20 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:13:35 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/indexList.js + */ +export default { + // indexList 组件 + indexList: { + inactiveColor: '#606266', + activeColor: '#5677fc', + indexList: [], + sticky: true, + customNavHeight: 0, + safeBottomFix: false + } +} diff --git a/uni_modules/uview-plus/components/u-index-list/props.js b/uni_modules/uview-plus/components/u-index-list/props.js new file mode 100644 index 0000000..46a1fba --- /dev/null +++ b/uni_modules/uview-plus/components/u-index-list/props.js @@ -0,0 +1,36 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 右边锚点非激活的颜色 + inactiveColor: { + type: String, + default: () => defProps.indexList.inactiveColor + }, + // 右边锚点激活的颜色 + activeColor: { + type: String, + default: () => defProps.indexList.activeColor + }, + // 索引字符列表,数组形式 + indexList: { + type: Array, + default: () => defProps.indexList.indexList + }, + // 是否开启锚点自动吸顶 + sticky: { + type: Boolean, + default: () => defProps.indexList.sticky + }, + // 自定义导航栏的高度 + customNavHeight: { + type: [String, Number], + default: () => defProps.indexList.customNavHeight + }, + // 是否开启底部安全距离适配 + safeBottomFix: { + type: Boolean, + default: () => defProps.indexList.safeBottomFix + }, + } +}) diff --git a/uni_modules/uview-plus/components/u-index-list/u-index-list.vue b/uni_modules/uview-plus/components/u-index-list/u-index-list.vue new file mode 100644 index 0000000..1f4f15b --- /dev/null +++ b/uni_modules/uview-plus/components/u-index-list/u-index-list.vue @@ -0,0 +1,593 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-input/input.js b/uni_modules/uview-plus/components/u-input/input.js new file mode 100644 index 0000000..6897e22 --- /dev/null +++ b/uni_modules/uview-plus/components/u-input/input.js @@ -0,0 +1,49 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:13:55 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/input.js + */ +export default { + // index 组件 + input: { + value: '', + type: 'text', + fixed: false, + disabled: false, + disabledColor: '#f5f7fa', + clearable: false, + password: false, + maxlength: 140, + placeholder: null, + placeholderClass: 'input-placeholder', + placeholderStyle: 'color: #c0c4cc', + showWordLimit: false, + confirmType: 'done', + confirmHold: false, + holdKeyboard: false, + focus: false, + autoBlur: false, + disableDefaultPadding: false, + cursor: -1, + cursorSpacing: 30, + selectionStart: -1, + selectionEnd: -1, + adjustPosition: true, + inputAlign: 'left', + fontSize: '15px', + color: '#303133', + prefixIcon: '', + prefixIconStyle: '', + suffixIcon: '', + suffixIconStyle: '', + border: 'surround', + readonly: false, + shape: 'square', + formatter: null, + cursorColor: '' + } +} diff --git a/uni_modules/uview-plus/components/u-input/props.js b/uni_modules/uview-plus/components/u-input/props.js new file mode 100644 index 0000000..794de95 --- /dev/null +++ b/uni_modules/uview-plus/components/u-input/props.js @@ -0,0 +1,203 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + // #ifdef VUE3 + // 绑定的值 + modelValue: { + type: [String, Number], + default: () => defProps.input.value + }, + // #endif + // #ifdef VUE2 + // 绑定的值 + value: { + type: [String, Number], + default: () => defProps.input.value + }, + // #endif + // number-数字输入键盘,app-vue下可以输入浮点数,app-nvue和小程序平台下只能输入整数 + // idcard-身份证输入键盘,微信、支付宝、百度、QQ小程序 + // digit-带小数点的数字键盘,App的nvue页面、微信、支付宝、百度、头条、QQ小程序 + // text-文本输入键盘 + type: { + type: String, + default: () => defProps.input.type + }, + // 如果 textarea 是在一个 position:fixed 的区域,需要显示指定属性 fixed 为 true, + // 兼容性:微信小程序、百度小程序、字节跳动小程序、QQ小程序 + fixed: { + type: Boolean, + default: () => defProps.input.fixed + }, + // 是否禁用输入框 + disabled: { + type: Boolean, + default: () => defProps.input.disabled + }, + // 禁用状态时的背景色 + disabledColor: { + type: String, + default: () => defProps.input.disabledColor + }, + // 是否显示清除控件 + clearable: { + type: Boolean, + default: () => defProps.input.clearable + }, + // 是否密码类型 + password: { + type: Boolean, + default: () => defProps.input.password + }, + // 最大输入长度,设置为 -1 的时候不限制最大长度 + maxlength: { + type: [String, Number], + default: () => defProps.input.maxlength + }, + // 输入框为空时的占位符 + placeholder: { + type: String, + default: () => defProps.input.placeholder + }, + // 指定placeholder的样式类,注意页面或组件的style中写了scoped时,需要在类名前写/deep/ + placeholderClass: { + type: String, + default: () => defProps.input.placeholderClass + }, + // 指定placeholder的样式 + placeholderStyle: { + type: [String, Object], + default: () => defProps.input.placeholderStyle + }, + // 是否显示输入字数统计,只在 type ="text"或type ="textarea"时有效 + showWordLimit: { + type: Boolean, + default: () => defProps.input.showWordLimit + }, + // 设置右下角按钮的文字,有效值:send|search|next|go|done,兼容性详见uni-app文档 + // https://uniapp.dcloud.io/component/input + // https://uniapp.dcloud.io/component/textarea + confirmType: { + type: String, + default: () => defProps.input.confirmType + }, + // 点击键盘右下角按钮时是否保持键盘不收起,H5无效 + confirmHold: { + type: Boolean, + default: () => defProps.input.confirmHold + }, + // focus时,点击页面的时候不收起键盘,微信小程序有效 + holdKeyboard: { + type: Boolean, + default: () => defProps.input.holdKeyboard + }, + // 自动获取焦点 + // 在 H5 平台能否聚焦以及软键盘是否跟随弹出,取决于当前浏览器本身的实现。nvue 页面不支持,需使用组件的 focus()、blur() 方法控制焦点 + focus: { + type: Boolean, + default: () => defProps.input.focus + }, + // 键盘收起时,是否自动失去焦点,目前仅App3.0.0+有效 + autoBlur: { + type: Boolean, + default: () => defProps.input.autoBlur + }, + // 是否去掉 iOS 下的默认内边距,仅微信小程序,且type=textarea时有效 + disableDefaultPadding: { + type: Boolean, + default: () => defProps.input.disableDefaultPadding + }, + // 指定focus时光标的位置 + cursor: { + type: [String, Number], + default: () => defProps.input.cursor + }, + // 输入框聚焦时底部与键盘的距离 + cursorSpacing: { + type: [String, Number], + default: () => defProps.input.cursorSpacing + }, + // 光标起始位置,自动聚集时有效,需与selection-end搭配使用 + selectionStart: { + type: [String, Number], + default: () => defProps.input.selectionStart + }, + // 光标结束位置,自动聚集时有效,需与selection-start搭配使用 + selectionEnd: { + type: [String, Number], + default: () => defProps.input.selectionEnd + }, + // 键盘弹起时,是否自动上推页面 + adjustPosition: { + type: Boolean, + default: () => defProps.input.adjustPosition + }, + // 输入框内容对齐方式,可选值为:left|center|right + inputAlign: { + type: String, + default: () => defProps.input.inputAlign + }, + // 输入框字体的大小 + fontSize: { + type: [String, Number], + default: () => defProps.input.fontSize + }, + // 输入框字体颜色 + color: { + type: String, + default: () => defProps.input.color + }, + // 输入框前置图标 + prefixIcon: { + type: String, + default: () => defProps.input.prefixIcon + }, + // 前置图标样式,对象或字符串 + prefixIconStyle: { + type: [String, Object], + default: () => defProps.input.prefixIconStyle + }, + // 输入框后置图标 + suffixIcon: { + type: String, + default: () => defProps.input.suffixIcon + }, + // 后置图标样式,对象或字符串 + suffixIconStyle: { + type: [String, Object], + default: () => defProps.input.suffixIconStyle + }, + // 边框类型,surround-四周边框,bottom-底部边框,none-无边框 + border: { + type: String, + default: () => defProps.input.border + }, + // 是否只读,与disabled不同之处在于disabled会置灰组件,而readonly则不会 + readonly: { + type: Boolean, + default: () => defProps.input.readonly + }, + // 输入框形状,circle-圆形,square-方形 + shape: { + type: String, + default: () => defProps.input.shape + }, + // 用于处理或者过滤输入框内容的方法 + formatter: { + type: [Function, null], + default: () => defProps.input.formatter + }, + // 是否忽略组件内对文本合成系统事件的处理 + ignoreCompositionEvent: { + type: Boolean, + default: true + }, + // 光标颜色 + cursorColor: { + type: String, + default: () => defProps.input.cursorColor + }, + } +}) diff --git a/uni_modules/uview-plus/components/u-input/u-input.vue b/uni_modules/uview-plus/components/u-input/u-input.vue new file mode 100644 index 0000000..8baaa2c --- /dev/null +++ b/uni_modules/uview-plus/components/u-input/u-input.vue @@ -0,0 +1,401 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-keyboard/keyboard.js b/uni_modules/uview-plus/components/u-keyboard/keyboard.js new file mode 100644 index 0000000..57182bd --- /dev/null +++ b/uni_modules/uview-plus/components/u-keyboard/keyboard.js @@ -0,0 +1,30 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:07:49 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/keyboard.js + */ +export default { + // 键盘组件 + keyboard: { + mode: 'number', + dotDisabled: false, + tooltip: true, + showTips: true, + tips: '', + showCancel: true, + showConfirm: true, + random: false, + safeAreaInsetBottom: true, + closeOnClickOverlay: true, + show: false, + overlay: true, + zIndex: 10075, + cancelText: '取消', + confirmText: '确定', + autoChange: false + } +} diff --git a/uni_modules/uview-plus/components/u-keyboard/props.js b/uni_modules/uview-plus/components/u-keyboard/props.js new file mode 100644 index 0000000..8c5d8ae --- /dev/null +++ b/uni_modules/uview-plus/components/u-keyboard/props.js @@ -0,0 +1,86 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘,car-车牌号键盘 + mode: { + type: String, + default: () => defProps.keyboard.mode + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: () => defProps.keyboard.dotDisabled + }, + // 是否显示顶部工具条 + tooltip: { + type: Boolean, + default: () => defProps.keyboard.tooltip + }, + // 是否显示工具条中间的提示 + showTips: { + type: Boolean, + default: () => defProps.keyboard.showTips + }, + // 工具条中间的提示文字 + tips: { + type: String, + default: () => defProps.keyboard.tips + }, + // 是否显示工具条左边的"取消"按钮 + showCancel: { + type: Boolean, + default: () => defProps.keyboard.showCancel + }, + // 是否显示工具条右边的"完成"按钮 + showConfirm: { + type: Boolean, + default: () => defProps.keyboard.showConfirm + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: () => defProps.keyboard.random + }, + // 是否开启底部安全区适配,开启的话,会在iPhoneX机型底部添加一定的内边距 + safeAreaInsetBottom: { + type: Boolean, + default: () => defProps.keyboard.safeAreaInsetBottom + }, + // 是否允许通过点击遮罩关闭键盘 + closeOnClickOverlay: { + type: Boolean, + default: () => defProps.keyboard.closeOnClickOverlay + }, + // 控制键盘的弹出与收起 + show: { + type: Boolean, + default: () => defProps.keyboard.show + }, + // 是否显示遮罩,某些时候数字键盘时,用户希望看到自己的数值,所以可能不想要遮罩 + overlay: { + type: Boolean, + default: () => defProps.keyboard.overlay + }, + // z-index值 + zIndex: { + type: [String, Number], + default: () => defProps.keyboard.zIndex + }, + // 取消按钮的文字 + cancelText: { + type: String, + default: () => defProps.keyboard.cancelText + }, + // 确认按钮的文字 + confirmText: { + type: String, + default: () => defProps.keyboard.confirmText + }, + // 输入一个中文后,是否自动切换到英文 + autoChange: { + type: Boolean, + default: () => defProps.keyboard.autoChange + } + } +}) diff --git a/uni_modules/uview-plus/components/u-keyboard/u-keyboard.vue b/uni_modules/uview-plus/components/u-keyboard/u-keyboard.vue new file mode 100644 index 0000000..1e9658d --- /dev/null +++ b/uni_modules/uview-plus/components/u-keyboard/u-keyboard.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-lazy-load/u-lazy-load.vue b/uni_modules/uview-plus/components/u-lazy-load/u-lazy-load.vue new file mode 100644 index 0000000..bc8cc20 --- /dev/null +++ b/uni_modules/uview-plus/components/u-lazy-load/u-lazy-load.vue @@ -0,0 +1,260 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/uview-plus/components/u-line-progress/lineProgress.js b/uni_modules/uview-plus/components/u-line-progress/lineProgress.js new file mode 100644 index 0000000..51531a6 --- /dev/null +++ b/uni_modules/uview-plus/components/u-line-progress/lineProgress.js @@ -0,0 +1,20 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:14:11 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/lineProgress.js + */ +export default { + // lineProgress 组件 + lineProgress: { + activeColor: '#19be6b', + inactiveColor: '#ececec', + percentage: 0, + showText: true, + height: 12, + fromRight: false, + } +} diff --git a/uni_modules/uview-plus/components/u-line-progress/props.js b/uni_modules/uview-plus/components/u-line-progress/props.js new file mode 100644 index 0000000..2690e29 --- /dev/null +++ b/uni_modules/uview-plus/components/u-line-progress/props.js @@ -0,0 +1,35 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 激活部分的颜色 + activeColor: { + type: String, + default: () => defProps.lineProgress.activeColor + }, + inactiveColor: { + type: String, + default: () => defProps.lineProgress.color + }, + // 进度百分比,数值 + percentage: { + type: [String, Number], + default: () => defProps.lineProgress.inactiveColor + }, + // 是否在进度条内部显示百分比的值 + showText: { + type: Boolean, + default: () => defProps.lineProgress.showText + }, + // 进度条的高度,单位px + height: { + type: [String, Number], + default: () => defProps.lineProgress.height + }, + // 是否从右往左加载 + fromRight: { + type: Boolean, + default: () => defProps.lineProgress.fromRight + } + } +}) diff --git a/uni_modules/uview-plus/components/u-line-progress/u-line-progress.vue b/uni_modules/uview-plus/components/u-line-progress/u-line-progress.vue new file mode 100644 index 0000000..983394a --- /dev/null +++ b/uni_modules/uview-plus/components/u-line-progress/u-line-progress.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-line/line.js b/uni_modules/uview-plus/components/u-line/line.js new file mode 100644 index 0000000..2c87af2 --- /dev/null +++ b/uni_modules/uview-plus/components/u-line/line.js @@ -0,0 +1,20 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:04:49 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/line.js + */ +export default { + // line组件 + line: { + color: '#d6d7d9', + length: '100%', + direction: 'row', + hairline: true, + margin: 0, + dashed: false + } +} diff --git a/uni_modules/uview-plus/components/u-line/props.js b/uni_modules/uview-plus/components/u-line/props.js new file mode 100644 index 0000000..6428d3f --- /dev/null +++ b/uni_modules/uview-plus/components/u-line/props.js @@ -0,0 +1,35 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + color: { + type: String, + default: () => defProps.line.color + }, + // 长度,竖向时表现为高度,横向时表现为长度,可以为百分比,带px单位的值等 + length: { + type: [String, Number], + default: () => defProps.line.length + }, + // 线条方向,col-竖向,row-横向 + direction: { + type: String, + default: () => defProps.line.direction + }, + // 是否显示细边框 + hairline: { + type: Boolean, + default: () => defProps.line.hairline + }, + // 线条与上下左右元素的间距,字符串形式,如"30px"、"20px 30px" + margin: { + type: [String, Number], + default: () => defProps.line.margin + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: () => defProps.line.dashed + } + } +}) diff --git a/uni_modules/uview-plus/components/u-line/u-line.vue b/uni_modules/uview-plus/components/u-line/u-line.vue new file mode 100644 index 0000000..5b3e276 --- /dev/null +++ b/uni_modules/uview-plus/components/u-line/u-line.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-link/link.js b/uni_modules/uview-plus/components/u-link/link.js new file mode 100644 index 0000000..a5d0450 --- /dev/null +++ b/uni_modules/uview-plus/components/u-link/link.js @@ -0,0 +1,26 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:45:36 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/link.js + */ +import config from '../../libs/config/config' + +const { + color +} = config +export default { + // link超链接组件props参数 + link: { + color: color['u-primary'], + fontSize: 15, + underLine: false, + href: '', + mpTips: '链接已复制,请在浏览器打开', + lineColor: '', + text: '' + } +} diff --git a/uni_modules/uview-plus/components/u-link/props.js b/uni_modules/uview-plus/components/u-link/props.js new file mode 100644 index 0000000..d96d824 --- /dev/null +++ b/uni_modules/uview-plus/components/u-link/props.js @@ -0,0 +1,41 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 文字颜色 + color: { + type: String, + default: () => defProps.link.color + }, + // 字体大小,单位px + fontSize: { + type: [String, Number], + default: () => defProps.link.fontSize + }, + // 是否显示下划线 + underLine: { + type: Boolean, + default: () => defProps.link.underLine + }, + // 要跳转的链接 + href: { + type: String, + default: () => defProps.link.href + }, + // 小程序中复制到粘贴板的提示语 + mpTips: { + type: String, + default: () => defProps.link.mpTips + }, + // 下划线颜色 + lineColor: { + type: String, + default: () => defProps.link.lineColor + }, + // 超链接的问题,不使用slot形式传入,是因为nvue下无法修改颜色 + text: { + type: String, + default: () => defProps.link.text + } + } +}) diff --git a/uni_modules/uview-plus/components/u-link/u-link.vue b/uni_modules/uview-plus/components/u-link/u-link.vue new file mode 100644 index 0000000..5462707 --- /dev/null +++ b/uni_modules/uview-plus/components/u-link/u-link.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-list-item/listItem.js b/uni_modules/uview-plus/components/u-list-item/listItem.js new file mode 100644 index 0000000..7fe2166 --- /dev/null +++ b/uni_modules/uview-plus/components/u-list-item/listItem.js @@ -0,0 +1,15 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:15:40 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/listItem.js + */ +export default { + // listItem 组件 + listItem: { + anchor: '' + } +} diff --git a/uni_modules/uview-plus/components/u-list-item/props.js b/uni_modules/uview-plus/components/u-list-item/props.js new file mode 100644 index 0000000..edaa4dc --- /dev/null +++ b/uni_modules/uview-plus/components/u-list-item/props.js @@ -0,0 +1,11 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 用于滚动到指定item + anchor: { + type: [String, Number], + default: () => defProps.listItem.anchor + } + } +}) diff --git a/uni_modules/uview-plus/components/u-list-item/u-list-item.vue b/uni_modules/uview-plus/components/u-list-item/u-list-item.vue new file mode 100644 index 0000000..28ed02a --- /dev/null +++ b/uni_modules/uview-plus/components/u-list-item/u-list-item.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-list/list.js b/uni_modules/uview-plus/components/u-list/list.js new file mode 100644 index 0000000..a830c32 --- /dev/null +++ b/uni_modules/uview-plus/components/u-list/list.js @@ -0,0 +1,28 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:14:53 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/list.js + */ +export default { + // list 组件 + list: { + showScrollbar: false, + lowerThreshold: 50, + upperThreshold: 0, + scrollTop: 0, + offsetAccuracy: 10, + enableFlex: false, + pagingEnabled: false, + scrollable: true, + scrollIntoView: '', + scrollWithAnimation: false, + enableBackToTop: false, + height: 0, + width: 0, + preLoadScreen: 1 + } +} diff --git a/uni_modules/uview-plus/components/u-list/props.js b/uni_modules/uview-plus/components/u-list/props.js new file mode 100644 index 0000000..9fca829 --- /dev/null +++ b/uni_modules/uview-plus/components/u-list/props.js @@ -0,0 +1,101 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 控制是否出现滚动条,仅nvue有效 + showScrollbar: { + type: Boolean, + default: () => defProps.list.showScrollbar + }, + // 距底部多少时触发scrolltolower事件 + lowerThreshold: { + type: [String, Number], + default: () => defProps.list.lowerThreshold + }, + // 距顶部多少时触发scrolltoupper事件,非nvue有效 + upperThreshold: { + type: [String, Number], + default: () => defProps.list.upperThreshold + }, + // 设置竖向滚动条位置 + scrollTop: { + type: [String, Number], + default: () => defProps.list.scrollTop + }, + // 控制 onscroll 事件触发的频率,仅nvue有效 + offsetAccuracy: { + type: [String, Number], + default: () => defProps.list.offsetAccuracy + }, + // 启用 flexbox 布局。开启后,当前节点声明了display: flex就会成为flex container,并作用于其孩子节点,仅微信小程序有效 + enableFlex: { + type: Boolean, + default: () => defProps.list.enableFlex + }, + // 是否按分页模式显示List,默认值false + pagingEnabled: { + type: Boolean, + default: () => defProps.list.pagingEnabled + }, + // 是否允许List滚动 + scrollable: { + type: Boolean, + default: () => defProps.list.scrollable + }, + // 值应为某子元素id(id不能以数字开头) + scrollIntoView: { + type: String, + default: () => defProps.list.scrollIntoView + }, + // 在设置滚动条位置时使用动画过渡 + scrollWithAnimation: { + type: Boolean, + default: () => defProps.list.scrollWithAnimation + }, + // iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只对微信小程序有效 + enableBackToTop: { + type: Boolean, + default: () => defProps.list.enableBackToTop + }, + // 列表的高度 + height: { + type: [String, Number], + default: () => defProps.list.height + }, + // 列表宽度 + width: { + type: [String, Number], + default: () => defProps.list.width + }, + // 列表前后预渲染的屏数,1代表一个屏幕的高度,1.5代表1个半屏幕高度 + preLoadScreen: { + type: [String, Number], + default: () => defProps.list.preLoadScreen + }, + // 开启自定义下拉刷新 + refresherEnabled: { + type: Boolean, + default: () => false + }, + // 设置自定义下拉刷新阈值 + refresherThreshold: { + type: Number, + default: () => 45 + }, + // 设置自定义下拉刷新默认样式,支持设置 black,white,none,none 表示不使用默认样式 + refresherDefaultStyle: { + type: String, + default: () => 'black' + }, + // 设置自定义下拉刷新区域背景颜色 + refresherBackground: { + type: String, + default: () => '#FFF' + }, + // 设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发 + refresherTriggered: { + type: Boolean, + default: () => false + } + } +}) diff --git a/uni_modules/uview-plus/components/u-list/u-list.vue b/uni_modules/uview-plus/components/u-list/u-list.vue new file mode 100644 index 0000000..e8e28e8 --- /dev/null +++ b/uni_modules/uview-plus/components/u-list/u-list.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-loading-icon/loadingIcon.js b/uni_modules/uview-plus/components/u-loading-icon/loadingIcon.js new file mode 100644 index 0000000..56cc3f2 --- /dev/null +++ b/uni_modules/uview-plus/components/u-loading-icon/loadingIcon.js @@ -0,0 +1,30 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:45:47 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/loadingIcon.js + */ +import config from '../../libs/config/config' + +const { + color +} = config +export default { + // loading-icon加载中图标组件 + loadingIcon: { + show: true, + color: color['u-tips-color'], + textColor: color['u-tips-color'], + vertical: false, + mode: 'spinner', + size: 24, + textSize: 15, + text: '', + timingFunction: 'ease-in-out', + duration: 1200, + inactiveColor: '' + } +} diff --git a/uni_modules/uview-plus/components/u-loading-icon/props.js b/uni_modules/uview-plus/components/u-loading-icon/props.js new file mode 100644 index 0000000..6a6abf9 --- /dev/null +++ b/uni_modules/uview-plus/components/u-loading-icon/props.js @@ -0,0 +1,61 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 是否显示组件 + show: { + type: Boolean, + default: () => defProps.loadingIcon.show + }, + // 颜色 + color: { + type: String, + default: () => defProps.loadingIcon.color + }, + // 提示文字颜色 + textColor: { + type: String, + default: () => defProps.loadingIcon.textColor + }, + // 文字和图标是否垂直排列 + vertical: { + type: Boolean, + default: () => defProps.loadingIcon.vertical + }, + // 模式选择,circle-圆形,spinner-花朵形,semicircle-半圆形 + mode: { + type: String, + default: () => defProps.loadingIcon.mode + }, + // 图标大小,单位默认px + size: { + type: [String, Number], + default: () => defProps.loadingIcon.size + }, + // 文字大小 + textSize: { + type: [String, Number], + default: () => defProps.loadingIcon.textSize + }, + // 文字内容 + text: { + type: [String, Number], + default: () => defProps.loadingIcon.text + }, + // 动画模式 + timingFunction: { + type: String, + default: () => defProps.loadingIcon.timingFunction + }, + // 动画执行周期时间 + duration: { + type: [String, Number], + default: () => defProps.loadingIcon.duration + }, + // mode=circle时的暗边颜色 + inactiveColor: { + type: String, + default: () => defProps.loadingIcon.inactiveColor + } + } +}) diff --git a/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue b/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue new file mode 100644 index 0000000..d399d26 --- /dev/null +++ b/uni_modules/uview-plus/components/u-loading-icon/u-loading-icon.vue @@ -0,0 +1,348 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-loading-page/loadingPage.js b/uni_modules/uview-plus/components/u-loading-page/loadingPage.js new file mode 100644 index 0000000..6ed7485 --- /dev/null +++ b/uni_modules/uview-plus/components/u-loading-page/loadingPage.js @@ -0,0 +1,24 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:00:23 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/loadingPage.js + */ +export default { + // loading-page组件 + loadingPage: { + loadingText: '正在加载', + image: '', + loadingMode: 'circle', + loading: false, + bgColor: '#ffffff', + color: '#C8C8C8', + fontSize: 19, + iconSize: 28, + loadingColor: '#C8C8C8', + zIndex: 10 + } +} diff --git a/uni_modules/uview-plus/components/u-loading-page/props.js b/uni_modules/uview-plus/components/u-loading-page/props.js new file mode 100644 index 0000000..185a78f --- /dev/null +++ b/uni_modules/uview-plus/components/u-loading-page/props.js @@ -0,0 +1,57 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + // 提示内容 + loadingText: { + type: [String, Number], + default: () => defProps.loadingPage.loadingText + }, + // 文字上方用于替换loading动画的图片 + image: { + type: String, + default: () => defProps.loadingPage.image + }, + // 加载动画的模式,circle-圆形,spinner-花朵形,semicircle-半圆形 + loadingMode: { + type: String, + default: () => defProps.loadingPage.loadingMode + }, + // 是否加载中 + loading: { + type: Boolean, + default: () => defProps.loadingPage.loading + }, + // 背景色 + bgColor: { + type: String, + default: () => defProps.loadingPage.bgColor + }, + // 文字颜色 + color: { + type: String, + default: () => defProps.loadingPage.color + }, + // 文字大小 + fontSize: { + type: [String, Number], + default: () => defProps.loadingPage.fontSize + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: () => defProps.loadingPage.fontSize + }, + // 加载中图标的颜色,只能rgb或者十六进制颜色值 + loadingColor: { + type: String, + default: () => defProps.loadingPage.loadingColor + }, + // 层级 + zIndex: { + type: [Number], + default: () => defProps.loadingPage.zIndex + }, + } +}) diff --git a/uni_modules/uview-plus/components/u-loading-page/u-loading-page.vue b/uni_modules/uview-plus/components/u-loading-page/u-loading-page.vue new file mode 100644 index 0000000..b878d5b --- /dev/null +++ b/uni_modules/uview-plus/components/u-loading-page/u-loading-page.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-loadmore/loadmore.js b/uni_modules/uview-plus/components/u-loadmore/loadmore.js new file mode 100644 index 0000000..67c1160 --- /dev/null +++ b/uni_modules/uview-plus/components/u-loadmore/loadmore.js @@ -0,0 +1,32 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:15:26 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/loadmore.js + */ +export default { + // loadmore 组件 + loadmore: { + status: 'loadmore', + bgColor: 'transparent', + icon: true, + fontSize: 14, + iconSize: 17, + color: '#606266', + loadingIcon: 'spinner', + loadmoreText: '加载更多', + loadingText: '正在加载...', + nomoreText: '没有更多了', + isDot: false, + iconColor: '#b7b7b7', + marginTop: 10, + marginBottom: 10, + height: 'auto', + line: false, + lineColor: '#E6E8EB', + dashed: false, + } +} diff --git a/uni_modules/uview-plus/components/u-loadmore/props.js b/uni_modules/uview-plus/components/u-loadmore/props.js new file mode 100644 index 0000000..fb78e39 --- /dev/null +++ b/uni_modules/uview-plus/components/u-loadmore/props.js @@ -0,0 +1,96 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 组件状态,loadmore-加载前的状态,loading-加载中的状态,nomore-没有更多的状态 + status: { + type: String, + default: () => defProps.loadmore.status + }, + // 组件背景色 + bgColor: { + type: String, + default: () => defProps.loadmore.bgColor + }, + // 是否显示加载中的图标 + icon: { + type: Boolean, + default: () => defProps.loadmore.icon + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: () => defProps.loadmore.fontSize + }, + // 图标大小 + iconSize: { + type: [String, Number], + default: () => defProps.loadmore.iconSize + }, + // 字体颜色 + color: { + type: String, + default: () => defProps.loadmore.color + }, + // 加载中状态的图标,spinner-花朵状图标,circle-圆圈状,semicircle-半圆 + loadingIcon: { + type: String, + default: () => defProps.loadmore.loadingIcon + }, + // 加载前的提示语 + loadmoreText: { + type: String, + default: () => defProps.loadmore.loadmoreText + }, + // 加载中提示语 + loadingText: { + type: String, + default: () => defProps.loadmore.loadingText + }, + // 没有更多的提示语 + nomoreText: { + type: String, + default: () => defProps.loadmore.nomoreText + }, + // 在“没有更多”状态下,是否显示粗点 + isDot: { + type: Boolean, + default: () => defProps.loadmore.isDot + }, + // 加载中图标的颜色 + iconColor: { + type: String, + default: () => defProps.loadmore.iconColor + }, + // 上边距 + marginTop: { + type: [String, Number], + default: () => defProps.loadmore.marginTop + }, + // 下边距 + marginBottom: { + type: [String, Number], + default: () => defProps.loadmore.marginBottom + }, + // 高度,单位px + height: { + type: [String, Number], + default: () => defProps.loadmore.height + }, + // 是否显示左边分割线 + line: { + type: Boolean, + default: () => defProps.loadmore.line + }, + // 线条颜色 + lineColor: { + type: String, + default: () => defProps.loadmore.lineColor + }, + // 是否虚线,true-虚线,false-实线 + dashed: { + type: Boolean, + default: () => defProps.loadmore.dashed + } + } +}) diff --git a/uni_modules/uview-plus/components/u-loadmore/u-loadmore.vue b/uni_modules/uview-plus/components/u-loadmore/u-loadmore.vue new file mode 100644 index 0000000..13f6b78 --- /dev/null +++ b/uni_modules/uview-plus/components/u-loadmore/u-loadmore.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-message-input/u-message-input.vue b/uni_modules/uview-plus/components/u-message-input/u-message-input.vue new file mode 100644 index 0000000..0da5f1c --- /dev/null +++ b/uni_modules/uview-plus/components/u-message-input/u-message-input.vue @@ -0,0 +1,318 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-modal/modal.js b/uni_modules/uview-plus/components/u-modal/modal.js new file mode 100644 index 0000000..64db018 --- /dev/null +++ b/uni_modules/uview-plus/components/u-modal/modal.js @@ -0,0 +1,35 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:15:59 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/modal.js + */ +export default { + // modal 组件 + modal: { + show: false, + title: '', + content: '', + confirmText: '确认', + cancelText: '取消', + showConfirmButton: true, + showCancelButton: false, + confirmColor: '#2979ff', + cancelColor: '#606266', + buttonReverse: false, + zoom: true, + asyncClose: false, + closeOnClickOverlay: false, + negativeTop: 0, + width: '650rpx', + confirmButtonShape: '', + duration: 400, + contentTextAlign: 'left', + asyncCloseTip: '操作中...', + asyncCancelClose: false, + contentStyle: {} + } +} diff --git a/uni_modules/uview-plus/components/u-modal/props.js b/uni_modules/uview-plus/components/u-modal/props.js new file mode 100644 index 0000000..0f0177b --- /dev/null +++ b/uni_modules/uview-plus/components/u-modal/props.js @@ -0,0 +1,111 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 是否展示modal + show: { + type: Boolean, + default: () => defProps.modal.show + }, + // 标题 + title: { + type: [String], + default: () => defProps.modal.title + }, + // 弹窗内容 + content: { + type: String, + default: () => defProps.modal.content + }, + // 确认文案 + confirmText: { + type: String, + default: () => defProps.modal.confirmText + }, + // 取消文案 + cancelText: { + type: String, + default: () => defProps.modal.cancelText + }, + // 是否显示确认按钮 + showConfirmButton: { + type: Boolean, + default: () => defProps.modal.showConfirmButton + }, + // 是否显示取消按钮 + showCancelButton: { + type: Boolean, + default: () => defProps.modal.showCancelButton + }, + // 确认按钮颜色 + confirmColor: { + type: String, + default: () => defProps.modal.confirmColor + }, + // 取消文字颜色 + cancelColor: { + type: String, + default: () => defProps.modal.cancelColor + }, + // 对调确认和取消的位置 + buttonReverse: { + type: Boolean, + default: () => defProps.modal.buttonReverse + }, + // 是否开启缩放效果 + zoom: { + type: Boolean, + default: () => defProps.modal.zoom + }, + // 是否异步关闭,只对确定按钮有效 + asyncClose: { + type: Boolean, + default: () => defProps.modal.asyncClose + }, + // 是否允许点击遮罩关闭modal + closeOnClickOverlay: { + type: Boolean, + default: () => defProps.modal.closeOnClickOverlay + }, + // 给一个负的margin-top,往上偏移,避免和键盘重合的情况 + negativeTop: { + type: [String, Number], + default: () => defProps.modal.negativeTop + }, + // modal宽度,不支持百分比,可以数值,px,rpx单位 + width: { + type: [String, Number], + default: () => defProps.modal.width + }, + // 确认按钮的样式,circle-圆形,square-方形,如设置,将不会显示取消按钮 + confirmButtonShape: { + type: String, + default: () => defProps.modal.confirmButtonShape + }, + // 弹窗动画过度时间 + duration: { + type: [Number], + default: defProps.modal.duration + }, + // 文案对齐方式 + contentTextAlign: { + type: String, + default: () => defProps.modal.contentTextAlign + }, + // 异步确定时如果点击了取消时候的提示文案 + asyncCloseTip: { + type: String, + default: () => defProps.modal.asyncCloseTip + }, + // 是否异步关闭,只对取消按钮有效 + asyncCancelClose: { + type: Boolean, + default: () => defProps.modal.asyncCancelClose + }, + // 内容样式 + contentStyle: { + type: Object, + default: () => defProps.modal.contentStyle + } + } +}) diff --git a/uni_modules/uview-plus/components/u-modal/u-modal.vue b/uni_modules/uview-plus/components/u-modal/u-modal.vue new file mode 100644 index 0000000..044ad58 --- /dev/null +++ b/uni_modules/uview-plus/components/u-modal/u-modal.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-navbar-mini/props.js b/uni_modules/uview-plus/components/u-navbar-mini/props.js new file mode 100644 index 0000000..57d5b4e --- /dev/null +++ b/uni_modules/uview-plus/components/u-navbar-mini/props.js @@ -0,0 +1,51 @@ +import { defineMixin } from '../../libs/vue' + +export const props = defineMixin({ + props: { + // 是否开启顶部安全区适配 + safeAreaInsetTop: { + type: Boolean, + default: () => true + }, + // 是否固定在顶部 + fixed: { + type: Boolean, + default: () => true + }, + // 左边的图标 + leftIcon: { + type: String, + default: 'arrow-leftward' + }, + // 背景颜色 + bgColor: { + type: String, + default: () => 'rgba(0,0,0,.15)' + }, + // 导航栏高度 + height: { + type: [String, Number], + default: () => '32px' + }, + // 图标的大小 + iconSize: { + type: [String, Number], + default: '20px' + }, + // 图标的颜色 + iconColor: { + type: String, + default: '#fff' + }, + // 点击左侧区域(返回图标),是否自动返回上一页 + autoBack: { + type: Boolean, + default: () => true + }, + // 首页路径 + homeUrl: { + type: [String], + default: '' + } + } +}) diff --git a/uni_modules/uview-plus/components/u-navbar-mini/u-navbar-mini.vue b/uni_modules/uview-plus/components/u-navbar-mini/u-navbar-mini.vue new file mode 100644 index 0000000..279da76 --- /dev/null +++ b/uni_modules/uview-plus/components/u-navbar-mini/u-navbar-mini.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-navbar/navbar.js b/uni_modules/uview-plus/components/u-navbar/navbar.js new file mode 100644 index 0000000..a950988 --- /dev/null +++ b/uni_modules/uview-plus/components/u-navbar/navbar.js @@ -0,0 +1,33 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:16:18 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/navbar.js + */ +import color from '../../libs/config/color' +export default { + // navbar 组件 + navbar: { + safeAreaInsetTop: true, + placeholder: false, + fixed: true, + border: false, + leftIcon: 'arrow-left', + leftText: '', + rightText: '', + rightIcon: '', + title: '', + titleColor: '', + bgColor: '#ffffff', + titleWidth: '400rpx', + height: '44px', + leftIconSize: 20, + leftIconColor: color.mainColor, + autoBack: false, + titleStyle: '' + } + +} diff --git a/uni_modules/uview-plus/components/u-navbar/props.js b/uni_modules/uview-plus/components/u-navbar/props.js new file mode 100644 index 0000000..b66f87e --- /dev/null +++ b/uni_modules/uview-plus/components/u-navbar/props.js @@ -0,0 +1,97 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' + +export const props = defineMixin({ + props: { + // 是否开启顶部安全区适配 + safeAreaInsetTop: { + type: Boolean, + default: () => defProps.navbar.safeAreaInsetTop + }, + // 固定在顶部时,是否生成一个等高元素,以防止塌陷 + placeholder: { + type: Boolean, + default: () => defProps.navbar.placeholder + }, + // 是否固定在顶部 + fixed: { + type: Boolean, + default: () => defProps.navbar.fixed + }, + // 是否显示下边框 + border: { + type: Boolean, + default: () => defProps.navbar.border + }, + // 左边的图标 + leftIcon: { + type: String, + default: () => defProps.navbar.leftIcon + }, + // 左边的提示文字 + leftText: { + type: String, + default: () => defProps.navbar.leftText + }, + // 左右的提示文字 + rightText: { + type: String, + default: () => defProps.navbar.rightText + }, + // 右边的图标 + rightIcon: { + type: String, + default: () => defProps.navbar.rightIcon + }, + // 标题 + title: { + type: [String, Number], + default: () => defProps.navbar.title + }, + // 标题颜色 + titleColor: { + type: String, + default: () => defProps.navbar.titleColor + }, + // 背景颜色 + bgColor: { + type: String, + default: () => defProps.navbar.bgColor + }, + // 状态栏背景颜色 不写会使用背景颜色bgColor + statusBarBgColor: { + type: String, + default: () => '' + }, + // 标题的宽度 + titleWidth: { + type: [String, Number], + default: () => defProps.navbar.titleWidth + }, + // 导航栏高度 + height: { + type: [String, Number], + default: () => defProps.navbar.height + }, + // 左侧返回图标的大小 + leftIconSize: { + type: [String, Number], + default: () => defProps.navbar.leftIconSize + }, + // 左侧返回图标的颜色 + leftIconColor: { + type: String, + default: () => defProps.navbar.leftIconColor + }, + // 点击左侧区域(返回图标),是否自动返回上一页 + autoBack: { + type: Boolean, + default: () => defProps.navbar.autoBack + }, + // 标题的样式,对象或字符串 + titleStyle: { + type: [String, Object], + default: () => defProps.navbar.titleStyle + } + } +}) diff --git a/uni_modules/uview-plus/components/u-navbar/u-navbar.vue b/uni_modules/uview-plus/components/u-navbar/u-navbar.vue new file mode 100644 index 0000000..78cd359 --- /dev/null +++ b/uni_modules/uview-plus/components/u-navbar/u-navbar.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-no-network/noNetwork.js b/uni_modules/uview-plus/components/u-no-network/noNetwork.js new file mode 100644 index 0000000..74dba1b --- /dev/null +++ b/uni_modules/uview-plus/components/u-no-network/noNetwork.js @@ -0,0 +1,18 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:16:39 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/noNetwork.js + */ +export default { + // noNetwork + noNetwork: { + tips: '哎呀,网络信号丢失', + zIndex: '', + image: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABLKADAAQAAAABAAABLAAAAADYYILnAABAAElEQVR4Ae29CZhkV3kefNeq6m2W7tn3nl0aCbHIAgmQPGB+sLCNzSID9g9PYrAf57d/+4+DiW0cy8QBJ06c2In/PLFDHJ78+MGCGNsYgyxwIwktwEijAc1ohtmnZ+2Z7p5eq6vu9r/vuXWrq25VdVV1V3dXVX9Hmj73nv285963vvOd75yraeIEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaD8E9PbrkvRopSMwMBBYRs+5O/yJS68cPnzYXel4tFP/jXbqjPRFEAiCQNe6Bw/6gdFn9Oy9Q90LLG2DgBBW2wyldIQIPPPCte2a5q3jtR+4ff/4wuBuXotrDwSEsNpjHKUXQODppy+udYJMEUEZgbd94DvnNwlA7YGAEFZ7jOOK78Xp06eTTkq7sxwQhmXuf/754VXl4iSstRAQwmqt8ZLWlkHg0UcD49qYfUjXfLtMtOZ7npExJu4iqZWLl7DWQUAIq3XGSlpaAYHD77q8xwuCOSUoXw8Sl0eMux977DGzQjES3AIICGG1wCBJEysj8PXnz230XXdr5RQFMYbRvWnv6w8UhMhliyGwYghr4Pjg3oEXL34ey9zyC9tiD2ml5h47dr1LN7S6CMjz/A3PvHh1Z6UyJby5EVgRhKUe7Kz/JU0LfvrJo5f+Y3MPibSuFgQGBgasYSd9l6GDsup0WS/T/9RTp9fXmU2SNwECdQ92E7S57iaMeJnPQLK6ixkDLfjlb7546RfrLkQyNBcC3dsP6oHWMd9G+V3JgwPHh7rnm1/yLQ8CbU9Y33zp0j+nZFUMb/DHmB7+SHGY3LUKAk8cObtD00xlHDrfNge+Z2ozU3c9dvx4Yr5lSL6lR6CtCWvg6OAPw9z538ZhhZRl6XrwhW8du1KX/iNejtwvPQIDR8+vSRqJ/obU7GupjdNdh2gW0ZDypJBFR6BtB2rg2OVtuub9JcmpHIpBoK1xfffLzx4f7C0XL2HNiYDp6bs9z23Ypn1fC1Y/9PCFDc3ZW2lVHIG2JKzTp4Ok7nv/G6Q054MIvda+bNb74pEgKGtwGAdL7pcfAa8vOKEZ2kyjWuLr7uDh+/qvN6o8KWdxEWhLwroyeek/g4zuqwU6kNrhyZcu/UktaSXN8iNwuL9/RuvVXtJ9PbPQ1vhmcP6t9+47u9ByJP/SIdB2hDVw9MJHQFYfrQdCph84evFX68kjaZcPAZJWwjMXRFpJ2zr91tfuvrh8vZCa54NA2xGWrunvmg8QWCJ/N4ir7fCYDxatkOeBB7an501agXbygVdvv9IK/ZQ2FiPQdi9osGbH+zRNf7y4m9Xu9Me7N9nv0HXdr5ZS4psHgXpJC9P/wDRTx0Vn1TxjWG9LGrbaUm/Fi5meSvcrkxf/Cg/ow9XqAUk91v3qHT97r6471dJKfHMi8Oyzgx1Z03t1YAQVT2MwgsC3u+yXHzi0faQ5eyGtqgWBtpOw2Ol9+/TM+sTOn8L08MtzgQCy+tOHXr3jA0JWc6HU/HF5Scssr4jXcYqfP6V/T8iq+ceyWgvbUsKKOn38eJAYyl56TAuCEr2WYei//9Crd/5GlFb81kdASVopSFrerKRlaoZj9HR+700H10+0fg+lB21NWBxe2lhNHsUpDZr27mi4dV379R9+za4/iO7Fbx8ECknLCPTsTDJ17O33bJpqnx6u7J60PWFxeAcCbMV56dJfQKf1bkMLfuGh1+76zMoe9vbuPUnLsb2DtmOe5HSxvXsrvWtLBEhaTx29+Ma27Jx0ShAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQaEsEVoQdVluO3BJ06ptHL34b1XRjp4Ch6Rq24+kmjG4Nwwg+9uA9u/73EjRBqhAEihAoe3xwUQq5WTYEzp0b3ZnV/Ncf6O/9AvY9wlh/6dy3X7ncN512Zw9BVLXjuAP4np44vnQtkZoEgVkEhLBmsWiKqwsXpjbPBOn3gRfenwnc+7GBe+zsjclvonFDS9nA9Iy/u3x9+vAP3735VPk4CRUEFhcBIazFxbfm0k9fHD7k+v4nQFaPQIrx8Gmyx/GJ0J/t7ez7mw0b9MmaC2pQQgh0/ZSm4g5TwueWWtqLt0HuVy4CQljLPPYnB0depTn+b3t+8B4t0AdBUv93h2H9xc6da0aXs2m+r1WQsLRnl7NdUvfKRkAIa5nG//r1oGtsZvjTgev/kqYHF/TA+AXoqv4npJemOEiQU1Eo2l+G0movBK1UBBPU7s9E1+ILAkuNgKwSLjXiqO/khVtvARH8dxDBRkMzPrF/V+9/BlG5y9CUqlXinHv9mRPXtvuus88L9H3JPv2zD2yXExCqAicJBIFWRwAvv3Xqwq0/Pnn+lv/K+ZvfPH3p9p5W75O0fxaBp793ce3AwIDMWmYhafiVgNtwSMsXeHp4eNXJC8Nf0PAdRCiuf/XgrnWUqsqotcvnl9DmRkCdweX4b9N7+m/ih+mbMraLM14yJVwcXItKpT1VRve+ArC3Qqn+3gM7132jKEGZm6tXg86J7OhDfuA/iHwPUpfUZSfu2L59tXxEoQxeyxkEgjKeOnLxHb4RqC+NY5H3+2953d4XlrNN7Vq3ENYij+yZwbG9jpt9GkBPQ5H9zgP9607OVeWp87cOQtn9zwJf+xDMNFfj+jryPqXpxj8c2Nn7P+SXey70lidu4IXzb0DNB4tr9751+HV7zxSHyd1CERDCWiiCc+QPjUCnsaqmZ62O5IN7N/VUNP48ee7mAZDTf4Tt049iUG4Guv4ZfNLos9UIbo7qJWoJEHjy+bP7fNsoOcnW0A0/aacef8PdG28sQTNWTBVCWIs01OfPj66BpfqTmq732UnjgT1bei+Vq4pTv7HM8Ceg2/o1qLQug7T+FaaM3IqTLZdewpoHgYEjV9fphvOj+OShWa5V+CxvZtpzv/LwG/aNl4uXsPoRwI+4uEYjAJ2GmdG8L0FK2mYa+tsrkdXZy+P7x2ZuHdW14P+BLdank9q6Qwd3rf+ckFWjR6Tx5Q2cP58K9Jm3VCIr1ogt48lO237r3//96YofeG18y9q7RFklXITxPXV+5DchKb3ZDMy37Nu5tuxG4R9cHH6b42QfAzlds+3EPXu2rfrBIjRFilwkBIIR7SHoJDurFU89ZOd680Gke6JaWomvjoBIWNUxqivFD87fej0e0n8Fwvr0/t1rnyqX+QfnRz7g+8FX8Rv8vL3auF/IqhxKzR2WCPxXqKeq3krDTdj2ierpJEUtCIgOqxaUakwzNBR0D09yiqePHOjveyOkpxLr9VMXb73V97S/h3nDXx7Y2fdPkAYbncW1IgIDxy5vM7LZt/hgrnLtxyaBrJNxv/72N+6tuNhSLp+EVUZACKsyNnXHvHL+1qcgNf2KbSXu2bt9dcmS9qlzo/fARgcmCtpzB3b1/Vg5QiuslLowENyDWDn8cSjl98PgdBviu03N+rl9/WufLEwr18uDwLdevLTF1YK3xnVZ2HI1bUxrT7z5zTuXdRP78qCyeLUKYTUI25OXbm4JPO00TBj+6I7+db8ZL3ZwMOiYdG4dA1lN9HWte2iuI2NAVPapC8O/CGPR34Ip/AZIbIMo7yX8G9QMbcS09P+2b1vf5XgdrXaPfiYns9oeLLEd8D1/B7Dp0E1jGP042pXQj7RKf546cmGzp+tv1TRf6YQD35/QO3seP3xow5IfC9QqmM23naJ0ny9ysXwgq98BWc0kVhv/Nhalbqe8kd/Fr8MOSEr3zEVWrwyO3I29hl+E9LUHGf+nAXI6sGPdd8uV2YphIKnE5IyL6bLxk7cn3bdkHHefrpvJAExMZ1uBZmqeNzXtfzUzk/m/ens7LjV7Px+8d9e1579/44l0duZtge+Np5zEEw8c2pBu9na3YvtEwmrAqNE8IZvNHsep5//yjl3r/0O8yFOXbv0QCO05gP0JGIL+fjw+uj91YeRh/Dp/PtCDM7Zpfmjvjt6Xo7hW9ycmJjaYduf7Hdf/8HTGfa3rG9rYxLSWnsloPg7fijZV8oFM2Ja2a9t6EJd7bCztvHP7us4rrdD/r3/7ct9I99jEI4cOiQ3dIg2YEFYDgOUJDFj1e8TqX7cT4kImXuQr5279A4DeBEX8ayvprU4N3rovcALot/TH13T0fXDTJn0qXk4r3k9OTm4y7a6PzjjORzOOvn1kbEqbnEprPhRzwAKzwFLHk05hv6Yd6N+o3R6beG50aPSdr3qV6IJKkVp5ITIlXOCYn4Yexr0w/DO6YXymHFlR0e5r7tsM3fxgJbI6fW1ivTeT+SsYmr54cFff+5Cu5X+hb94Merp6/J/PusGvTE6724eGJ7RpSFOkKPCUZvBPBccoHBet3Rwe13rX9tw/PjXzZ5hKvr8SfhWKkeA2REAIa4GD6p0feRdWBnvxjv2PckVhVfBf4A29uG/X2i+Ui2eYn8n8NryuDr3jPfWSFV5k44UT137eshIP2K7/64cObbheqZ6lCp+Ydt8TBO7vTM5od1+/NR4SFVhoLpKKt410lnE8LTMzo3V2dLznxLkhYgQ9obiVjEDln7mVjEodfYcpw+MAsftg/7qSDbAnb97sCSb0Yei2fqOcbovVqKNnNO8HmAE9Cv3Wp+uoWjt27HpXNqH9WTKR+kBHKqEFbvo5y3N/avfu4g23R45f3WGa1k9ZicTd0zPTf/f6O7f8dT311Jp2fHzmgJlI/N70jPPe4bEZ6Kg4qw0lqlrLiNKBiLWerpTW25PUbkPXZViW62ecHz+4d8PXojTirzwEyhq8rTwYFtRjvpX/rlwJ+iSXugPbMuyKBOHo3geRJtuT7PujcmVUCuPJlhnL/9NUqvMD2eyM5sxMaIlE4n7XML907tyNjcxHQjty4sZv66Z1xEok/xNW5n4uZSf+8sT5m++vVO58wkEu5sR09pd9w/rWyET2vReujiqygrSopn/zKZN5qMeirotKeTyolm7p/+X06Wvr51ue5Gt9BISwFjiGsLl6N6SrvylXDNTK70D4mX071pwtF88w6Jd/DG/1E1u26NOV0pQL71y3/8PJVOcHMzPTWkcCH2YGOaTTaS2RTN6f1fQvvvDK1bdnbO2JZCr1SeRfn05Pa1PTU0gXJBKW+ecnzlxvCGndhFQ1NRP8bcY1/vjS9bF1V26MwHwsVKiXa3etYVw1TNhYJ3TDjQCO42jJVMcez7J+t9YyJF37ISCEtahjGjxkGDr2DJZ31D8h5vUQJL5RPkXlUMM07u3qSGidICvkzzuSlmlZb0olrK9hD9v9JCrPC196JoPMAolFg6CV+PPj54YeyWecx8Vk2v1Q0rSfhFT18LnBmzBRyNalp5qrSuq7kiAsh4SFa7oZ9M0wzI+cPHOjZPo9V1kS1z4ICGEt4lhiCvZrSa2jol7qzPXJPk6nIGbVbWfUvcr7hO9MP97ZVXpggOu6ajplYStj7l1XvbRMXbPAbp6HzSSBlkraNknrvfVCcPt2sHYi7f3pTDb47KUbYxuvKqkKpYBXKBnV869c3WgbDEixAck0FGFFfEzJzbIsO9C1TyrcymWWsLZGIHoW2rqTzdo5dXyykz0NC8l779i5vu4zwM+eHVntGP5jqVTq/6AkVc5NZ3wNH2lVxNWZNIukMSjiNd9z0+CHp5DXAdX4SAg203w8GB5IATtODHzdK8C15kEjhXvNS9rWA11dnfcMDY9prscss48RySakrOLWqODCoIKAgkuVgsS0urtD60haeV1YYVbbtjUn6/74HXvW/11huFy3PwKzT1r797Upe3jq4sib9u9Y+wxe+vh7W1N7jx49v6ZzbffnQD4/Cj1Pfjx54XiBls6GVuTUc9mQsOIO9mPQFdkIRlz4fy5JLm2ZMOqTcJaXIqpcqnixVe+rdbZ3dbc2OT0D0wZIibHSksmklslknvx+//q3PiKnXcTQae/b+LPQ3r1t0969cOL6G7o6E09qgZegdMJBpVQ1DbKCpyUt6oPKz/4NEJalCAuZFIuEVBJd+jgLh4rvAiFqUVGkhJZMWFp3Z0obGSu/d5gSnWmavuO6h+/cvYHSobgVgoAYjrb4QPMUiGtj1/79jBMkLBwiTlMASlYzTkhWCJyTrGAyMOFkst/BoYMmuIIyGJYcMXMMdNwHPhYN1qWS1t6ZLGaKZL8yzFXTr15BooLLMugHMBRNKgW+It8y9TEcJGt4rvcRFCCEVQbFdg0Swmrxkb0+cf2XOzq73kgdFieEXF2jdEUJKQH6SVWQrNjtZDKlpTPp38U58iUbthk/Ph7sN6zg/xudSGvD4xkq6otcnnjyF0XRRTflkyC0IIJE1JG0QbqGNpMNp5xFhRTcZDNoj66988SFm5vv3LX+WkGUXLYxAuXnCW3c4XbqGs9hwjv+a9lsuN+ahOJSCoLjNDAFvVUll0p1aNPp6adTweSflEszPO48oFn+4yOTmR+6enOshKyYhzWpf/jDuuf6x2aV/qNRaPG/1d0gUXWCA0uu7GhMmkqmerEc8KOVU0lMuyFQ+Ylut562YX9Sncmf7Ojo3BDZWbGLtMkiUVXSWTFNuMqWuYG530f7+/tnGFboxsfdd9mm8XdDo9O7rg6NFq0CFqZr5DWlK9qV0fZqGvZchSuPlevB2VmG/hOV4yWm3RAQwmrhEcW64qu4ykfJho52Vp3J8quBYQooqWDKADftBd6HD+5efyoKj/zR8ew/hWXY56/cnFh7a3RCTTGjuMX0SVB9qzu1qfQM+jO3dBW1g6uVSHv/qVNX10Vh4rc3AkJYLTy+WA/8ou9kJjo7bOh+DLVFZ64TEbCyBktxI5PJZj56R//Gx+NdH5vM4vuI+p8NXh9LjU1iw3EZhXc8TyPuuV9wDaaCfBjTM06N0hVWQmHBDzvSDZ5tvqYR7ZAymh8BIazmH6OKLbzv0KZvJEz3ZzEFnEolaEtV2XEaCLKadrIz//TQnk1/EU85NuH8th8Yf4j9gMZUOrNkZEVZCnsbtTU9KW18GqcKFyjh420sd2+j33pg3F8uTsLaDwEhrBYf04O7N/2t7/o/C2FoGnsIy/YGlvAwSfCvZzLOe+8oR1ZT3u/5uvHJC9dGtJlMrfqjslXVHwjpat2aLi2rjFFLjUSrFUjlO0juddXSSXx7ICCE1QbjiHO0/hofbPgwpnDTOR2V6hWNQqGUx34890noet5yaO+Gko3Y45PO7/uB/lvnrwxrWdha1absbgxo1FWtwplXqYSJY5Nn5lU3bLHQmGA/yko0plVSSjMjIITVzKNTR9sO7dv8RSeb/T9BWmMkKv4D+YzBXuljV7yxd+zfte6VeHGKrHTz4+cv38JWmyUmKzSGG5z7VndoE7kz3uPtq+Welvhwm39weVjOyaoFsBZPI4TV4gNY2Pw79mz8KyebeRIH+VEZTaX0sf27+v794TKmCxNTzr/2NOPj5wZBVjjdYSklq6jN69dyKuhqmWztivYob+RTSkPbe/xMdlMUJn77IiCE1W5jq+s4dYEO6mzsYAmvi/+CrH7LDYxPcBq4HGTFVcG1ULLT5orS1ULIkoSFI2cMHKG8obiXcteOCAhhtdmo6gaOh4EWWlkyYU9gvHswXfgV19d/7+LVkSWfBrItJJhObL/p7elQR8fUZnEV70XxPc01sM+xrzhU7toRgZIHuh07uZL6xA3LBaYB+Ar8rBsfz34YX1j+D5eu317QNGy2xPquSE4mDuXb2IujY2AgytNE67RiKFshzuwCR5s9ZSMlsK0QEMJqq+GkBKOF5yFzRoidK5BoFCeMjM/8mG+a//Xy0Li55KYLBRiTrGjwOQ1br4VMBQuKVJeQKVPxMLlvPwSEsNpsTEECmBLSgbHUpwD1YGwse59l2p+9fmuig4fiNZIowrqq/6Xeqm9Vh9JbjcOKvqFtACX7gV8kTVZvkaRoRQSEsFpx1OZoM2iKxxuHLtDcsZlgLzYZfv7m7XSv+r7fIm234XSP/8o5ktWqzqSyZr89PoXPYDTYkZvziw0NLluKayoEyq4iNVULpTF1IaDjHHZmoAW4aep9geN8fiLt998cGYdtVp7K6iqzXGJFUCAi7jdkuapsBJKcPBwgyP8YRyV7B04Q3dDbpY3jg6gupoMNla5U41BbUN9n0sr1ScKaHwEhrOYfo7paCAW0WiWknihhW/0Tabf/6tDtxpIVSIhGnz1dSXUkDL8fSHKi4/lWPId9Kp3Vxqegp8J/m9f14D6DQ/nmb281FwgkZ1Dj7bnSSFx7ICCE1R7jmO8FJJr8jCvjeNrIxFjDJBpKVaSlXhwDw384MyucBoLAGEfHI5ptO6n1YAq4FjorH9IWjUOnFlF3pj62aui3whbI33ZGQAir/UY3XCVEvzgdw/8NcSyGUhSlpVWQrFg2p39xp0JYLyIohaXxdZ2FGofG6yi85/QS32F0Asu8URgu1+2JgCjd22xcsVElPC85169Gaa1YTkRWJKpSqooBiQQzONvq9sRULKKxtzzAEJw1api2EFZjoW3K0oSwmnJY5tcoSD09HanEDztubnfO/IopyUWC6sUmZUpW5aSqkgwgK04DxxaZrFivacCaIdAuH9zaM1rSDgloOwSEsNpoSMenvU93dXb+EE5taFivKElRqd67qrNmsqIF+yjMF/i56MV2JqadYKxXMDXM6+4Wu04pf/kQEMJaPuwbWvPticwj4Il/NnTrdl7JrqaDC5wTUle1GmdWWVCw1+JotjA6PgnThsIdQrXknF8arkJi/+R355dbcrUaArU9ha3WqxXW3tHR9C5dN//T9eEJ3aGdUwP7T0V7F86Mr0VW4mF6o2NTS/ilaB2HDmb8wA2+08AuS1FNjIAQVhMPTi1NgwRkGKbxRxMz3uaJSRzVUkumOtLwo6Zc7aOkVdEhynN9NQ1cyuNqeEqD67mX9TXGyxXbJhFthYAQVosP58S0909czfqJqzdGODVqaG/IUbCWr2p0yukfp4FUtDfeir1yl8IPUGjPHFy/fqJyKolpJwSEsFp4NEfT6Z3YBvOp8MvMc0hAi9hHNQ1cBrJil5TUZxhfXsTuSdFNhoAQVpMNSD3NMTzzU1PZYAM/ProYkg3UV5rHT8lXmA7SwnwEq4FLLVkRI04HM+n0LdvzvlEPZpK2tREQwmrR8ZucCd7hePr7rw2N5PfxLUZXON1zHKz4kb0KnIttP6Njk8tyaimbwXPrsW/yq3v3bhoqaJZctjkCQlgtOMCYCnU4GedTI+NpQ32XbxH7QOmKG5nzdIWZJz8HNkKygqI9TmSL2JSiovGVn0A39c8WBcpN2yMghNWCQ4zPc0HRbr6GEs6chJFnmfl3knZO4/hmII1B6fiFG9br0s6qAeXPp2WUrhzHeXH/jr6n5pNf8rQuAkJYLTZ2kK7Wul7w6zeGx9DyUsZovOodOizosTg1TM9k1Wogpa7lIisOF+w48E/7E5B1Y/cgtdizsBKbK6c1tNioT6X9n3MDcyePOo7OoJqrC6S0+ZIYV+GSOHxvc18PJCxXG4ed13I727axqTp9yk9rX1jutkj9S4+ASFhLj/m8axwdDdbgELxfGsLpoZyqVXPVU1QugVJUV0dC27p+FaaBWWxknq6ceAljTNMiAf/BoUMbJpewWqmqSRAQCatJBqKWZpgJ731Zx9pJM4aK0hXe5vlKVFEbKFlxs3PvqpSSqpbzKztRm+gnEkktnU6/2GFMfa4wXK5XDgJCWC0y1iAR6/Z49iOjY7C5qkG6mk+3SFQGlEP8FFdnygrNFqBsn1OxP5+K5pGHbcBhqhT8fqu/v39mHkVIljZAQAirRQYx7Wj3Zj3tddQjVVJ4l50CMjHe8mqOTJCCvmoTyIrENXx7Uinbm4Gs2PZUqkObnp76i0N7N36tWl8kvn0RaGnCGhgILKPn3B3+xKVXDh8+nPseX3sOlpt13+P4uonv71WeDqLr1ampFB8S1JrulNaHc9rTMxltcpofOeWns0rTLkeIZUHRnpm5YibMf7kc9UudzYNAyyrd8ZLpWvfgQT8w+oyevXeo++bBtaEtQd9s1/ffRsV3I6eDJCp+nourgH04UZQnhIYfWm1o8xdUGCU8/E/bil89sH3dlQUVJplbHoGWJaxnXri2HTvd1nEEcCBS3z++MLi75UejQgcmJjL92ax/gNJPo6QekhVXAbdvXI3D+XQ1Bcxiu02zTAEjKFIdHTQS/S8Hd2/4YhQm/spFoCUJ6+mnL651gkwRQRmBt33gO+c3teNQYin/oG6aKX5rcKEukqqoWN+Ij5vy81v8UATDG0WGC21jlJ96K6wKPpWd8H8jChN/ZSPQcoR1+vTppJPS7iw3bIZl7n/++eFV5eJaOczX9Z2YvM1LPxWpocBHKv8qHHdMqSphGUqqahaThfj40ITBcbLnsDj6oXvu2bS4n96JVy73TYtASxHWo48GxrUx+5Cu+XY5RH3PMzLGxF0ktXLxrRoGNVPPfNtOolIrgElLGYH2wbZqcipdIFVFlDbfGhqfj9bskCaHHS/7gTt3r73Y+BqkxFZFoKUI6/C7Lu/Bl1jmlKB8PUhcHjHufuyxx/g5lbZw+BL7bX4EoiZqyS0T0uM0j1+82QSl+ua+bhxj7GjD2LicwWkLzaarigbKsmDJ7gcTmezMBw/t3ixntUfAiK8QaBmzhq8/f26j77pbaxo3w+jetPf1B5D2RE3pmzyR4/nH+Mti4Wx1dUrCHO0lSVGqskFUnakkpn6mhu086jgYHkWTW3Wbo4Tli6L5gqYHE47vfeDufVv+YflaIjU3KwItIWEdO3a9Szc0ElDNDqcLbHjmxas7a87QxAnX9ljfxcr+Mzs29ykpi1O8iJjoR/cm5o7dnUl89LRLW93dyWmVIip+Kp7pmlWqIvQ8Mga9Gslm3Efu3LX+K008HNK0ZUSgplnGMrZPGxgYsIKeXa/TA61jPu0w0+7xBx/cd3M+eZspD0wbDgWm+RXP13cODY/jWGKuGAb48jG+agNpilbqlKZoWDqDY2AyjtNUlupzYZlKpXgaxIVMNv0zd+/d+uxcaSVuZSPQ/IT13TN34QRvZW81n6HSDdMLUqmjh9tgd//Fi8OHEl3JL3Z2dh3MzGA7XU664llVWRz/QhLjNYmsmaWp/DjCjqIDdlaZTOZZ1/A+fGj7hjP5OLkQBMog0NSE9cSRszuswNhdpt31BRnazM3U9IuPHDrUuG+419eChqU+cvzqjp7u5P9KJpMPpqc51Zv9QntLkFQBEqZluVCw/7nhaP9i376+8YIouRQEyiLQtIQ1cPT8GjOw7vE8tyFtxBrb2MBXdh579FF99g0vC0nzB548ebNHT2l/aFmJj1BPBYyav9EFLaQ+jdPAVNL8/pZ13a8qiJLLOhAAjvrTRy/d0enbF+69d0tzHFhWR/vnk7Rple6mp+9uFFkRGF8LVj/08IUN8wGp2fIcPLh+4sCu9R+F3ucj0MLf4vaVVnChqYWmdaQS2jpY2vd0djh86Vqh7c3Yxm8dudTPxaW0lrn7yJEjZW0Tm7HdC2lT0xKW1xecgHE3FDWNcb7uDh6+r/96Y0prjlIO7ur7TOD5b3ayzt9ylY0Gl83qKFXZsCXrXdOlrV3djf2LBr556JOshLDmMWhPPXV6vav5O5jVxYLUhNl3iIbV8yiqpbI0bQcP85C2Xu0l3dczC0XUN4Pzb71339mFltOM+Q/0rzu5f2fvu1zH+QDOt3uZ0pbVRMRFouJK5qqeTkhVqyBdtdUmhGV5JI4cudrpd5kHiyp3tTU/8s6r+4rC2vCmaQmLWJO0Ep65INJK2tbpt75298U2HLuiLh3oX/95L+0/kHUyvwTieiUJHVEimVzy1UKeWMqv2pCoKEVFRNXT1aHawnBx80eAZj7TwcxdAc5Gi5fiaNnNT37nCk4xaV/X1IRF2B94YHt63qQVaCcfePX2K+07fMU9U7qtHev+xE/7r3cc70O+6w1gxuV0dHZiusgvJS/O7IskRXLs6KCxqj+B26t9a3uUREWi4plbQlTFYzXvu+7tB3EIUGel/L6e3TNw5NS8zYAqldss4YvzBC9C7559drAja3qvDoyg6pwCP+KBZaVOPPjazS1vMLpQKE9fuPnawDB+EqehPwzWuAuSl8LPg90WVxhJJPWQCUmPBAWTBEz1TFUGpqO3wYYvIPgr2az35a2b1/50V6f1e1NTlVcvEzB0xRekj67usu5FmS2/crvQcaol/zeeObfTSOj91dIq28PxiaOHDx9quy8LtQxhcZBqIS0Dhkl2l/3yA4e2j1Qb2JUUD1Iyz1waOQib0vsxKXsAFvH3wMB0JySwtZC+DBPTN5BOCEnhrI1BuKe9l6tIzsVCiD6E0DOabrwI2elZ09aP7N3aNxjheXvK+a1OENa0EFYEyYL9rz072Ju03ZpNQKj7Xd899cKhNrA9LASvZTY/s9GcHoK0XsrakLS8UklLxyl+/rj+/Qfu2367sJNyTS7SuZfneO7ffweBGScu3NwAqWgrTvTc5jjBZmw87tMCfRXYKQWOgula4OiBOQUZ7DZuhrAGdQXxV0zPuCaGnkv3VPGHOpPw7+QPR62OM5HhdNddGOeX2kmCbSnC4mDlSStVTFr4eLljdHV+702vWz9R66Cu5HS5h5hmHvz3QiOxwJTRo2BGgY06dm7OVhewYGAY6s75oD+ZDs4JPY9JyqSCQ7ABqftd5VFM3/j2Ja4mtsWpJQSq6ZXu5UZTKeJnsHpohiYPRqBn04nkS2+CQWW59BK2dAjwS0Y4IHDz2ERWG8Gnwm7iK9W3sFmbvrqGPzw6gW8eTmvTM07XmTPX28KYd7EQ3rjnvv1QFHbPt3zT9DcMPHd+13zzN1s+/hC2rKOo7NjeQdsxT5LEWrYjbdLw05eHtwWe9jl0542u62HZHZIVpalY/yIlP5X3MHYddLLZfy4fmYiBhNuB509vw+rG3tKY+kOwGHLi7W/cS91jS7v4s9TSnZHGLx8CICH9lXNDX+zpWfXuycnaBV2e3e567nAm4973qv0bzy1fD5qr5oEB7KXt0u7B3Loh7yhWVfypbOalh9+wr6U3mbfklLC5Hi1pDRE4ef7Wj+EEiZ+amqpvJT2bzWjJRLIPR3n9riA5i4DZg720DSIrlsrvHXSZ9p7ZGlrzSgirNcetqVp9/vz5FJTqj6JRejTdq6eBMzNpHP9s//QrF4bvrydfO6f1JrCX1mvcXlo98Kembjotr3wXwmrnp36J+pYNeh5JdqRem83O77gxkpxtW3bgOZ/g1HKJmt3U1Rw+3D+zrc89aunagnWzpq6PdxujLz388L4F78tdbtCEsJZ7BFq8/sHBoMPX/I9hyrGgnuDUUZzrnnz7yQu3HlxQQW2Ued++fZmJ1e5LoPB5k5ZpWCPXz+08du+99zrtAI0QVjuM4jL2YcIZeh+2+9wF49MFtYJSlgmHE0g/JlLWLJQPg7RmhtyXsJ18eja0tivsXhj6xy9ve/mRR5TRcG2ZmjyViN9NPkDN3Dz1FW5z9XM4i+s1ME1YcFNpUIrVLHzJzHnwjl0bn1twgW1UwPHjxxPXpztejR0HFTc+F3YXRwxdfdM9W08D0zrs4wtLaM5rkbCac1xaolWOvurhZIPIih0OdVm2haNTfqUlAFjCRnJP4HBn+iUqz6tVa2nGpTe/etsP2o2s2G8hrGqjL/FlEQC5GHghfplSUSMdvwaEA/9+4vjpa3c2stx2KIsfUek2dr+EuXNF2xEjSJx98w/tbFt7NiGsdniSl6EPp84O3W/Z1oPzXRms1GRKWdCJdeCIlJ+vlGYlh997r+70+EPH8NHJEtLCauCph+7bmj81ox1xEsJqx1Fdij4Zxi9AT2KSYBrtslgxhOD2gWOyz7AstFzx6zFHj1mGobYUYAgC9cHge3ddK5uhjQKFsNpoMJeqK6+8cm0X6noXiWUxHA8WxAdWNyQM45HFKL8dyiRpueM7jllmMGpnjO+1w9fNaxmXxiogaqlR0jQdAkeOBPjczrnOiQ6jw88ESSOA6KT7iQzOHEvavu1pZsLQg4QPP/DdZG9Xx/vWrOr+mfR03SvtNffdxleAQIgvTzjBT0w409Mpu2faufZy+vDhw5WPMa25dEnYqggIYbXqyNXY7i/jCyvdfmaVb5hdVsLp9LJGp43j1/1A7/RdvdMwPRzEboRnLVHe9vEvL3eXBOB4ZMta22H+TiqV2LJQ26u5u6Bju44Z3J7O/Lvp6cwPmBanOwQ4uNHRTWMK21bSvh1Mm642nTWCtKkH07rnTE72aOO0XZq7bIltVQSEsFp15HLthg5J/+aJE12m3tVjOPYq1/dW4cTjHnwMYhXOce8xDd3y/PJW6OpMdsTRVy4iK/rKMR/jwvz825VIHFzT3fkx13UW/dnhRy3GJyeeHEs7n1XNibUPFvY6vtGDw5vV9w0Vofn81qGhZfDhi3HX8SfQ/3HPMse9CWcCX0gel2OIFJIt+2fRH7qWRaYJG85NxldGzV4tGayFSLQ24+q9ULyu9gJfMU5ELTn6wUISTl03NHz1KzyiJLqmX657OLLdSJgoXTO7cBxyN172blier4YCvBsFdSNXV2dC35tKJrbzfPfFdjwvC/qs9MSMxxNRsSqmT6LhUDQHE+jUBE7UnATXTuLsrRn01K2l/x6+qItiR3TNG8V59KNB0DGSfNXGUXwJY2Gm+osNhpSvEBDCasIHgVLTt75/aQ0MnXpBNb2QgNYEntfr4wu/nBYpKQLtxtdwAh0SBX3VDe7nM/Ha5vf1Fb/CURS2bCTAWWuxR229qRsbQQQbUed61LfW14JVKKsTJ5sk8WUcHbtlNANyTOhgcmAGKH7p3m1FWpqtuZCu+LByVdKHVMjpKEQrBwIW9tnpXOIH+QTDSH/D9f0bmCLewDn1I4HmwtAypPDZ/oe9oXKf/aMPsWxSs/RR13FHrURiZE1gDR86tKHEdCDMKX+XCwEhrOVCvqBeHNaW6ui11/mWDtLQ1kEiWodXE4rwYgepAPssTPCMOjIdAk94TZ8pMZjch8HjDorGFUTUAwlkh64be0A9/ZCatiDZWtOyE7ClQmIdJICJFYhA+TRV4Fo5/QIHiUvrTEbkVRCxiJfsSBbfYk87OTExXxdazY5yUgiRKfpHQ1YSkONmAZY+gV4NIeVFfCXoLNA5h/Plb5LzWAyzF+IVXdNnvO/6GcsyhjC1vmWZ7s2pO3fdOqzriy9asnJxZREoerDLppDAhiIAEtCfO3F5rW0a6z1PX4/nf53nG5RqqrpieSnULEVh8cx4E7ugH78H8tG9eP/24oVezY+pkpA8b/abhPF8le75BqdsXUtaFeaTlTI2IByEoU1l8oq1mkokcZHElIRoWmpejMMCMyCvQXyy7JjjuUcgOl4tLCzCMpTHgFpcgkViX/dH/ax2Szf8m2Yqc/MN+1r7BM/C/rfCtRDWEozSkbMjq7NTY5t13dqE6dhG3wsSqlp+C9DDi0ifLrqmT1f6BgUaPjiHN0lJAGAfvpWcI4XjiHIMF6ocO/EjmMa9HeelQ1LT1PRpoce/sJwOTCQtc+kfGQp6Uxl+9JWtmL+jNEaJ0gKBgbsygR58B4sHfwV5aliVWg3vCHv6ymHcdG868IzrVsK6pnd71+/dsmXxbD3m3/W2ybn0T1/bQFe5I8euX+9ybuqbXMPbDA7ZCKV4uMOecyz+9OfmWvj9x9zEw6JW+JuOX298WhE6qtwLEV3TL1tb/AWj7sqwfqaro/sdmcyM+vBp2XzzDEzaBiQsNH+e+eeTjQ+ohwqnG0BYhfVzNYKrkOmpyauYYH8KvD8G6RPBszrC6Jq+ystl0ghzXEZjR5+O4+iZwTh+eG7Yqa5rq/3hGzzTSkXKn4YgIITVABjBP+ZzP7i8ydasrZCetuCHvIvFRs92SEdlpnCYE2LOQi12OA7RNf1yjrphHIyE9yOXPnfNMDg70DpdTf8DWDKs5rRvMVwChAWrUgh21HzllD0NrigqlxKVC7bKQuOOWeGiuI7OTkhb6T8C/Xw3xkel9cXxj6eIxiY3Hhx3X9dHsWJwDaa3l1+zd9Mt/F4tUk/ijWnP+/DBb8++LWqvnh0c7NDGta0pO7kl6zpb8AJzEUr91kYEFdeBRCt69Nm4+AsSl6jwjVGckY6VwPwUpLhLURx9xliWvxFHi/w+zB0SWCnLsVpxnoXesSI2ngp4zmRJXPgf/0IleGH51R6uwjeX5MR76qtITh7+8N9Cp4GF7Sm8Zl1s35pVXVomm/5c1vG+Wm284njHJeJq44/FjixUAld8w7uijW6+xo3MhW2S6+oIVHumqpewglJ87+LFtcFUcqur+1vxwPcZJqYPMOyhXw6GKI4+4/GwQpjCBhe+6XDIpFb06PM+np5hhS5eXzw9bLJ2pBLGv4Fe36BU4kA6IQGw8MUY6MJywVeqDs54Z69zrWdY7jI3G1ZtUiSV6zzDI3IqLLew/wu9jspl+yywrA1pEed5QceXPT3jBb/DLrA5ua5UHZ/4eMTbFx+fwvE3DJO8fANrjlctL7giJhRx9MrfR89R+VgJ1Y6currONuwd0FNsxwtV02mPlWGLy1TxlPHf6Hh8PH9xesvw9yRM+5PIRT2ZIgVKKZxWUY/PT8aTFPji0i3m4Ed1hDWV/7uY9bNGtiGqAyorJRWSqCgdkrQiR5KddrwPlsq8xfhG6efvx8dvtiQczDdmmPaldDBxSVYeZ3GJXxUMWzxq5d4fPz7Ym7X1HTAL2A7NqtJHEQ3qtCPjw3LoxB/v+OMZ5VVzR5aHWRuErYA+y4uu6fM+Xl9J/lh7bFvbY+vmv0bWos9tsXAWSLIiaSnyApHxJz6SbFSFuXTw8i86r5vVRW1m+6IHmUREAuI0lcREP5q2ztWPrO9/YK54xsXHI56+cePvj3qBfimZNS+J5FWMcrjptThsRd4dPX9+DcwEd5iQphwozfkCwJKaLv9ewHYKeicfSudwShcnJDBBOD3MTwGRO0cqLIj73jQTaejDBYaPHTBgJ/i5+HyYijd95sFhRzkzB7yL2IrCtGwezj9nOQVTUlfPwiicifnu5J0qHHd8mXHIG6ZD7JQqIk9kJK6QwAokMWRUhMaSeJ0vcfaiXNhs7PyuwpYV51Vh+EM/Pu2M9GckpyiOuZm2Wvtom+Y4me8xPbvIIujzPu6Wbvyt1ejL3U7Sv/v754ZHsORwaX3KGdwiJhO5pzY+Mivk/urVq52jTnIXlEc78LKu8qAMx/G8kHhyOicosz0ovM3IrIDKb15HSvDoOoqv+hMLYCOWI8ash0vmufryZVcqLz4u8fym3ov1xT/EVp4UDUTn4/iS0xW+sZTMojASmLqGp64iH4FRXJQ2TKj+lv7JVRTVxwQkm9APyaboGnGMzSVR6VR87ipsVT645ovOzi5tamb6zzB1/nqzjz+s9YetwLioZW5C8jq08K9+1IxS8yQsfF6ap1WL2BK8VOaJc6NbPcPrx7wJ++hmHQUPvOaQgMJ3ETtVlERDP0wVsQ19uPgcLQyt/Dc+p4jlL6k/1xa2qVyh5ApEzEoErm/DsPOTXV3de6anq36roFyRdYWVbVSshHJEMt98saIXfIu9koplYZL6m/hUz7kS/Jt0/PE8+Jj6X/Y6k+fv2tA1BKIvB/OC8WnGAmp5dpqx3XW36fjgYK/upXbhFd+BrRlqn16MfkrspkoC4hnirYjbUVWzs4rHx8uL3cerjwt0TA4RcBcsuX8Rn97q54okVsCKJJ9YkSvy1gJR4aOtnAr6OJP+L13d+BKBKMEzHhAfgDh6yzD+vqHjTDDvYpAxLqwEfVdbE9bpIEi6V27tdLP+LnzPrWS/XrRTnz5d4e79+LNY7r4kP+Z7Jv7z1LyPL0B4Tb+ci9cXLy+eJ54e8Rw//rqqcUR+HOrgYVprJbBl5E2w63oI64J7k8mUDZLGhmAXs19ucVkxP8gKQu4ptCxbMy2TW3KAGI4u1P207ztH3CDx/7bL+Cdse8h1Zy5ev7Dp8uHD7blJuy0J69TV8XW6l92Dl3cbLG6g98idbhDgdANcY1ZY9o2N4mpNr96GRf1Da3Wui0RW69F1bWslvp81LD2xDTOGu9DhQzBc7AcYfYlkAqo6A6ozqHNBYJTESGitTGShsp0qQSxT4AcoPJQw0LBlEPhBFakHDjoLvY+XgVIyg7WK77tG8n9pvpHXBbXL+OMBd7FN6KLu+uf27esbX9RHdIkLbxvCGhgYsDb3v2a7obt7YHakpKmYiqgE2ioqJbzIOszXcSov/DAzRRNehyJKvPx4+igv/ZLKEaCkoZxUFMYXE1I8f7Xyq/UHp9CkAlfbCF3NdlhS7IQguA0N2wiJYy1ktC5IISb1Okr5jSYruy2SGlYkIkKLSC3yy/WrUWGzSnjaTUX/QEhYQuNewLCdwBFKRkpOuAfr4sBnwwfDg6B0MHagORhBHNqHw5WxTwYav6lAt/42MBLfrYZXHO9w3Ftr/B0Hp0pY+tkD29ddAz5ln8NGjddSlNPyhHV8aKjbzAS7Dd3egRcvgRHJWyrHASw9Pyp+vlSxEluH0jWAGQF9VVZMpxHVRZ/xSKQU4PR5Xy0+/sLQZCFS9DN/XKtSeh5WrL2x+sMyZv+W67+vwz5eC7oDx12rm9pakNg639B68XL3Qh+2Bm94DySxHhg0daBHSQhiCbyyyMS9SDi8RhEHyYP1qD9qak0S4VGn5VYrSTRKEkKHWYYiHuQmCYb/YKYLqS+3H5LYckxJmz6qhSYJ5yNgzgtuclESpncBfN8Fj3lgJdCSGpHcGECoxrouMoHjzO+4evLLMB1VKxJV8Wyj8Q80Ix043jnTu32hlTdkh08Yn7UWcnio9Qs3pzZm0lN7LCOxIdIZxbuQ1+lAVFFxJB7aMeUIiPkiPRPjo2v6dPF4FVjHnxi/oQK0Az/bymf5uI7ayGLj6eM63nrbF5VNXzV7nv3HViQL3JAEaSV1z0iBNJIgJBCYkSKJYbdjEiSHw7a0BI5s6QBBbINUswMUsQ6E11UojZGccA9dcZDBdQY+TgyFTgkiEKYyIBvstAQzIRk8cBJ+A2j4gZFDFWAqjAp3V5IhQYYwwUJ57ByS0QINzMYK8FyrRxt3KNbXb2qG/UVNT5wDyCt6/A0boGbdqzPA4tD21SPquWihPy1FWHjQzYs3xnZkM95ePIZd8RccBx1xez/UPowp46I4+uVcLD9/8Plq0Gfy6Jp+uez5uqPyY+UtNN5DuVQc06drpv4bIDXsjtsMpdkOSC79QK4Xog3PzwF4IBNCBiIhpBSpoE8jioqWaM2KCRuOqwLXgIQItKIe0lCYD/lZjoqgGIo0+J++SsmMKA8eqQ21qHuUh2PfzQHN6vgG6vVK8GfmQhcbr3Yff+AEi3rtdCtNF8u/eIWD2ATXx4Mg0XH1Vr/hm7sDQw8PvyvTrriKWocEE0C6oM/kJRJHrAykgj6WGlq+JUifu6YfS6pu4/UVa6AgQcXKi78ApekhcWFBwMstEkTX9MvVHw+Lt2ex+4+Pg62CxgsHEwZbAdgWIJfA+ICkfDRYtyAwWWB7Ay8F8VT/KB0bOJ4Gx/CQfUKSwZGrJJs8iZHYgB0zMB+zk8hopQ8hEcEog2ERASIBAOL5fIrVIKLxXKtzKPZLgZUckvGf+/nH5HsK0+Uz3316zeAjj3D23Lwu90w0ZwNpiZ72UnvwfO/AXIFnXfLBxLOsHn6yiLqmr3oQ04LHX9hq6TFHI6txrlYWkHj98UT1lh8vryR/rIKq6aO204drdP8hRWF3itmLUw42QnW1CSTSA2IAIXkWOBYKLWw8wjVqNkEaFqjFwLQNJhWI4ZiFoiq6QX0SbsEo6HMoWVFCYprwjw6FP65BXCSoXJwiOwpnFK9A6yiWkQhRDwA9XAfpwLS/AqnqSKP7jwapquiznXFXMn6x8Yg/X/HySvLHKqiaPlZfvf0H6BloAM/v3tpzHkJwUx59Uxb4GE5Lfnt2ZGS16SX3+F5mq4llfegtwnaSR6J5EC8hPUV6IDaS6aDnoZ5DpYe6AtdgOr4pyhXLNPH0KKCo/DDP7N+S+mI6qHzbQr7AbdgW+iylWn0l5cf6E29ftfSN6L9lGl04x30tOtMHklmLhxpClW9BL4S1T+i2uNPRp+0FflD0AN9A9LHnmHGBBfJCE3QL9ALiguoJqiu+64gDzWGIIAlhzhaSDsMV/yjJi3BxyY9khP9BXBSzEMY/AFORGMmM1yyKZfmm+ZKuJf4uMHV1THEj+o+S864E7zYd/8Dliqp2MamvPbt9uw4dY/M4DnXTuMuXx/scK9iHLcbryzfKwvOJBSGNPl10Tb8WV0xYyMFymDdXXv46Kq+ueChJQI4WlSUqf8StOf5CNdXqr9afxe8/Gm6AoLAqGKyCGLSG350ACFzKM2FvaeOseEhFOsjItdQ2S6wYYmkOdl2+CfLBvmpIV55vYY2Qn6uAxAWC40zbhxSmWArcQj0TSIiSU37mx0kgVesgLereOSz8E5EWJa6Qzyh1hZEcO7xY4Ct9WLfNvwa+5xA2h6uGP6vMPxMsZ8WNf0Gf+cOCw9usq51a5+kNG9Sn1IjJsjoO0LI7EpVra/vxhPdFs7JyjYriohlbTAKGxO1C6oJEljseOLqmTxfPX66OucJK66OUNzuDjK7p05UIbGwX25I/vrj4BYrnD0uZ/Rtvfzz9fPsPIkgkbL0DZNMFRVEHFEY2ZCBTcwMLdfCsCCVN4SwpE9YG+ARNgD24IDHYSYB1yNCYDkLRFoC8oOUG40AKQx5IYyAmlQ6SF7dDoSof0hbJiApzqLs43aPc5UG+AvVQ/4T7nGQFQiJ5kdbAkmgH2Sz0FaWB4gLrad22v4nmuvPt/yzCc1+V4t0e4z93r8PYwDCvNANxLSthkai0jmCf5+jq6y6Y4SkjTfoKprgWufj9Dg3AozBmiK7pl3H8WDH3u0YfLY6u6c/HVS2vSvsxoygyTF2q/qNenEyjJ5NJPYGPRidME1M1/JYqwyoNq32Ihu4J0z5M+WA2DoqwEI9wfmEaEhQJzPNsKNOh0jJwrfRVJqbnNOrC6IGwQFzgHiKrpCuq2kE+FizrMXWE7IWCEKemg7hSiimOQchNIC3EchqpHlBO95TshQThkwF5TL9k+Mm/MZLGzVo3AlQdLzagDle1vCYd/wU9/5Z5ZcyZPnNow/J8ZHZZCGtsbKw3rdn7nIzTx42o0WfP1cPKuYJ6XPFs5q7p8zmKx5v8cdcxDeMPOR1fj+gh4X10TV/dukiC+nJPeLy8eH1hrtm/UVvpKxcrP2oL/dlcs1eQ9PCeo73wGcp+R2Xyvlp74vH19B9EkoA2CYKUlcQqJCQj6vkoyBjh/IurcJiy4Zxy2FMptRBO7sK3kClR0UYUZAX+wMqfC1ICiYHMYBsKSQsSFKaAUEqZLoiK00ASFsgpN0UEUWE6yOkiiArE6NmUb91OWwAAEuNJREFUszCNxA0c/uBoF04W86YOarWQAYjGmHBBEIkUiXEqib025hNmInWknv6zKo77Sh3/RvcfSx5Xl4O4yr5Y7NxiuEEQFT4uvs8yrF5VvosX28LLS185vsiRHkc9YPiJtrCbJIzHyx3gJdfpl80flZWPR6qIxJghus7xjSqj4E9UNn2VvN76Csqq6XIR+48OYEeGlcAaXhLfQwxNQcgQEI9IErOOxBUuCuDLz9Arm5iyOTaYy7Jty8hAb2VCm43ZmwnwQTbgFpAWyA4SGEKhaMdgYNpngKAcpeMCAfFjYGE4yAqco3RZ0LorUqOkxVkf6AgzvFBPFbISSsOUD+WRrWijpcwbmI4Gomj4yxAIv4bPVU+q9sfxk/EP36UlfP49N3vNWr/m9CZdX/zzjDDofAoW3XHVr9NPHdB8p2+uORl/mjFLUktMbBTtkSJbpLCRxYyD5OpJps/4+DJuvq5IIgoLqfi3pLzcRuloM7QSzKImsBSWG80LVKkxkSvOkFHaCjL5QvrPN9rwvaSVtEg2ICmQCNRQkGjwnlOpNktMxdds+GxcRFrIyCmhTQMEUJjl4qwtzPbAOVC8o0DUZroGiMmBpEUfRBZ4DvRUJC4/1GOpij1ML9XU0PJdFxIZGsOpJkkOQ0YdFh5CPodKl0WfRqQkVUhTIEf1iN4GkdJU4Rx/xsJfHkpfMv4cd+IAUJb1+YdkfSU7NXp6+/bti7qquKiEdfVq0Gl2TO2DonYzAcUTCv0slCB8FuGia/q8j7iAPl30aNIPHVKq55w+00MvjFLo05WmV8H5P9XLzydVF/H0xbGl9UGfjm226B98po2u6fO+0f3H9M7SbT1h+FoS00ybSmm+5/RZHxzbwWvVHtSvNuLRR4BKl0vPtHRhWh1SESUsNBkH0qjvNiAx4MA1JDBc4yBmTPmwJArJCFM+dA1SE5XsmFIqRTzKUrZYkMio78IUkauFoW6Mcbin1GWrOR8nqOEUEUQFmuK3ZdEw6NFg92s9j3XLp0CIsAuS8VdPkcKhCZ9/KAc81x/c3NdzFjy6KHZc0YPNh7VhDg9jYnh4co9n2dvx1nLalys7Rimx2xLGigfEJBQ0Xr149FkBVb04BQiTlPAFbTiDxRGKM1pJf5AgarPKG0sQu413N07hkCANO5m0fSebtCwziW5DqMISHTRMJCDF23inYbmsauNCHq+Vn1ta5dErzKN8psP/RiIXVpAegKJQ30Y06AQSEXdAIpdL0wbTNsLpoSIeCwRJHZYBpTusIFAIlPC0iqL5AxoCcmLPQkkLdITRCc0dSFqQD1A51g4pLOXmhZCwDMO2BpH9q6ZtDoU4oKQIy5yEynFnv+mzw+0+/q3Sf5yT4aYs89zq1alLIK7wYeQANcCpgW5AOaqIARzxcudrXrMTz+cuFAxBI1Rw06eLKz3xsnDikt+Mmr9mWBlXrbySeJAlTt8MXJImXHRNv0zx2GpWZ3r0KKqzXHlRHH26+fQf+mkbg56ADjppUuihMJl7BEhGtmnj+4Phj1lEUAzjaQcgJkzcqPPmlI/yjdJV8Trf/+hbeYyP0uMS0zSVF8SEaSELxkhR6a7IC1IVHkNMBWEkCljxYQ7YXgWKrDCHw2ohJDDKSkr5Tst3TANBp7DdgkTFKSOpxYMtV2i3hXQoJjwbBo3L4oibAajdXmSbCl01PEvi6x3PetMvwfi3cv+xHpPRk8GZvo6Oq5y5FvZlvtfqQZ5v5igfH7iRdHqrn/H24McyEb6ejCUxkCwqEATi8JDNKtWRIxI6wrLj+aOyQgIqLT/KTZ+OLYnCFGHE60PdSgzIgVmcfrbt5evjYkB97VeNyv8plx/UYoChElhYgB7KtD3PAUWRpejIVNzNAjNzyDuYRqnrMF5dIx4CkTrlAJQRps2FhZIX5lqYwfFLOygTBeSmkUhDEgNvIC7MR5ML6JhozoCpn+858G1utbH4j7BRT0Z9VlZzbTyOKJCKeCjkqYbkFBJh+DXCPVcKuXKIFURlm8WBoZSFOBCYmk6i33ioT+Kw1CegEMspcFfe+M8+rRySNum/YUwm9I7TPT04NWOBDg/nwtz16xMbEp3mPswIOuI6G7wBSlynz1pQWZEIP0smIcEEWN3QsfJDn+nj9FFSPh73wilgdE2f+eOumo4pPqWI2kI/LKu4RVXLq7H/kJopRUFhnkj4joNT9KC/BlZgAIVD1I+cwASVUBgCIsF1KEQxJLpGPKHGP5LYrAs5ikREnmJ61KF4K5cG1+REVS6HC1JauGroYYcOrLWUEp6MSF0UpoZgK5hV2dgEzeNLYbMBnRQZEUPnOwGMT6GOp57Kg/0WTCMYjnsQHpDmlJFTR5IcNt/alvV1PdF5NsKcLSpGG03L6QcjnWDpeIXqgFYb//A9wGi1+fMPDeqY7nae6uvT530KKp+JebkhHJyX6Fqz33X83tCgRr1d6gXBH+XnFtEwDmEVMBfAtbK7UvHxVTb1gGLQokbFVBZMDtUJHmT+dsPxmqSRU2nkrxkWxhfbOfEVwLov4sIaonSRr1qZy6vy8xliPbn+qPjYHxSm6mJwdB357DfaVtJ/BMLeW0/ayVQSR6TA5AB7h8kwmFeRrFBUSFYkJk7GsM+F5SuiCQmFBEriCskHYcxfEM9ozBjBS/yaKD//rBzndjD3BHswAcmqwFdhOWGugCw5owwpEt9sxMlVGWQEK4GlcAOi1XAcL6eLICfdcMFmNDnH7xdO/YTCHTkxM2B6EiSPbuXmHrZO5eJy4Iu6lfo2Gu8orFfA+PM9UMjnHpBIx9v+/Q9Wm8nMfcMTE1d7u7vP4Ec6fzy1wqOGP3xI63JHjgT2/rsy/boTbMP0pe78dVUWS5wjK0VUjIqNN3kA62ZYeIcfxofXDFNFUZBTT4W6m71mWBlXrb4yWSoEYWh0jVIUdJEmzA6o18mRDN7dCplCEkK8IiP4WRAU9OO8j5wimZB3SAhKYlJEphLkJCaSEP7PEdxsfVG5UWFxP6qPPngTlvBED6IWLN8dTPmg8ocFPPRXWBdlFWqqCEmLlhAgLRtKdLaAkpQNfRUM6DUQGOUiTimNEaT7FvRVw/F6K91XG4/mHf9KPaovvJ36jzfSS1mpc6mUdhnvhZL4a0GjZsKBKK+n0+kt0AHvztCAsIzjeeAeUKVPF1l101cBWCICxcGmcPalUeHRnyguIsJYej79fFnpKxdjrKhu+spVK69Ke+OW6SXlh7Xk/8b7D5umJKY6nUiQAEmp5ZKoD5Ay8kTFzcAsJIrL+ZREYCWAaU4ubXRNP8wfpuSuGubHMwCJhSuGPCiYJIMw5GV6xkfY0Wd+WoPiBAlEhvnzNluw3SKZYTkQHIQ5J1RQDg7Lw/QQGUIdFp4wcC9KgQ/7KkxjucEHROVmc3ZaCFfEjMxUvlPvBZ0WhT1Q1zG06hQKyGPA9qEh4bPRJuO/0p//WvoPyXpa77BPr9L1mn64QiJRT0vlP3jg1oyn0/th1dnN6VOkQyh8wVRuPpLUH9GHi+sckD4vLaj43NSHLwfv8cKjbGxdgc97JUpFpIRbpovKYHTUltkpHYkyEqNYf1gWfZU+Vn+JiMZERS4qKyTAMv1hmwoItLT/aL6OL9cn8A4mknhDkR5CUuh43ExhAXjnIQVxRQ9UwnU1JM73meHISINzlY/1Ir3jwNQBtui5IpU3K2mFZbEUEhgJiHlZhkqI8rws7hPFxBHlZ5romu1CGRSv2HyQEQiLPkwefJcSk2o0mU+F8Z46KswbKd8qvRUWiq7BsuoYlF/q+Jd839p4/KNnFHhw+Fbc819r/y3dHO7qsk9D2lLPBvEq59SLXC6CYSCq1OTk5F48g+FxLyQSvvyzhFK8taaYL1ACiYdkkSOg/HVO4irmAySLlR8+yHy5wnaWysTF7YmnRxdyecMXFDcxx3KjNCUEGUtb2r4Iixwh5qebxEG58v2Hkh0ERqlLp5kClNLkngLSyF8XExrZi089SYbFm9DRg1FCbEKyoxQE8sqFkTOgTwrDVIPCP/k8qpRcGrxMEXmxnpwjUeXbhjpgA2bBNsp0HPQWOiwNOnddw5YcNIdSFyzTlUKehEbrLDxDNn7osjCXPw5FO22qgPfKHn/pf8XxxxetvSvYlX8BxBVKCdGDmPPDhz0W+Oijjxof//jHt+Hh2oko/qKqFx4l0BJQmQIwS3RNn/fxZXqGFbq4nQzimI9tKFs+S1S1KJ9XoQkEfUQwtKg98fSzefMMwmx5F28/IqK2RLjM2b54/gX0H0v6+IiDZSVgHJogfYWNzDMUpCtsUkKg4pKIUJAsnNTlkjNWzfBCPMOhi8JAiCSqPBmyMFVQ1OdctQwLywNZ5cPCpDl80D6IhjzBASQF0sUeREpSJCyE4ceSpJXbEO2612AHepaTSRn/YrtEAD3n8xV/ntv4+S96nyGRO9gccQZmEPiBK3bRi5kPHcG+v2T32n2+53bxNY8oQyWIB0SR9OmqxMeTh5lm/8azx8srEbCQNSqTpUTX+eagwCiPqiWeQAXO/olHV2tPaYUFjWCxsQJjt7MV564K6iOB2Xj1adNGa3PqDMFl4XwSSnAQCUIibqFPlwtTwbiOkoSR+JvLx3KYv9BXaSrlLyifSegQBNMFTAWhiIeFArRZnoX+8Y2EzKhbnuNlYO9wFpZXkwoH5Kmj/6qOFTz+0n8+Y4Y/2pVIcJqY35+YJ6wjEN33ZzL9kPY3hWjx6Sv+RcByLIQAZZYQJSn2C944FRF/QkvjQ31XZDcV04GVPOGl+WdJEhVGbaNPV3d7Va7ZP83U/1ACgzTjkg4gjUFvHhGWkrPAPnnBLNeFSEKKfAbzOu9yBAUdVj6cZURpZuU3XOUILioD93x2IEnxxFGc9c6M+M93cHSNZVzHquBQDeMn4x898wQ2us7pgGvAbyU8/z5e5EupVEqtJirCgp4KHxVI7sbrQIYKHyKF3+yvIvEEX8FsQNk9qXwgBpgQwNo7p9OKrukzfdzF08+WTmYrV35YF+tU8bEpYImInGtLVH+8PkzZ8iQcVpjrawXCLOHH5uo/9JmWjbXHJMQcNhVW8bOklbsumnJw7Q+cgtVK2mJxAUNNKKncp54KHuzAwnjCE01B1UIHA1A80ik/IkdIfTj6mE8MXh2sSKZhdHUd+IcDykwFLj4eMv7Fv+il75c8/xEmeHaojD+jZ4LgbsPVVvO5iutg4oSAFCCiAqVp/jrUKRU8mzVexsube05ff3tiD0Q1wkP/ojrYgeiaftiheHsjLKL4GrudTxYvb0H9h94bpzeAwCD4cAqJf5SmlBjFH5D8ChVC1Q8KyIkrjtgbE64y4lqtINJHel5Hq4q4ZdsYzsWBWaU+rkFWtFzQbiNNnWciNbT/qD4+Hitq/FdE/3mWzmvQU+W4hZZPenQuRHRNfylcvfVjpUqz0Tj6dNE1/fm4euufTx1z5am3/hr6z6lj9A9ElneKwPJ3IYEVEpqKys0YFeUhoDBP4TV/+bjVIkfqKuu8/ixC/+tqR73111V4DYnrrb+G8a+h1tkk9dY/m7MxV7XUzwdP3ApBgCYG6Co+L6/+kcB4X0g0ERFFzwXjojBc5q8ZhqOKtWEoROmLEwSWBIHowVySyqSS5kIABEYhisRFEov8SgRWGD6K9OMgq8IwBIkTBBYXASGsxcW3pUoHgfF5iIiLPv9x+03kuLxMqaqsUj1KJL4gsFgICGEtFrJtUG6OwDhtJHHhqLOl+dBAG0AnXRAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBAFBQBAQBAQBQUAQEAQEAUFAEBAEBIGVhMD/D0fV/fpMMM+gAAAAAElFTkSuQmCC' + } + +} diff --git a/uni_modules/uview-plus/components/u-no-network/props.js b/uni_modules/uview-plus/components/u-no-network/props.js new file mode 100644 index 0000000..1091cf5 --- /dev/null +++ b/uni_modules/uview-plus/components/u-no-network/props.js @@ -0,0 +1,21 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 页面文字提示 + tips: { + type: String, + default: () => defProps.noNetwork.tips + }, + // 一个z-index值,用于设置没有网络这个组件的层次,因为页面可能会有其他定位的元素层级过高,导致此组件被覆盖 + zIndex: { + type: [String, Number], + default: () => defProps.noNetwork.zIndex + }, + // image 没有网络的图片提示 + image: { + type: String, + default: () => defProps.noNetwork.image + } + } +}) diff --git a/uni_modules/uview-plus/components/u-no-network/u-no-network.vue b/uni_modules/uview-plus/components/u-no-network/u-no-network.vue new file mode 100644 index 0000000..374115c --- /dev/null +++ b/uni_modules/uview-plus/components/u-no-network/u-no-network.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-notice-bar/noticeBar.js b/uni_modules/uview-plus/components/u-notice-bar/noticeBar.js new file mode 100644 index 0000000..5c4adde --- /dev/null +++ b/uni_modules/uview-plus/components/u-notice-bar/noticeBar.js @@ -0,0 +1,28 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:17:13 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/noticeBar.js + */ +export default { + // noticeBar + noticeBar: { + text: [], + direction: 'row', + step: false, + icon: 'volume', + mode: '', + color: '#f9ae3d', + bgColor: '#fdf6ec', + speed: 80, + fontSize: 14, + duration: 2000, + disableTouch: true, + url: '', + linkType: 'navigateTo', + justifyContent: 'flex-start' + } +} diff --git a/uni_modules/uview-plus/components/u-notice-bar/props.js b/uni_modules/uview-plus/components/u-notice-bar/props.js new file mode 100644 index 0000000..2dd91af --- /dev/null +++ b/uni_modules/uview-plus/components/u-notice-bar/props.js @@ -0,0 +1,76 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 显示的内容,数组 + text: { + type: [Array, String], + default: () => defProps.noticeBar.text + }, + // 通告滚动模式,row-横向滚动,column-竖向滚动 + direction: { + type: String, + default: () => defProps.noticeBar.direction + }, + // direction = row时,是否使用步进形式滚动 + step: { + type: Boolean, + default: () => defProps.noticeBar.step + }, + // 是否显示左侧的音量图标 + icon: { + type: String, + default: () => defProps.noticeBar.icon + }, + // 通告模式,link-显示右箭头,closable-显示右侧关闭图标 + mode: { + type: String, + default: () => defProps.noticeBar.mode + }, + // 文字颜色,各图标也会使用文字颜色 + color: { + type: String, + default: () => defProps.noticeBar.color + }, + // 背景颜色 + bgColor: { + type: String, + default: () => defProps.noticeBar.bgColor + }, + // 水平滚动时的滚动速度,即每秒滚动多少px(px),这有利于控制文字无论多少时,都能有一个恒定的速度 + speed: { + type: [String, Number], + default: () => defProps.noticeBar.speed + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: () => defProps.noticeBar.fontSize + }, + // 滚动一个周期的时间长,单位ms + duration: { + type: [String, Number], + default: () => defProps.noticeBar.duration + }, + // 是否禁止用手滑动切换 + // 目前HX2.6.11,只支持App 2.5.5+、H5 2.5.5+、支付宝小程序、字节跳动小程序 + disableTouch: { + type: Boolean, + default: () => defProps.noticeBar.disableTouch + }, + // 跳转的页面路径 + url: { + type: String, + default: () => defProps.noticeBar.url + }, + // 页面跳转的类型 + linkType: { + type: String, + default: () => defProps.noticeBar.linkType + }, + justifyContent: { + type: String, + default: () => defProps.noticeBar.justifyContent + }, + } +}) diff --git a/uni_modules/uview-plus/components/u-notice-bar/u-notice-bar.vue b/uni_modules/uview-plus/components/u-notice-bar/u-notice-bar.vue new file mode 100644 index 0000000..122a4cc --- /dev/null +++ b/uni_modules/uview-plus/components/u-notice-bar/u-notice-bar.vue @@ -0,0 +1,105 @@ + + + + diff --git a/uni_modules/uview-plus/components/u-notify/notify.js b/uni_modules/uview-plus/components/u-notify/notify.js new file mode 100644 index 0000000..1042d2a --- /dev/null +++ b/uni_modules/uview-plus/components/u-notify/notify.js @@ -0,0 +1,22 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:10:21 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/notify.js + */ +export default { + // notify组件 + notify: { + top: 0, + type: 'primary', + color: '#ffffff', + bgColor: '', + message: '', + duration: 3000, + fontSize: 15, + safeAreaInsetTop: false + } +} diff --git a/uni_modules/uview-plus/components/u-notify/props.js b/uni_modules/uview-plus/components/u-notify/props.js new file mode 100644 index 0000000..fdb01b4 --- /dev/null +++ b/uni_modules/uview-plus/components/u-notify/props.js @@ -0,0 +1,51 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 到顶部的距离 + top: { + type: [String, Number], + default: () => defProps.notify.top + }, + // 是否展示组件 + // show: { + // type: Boolean, + // default: () => defProps.notify.show + // }, + // type主题,primary,success,warning,error + type: { + type: String, + default: () => defProps.notify.type + }, + // 字体颜色 + color: { + type: String, + default: () => defProps.notify.color + }, + // 背景颜色 + bgColor: { + type: String, + default: () => defProps.notify.bgColor + }, + // 展示的文字内容 + message: { + type: String, + default: () => defProps.notify.message + }, + // 展示时长,为0时不消失,单位ms + duration: { + type: [String, Number], + default: () => defProps.notify.duration + }, + // 字体大小 + fontSize: { + type: [String, Number], + default: () => defProps.notify.fontSize + }, + // 是否留出顶部安全距离(状态栏高度) + safeAreaInsetTop: { + type: Boolean, + default: () => defProps.notify.safeAreaInsetTop + } + } +}) diff --git a/uni_modules/uview-plus/components/u-notify/u-notify.vue b/uni_modules/uview-plus/components/u-notify/u-notify.vue new file mode 100644 index 0000000..2970f4d --- /dev/null +++ b/uni_modules/uview-plus/components/u-notify/u-notify.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-number-box/numberBox.js b/uni_modules/uview-plus/components/u-number-box/numberBox.js new file mode 100644 index 0000000..e6fb3b7 --- /dev/null +++ b/uni_modules/uview-plus/components/u-number-box/numberBox.js @@ -0,0 +1,40 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:11:46 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/numberBox.js + */ +export default { + // 步进器组件 + numberBox: { + name: '', + value: 0, + min: 1, + max: Number.MAX_SAFE_INTEGER, + step: 1, + integer: false, + disabled: false, + disabledInput: false, + asyncChange: false, + inputWidth: 35, + showMinus: true, + showPlus: true, + decimalLength: null, + longPress: true, + color: '#323233', + buttonWidth: 30, + buttonSize: 30, + buttonRadius: '0px', + bgColor: '#EBECEE', + disabledBgColor: '#f7f8fa', + inputBgColor: '#EBECEE', + cursorSpacing: 100, + disableMinus: false, + disablePlus: false, + iconStyle: '', + miniMode: false + } +} diff --git a/uni_modules/uview-plus/components/u-number-box/props.js b/uni_modules/uview-plus/components/u-number-box/props.js new file mode 100644 index 0000000..ada9952 --- /dev/null +++ b/uni_modules/uview-plus/components/u-number-box/props.js @@ -0,0 +1,145 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 步进器标识符,在change回调返回 + name: { + type: [String, Number], + default: () => defProps.numberBox.name + }, + // #ifdef VUE2 + // 用于双向绑定的值,初始化时设置设为默认min值(最小值) + value: { + type: [String, Number], + default: () => defProps.numberBox.value + }, + // #endif + // #ifdef VUE3 + // 用于双向绑定的值,初始化时设置设为默认min值(最小值) + modelValue: { + type: [String, Number], + default: () => defProps.numberBox.value + }, + // #endif + // 最小值 + min: { + type: [String, Number], + default: () => defProps.numberBox.min + }, + // 最大值 + max: { + type: [String, Number], + default: () => defProps.numberBox.max + }, + // 加减的步长,可为小数 + step: { + type: [String, Number], + default: () => defProps.numberBox.step + }, + // 是否只允许输入整数 + integer: { + type: Boolean, + default: () => defProps.numberBox.integer + }, + // 是否禁用,包括输入框,加减按钮 + disabled: { + type: Boolean, + default: () => defProps.numberBox.disabled + }, + // 是否禁用输入框 + disabledInput: { + type: Boolean, + default: () => defProps.numberBox.disabledInput + }, + // 是否开启异步变更,开启后需要手动控制输入值 + asyncChange: { + type: Boolean, + default: () => defProps.numberBox.asyncChange + }, + // 输入框宽度,单位为px + inputWidth: { + type: [String, Number], + default: () => defProps.numberBox.inputWidth + }, + // 是否显示减少按钮 + showMinus: { + type: Boolean, + default: () => defProps.numberBox.showMinus + }, + // 是否显示增加按钮 + showPlus: { + type: Boolean, + default: () => defProps.numberBox.showPlus + }, + // 显示的小数位数 + decimalLength: { + type: [String, Number, null], + default: () => defProps.numberBox.decimalLength + }, + // 是否开启长按加减手势 + longPress: { + type: Boolean, + default: () => defProps.numberBox.longPress + }, + // 输入框文字和加减按钮图标的颜色 + color: { + type: String, + default: () => defProps.numberBox.color + }, + // 按钮宽度 + buttonWidth: { + type: [String, Number], + default: () => defProps.numberBox.buttonWidth + }, + // 按钮大小,宽高等于此值,单位px,输入框高度和此值保持一致 + buttonSize: { + type: [String, Number], + default: () => defProps.numberBox.buttonSize + }, + // 按钮圆角 + buttonRadius: { + type: [String], + default: () => defProps.numberBox.buttonRadius + }, + // 输入框和按钮的背景颜色 + bgColor: { + type: String, + default: () => defProps.numberBox.bgColor + }, + // 按钮禁用背景色 + disabledBgColor: { + type: String, + default: () => defProps.numberBox.disabledBgColor + }, + // 输入框背景颜色 + inputBgColor: { + type: String, + default: () => defProps.numberBox.inputBgColor + }, + // 指定光标于键盘的距离,避免键盘遮挡输入框,单位px + cursorSpacing: { + type: [String, Number], + default: () => defProps.numberBox.cursorSpacing + }, + // 是否禁用增加按钮 + disablePlus: { + type: Boolean, + default: () => defProps.numberBox.disablePlus + }, + // 是否禁用减少按钮 + disableMinus: { + type: Boolean, + default: () => defProps.numberBox.disableMinus + }, + // 加减按钮图标的样式 + iconStyle: { + type: [Object, String], + default: () => defProps.numberBox.iconStyle + }, + // 迷你模式 + miniMode: { + type: Boolean, + default: () => defProps.numberBox.miniMode + }, + } +}) diff --git a/uni_modules/uview-plus/components/u-number-box/u-number-box.vue b/uni_modules/uview-plus/components/u-number-box/u-number-box.vue new file mode 100644 index 0000000..09ae4f5 --- /dev/null +++ b/uni_modules/uview-plus/components/u-number-box/u-number-box.vue @@ -0,0 +1,478 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-number-keyboard/numberKeyboard.js b/uni_modules/uview-plus/components/u-number-keyboard/numberKeyboard.js new file mode 100644 index 0000000..7b45065 --- /dev/null +++ b/uni_modules/uview-plus/components/u-number-keyboard/numberKeyboard.js @@ -0,0 +1,17 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:08:05 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/numberKeyboard.js + */ +export default { + // 数字键盘 + numberKeyboard: { + mode: 'number', + dotDisabled: false, + random: false + } +} diff --git a/uni_modules/uview-plus/components/u-number-keyboard/props.js b/uni_modules/uview-plus/components/u-number-keyboard/props.js new file mode 100644 index 0000000..d853858 --- /dev/null +++ b/uni_modules/uview-plus/components/u-number-keyboard/props.js @@ -0,0 +1,21 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 键盘的类型,number-数字键盘,card-身份证键盘 + mode: { + type: String, + default: () => defProps.numberKeyboard.value + }, + // 是否显示键盘的"."符号 + dotDisabled: { + type: Boolean, + default: () => defProps.numberKeyboard.dotDisabled + }, + // 是否打乱键盘按键的顺序 + random: { + type: Boolean, + default: () => defProps.numberKeyboard.random + } + } +}) diff --git a/uni_modules/uview-plus/components/u-number-keyboard/u-number-keyboard.vue b/uni_modules/uview-plus/components/u-number-keyboard/u-number-keyboard.vue new file mode 100644 index 0000000..2290793 --- /dev/null +++ b/uni_modules/uview-plus/components/u-number-keyboard/u-number-keyboard.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-overlay/overlay.js b/uni_modules/uview-plus/components/u-overlay/overlay.js new file mode 100644 index 0000000..c26d068 --- /dev/null +++ b/uni_modules/uview-plus/components/u-overlay/overlay.js @@ -0,0 +1,18 @@ +/* + * @Author : LQ + * @Description : + * @version : 1.0 + * @Date : 2021-08-20 16:44:21 + * @LastAuthor : LQ + * @lastTime : 2021-08-20 17:06:50 + * @FilePath : /u-view2.0/uview-ui/libs/config/props/overlay.js + */ +export default { + // overlay组件 + overlay: { + show: false, + zIndex: 10070, + duration: 300, + opacity: 0.5 + } +} diff --git a/uni_modules/uview-plus/components/u-overlay/props.js b/uni_modules/uview-plus/components/u-overlay/props.js new file mode 100644 index 0000000..39f16f3 --- /dev/null +++ b/uni_modules/uview-plus/components/u-overlay/props.js @@ -0,0 +1,26 @@ +import { defineMixin } from '../../libs/vue' +import defProps from '../../libs/config/props.js' +export const props = defineMixin({ + props: { + // 是否显示遮罩 + show: { + type: Boolean, + default: () => defProps.overlay.show + }, + // 层级z-index + zIndex: { + type: [String, Number], + default: () => defProps.overlay.zIndex + }, + // 遮罩的过渡时间,单位为ms + duration: { + type: [String, Number], + default: () => defProps.overlay.duration + }, + // 不透明度值,当做rgba的第四个参数 + opacity: { + type: [String, Number], + default: () => defProps.overlay.opacity + } + } +}) diff --git a/uni_modules/uview-plus/components/u-overlay/u-overlay.vue b/uni_modules/uview-plus/components/u-overlay/u-overlay.vue new file mode 100644 index 0000000..c10a213 --- /dev/null +++ b/uni_modules/uview-plus/components/u-overlay/u-overlay.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-pagination/u-pagination.vue b/uni_modules/uview-plus/components/u-pagination/u-pagination.vue new file mode 100644 index 0000000..89dd2f0 --- /dev/null +++ b/uni_modules/uview-plus/components/u-pagination/u-pagination.vue @@ -0,0 +1,283 @@ + + + + + diff --git a/uni_modules/uview-plus/components/u-parse/node/node.vue b/uni_modules/uview-plus/components/u-parse/node/node.vue new file mode 100644 index 0000000..fca3a76 --- /dev/null +++ b/uni_modules/uview-plus/components/u-parse/node/node.vue @@ -0,0 +1,599 @@ +