Commit ee8a8474 authored by liujiangnan's avatar liujiangnan

feat

parent 9d944887
.edit-data{
padding: 10px;
}
.el-card {
display: inline-block;
margin: 3px;
}
.data-card {
position: relative;
width: 90%;
vertical-align: top;
}
.data-card .el-card__body {
padding: 15px 20px 0px;
}
.audio-uploader {
text-align: left;
margin-bottom: 10px;
}
audio {
margin: 10px 0;
}
.el-form-item {
margin-bottom: 15px;
}
.delete-btn-wrapper {
position: absolute;
bottom: 10px;
left: 0;
right: 0;
text-align: center;
}
/* 音频信息显示样式 */
.audio-info {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 10px;
padding: 8px 12px;
background: #f5f7fa;
border-radius: 4px;
}
.audio-file-info {
flex: 1;
overflow: hidden;
margin-right: 10px;
}
.audio-file-info .filename {
display: block;
font-size: 14px;
color: #606266;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.audio-file-info .file-meta {
font-size: 12px;
color: #909399;
}
.audio-play-btn {
font-size: 30px;
color: #409EFF;
cursor: pointer;
transition: all 0.3s;
}
.audio-play-btn:hover {
color: #66b1ff;
}
/* 图片上传区域样式 */
.image-uploader {
width: 120px;
height: 120px;
line-height: 120px;
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.image-uploader .el-upload {
width: 120px;
height: 120px;
}
.image-uploader:hover {
border-color: #409EFF;
}
.upload-icon {
font-size: 28px;
color: #8c939d;
width: 120px;
height: 120px;
line-height: 120px;
text-align: center;
}
.image-preview {
width: 100%;
height: 100%;
position: relative;
}
.uploaded-image {
width: 100%;
height: 100%;
object-fit: cover;
}
.image-actions {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
opacity: 0;
transition: opacity 0.3s;
}
.image-preview:hover .image-actions {
opacity: 1;
}
.image-actions i {
color: #fff;
font-size: 20px;
margin: 0 10px;
cursor: pointer;
}
.image-actions i:hover {
transform: scale(1.2);
}
\ No newline at end of file
......@@ -16,9 +16,106 @@
</head>
<body>
<div class="edit-data">
<!-- 简单的例子,一个输入框+一个按钮,保存输入框的信息 -->
test: <input type="text" name="test" />
<input id="save" type="button" value="保存" >
<el-card class="data-card" v-for="item, index in data" :key="index">
<div slot="header" class="clearfix">
<span>题目{{index + 1}}</span>
<el-button style="float: right; padding: 3px 0" type="text" @click="deleteConf(index)">删除</el-button>
</div>
<div>
<el-form label-width="90px">
<el-form-item label="题干图片">
<div class="image-uploader">
<el-upload
:action="uploadUrl"
:data="uploadData"
:show-file-list="false"
:on-success="(res, file) => handleImageSuccess(res, file, index)"
:before-upload="beforeImageUpload">
<div v-if="data[index].image_url" class="image-preview">
<img :src="data[index].image_url" class="uploaded-image">
<div class="image-actions">
<i class="el-icon-zoom-in" @click.stop="previewImage(data[index].image_url)"></i>
<i class="el-icon-delete" @click.stop="removeImage(index)"></i>
</div>
</div>
<i v-else class="el-icon-plus upload-icon"></i>
</el-upload>
</div>
</el-form-item>
<el-form-item label="题干">
<el-input type="textarea" v-model="data[index].question" placeholder="请输入题干英文" @change="save"></el-input>
</el-form-item>
<!-- 新增音频上传和预览部分 -->
<el-form-item label="题干音频">
<div class="audio-uploader">
<el-upload
:action="uploadUrl"
:data="uploadData"
:on-success="(res, file) => handleAudioSuccess(res, file, index)"
:before-upload="beforeAudioUpload"
:show-file-list="false">
<el-button size="small" type="primary">{{ data[index].audio_url ? '重新上传' : '上传' }}</el-button>
&nbsp;&nbsp;&nbsp;&nbsp;
<span v-if="data[index].audio_url" class="filename" @click.stop="togglePlay(index)">{{ data[index].audio_name }}(点击播放)</span>
<audio :ref="'audio' + index" :src="data[index].audio_url" @ended.stop="audioEnded(index)" style="display: none;"></audio>
</el-upload>
</div>
</el-form-item>
<el-form-item v-for="(option, optionIndex) in data[index].options" :key="optionIndex" :label="'选项' + (optionIndex + 1)">
<el-row style="border: 1px solid #E4E7ED; padding: 10px;">
<el-col :span="6">
<div class="image-uploader" style="display: inline-block;">
<el-upload
:action="uploadUrl"
:data="uploadData"
:show-file-list="false"
:on-success="(res, file) => handleOptionImageSuccess(res, file, index, optionIndex)"
:before-upload="beforeImageUpload">
<div v-if="data[index].options[optionIndex].image_url" class="image-preview">
<img :src="data[index].options[optionIndex].image_url" class="uploaded-image">
<div class="image-actions">
<i class="el-icon-zoom-in" @click.stop="previewImage(data[index].options[optionIndex].image_url)"></i>
<i class="el-icon-delete" @click.stop="removeOptionImage(index, optionIndex)"></i>
</div>
</div>
<i v-else class="el-icon-plus upload-icon"></i>
</el-upload>
</div>
</el-col>
<el-col :span="18">
<el-input style="width: 60%;" v-model="data[index].options[optionIndex].text" placeholder="请输入选项英文" @change="save">
</el-input><br>
<div class="audio-uploader">
<el-upload
:action="uploadUrl"
:data="uploadData"
:on-success="(res, file) => handleOptionAudioSuccess(res, file, index, optionIndex)"
:before-upload="beforeAudioUpload"
:show-file-list="false">
<el-button size="small" type="primary">{{ data[index].options[optionIndex].audio_url ? '重新上传' : '上传' }}音频</el-button>
&nbsp;&nbsp;&nbsp;&nbsp;
<span v-if="data[index].options[optionIndex].audio_url" class="filename" @click.stop="toggleOptionPlay(index, optionIndex)">{{ data[index].options[optionIndex].audio_name }}(点击播放)</span>
<audio :ref="'audio' + index + '-' + optionIndex" :src="data[index].options[optionIndex].audio_url" @ended.stop="audioOptionEnded(index, optionIndex)" style="display: none;"></audio>
</el-upload>
</div>
<el-checkbox v-model="data[index].options[optionIndex].is_correct" @change="save">正确</el-checkbox>
<el-button style="float: right;" icon="el-icon-delete" size="small" type="primary" @click.stop="deleteOption(index, optionIndex)">删除选项</el-button>
</el-col>
</el-row>
</el-form-item>
<el-form-item>
<el-button size="small" type="primary" @click.stop="addOption(index)">增加选项</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="hover" class="data-card">
<div style="cursor: pointer; display: flex; justify-content: center; align-items: center; height: 80px;"
@click="addConfig">
<el-button class="btn" type="text" size="mini" icon="el-icon-plus">新加</el-button>
</div>
</el-card>
</div>
</body>
<script src="./index.js"></script>
......
......@@ -10,26 +10,242 @@ var uploadData = window.courseware.uploadData(); //上传文件必须要的参
*/
//对应模板的名称,这个可以不写,但是最好是能写上,同时开发多个模板的情况下如果不写这个,本地缓存可能会存在混乱
var key = "h5_test";
var key = "lexile_question";
$(function(){
window.courseware.getData(function(data){
//数据加载完,才算页面加载完成
//获取数据
if(data&&data.test){
$("[name='test']").val(data.test);
new Vue({
el: '.edit-data',
created() {
window.courseware.getData((data) => {
this.data = data || [];
}, key);
window['air'].getUploadCallback = (url, data) => {
this.uploadUrl = url;
this.uploadData = data;
};
},
data() {
return {
data: [],
uploadUrl: window.courseware.uploadUrl(),
uploadData: window.courseware.uploadData(),
}
},
methods: {
handleAudioSuccess(res, file, index) {
// 假设上传接口返回的音频URL在 res.url 中
this.data[index].audio_url = res.url;
this.data[index].audio_name = file.name;
//绑定点击事件
$('#save').on('click',function(){
var test = $("[name='test']").val();
// 计算文件大小
const size = file.size;
if (size < 1024) {
this.data[index].audio_size = size + 'B';
} else if (size < 1024 * 1024) {
this.data[index].audio_size = (size / 1024).toFixed(2) + 'KB';
} else {
this.data[index].audio_size = (size / (1024 * 1024)).toFixed(2) + 'MB';
}
// 获取音频时长
const audio = new Audio(res.url);
audio.addEventListener('loadedmetadata', () => {
const duration = audio.duration;
const minutes = Math.floor(duration / 60);
const seconds = Math.floor(duration % 60);
this.data[index].audio_duration = `${minutes}:${seconds.toString().padStart(2, '0')}`;
});
this.save();
},
handleOptionAudioSuccess(res, file, index, optionIndex) {
// 假设上传接口返回的音频URL在 res.url 中
this.data[index].options[optionIndex].audio_url = res.url;
this.data[index].options[optionIndex].audio_name = file.name;
// 计算文件大小
const size = file.size;
if (size < 1024) {
this.data[index].options[optionIndex].audio_size = size + 'B';
} else if (size < 1024 * 1024) {
this.data[index].options[optionIndex].audio_size = (size / 1024).toFixed(2) + 'KB';
} else {
this.data[index].options[optionIndex].audio_size = (size / (1024 * 1024)).toFixed(2) + 'MB';
}
// 获取音频时长
const audio = new Audio(res.url);
audio.addEventListener('loadedmetadata', () => {
const duration = audio.duration;
const minutes = Math.floor(duration / 60);
const seconds = Math.floor(duration % 60);
this.data[index].options[optionIndex].audio_duration = `${minutes}:${seconds.toString().padStart(2, '0')}`;
});
this.save();
},
// 播放/暂停音频
togglePlay(index) {
const audio = this.$refs['audio' + index][0];
if (this.data[index].isPlaying) {
audio.pause();
this.data[index].isPlaying = false;
} else {
// 先停止其他正在播放的音频
this.data.forEach((item, i) => {
if (i !== index && item.isPlaying) {
this.$refs['audio' + i][0].pause();
item.isPlaying = false;
}
});
audio.play();
this.data[index].isPlaying = true;
}
},
toggleOptionPlay(index, optionIndex) {
const audio = this.$refs['audio' + index + '-' + optionIndex][0];
if (this.data[index].options[optionIndex].isPlaying) {
audio.pause();
this.data[index].options[optionIndex].isPlaying = false;
} else {
// 先停止其他正在播放的音频
this.data[index].options.forEach((item, i) => {
if (i !== optionIndex && item.isPlaying) {
this.$refs['audio' + index + '-' + i][0].pause();
item.isPlaying = false;
}
});
audio.play();
this.data[index].options[optionIndex].isPlaying = true;
}
},
// 音频播放结束
audioEnded(index) {
this.data[index].isPlaying = false;
},
audioOptionEnded(index, optionIndex) {
this.data[index].options[optionIndex].isPlaying = false;
},
beforeAudioUpload(file) {
const isAudio = file.type.startsWith('audio/');
const isLt20M = file.size / 1024 / 1024 < 20;
//保存新增或修改的数据
window.courseware.setData({test: test},function(){
if (!isAudio) {
this.$message.error('只能上传音频文件!');
return false;
}
if (!isLt20M) {
this.$message.error('音频大小不能超过 20MB!');
return false;
}
return true;
},
save() {
// 保存新增或修改的数据
window.courseware.setData(this.data, () => {
//保存数据也是异步的
alert("保存成功!");
},key);
this.$message.success("实时保存成功");
}, key);
},
deleteConf(index) {
this.data.splice(index, 1);
this.save();
},
addConfig() {
this.data.push({
question: '',
audio_url: '',
image_url: '',
audio_name: '',
audio_size: '',
audio_duration: '',
isPlaying: false,
options: [],
});
this.save();
},
addOption(index) {
this.data[index].options.push({
image_url: '',
audio_url: '',
audio_name: '',
text: '',
is_correct: false,
});
this.save();
},
deleteOption(index, optionIndex) {
this.data[index].options.splice(optionIndex, 1);
this.save();
},
// 图片上传成功的回调
handleImageSuccess(res, file, index) {
// 假设上传接口返回的图片URL在 res.url 中
console.log(res, file, index);
this.data[index].image_url = res.url;
this.save();
},
handleOptionImageSuccess(res, file, index, optionIndex) {
this.data[index].options[optionIndex].image_url = res.url;
this.save();
},
// 图片上传前的验证
beforeImageUpload(file) {
const isImage = file.type.startsWith('image/');
const isLt2M = file.size / 1024 / 1024 < 5;
})
},key);
})
\ No newline at end of file
if (!isImage) {
this.$message.error('只能上传图片文件!');
return false;
}
if (!isLt2M) {
this.$message.error('图片大小不能超过 2MB!');
return false;
}
return true;
},
// 预览图片
previewImage(url) {
// 使用 Element UI 的 Image 组件预览
const h = this.$createElement;
this.$msgbox({
title: '图片预览',
message: h('img', {
attrs: {
src: url,
style: 'max-width: 100%; max-height: 500px;'
}
}),
showCancelButton: false,
confirmButtonText: '关闭'
});
},
removeImage(index) {
this.$confirm('确定要删除这张图片吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.data[index].image_url = '';
this.save();
this.$message({
type: 'success',
message: '删除成功!'
});
}).catch(() => { });
},
removeOptionImage(index, optionIndex) {
this.data[index].options[optionIndex].image_url = '';
this.save();
}
},
computed: {
}
});
{
"name": "h5-template-generator",
"version": "1.0.0",
"lockfileVersion": 1,
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "h5-template-generator",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"bl": {
"compressing": "^1.5.0"
}
},
"node_modules/bl": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
"integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
"requires": {
"dependencies": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
}
},
"buffer-alloc": {
"node_modules/buffer-alloc": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
"integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
"requires": {
"dependencies": {
"buffer-alloc-unsafe": "^1.1.0",
"buffer-fill": "^1.0.0"
}
},
"buffer-alloc-unsafe": {
"node_modules/buffer-alloc-unsafe": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
"integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
},
"buffer-crc32": {
"node_modules/buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
"integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
"engines": {
"node": "*"
}
},
"buffer-fill": {
"node_modules/buffer-fill": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
"integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
},
"compressing": {
"node_modules/compressing": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/compressing/-/compressing-1.5.0.tgz",
"integrity": "sha512-CPMzMd/MswJh7CPRo605FQhXQlP0JbwCjPteh9GZ0jYTQcDBrYJLEW7Fm1dpTdOHk0/2ZE2C8SO5EX4Dp7KZ8w==",
"requires": {
"dependencies": {
"flushwritable": "^1.0.0",
"get-ready": "^1.0.0",
"iconv-lite": "^0.5.0",
......@@ -51,107 +62,117 @@
"tar-stream": "^1.5.2",
"yauzl": "^2.7.0",
"yazl": "^2.4.2"
},
"engines": {
"node": ">= 4.0.0"
}
},
"core-util-is": {
"node_modules/core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"end-of-stream": {
"node_modules/end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"requires": {
"dependencies": {
"once": "^1.4.0"
}
},
"fd-slicer": {
"node_modules/fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
"requires": {
"dependencies": {
"pend": "~1.2.0"
}
},
"flushwritable": {
"node_modules/flushwritable": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz",
"integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg="
},
"fs-constants": {
"node_modules/fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
},
"get-ready": {
"node_modules/get-ready": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz",
"integrity": "sha1-+RgX8emt7P6hOlYq38jeiDqzR4I="
},
"iconv-lite": {
"node_modules/iconv-lite": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz",
"integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==",
"requires": {
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
"engines": {
"node": ">=0.10.0"
}
},
"inherits": {
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"isarray": {
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"minimist": {
"node_modules/minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"mkdirp": {
"node_modules/mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"requires": {
"deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
"dependencies": {
"minimist": "0.0.8"
},
"bin": {
"mkdirp": "bin/cmd.js"
}
},
"once": {
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"requires": {
"dependencies": {
"wrappy": "1"
}
},
"pend": {
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
},
"process-nextick-args": {
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"pump": {
"node_modules/pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"requires": {
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"readable-stream": {
"node_modules/readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": {
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
......@@ -159,50 +180,49 @@
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"dependencies": {
"safe-buffer": {
"node_modules/readable-stream/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
}
}
},
"safe-buffer": {
"node_modules/safe-buffer": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
},
"safer-buffer": {
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"streamifier": {
"node_modules/streamifier": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz",
"integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8="
"integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=",
"engines": {
"node": ">=0.10"
}
},
"string_decoder": {
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"dependencies": {
"safe-buffer": {
"node_modules/string_decoder/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
}
}
},
"tar-stream": {
"node_modules/tar-stream": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
"integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==",
"requires": {
"dependencies": {
"bl": "^1.0.0",
"buffer-alloc": "^1.2.0",
"end-of-stream": "^1.0.0",
......@@ -210,42 +230,48 @@
"readable-stream": "^2.3.0",
"to-buffer": "^1.1.1",
"xtend": "^4.0.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"to-buffer": {
"node_modules/to-buffer": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz",
"integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg=="
},
"util-deprecate": {
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"wrappy": {
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"xtend": {
"node_modules/xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
"engines": {
"node": ">=0.4"
}
},
"yauzl": {
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
"requires": {
"dependencies": {
"buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0"
}
},
"yazl": {
"node_modules/yazl": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
"integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
"requires": {
"dependencies": {
"buffer-crc32": "~0.2.3"
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment