From 95a9700d50b5273641820cafc6e3eb969764db1a Mon Sep 17 00:00:00 2001 From: Gennady Grishkovtsov Date: Mon, 23 Jul 2018 12:00:58 +0300 Subject: [PATCH] Add existing code --- .babelrc | 6 + .editorconfig | 9 + .gitignore | 11 + README.md | 73 +- demo/index.html | 21 + demo/index.js | 16 + dist/vue-audio-recorder.min.js | 2 + dist/vue-audio-recorder.min.js.map | 1 + package-lock.json | 9104 ++++++++++++++++++++++++++++ package.json | 51 + screenshot.png | Bin 0 -> 51454 bytes src/audio-recorder.vue | 321 + src/components/icon-button.vue | 84 + src/components/line-control.vue | 54 + src/components/record-player.vue | 227 + src/index.js | 13 + src/lib/recorder.js | 110 + src/lib/utils.js | 22 + src/lib/wav-encoder.js | 59 + webpack.config.js | 65 + webpack.dev.js | 17 + webpack.prod.js | 31 + 22 files changed, 10295 insertions(+), 2 deletions(-) create mode 100644 .babelrc create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 demo/index.html create mode 100644 demo/index.js create mode 100644 dist/vue-audio-recorder.min.js create mode 100644 dist/vue-audio-recorder.min.js.map create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 screenshot.png create mode 100644 src/audio-recorder.vue create mode 100644 src/components/icon-button.vue create mode 100644 src/components/line-control.vue create mode 100644 src/components/record-player.vue create mode 100644 src/index.js create mode 100644 src/lib/recorder.js create mode 100644 src/lib/utils.js create mode 100644 src/lib/wav-encoder.js create mode 100644 webpack.config.js create mode 100644 webpack.dev.js create mode 100644 webpack.prod.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..e812394 --- /dev/null +++ b/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + ["env", { "modules": false }], + "stage-3" + ] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9d08a1a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1511548 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +node_modules/ +npm-debug.log +yarn-error.log + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/README.md b/README.md index 977ec2c..2195172 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,71 @@ -# vue-a-recorder -A simple audio recorder for VueJS applications +# vue-audio-recorder + +> Audio recorder for Vue.js. It allows to create, play, download and store records on a server + +#### [Live demo](https://jsfiddle.net/grishkovelli/rb1anxyj/) + +![](https://raw.githubusercontent.com/grishkovelli/vue-audio-recorder/master/screenshot.png) + +### Features + +- Beautiful clean UI +- Download/upload/play record +- Time limit +- Records limit +- A lot of callbacks + +## Installation + +``` +npm i vue-audio-recorder --save +``` + +## Props + +| Prop | Type | Description | +| --------------------- | -------- | ---------------------------------------------------------------- | +| attempts | Number | Number of recording attempts | +| time | Number | Time limit for record in minutes | +| upload-url | String | URL for uploading | +| start-record | Function | It fires after click the record button | +| stop-record | Function | It fires after click the stop button or exceeding the time limit | +| start-upload | Function | It fires after start uploading | +| attempts-limit | Function | It fires after exceeding the attempts | +| failed-upload | Function | Is fires after failure uploading | +| mic-failed | Function | It fires if your microphone doesn't work | +| successful-upload | Function | It fires after successful uploading | +| successful-upload-msg | String | Display the message after successful uploading | +| failed-upload-msg | String | Display the message after failure uploading | + +## Usage + +```js + +``` + +## Build Setup + +``` bash +# install dependencies +npm install + +# serve with hot reload at localhost:8080 +npm run dev + +# build for production with minification +npm run build +``` + +## Authors + +[Gennady Grishkovtsov](https://www.linkedin.com/in/grishkovtsov/) - Developer + +[Olga Zimina](https://www.behance.net/zimin4ik) - UIX Designer diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..e0da726 --- /dev/null +++ b/demo/index.html @@ -0,0 +1,21 @@ + + + + + vue-audio-recorder | demo + + + +
+ +
+ + diff --git a/demo/index.js b/demo/index.js new file mode 100644 index 0000000..6f89355 --- /dev/null +++ b/demo/index.js @@ -0,0 +1,16 @@ +import Vue from 'vue' +import axios from 'axios' +import AudioRecorder from '../src/audio-recorder' + +Vue.config.productionTip = false +Vue.prototype.$http = axios + +new Vue({ + el: '#app', + components: {AudioRecorder}, + methods: { + callback (msg) { + console.debug('Event: ', msg) + } + } +}) diff --git a/dist/vue-audio-recorder.min.js b/dist/vue-audio-recorder.min.js new file mode 100644 index 0000000..2d7ee4d --- /dev/null +++ b/dist/vue-audio-recorder.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("VueAudioRecorder",[],e):"object"==typeof exports?exports.VueAudioRecorder=e():t.VueAudioRecorder=e()}("undefined"!=typeof self?self:this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=9)}([function(t,e){function n(t,e){var n=t[1]||"",i=t[3];if(!i)return n;if(e&&"function"==typeof btoa){var o=r(i);return[n].concat(i.sources.map(function(t){return"/*# sourceURL="+i.sourceRoot+t+" */"})).concat([o]).join("\n")}return[n].join("\n")}function r(t){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(t))))+" */"}t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var r=n(e,t);return e[2]?"@media "+e[2]+"{"+r+"}":r}).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var r={},i=0;in.parts.length&&(r.parts.length=n.parts.length)}else{for(var s=[],i=0;i1?1:i}function i(t){return new Date(1e3*t).toISOString().substr(14,5)}e.a=r,e.b=i},function(t,e,n){"use strict";var r=n(5),i=n(17),o=n(19),s=n(3);e.a={props:{attempts:{type:Number},time:{type:Number},uploadUrl:{type:String},attemptsLimit:{type:Function},failedUpload:{type:Function},micFailed:{type:Function},startRecord:{type:Function},startUpload:{type:Function},stopRecord:{type:Function},successfulUpload:{type:Function},successfulUploadMsg:{type:String,default:"Upload successful"},failedUploadMsg:{type:String,default:"Upload fail"}},data:function(){var t=this;return{isUploading:!1,recorder:new i.a({afterStop:function(){t.recordList=t.recorder.recordList(),t.stopRecord&&t.stopRecord("stop record")},attempts:this.attempts,time:this.time}),recordList:[],selectedRecord:{},uploadStatus:null}},components:{IconButton:r.a,RecordPlayer:o.a},methods:{toggleRecorder:function(){this.attempts&&this.recorder.records.length>=this.attempts||(!this.isRecording||this.isRecording&&this.isPause?(this.recorder.start(),this.startRecord&&this.startRecord("start record")):(this.recorder.pause(),this.startRecord&&this.startRecord("pause record")))},stopRecorder:function(){this.isRecording&&this.recorder.stop()},selectRecord:function(t,e){this.selectedRecord={idx:t,url:e.url,blob:e.blob}},onStartUpload:function(){this.isUploading=!0},onEndUpload:function(t){var e=this;this.isUploading=!1,this.uploadStatus=t,setTimeout(function(){e.uploadStatus=null},1500)}},computed:{attemptsLeft:function(){return this.attempts-this.recorder.records.length},iconButtonType:function(){return this.isRecording&&this.isPause?"mic":this.isRecording?"pause":"mic"},isPause:function(){return this.recorder.isPause},isRecording:function(){return this.recorder.isRecording},message:function(){return"success"===this.uploadStatus?this.successfulUploadMsg:this.failedUploadMsg},recordedTime:function(){return this.time&&this.recorder.duration>=60*this.time&&this.stopRecorder(),Object(s.b)(this.recorder.duration)},uploadStatusClasses:function(){var t=["ar__upload-status"];return t.push("success"===this.uploadStatus?"ar__upload-status--success":"ar__upload-status--fail"),t.join(" ")},volume:function(){return parseFloat(this.recorder.volume)}}}},function(t,e,n){"use strict";function r(t){n(14)}var i=n(6),o=n(16),s=n(2),a=r,c=s(i.a,o.a,!1,a,null,null);e.a=c.exports},function(t,e,n){"use strict";e.a={props:{name:{type:String},size:{type:String,default:"sm"}},data:function(){return{icons:{download:'',mic:'',pause:'',play:'',save:'',stop:'',volume:''}}},computed:{iconClasses:function(){return["ar-icon-button","ar-icon-button__"+this.size]}}}},function(t,e,n){"use strict";var r=n(5),i=n(22),o=n(3);e.a={props:{uploadUrl:{type:String},record:{type:Object},startUpload:{type:Function},successfulUpload:{type:Function},failedUpload:{type:Function}},data:function(){return{isPlaying:!1,duration:Object(o.b)(0),playedTime:Object(o.b)(0),progress:0,volume:.8}},components:{IconButton:r.a,LineControl:i.a},mounted:function(){var t=this;this.player=document.getElementById("audio-recorder-player"),this.player.addEventListener("ended",function(){t.isPlaying=!1}),this.player.addEventListener("loadeddata",function(e){t._resetProgress(),t.duration=Object(o.b)(t.player.duration)}),this.player.addEventListener("timeupdate",this._onTimeUpdate)},computed:{playBtnIcon:function(){return this.isPlaying?"pause":"play"}},methods:{playback:function(){var t=this;this.record.url&&(this.isPlaying?this.player.pause():setTimeout(function(){t.player.play()},0),this.isPlaying=!this.isPlaying)},upload:function(){var t=this;if(this.record.url){this.startUpload&&this.startUpload(),this.$emit("on-start-upload");var e=new FormData;e.append("audio",this.record.blob,"my-record"),this.$http.post(this.uploadUrl,e,{headers:{"Content-Type":"multipart/form-data; boundary="+e._boundary}}).then(function(e){t.$emit("on-end-upload","success"),t.successfulUpload&&t.successfulUpload(e)}).catch(function(e){t.$emit("on-end-upload","fail"),t.failedUpload&&t.failedUpload(e)})}},download:function(){if(this.record.url){var t=document.createElement("a");t.href=this.record.url,t.download="record.wav",t.click()}},_resetProgress:function(){this.isPlaying=!1,this.progress=0},_onTimeUpdate:function(){this.playedTime=Object(o.b)(this.player.currentTime),this.progress=this.player.currentTime/this.player.duration*100},_onUpdateProgress:function(t){t&&(this.player.currentTime=t*this.player.duration)},_onUpdateVolume:function(t){t&&(this.player.volume=t,this.volume=t)}}}},function(t,e,n){"use strict";var r=n(3);e.a={props:{refId:{type:String},eventName:{type:String},percentage:{type:Number,default:0}},methods:{onMouseDown:function(t){var e=Object(r.a)(t,this.$refs[this.refId]);this.$emit("changeLineHead",e),document.addEventListener("mousemove",this.onMouseMove),document.addEventListener("mouseup",this.onMouseUp)},onMouseUp:function(t){document.removeEventListener("mouseup",this.onMouseUp),document.removeEventListener("mousemove",this.onMouseMove);var e=Object(r.a)(t,this.$refs[this.refId]);this.$emit("changeLineHead",e)},onMouseMove:function(t){var e=Object(r.a)(t,this.$refs[this.refId]);this.$emit("changeLineHead",e)}},computed:{percentageWidth:function(){return(this.percentage<1?100*this.percentage:this.percentage)+"%"}}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(10);e.default={install:function(t){this.installed||(this.installed=!0,t.component("audio-recorder",r.a))}}},function(t,e,n){"use strict";function r(t){n(11)}var i=n(4),o=n(27),s=n(2),a=r,c=s(i.a,o.a,!1,a,null,null);e.a=c.exports},function(t,e,n){var r=n(12);"string"==typeof r&&(r=[[t.i,r,""]]),r.locals&&(t.exports=r.locals);n(1)("61bff3ea",r,!0,{})},function(t,e,n){e=t.exports=n(0)(!1),e.push([t.i,"\n.ar {\n width: 420px;\n font-family: 'Roboto', sans-serif;\n border-radius: 16px;\n background-color: #FAFAFA;\n box-shadow: 0 4px 18px 0 rgba(0, 0, 0, 0.17);\n position: relative;\n box-sizing: content-box;\n}\n.ar-content {\n padding: 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.ar-records {\n height: 138px;\n padding-top: 1px;\n overflow-y: auto;\n margin-bottom: 20px;\n}\n.ar-records__record {\n width: 320px;\n padding: 0 10px;\n margin: 0 auto;\n line-height: 45px;\n display: flex;\n justify-content: space-between;\n border-bottom: 1px solid #E8E8E8;\n}\n.ar-records__record--selected {\n border: 1px solid #E8E8E8;\n border-radius: 24px;\n background-color: #FFFFFF;\n margin-top: -1px;\n padding: 0 34px;\n}\n.ar-recorder {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.ar-recorder__duration {\n color: #AEAEAE;\n font-size: 32px;\n font-weight: 500;\n margin-top: 20px;\n margin-bottom: 16px;\n}\n.ar-recorder__stop {\n position: absolute;\n top: 10px;\n right: -52px;\n}\n.ar-recorder__time-limit {\n position: absolute;\n color: #AEAEAE;\n font-size: 12px;\n top: 128px;\n}\n.ar-recorder__records-limit {\n position: absolute;\n color: #AEAEAE;\n font-size: 12px;\n top: 78px;\n}\n.ar-spinner {\n display: flex;\n height: 30px;\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n margin: auto;\n width: 144px;\n z-index: 10;\n}\n.ar-spinner__dot {\n display: block;\n margin: 0 8px;\n border-radius: 50%;\n width: 30px;\n height: 30px;\n background: #05CBCD;\n animation-name: blink;\n animation-duration: 1.4s;\n animation-iteration-count: infinite;\n animation-fill-mode: both;\n}\n.ar-spinner__dot:nth-child(2) {\n animation-delay: .2s;\n}\n.ar-spinner__dot:nth-child(3) {\n animation-delay: .4s;\n}\n@keyframes blink {\n0% {\n opacity: .2;\n}\n20% {\n opacity: 1;\n}\n100% {\n opacity: .2;\n}\n}\n.ar__text {\n color: rgba(84, 84, 84, 0.5);\n font-size: 16px;\n}\n.ar__blur {\n filter: blur(2px);\n opacity: 0.7;\n}\n.ar__overlay {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 10;\n}\n.ar__upload-status {\n text-align: center;\n font-size: 10px;\n padding: 2px;\n letter-spacing: 1px;\n position: absolute;\n bottom: 0;\n}\n.ar__upload-status--success {\n color: green;\n}\n.ar__upload-status--fail {\n color: red;\n}\n",""])},function(t,e){t.exports=function(t,e){for(var n=[],r={},i=0;i0&&void 0!==arguments[0]?arguments[0]:{};r(this,t),this.afterStop=e.afterStop,this.micFailed=e.micFailed,this.bufferSize=4096,this.records=[],this.samples=[],this.isPause=!1,this.isRecording=!1,this.duration=0,this.volume=0,this._duration=0}return s(t,[{key:"start",value:function(){navigator.mediaDevices.getUserMedia({audio:!0}).then(this._micCaptured.bind(this)).catch(this._micError.bind(this)),this.isPause=!1,this.isRecording=!0}},{key:"stop",value:function(){this.stream.getTracks().forEach(function(t){return t.stop()}),this.input.disconnect(),this.processor.disconnect(),this.context.close();var t=new i.a({bufferSize:this.bufferSize,sampleRate:this.context.sampleRate,samples:this.samples}),e=t.getData(),n=URL.createObjectURL(e);this.samples=[],this.records.push({blob:e,url:n,duration:Object(o.b)(this.duration)}),this.isPause=!1,this.isRecording=!1,this._duration=0,this.duration=0,this.afterStop&&this.afterStop()}},{key:"pause",value:function(){this.stream.getTracks().forEach(function(t){return t.stop()}),this.input.disconnect(),this.processor.disconnect(),this.context.close(),this._duration=this.duration,this.isPause=!0}},{key:"recordList",value:function(){return this.records}},{key:"lastRecord",value:function(){return this.records.slice(-1)}},{key:"_micCaptured",value:function(t){var e=this;this.context=new AudioContext,this.input=this.context.createMediaStreamSource(t),this.processor=this.context.createScriptProcessor(this.bufferSize,1,1),this.duration=this._duration,this.stream=t,this.processor.onaudioprocess=function(t){for(var n=t.inputBuffer.getChannelData(0),r=0,i=0;i.02},attrs:{size:"lg",name:t.iconButtonType},nativeOn:{click:function(e){return t.toggleRecorder(e)}}}),t._v(" "),n("icon-button",{staticClass:"ar-recorder__stop",attrs:{name:"stop"},nativeOn:{click:function(e){return t.stopRecorder(e)}}})],1),t._v(" "),t.attempts?n("div",{staticClass:"ar-recorder__records-limit"},[t._v("Attempts: "+t._s(t.attemptsLeft)+"/"+t._s(t.attempts))]):t._e(),t._v(" "),n("div",{staticClass:"ar-recorder__duration"},[t._v(t._s(t.recordedTime))]),t._v(" "),t.time?n("div",{staticClass:"ar-recorder__time-limit"},[t._v("Record duration is limited: "+t._s(t.time)+"m")]):t._e(),t._v(" "),n("div",{staticClass:"ar-records"},t._l(t.recordList,function(e,r){return n("div",{staticClass:"ar-records__record",class:{"ar-records__record--selected":r===t.selectedRecord.idx},on:{click:function(n){t.selectRecord(r,e)}}},[n("div",{staticClass:"ar__text"},[t._v("Record "+t._s(r+1))]),t._v(" "),n("div",{staticClass:"ar__text"},[t._v(t._s(e.duration))])])})),t._v(" "),n("record-player",{attrs:{record:t.selectedRecord,"upload-url":t.uploadUrl,"start-upload":t.startUpload,"successful-upload":t.successfulUpload,"failed-upload":t.failedUpload},on:{"on-start-upload":t.onStartUpload,"on-end-upload":t.onEndUpload}}),t._v(" "),t.uploadStatus?n("div",{class:t.uploadStatusClasses},[t._v(t._s(t.message))]):t._e()],1)])},i=[],o={render:r,staticRenderFns:i};e.a=o}]).default}); +//# sourceMappingURL=vue-audio-recorder.min.js.map \ No newline at end of file diff --git a/dist/vue-audio-recorder.min.js.map b/dist/vue-audio-recorder.min.js.map new file mode 100644 index 0000000..6c16bc7 --- /dev/null +++ b/dist/vue-audio-recorder.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///vue-audio-recorder.min.js","webpack:///webpack/bootstrap 407f084bf6d4b418c82f","webpack:///./node_modules/css-loader/lib/css-base.js","webpack:///./node_modules/vue-style-loader/lib/addStylesClient.js","webpack:///./node_modules/vue-loader/lib/component-normalizer.js","webpack:///./src/lib/utils.js","webpack:///src/audio-recorder.vue","webpack:///./src/components/icon-button.vue","webpack:///src/components/icon-button.vue","webpack:///src/components/record-player.vue","webpack:///src/components/line-control.vue","webpack:///./src/index.js","webpack:///./src/audio-recorder.vue","webpack:///./src/audio-recorder.vue?f71b","webpack:///./src/audio-recorder.vue?4ffa","webpack:///./node_modules/vue-style-loader/lib/listToStyles.js","webpack:///./src/components/icon-button.vue?50f7","webpack:///./src/components/icon-button.vue?1447","webpack:///./src/components/icon-button.vue?0111","webpack:///./src/lib/recorder.js","webpack:///./src/lib/wav-encoder.js","webpack:///./src/components/record-player.vue","webpack:///./src/components/record-player.vue?526f","webpack:///./src/components/record-player.vue?335f","webpack:///./src/components/line-control.vue","webpack:///./src/components/line-control.vue?190c","webpack:///./src/components/line-control.vue?6776","webpack:///./src/components/line-control.vue?5e8c","webpack:///./src/components/record-player.vue?fdfb","webpack:///./src/audio-recorder.vue?d921"],"names":["root","factory","exports","module","define","amd","self","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","cssWithMappingToString","item","useSourceMap","content","cssMapping","btoa","sourceMapping","toComment","concat","sources","map","source","sourceRoot","join","sourceMap","unescape","encodeURIComponent","JSON","stringify","list","toString","mediaQuery","alreadyImportedModules","length","id","push","addStylesToDom","styles","domStyle","stylesInDom","refs","j","parts","addStyle","createStyleElement","styleElement","document","createElement","type","head","appendChild","obj","update","remove","querySelector","ssrIdKey","isProduction","noop","parentNode","removeChild","isOldIE","styleIndex","singletonCounter","singletonElement","applyToSingletonTag","bind","applyToTag","newObj","css","media","index","styleSheet","cssText","replaceText","cssNode","createTextNode","childNodes","insertBefore","setAttribute","options","ssrId","firstChild","hasDocument","DEBUG","Error","listToStyles","getElementsByTagName","navigator","test","userAgent","toLowerCase","parentId","_isProduction","_options","newList","mayRemove","textStore","replacement","filter","Boolean","rawScriptExports","compiledTemplate","functionalTemplate","injectStyles","scopeId","moduleIdentifier","esModule","scriptExports","default","render","staticRenderFns","_compiled","functional","_scopeId","hook","context","$vnode","ssrContext","parent","__VUE_SSR_CONTEXT__","_registeredComponents","add","_ssrRegister","existing","beforeCreate","_injectStyles","h","__webpack_exports__","calculateLineHeadPosition","ev","element","progressWidth","getBoundingClientRect","width","leftPosition","target","left","pos","clientX","className","match","err","convertTimeMMSS","seconds","Date","toISOString","substr","__WEBPACK_IMPORTED_MODULE_0__components_icon_button_vue__","__WEBPACK_IMPORTED_MODULE_1__lib_recorder_js__","__WEBPACK_IMPORTED_MODULE_2__components_record_player_vue__","__WEBPACK_IMPORTED_MODULE_3__lib_utils_js__","props","attempts","Number","time","uploadUrl","String","attemptsLimit","Function","failedUpload","micFailed","startRecord","startUpload","stopRecord","successfulUpload","successfulUploadMsg","failedUploadMsg","data","_this","isUploading","recorder","afterStop","recordList","selectedRecord","uploadStatus","components","IconButton","RecordPlayer","methods","toggleRecorder","records","isRecording","isPause","start","pause","stopRecorder","stop","selectRecord","idx","record","url","blob","onStartUpload","onEndUpload","status","_this2","setTimeout","computed","attemptsLeft","iconButtonType","message","recordedTime","duration","uploadStatusClasses","classes","volume","parseFloat","injectStyle","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_icon_button_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_b82bb472_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_icon_button_vue__","normalizeComponent","__vue_styles__","Component","size","icons","download","mic","play","save","iconClasses","__WEBPACK_IMPORTED_MODULE_0__icon_button_vue__","__WEBPACK_IMPORTED_MODULE_1__line_control_vue__","__WEBPACK_IMPORTED_MODULE_2__lib_utils_js__","isPlaying","playedTime","progress","LineControl","mounted","player","getElementById","addEventListener","_resetProgress","_onTimeUpdate","playBtnIcon","playback","upload","_this3","$emit","FormData","append","$http","post","headers","Content-Type","_boundary","then","resp","catch","error","link","href","click","currentTime","_onUpdateProgress","_onUpdateVolume","val","__WEBPACK_IMPORTED_MODULE_0__lib_utils_js__","refId","eventName","percentage","onMouseDown","seekPos","$refs","onMouseMove","onMouseUp","removeEventListener","percentageWidth","value","__WEBPACK_IMPORTED_MODULE_0__audio_recorder_vue__","install","Vue","installed","component","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_audio_recorder_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_7841b04e_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_audio_recorder_vue__","locals","newStyles","part","_vm","_h","$createElement","_self","_c","class","domProps","innerHTML","_s","esExports","_classCallCheck","instance","Constructor","TypeError","__WEBPACK_IMPORTED_MODULE_0__wav_encoder__","__WEBPACK_IMPORTED_MODULE_1__utils__","_createClass","defineProperties","descriptor","writable","key","protoProps","staticProps","_class","arguments","undefined","bufferSize","samples","_duration","mediaDevices","getUserMedia","audio","_micCaptured","_micError","stream","getTracks","forEach","track","input","disconnect","processor","close","encoder","sampleRate","audioBlob","getData","audioUrl","URL","createObjectURL","slice","AudioContext","createMediaStreamSource","createScriptProcessor","onaudioprocess","sample","inputBuffer","getChannelData","sum","toFixed","Math","sqrt","Float32Array","connect","destination","_joinSamples","buffer","ArrayBuffer","view","DataView","_writeString","setUint32","setUint16","_floatTo16BitPCM","Blob","output","offset","max","min","setInt16","recordLength","joinedSamples","Float64Array","set","string","setUint8","charCodeAt","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_record_player_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_46c7fafa_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_record_player_vue__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_line_control_vue__","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_b268bffc_hasScoped_false_buble_transforms_node_modules_vue_loader_lib_selector_type_template_index_0_line_control_vue__","ref","staticClass","on","mousedown","style","ar-player--active","_v","attrs","ref-id","changeLineHead","nativeOn","$event","ar-icon-button--clicked","src","_e","ar__blur","ar-icon-button--rec","ar-icon-button--pulse","_l","ar-records__record--selected","upload-url","start-upload","successful-upload","failed-upload","on-start-upload","on-end-upload"],"mappings":"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","file":"vue-audio-recorder.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"VueAudioRecorder\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VueAudioRecorder\"] = factory();\n\telse\n\t\troot[\"VueAudioRecorder\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"VueAudioRecorder\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"VueAudioRecorder\"] = factory();\n\telse\n\t\troot[\"VueAudioRecorder\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 9);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\n/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n Modified by Evan You @yyx990803\n*/\n\nvar hasDocument = typeof document !== 'undefined'\n\nif (typeof DEBUG !== 'undefined' && DEBUG) {\n if (!hasDocument) {\n throw new Error(\n 'vue-style-loader cannot be used in a non-browser environment. ' +\n \"Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.\"\n ) }\n}\n\nvar listToStyles = __webpack_require__(13)\n\n/*\ntype StyleObject = {\n id: number;\n parts: Array\n}\n\ntype StyleObjectPart = {\n css: string;\n media: string;\n sourceMap: ?string\n}\n*/\n\nvar stylesInDom = {/*\n [id: number]: {\n id: number,\n refs: number,\n parts: Array<(obj?: StyleObjectPart) => void>\n }\n*/}\n\nvar head = hasDocument && (document.head || document.getElementsByTagName('head')[0])\nvar singletonElement = null\nvar singletonCounter = 0\nvar isProduction = false\nvar noop = function () {}\nvar options = null\nvar ssrIdKey = 'data-vue-ssr-id'\n\n// Force single-tag solution on IE6-9, which has a hard limit on the # of \n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/audio-recorder.vue","function injectStyle (ssrContext) {\n require(\"!!vue-style-loader!css-loader!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-b82bb472\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!sass-loader!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./icon-button.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./icon-button.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./icon-button.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-b82bb472\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./icon-button.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/icon-button.vue\n// module id = 5\n// module chunks = 0","\n\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/icon-button.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/record-player.vue","\n\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// src/components/line-control.vue","import AudioRecorder from './audio-recorder.vue'\n\nexport default {\n install: function (Vue) {\n if (this.installed) {\n return\n }\n\n this.installed = true\n\n Vue.component('audio-recorder', AudioRecorder)\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","function injectStyle (ssrContext) {\n require(\"!!vue-style-loader!css-loader!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-7841b04e\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!sass-loader!../node_modules/vue-loader/lib/selector?type=styles&index=0!./audio-recorder.vue\")\n}\nvar normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./audio-recorder.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./audio-recorder.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-7841b04e\\\",\\\"hasScoped\\\":false,\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./audio-recorder.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/audio-recorder.vue\n// module id = 10\n// module chunks = 0","// style-loader: Adds some css to the DOM by adding a + + + + + diff --git a/src/components/icon-button.vue b/src/components/icon-button.vue new file mode 100644 index 0000000..5cff27d --- /dev/null +++ b/src/components/icon-button.vue @@ -0,0 +1,84 @@ + + + + + + diff --git a/src/components/line-control.vue b/src/components/line-control.vue new file mode 100644 index 0000000..8267428 --- /dev/null +++ b/src/components/line-control.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/src/components/record-player.vue b/src/components/record-player.vue new file mode 100644 index 0000000..f4f864d --- /dev/null +++ b/src/components/record-player.vue @@ -0,0 +1,227 @@ + + + + + diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..cde6a86 --- /dev/null +++ b/src/index.js @@ -0,0 +1,13 @@ +import AudioRecorder from './audio-recorder.vue' + +export default { + install: function (Vue) { + if (this.installed) { + return + } + + this.installed = true + + Vue.component('audio-recorder', AudioRecorder) + } +} diff --git a/src/lib/recorder.js b/src/lib/recorder.js new file mode 100644 index 0000000..ed3d191 --- /dev/null +++ b/src/lib/recorder.js @@ -0,0 +1,110 @@ +import WavEncoder from './wav-encoder' +import { convertTimeMMSS } from './utils' + +export default class { + constructor (options = {}) { + this.afterStop = options.afterStop + this.micFailed = options.micFailed + + this.bufferSize = 4096 + this.records = [] + this.samples = [] + + this.isPause = false + this.isRecording = false + + this.duration = 0 + this.volume = 0 + + this._duration = 0 + } + + start () { + navigator.mediaDevices.getUserMedia({audio: true}) + .then(this._micCaptured.bind(this)) + .catch(this._micError.bind(this)) + this.isPause = false + this.isRecording = true + } + + stop () { + this.stream.getTracks().forEach((track) => track.stop()) + this.input.disconnect() + this.processor.disconnect() + this.context.close() + + let encoder = new WavEncoder({ + bufferSize: this.bufferSize, + sampleRate: this.context.sampleRate, + samples: this.samples + }) + + let audioBlob = encoder.getData() + let audioUrl = URL.createObjectURL(audioBlob) + + this.samples = [] + + this.records.push({ + blob: audioBlob, + url: audioUrl, + duration: convertTimeMMSS(this.duration) + }) + + this.isPause = false + this.isRecording = false + this._duration = 0 + this.duration = 0 + + if (this.afterStop) { + this.afterStop() + } + } + + pause () { + this.stream.getTracks().forEach((track) => track.stop()) + this.input.disconnect() + this.processor.disconnect() + this.context.close() + + this._duration = this.duration + this.isPause = true + } + + recordList () { + return this.records + } + + lastRecord () { + return this.records.slice(-1) + } + + _micCaptured (stream) { + this.context = new AudioContext() + this.input = this.context.createMediaStreamSource(stream) + this.processor = this.context.createScriptProcessor(this.bufferSize, 1, 1) + this.duration = this._duration + this.stream = stream + + this.processor.onaudioprocess = (ev) => { + let sample = ev.inputBuffer.getChannelData(0) + let sum = 0.0 + + for (let i = 0; i < sample.length; ++i) { + sum += sample[i] * sample[i] + } + + this.duration = parseFloat(this._duration) + parseFloat(this.context.currentTime.toFixed(2)) + this.volume = Math.sqrt(sum / sample.length).toFixed(2) + this.samples.push(new Float32Array(sample)) + } + + this.input.connect(this.processor) + this.processor.connect(this.context.destination) + } + + _micError (error) { + if (this.micFailed) { + this.micFailed(error) + } + } +} diff --git a/src/lib/utils.js b/src/lib/utils.js new file mode 100644 index 0000000..230c367 --- /dev/null +++ b/src/lib/utils.js @@ -0,0 +1,22 @@ +export function calculateLineHeadPosition (ev, element) { + let progressWidth = element.getBoundingClientRect().width + let leftPosition = ev.target.getBoundingClientRect().left + let pos = (ev.clientX - leftPosition) / progressWidth + + try { + if (!ev.target.className.match(/^ar\-line\-control/)) { + return + } + } catch (err) { + return + } + + pos = pos < 0 ? 0 : pos + pos = pos > 1 ? 1 : pos + + return pos +} + +export function convertTimeMMSS (seconds) { + return new Date(seconds * 1000).toISOString().substr(14, 5) +} diff --git a/src/lib/wav-encoder.js b/src/lib/wav-encoder.js new file mode 100644 index 0000000..e42b614 --- /dev/null +++ b/src/lib/wav-encoder.js @@ -0,0 +1,59 @@ +export default class { + constructor (options) { + this.bufferSize = options.bufferSize || 4096 + this.sampleRate = options.sampleRate + this.samples = options.samples + } + + getData () { + this._joinSamples() + + let buffer = new ArrayBuffer(44 + this.samples.length * 2) + let view = new DataView(buffer) + + this._writeString(view, 0, 'RIFF') // RIFF identifier + view.setUint32(4, 36 + this.samples.length * 2, true) // RIFF chunk length + this._writeString(view, 8, 'WAVE') // RIFF type + this._writeString(view, 12, 'fmt ') // format chunk identifier + view.setUint32(16, 16, true) // format chunk length + view.setUint16(20, 1, true) // sample format (raw) + view.setUint16(22, 1, true) // channel count + view.setUint32(24, this.sampleRate, true) // sample rate + view.setUint32(28, this.sampleRate * 4, true) // byte rate (sample rate * block align) + view.setUint16(32, 4, true) // block align (channel count * bytes per sample) + view.setUint16(34, 16, true) // bits per sample + this._writeString(view, 36, 'data') // data chunk identifier + view.setUint32(40, this.samples.length * 2, true) // data chunk length + + this._floatTo16BitPCM(view, 44, this.samples) + + return new Blob([view], {type: 'audio/wav'}) + } + + _floatTo16BitPCM (output, offset, input) { + for (let i = 0; i < input.length; i++, offset += 2) { + let s = Math.max(-1, Math.min(1, input[i])) + output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true) + } + } + + _joinSamples () { + let recordLength = this.samples.length * this.bufferSize + let joinedSamples = new Float64Array(recordLength) + let offset = 0 + + for (let i = 0; i < this.samples.length; i++) { + let sample = this.samples[i] + joinedSamples.set(sample, offset) + offset += sample.length + } + + this.samples = joinedSamples + } + + _writeString (view, offset, string) { + for (let i = 0; i < string.length; i++) { + view.setUint8(offset + i, string.charCodeAt(i)) + } + } +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..e2288da --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,65 @@ +const webpack = require('webpack') +const merge = require('webpack-merge') +const env = `./webpack.${process.env.NODE_ENV === 'production' ? 'prod' : 'dev'}.js` + +module.exports = merge(require(env), { + module: { + rules: [ + { + test: /\.scss$/, + use: [ + 'vue-style-loader', + 'css-loader', + 'sass-loader' + ], + }, + { + test: /\.vue$/, + loader: 'vue-loader', + options: { + loaders: { + 'scss': [ + 'vue-style-loader', + 'css-loader', + 'sass-loader' + ] + } + } + }, + { + test: /\.js$/, + loader: 'babel-loader', + exclude: /node_modules/ + }, + { + test: /\.(png|jpg|gif|svg)$/, + loader: 'file-loader', + options: { + name: '[name].[ext]?[hash]' + } + } + ] + }, + resolve: { + alias: { + 'vue$': 'vue/dist/vue.esm.js' + }, + extensions: ['*', '.js', '.vue', '.json'] + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: `"${process.env.NODE_ENV}"` + }, + VERSION: JSON.stringify(require("./package.json").version) + }), + ], + devServer: { + historyApiFallback: true, + noInfo: true, + overlay: true + }, + performance: { + hints: false + } +}) diff --git a/webpack.dev.js b/webpack.dev.js new file mode 100644 index 0000000..6686567 --- /dev/null +++ b/webpack.dev.js @@ -0,0 +1,17 @@ +const path = require('path') +const HtmlWebpackPlugin = require('html-webpack-plugin') + +module.exports = { + devtool: '#eval-source-map', + entry: './demo/index.js', + output: { + path: path.resolve(__dirname, './demo') + }, + plugins: [ + new HtmlWebpackPlugin({ + filename: 'index.html', + template: './demo/index.html' + }) + ] +} + diff --git a/webpack.prod.js b/webpack.prod.js new file mode 100644 index 0000000..02c2384 --- /dev/null +++ b/webpack.prod.js @@ -0,0 +1,31 @@ +const path = require('path') +const webpack = require('webpack') + +module.exports = { + devtool: '#source-map', + entry: './src/index.js', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'vue-audio-recorder.min.js', + library: 'VueAudioRecorder', + libraryTarget: 'umd', + libraryExport: 'default', + umdNamedDefine: true + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: '"production"' + } + }), + new webpack.optimize.UglifyJsPlugin({ + sourceMap: true, + compress: { + warnings: true + } + }), + new webpack.LoaderOptionsPlugin({ + minimize: false + }) + ] +}