diff --git a/package.json b/package.json index 0ef039f..687f5e7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vuecsv", - "version": "0.0.6", + "version": "0.0.7", "description": "CSV components for Vue.js", "homepage": "https://github.com/ynishi/vuecsv", "repository": { @@ -21,6 +21,8 @@ "prepare": "npm run build" }, "dependencies": { + "bootstrap": "4.0.0-beta.2", + "bootstrap-vue": "^1.4.1", "file-saver": "^1.3.3", "papaparse": "^4.3.6", "testdouble": "^3.3.1", diff --git a/src/components/CsvDownload.vue b/src/components/CsvDownload.vue index 31eaa07..bb4c990 100644 --- a/src/components/CsvDownload.vue +++ b/src/components/CsvDownload.vue @@ -1,6 +1,7 @@ @@ -8,8 +9,13 @@ import Papa from 'papaparse' import * as FS from 'file-saver' +import CsvOption from './CsvOption.vue' + export default { name: 'CsvDownload', + components: { + 'optionModal': CsvOption + }, props: { title: { type: String, @@ -17,10 +23,21 @@ export default { }, filename: { type: String, - default: 'download.csv' + default: 'download' }, - convOption: { - type: Object + options: { + type: Object, + default: () => { + return { + quotes: true, + quoteChar: '"', + delimiter: ',', + newline: '\r\n', + header: true, + timestamp: false, + comp: false + } + } }, header: { type: Object @@ -35,9 +52,10 @@ export default { } }, methods: { - convert () { + convert (options) { + var dataCSV if (typeof this.header === 'undefined' || this.header === '') { - this.dataCSV = Papa.unparse(this.dataJson, this.convOption) + dataCSV = Papa.unparse(this.dataJson, options) } else { var d = { fields: Object.values(this.header), @@ -51,17 +69,65 @@ export default { } d.data.push(a) } - this.dataCSV = Papa.unparse(d, this.convOption) + dataCSV = Papa.unparse(d, options) } + return dataCSV + }, + emitOptions (options) { + this.options = options + }, + emitDownload (options) { + this._download(options) }, download () { - this.convert() - if (typeof this.dataCSV === 'undefined' || this.dataCSV === '') { + this._download(this.options) + }, + _makeFilename (base, delimiter, timestamp) { + var t = base + if (timestamp) { + const now = new Date() + t += '_' + now.getFullYear() + + ('0' + (now.getMonth() + 1)).slice(-2) + + ('0' + now.getDate()).slice(-2) + + ('0' + now.getHours()).slice(-2) + + ('0' + now.getMinutes()).slice(-2) + } + + switch (delimiter) { + case '\t': + t += '.tsv' + break + case ',': + t += '.csv' + break + default: + t += '.txt' + break + } + return t + }, + _download (options) { + var filename + var opts + + if (typeof options.filename === 'undefined' || options.filename === '') { + filename = this.filename + } else { + filename = options.filename + } + filename = this._makeFilename(filename, options.delimiter, options.timestamp) + if (typeof options === 'undefined' || options === '') { + opts = this.options + } else { + opts = options + } + const dataCSV = this.convert(opts) + if (typeof dataCSV === 'undefined' || dataCSV === '') { alert('no data') return } - const blob = new Blob([this.dataCSV], {type: 'text/csv;charset=utf-8'}) - FS.saveAs(blob, this.filename) + const blob = new Blob([dataCSV], {type: 'text/csv;charset=utf-8'}) + FS.saveAs(blob, filename) } } } diff --git a/src/components/CsvOption.vue b/src/components/CsvOption.vue new file mode 100644 index 0000000..507333e --- /dev/null +++ b/src/components/CsvOption.vue @@ -0,0 +1,313 @@ + + + + + diff --git a/src/index.js b/src/index.js index 2d80824..07a267f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,9 @@ import CsvDownload from './components/CsvDownload.vue' +import CsvOption from './components/CsvOption.vue' function plugin (Vue) { Vue.component(CsvDownload.name, CsvDownload) + Vue.component(CsvOption.name, CsvOption) } if (typeof window !== 'undefined' && window.Vue) { @@ -13,5 +15,6 @@ const version = '__VERSION__' export { CsvDownload, + CsvOption, version } diff --git a/test/unit/specs/CsvDownload.spec.js b/test/unit/specs/CsvDownload.spec.js index 8b26e68..bf0bb4c 100644 --- a/test/unit/specs/CsvDownload.spec.js +++ b/test/unit/specs/CsvDownload.spec.js @@ -9,9 +9,9 @@ function getRendered (Component, propsData) { } const testHeader = { - 'a': 'headerA', - 'b': 'headerB' - } + 'a': 'headerA', + 'b': 'headerB' +} const testDataJson = [ { @@ -24,6 +24,11 @@ const testDataJson = [ } ] +const testOptions = { + delimiter: ',', + timestamp: false +} + describe('CsvDownload.vue', () => { it('should render CsvDownload Component', () => { const vm = getRendered(CsvDownload, {}) @@ -32,27 +37,27 @@ describe('CsvDownload.vue', () => { it('should render with props', () => { const propsData = { title: 'testTitle', - filename: 'testFile.csv', - convOption: { opt1: 'testOpt' }, + filename: 'testFile', + options: testOptions, dataJson: testDataJson } const vm = getRendered(CsvDownload, propsData) expect(vm.title).to.equal('testTitle') - expect(vm.filename).to.equal('testFile.csv') - expect(vm.convOption.opt1).to.equal('testOpt') + expect(vm.filename).to.equal('testFile') + expect(vm.options.delimiter).to.equal(',') expect(vm.dataJson).to.equal(testDataJson) }) it('should convert csv', () => { const vm = getRendered(CsvDownload, { dataJson: testDataJson }) - vm.convert() + const dataCSV = vm.convert() const expected = 'a,b\r\n1,2\r\n3,4' - expect(expected).to.equal(vm.dataCSV) + expect(expected).to.equal(dataCSV) }) it('should convert csv with header', () => { const vm = getRendered(CsvDownload, { header: testHeader, dataJson: testDataJson }) - vm.convert() + const dataCSV = vm.convert() const expected = 'headerA,headerB\r\n1,2\r\n3,4' - expect(expected).to.equal(vm.dataCSV) + expect(expected).to.equal(dataCSV) }) it('should called download', () => { const vm = getRendered(CsvDownload, {}) @@ -60,5 +65,8 @@ describe('CsvDownload.vue', () => { var download = td.function('vm.download') download() td.verify(download()) + var emitDownload = td.function('vm.emitDownload') + emitDownload() + td.verify(emitDownload()) }) }) diff --git a/test/unit/specs/CsvOption.spec.js b/test/unit/specs/CsvOption.spec.js new file mode 100644 index 0000000..f219499 --- /dev/null +++ b/test/unit/specs/CsvOption.spec.js @@ -0,0 +1,54 @@ +import Vue from 'vue' +import CsvOption from '@/components/CsvOption' +import * as td from 'testdouble' + +function getRendered (Component, propsData) { + const Constructor = Vue.extend(Component) + const vm = new Constructor({ propsData: propsData }).$mount() + return vm +} + +const propsData = { + quotes: true, + quoteChar: "'", + delimiter: '|', + header: false, + newlineId: 'nlid1', + timestamp: true, + comp: true +} + +describe('CsvOption.vue', () => { + it('should render CsvOption Component', () => { + const vm = getRendered(CsvOption, {}) + expect(vm.$el.className).to.equal('csvoption') + }) + it('should render with props', () => { + const vm = getRendered(CsvOption, propsData) + expect(vm.quotes).to.equal(true) + expect(vm.quoteChar).to.equal("'") + expect(vm.delimiter).to.equal('|') + expect(vm.header).to.equal(false) + expect(vm.newlineId).to.equal('nlid1') + expect(vm.timestamp).to.equal(true) + expect(vm.comp).to.equal(true) + }) + it('should have public functions', () => { + expect(typeof CsvOption.methods.showModal).to.equal('function') + expect(typeof CsvOption.methods.submit).to.equal('function') + expect(typeof CsvOption.methods.download).to.equal('function') + }) + it('should invoke functions', () => { + const vm = getRendered(CsvOption, propsData) + + var showModel = td.function('vm.showModel') + showModel() + td.verify(showModel()) + var submit = td.function('vm.submit') + submit() + td.verify(submit()) + var download = td.function('vm.download') + download() + td.verify(download()) + }) +}) diff --git a/yarn.lock b/yarn.lock index 99f4ee0..1b34037 100644 --- a/yarn.lock +++ b/yarn.lock @@ -140,6 +140,10 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" @@ -847,6 +851,14 @@ babel-plugin-transform-vue-jsx@^3.5.0: dependencies: esutils "^2.0.2" +babel-polyfill@6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" + dependencies: + babel-runtime "^6.22.0" + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + babel-preset-env@^1.3.2: version "1.6.1" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" @@ -1087,6 +1099,19 @@ boom@5.x.x: dependencies: hoek "4.x.x" +bootstrap-vue@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/bootstrap-vue/-/bootstrap-vue-1.4.1.tgz#9064938be4dd1d5dc3a9b880eeb558d47a097152" + dependencies: + lodash.startcase "^4.4.0" + opencollective "^1.0.3" + popper.js "^1.12.9" + vue-functional-data-merge "^2.0.3" + +bootstrap@4.0.0-beta.2: + version "4.0.0-beta.2" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.0.0-beta.2.tgz#4d67d2aa2219f062cd90bc1247e6747b9e8fd051" + brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -1341,7 +1366,7 @@ chai@^4.1.2: pathval "^1.0.0" type-detect "^4.0.0" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1740,7 +1765,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-env@^5.0.1: +cross-env@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.1.3.tgz#f8ae18faac87692b0a8b4d2f7000d4ec3a85dfd7" dependencies: @@ -2230,6 +2255,12 @@ encodeurl@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -2343,7 +2374,7 @@ es6-iterator@^2.0.1, es6-iterator@~2.0.1: es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-map@^0.1.3: +es6-map@^0.1.3, es6-map@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" dependencies: @@ -2716,7 +2747,7 @@ extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" -external-editor@^2.0.4: +external-editor@^2.0.1, external-editor@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" dependencies: @@ -2823,6 +2854,10 @@ file-loader@^1.1.4: loader-utils "^1.0.2" schema-utils "^0.3.0" +file-saver@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-1.3.3.tgz#cdd4c44d3aa264eac2f68ec165bc791c34af1232" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -3478,7 +3513,7 @@ https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" -iconv-lite@0.4.19, iconv-lite@^0.4.17: +iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -3554,6 +3589,24 @@ inject-loader@^3.0.0: dependencies: babel-core "~6" +inquirer@3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.1" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^2.0.0" + strip-ansi "^3.0.0" + through "^2.3.6" + inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" @@ -3805,6 +3858,10 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" + is-resolvable@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.1.tgz#acca1cd36dbe44b974b924321555a70ba03b1cf4" @@ -4263,6 +4320,10 @@ lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" + lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -4645,6 +4706,13 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-fetch@1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-forge@0.6.33: version "0.6.33" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" @@ -4849,10 +4917,28 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +opencollective@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/opencollective/-/opencollective-1.0.3.tgz#aee6372bc28144583690c3ca8daecfc120dd0ef1" + dependencies: + babel-polyfill "6.23.0" + chalk "1.1.3" + inquirer "3.0.6" + minimist "1.2.0" + node-fetch "1.6.3" + opn "4.0.2" + opener@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" + opn@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" @@ -4964,6 +5050,10 @@ pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" +papaparse@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-4.3.6.tgz#9566eda0ecab13afcb740a62381c699f486cb145" + parallel-transform@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" @@ -5167,6 +5257,10 @@ pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +popper.js@^1.12.9: + version "1.12.9" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.12.9.tgz#0dfbc2dff96c451bb332edcfcfaaf566d331d5b3" + portfinder@^1.0.13, portfinder@^1.0.9: version "1.0.13" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" @@ -5617,6 +5711,13 @@ querystringify@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" +quibble@^0.5.1: + version "0.5.3" + resolved "https://registry.yarnpkg.com/quibble/-/quibble-0.5.3.tgz#3dfd53206fc6873f61c96f3bece63b69747b4d0c" + dependencies: + lodash "^4.17.2" + resolve "^1.5.0" + randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" @@ -5756,6 +5857,10 @@ regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" +regenerator-runtime@^0.10.0: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -6001,6 +6106,10 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + safe-buffer@5.1.1, 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" @@ -6494,6 +6603,13 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" +stringify-object-es5@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/stringify-object-es5/-/stringify-object-es5-2.5.0.tgz#057c3c9a90a127339bb9d1704a290bb7bd0a1ec5" + dependencies: + is-plain-obj "^1.0.0" + is-regexp "^1.0.0" + stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -6620,6 +6736,15 @@ test-exclude@^4.1.1: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" +testdouble@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/testdouble/-/testdouble-3.3.2.tgz#09ee360aab9bc410aa2eb2fd835c0eb7439239d5" + dependencies: + es6-map "^0.1.5" + lodash "^4.17.4" + quibble "^0.5.1" + stringify-object-es5 "^2.5.0" + text-encoding@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" @@ -6986,6 +7111,10 @@ vue-eslint-parser@^2.0.1: esquery "^1.0.0" lodash "^4.17.4" +vue-functional-data-merge@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vue-functional-data-merge/-/vue-functional-data-merge-2.0.4.tgz#b045ca57097f31446db6de15c87642b6e88ca7c2" + vue-hot-reload-api@^2.2.0: version "2.2.4" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.2.4.tgz#683bd1d026c0d3b3c937d5875679e9a87ec6cd8f" @@ -7115,7 +7244,7 @@ webpack-sources@^1.0.1, webpack-sources@^1.1.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^3.6.0: +webpack@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.10.0.tgz#5291b875078cf2abf42bdd23afe3f8f96c17d725" dependencies: