Commit 81376c93 authored by liujiangnan's avatar liujiangnan

feat: 第一版

parent 708d504d
No preview for this file type
/node_modules /node_modules
/dist /dist
/publish /publish
\ No newline at end of file /publish/form
/form/publish/*.zip
/publish/play
/node_modules
/play/build_android
/play/build_ios
/play/build_web_desktop
\ No newline at end of file
const express = require('express');
const os = require('os');
const readline = require('readline');
const { build } = require('./buildCocos');
const networkInfo = os.networkInterfaces();
let host = '';
for (const infos of Object.values(networkInfo)) {
for (const info of infos) {
if (info.family == 'IPv4') {
if (info.address.split('.')[0] != "127") {
host = info.address;
}
}
}
}
var app = express();
app.use('/dist', express.static('dist'));
app.get('/', function (req, res) {
res.send('Hello World');
})
let port = '';
var server = app.listen(8081, function () {
port = server.address().port
console.log("测试服务已启动:%s:%s", host, port)
console.log("如果已经build可访问如下地址");
console.log("http://%s:%s/dist/play/index.html", host, port)
console.log("http://%s:%s/dist/play/index.html", "localhost", port)
})
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
rl.on('line', async (str) => {
if (str.trim() == 'build') {
await build();
console.log("测试服务已启动:%s:%s", host, port)
console.log('输入 build 构建。')
} else {
console.log("测试服务已启动:%s:%s", host, port)
console.log('输入 build 构建。')
}
})
cd ../form & npm install & npm run publish & cd ../play & CocosCreator.exe --path "./" --build "platform=web-desktop;debug=true" --force & cd ../bin & node build.js
pause
let fs = require('fs'); const {build} = require('./buildCocos');
const compressing = require('compressing'); build();
\ No newline at end of file
function fix2(num) {
if (num >= 10) {
return '' + num;
} else {
return '0' + num;
}
}
async function copyDir(src, dst) {
const exists = await fs.existsSync(dst);
if (!exists) {
await fs.mkdirSync(dst);
}
//读取目录
const paths = await fs.readdirSync(src);
for (let i = 0; i < paths.length; i++) {
let path = paths[i];
const newSrc = `${src}/${path}`;
const newDst = `${dst}/${path}`;
const st = await fs.statSync(newSrc);
if (st.isFile()) {
console.log('copy: ' + newDst);
const data = await fs.readFileSync(newSrc);
await fs.writeFileSync(newDst, data);
} else if (st.isDirectory()) {
copyDir(newSrc, newDst);
}
}
}
async function removeDir(src) {
const exists = await fs.existsSync(src);
if (!exists) {
return;
}
//读取目录
const st = await fs.statSync(src);
console.log(st);
const paths = await fs.readdirSync(src);
for (let i = 0; i < paths.length; i++) {
let path = paths[i];
const newSrc = `${src}/${path}`;
const st = await fs.statSync(newSrc);
if (st.isFile()) {
console.log('remove: ' + newSrc);
await fs.unlinkSync(newSrc);
} else if (st.isDirectory()) {
await removeDir(newSrc);
}
}
await fs.rmdirSync(src);
}
async function main() {
let date = new Date();
let fileName = `Release_${date.getFullYear()}${fix2(date.getMonth() + 1)}${fix2(date.getDate())} `;
fileName += `${fix2(date.getHours())}-${fix2(date.getMinutes())}-${fix2(date.getSeconds())}`;
await removeDir('../publish/play');
await removeDir('../publish/form');
await copyDir('../play/build/web-desktop', '../publish/play');
compressing.zip.uncompress('../form/publish/form.zip', '../publish/form')
.then(() => {
const tarStream = new compressing.zip.Stream();
tarStream.addEntry('../publish/play');
tarStream.addEntry('../publish/form');
const destStream = fs.createWriteStream(`../publish/${fileName}.zip`);
tarStream.pipe(destStream);
console.log('打包完成!');
});
}
main();
\ No newline at end of file
#!/bin/sh
cd bin
set -e
node build_check.js
set +e
# cd ../form
# npm install
# npm run publish
cd ../bin
node build_step_0.js
cd ../play
/Applications/CocosCreator/Creator/2.4.5/CocosCreator.app/Contents/MacOS/CocosCreator --path "./" --build "platform=web-desktop;debug=true" --force
echo "生成 web desktop 完成~!"
cd ../bin
node build_step_1.js
echo "build_step_1 完成~!"
cd ../play
/Applications/CocosCreator/Creator/2.4.5/CocosCreator.app/Contents/MacOS/CocosCreator --path "./" --build "platform=ios;debug=false;md5Cache=true;buildPath=build_ios;encryptJs=true;xxteaKey=6bbfce23-28b4-4a;zipCompressJs=true" --force
echo "生成 ios 完成~!"
cd ../bin
node build_step_2.js
echo "build_step_2 完成~!"
cd ../play
/Applications/CocosCreator/Creator/2.4.5/CocosCreator.app/Contents/MacOS/CocosCreator --path "./" --build "platform=ios;debug=false;md5Cache=true;buildPath=build_android;appABIs=['armeabi-v7a','x86','x86_64','arm64-v8a'];encryptJs=true;xxteaKey=6bbfce23-28b4-4a;zipCompressJs=true" --force
echo "生成 android 完成~!"
cd ../bin
node build_step_3.js
echo "build_step_3 完成~!"
cd ../play
/Applications/CocosCreator/Creator/2.4.5/CocosCreator.app/Contents/MacOS/CocosCreator --path "./" --build "platform=web-desktop;debug=false;buildPath=build_web_desktop" --force
echo "生成 web-desktop 完成~!"
cd ../bin
node build_step_4.js
echo "build_step_4 完成~!"
\ No newline at end of file
const { spawn } = require("child_process");
const fs = require("fs");
const compressing = require('compressing');
const { v4, parse } = require('uuid');
const { Base64 } = require('js-base64');
const { copyDir, removeDir, fix2 } = require("./utils");
async function buildForm() {
const paths = fs.readdirSync('form');
if (!paths.includes('tsconfig.json')) {
await copyDir('form', 'dist/form');
return;
}
if (process.platform == 'win32') {
await execCmd('npm.cmd', ['install'], 'form');
} else {
await execCmd('npm', ['install'], 'form');
}
if (process.platform == 'win32') {
await execCmd('npm.cmd', ['run', 'publish'], 'form');
} else {
await execCmd('npm', ['run', 'publish'], 'form');
}
await compressing.zip.uncompress('form/publish/form.zip', 'dist/form');
}
function execCmd(cmd, params, path) {
return new Promise((resolve, reject) => {
const buffer = spawn(
cmd,
params,
{ cwd: path }
);
buffer.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
buffer.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
buffer.on('close', (code) => {
console.log(`child process exited with code ${code}`);
resolve();
});
});
}
let creatorBasePath = 'C:\\CocosDashboard_1.0.6\\resources\\.editors\\Creator\\2.4.5\\CocosCreator.exe';
if (process.platform !== 'win32') {
creatorBasePath = "/Applications/CocosCreator/Creator/2.4.5/CocosCreator.app/Contents/MacOS/CocosCreator";
}
const buildCocos = function (args) {
return new Promise((resolve, reject) => {
const buffer = spawn(
creatorBasePath,
args,
{ cwd: 'play' }
);
buffer.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
buffer.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
buffer.on('close', (code) => {
console.log(`child process exited with code ${code}`);
resolve();
});
});
};
function getReleaseFileName(projectName) {
let date = new Date();
let fileName = `${projectName}_${date.getFullYear()}${fix2(date.getMonth() + 1)}${fix2(date.getDate())} `;
fileName += `${fix2(date.getHours())}-${fix2(date.getMinutes())}-${fix2(date.getSeconds())}`;
return fileName;
}
function getFolderName(path) {
let folderName = '';
fs.readdirSync(path).find(fileName => {
const st = fs.statSync(`${path}/${fileName}`);
if (st.isDirectory()) {
folderName = fileName;
}
});
return folderName;
}
function editFolderMeta(path, folderName, isBundle) {
const metaPath = `${path}/${folderName}.meta`;
const metaDataStr = fs.readFileSync(metaPath);
const metaData = JSON.parse(metaDataStr);
metaData.isBundle = isBundle;
metaData.isRemoteBundle = {
ios: isBundle,
android: isBundle
};
fs.writeFileSync(metaPath, JSON.stringify(metaData));
}
async function buildWebDesktop() {
const args = ['--path', './', '--build', 'platform=web-desktop;debug=true', '--force'];
await buildCocos(args);
}
async function buildAndroidBundle() {
const args = ['--path', './', '--build', "platform=ios;debug=false;md5Cache=true;buildPath=build_android;appABIs=['armeabi-v7a','x86','x86_64','arm64-v8a'];encryptJs=true;xxteaKey=6bbfce23-28b4-4a;zipCompressJs=true", '--force'];
await buildCocos(args);
}
async function buildIosBundle() {
const args = ['--path', './', '--build', "platform=ios;debug=false;md5Cache=true;buildPath=build_ios;encryptJs=true;xxteaKey=6bbfce23-28b4-4a;zipCompressJs=true", '--force'];
await buildCocos(args);
}
async function buildWebBundle() {
const args = ['--path', './', '--build', "platform=web-desktop;debug=false;buildPath=build_web_desktop", '--force'];
await buildCocos(args);
}
function createConfigFile (projectName) {
const androidPaths = fs.readdirSync(`dist/android/${projectName}`);
const androidConfigFileName = androidPaths.find(path => path.indexOf('config') == 0);
const androidVersion = androidConfigFileName.split('.')[1];
const iosPaths = fs.readdirSync(`dist/ios/${projectName}`);
const iosConfigFileName = iosPaths.find(path => path.indexOf('config') == 0);
const iosVersion = iosConfigFileName.split('.')[1];
const config = {
"ios": {
"sceneName": projectName,
"version": iosVersion
},
"android": {
"sceneName": projectName,
"version": androidVersion
}
}
fs.writeFileSync('dist/config.json', JSON.stringify(config));
}
function compressAll (projectName) {
const tarStream = new compressing.zip.Stream();
tarStream.addEntry('dist/play');
tarStream.addEntry('dist/form');
tarStream.addEntry('dist/ios');
tarStream.addEntry('dist/android');
tarStream.addEntry('dist/web_desktop');
tarStream.addEntry('dist/config.json');
const destStream = fs.createWriteStream(`publish/${getReleaseFileName(projectName)}.zip`);
tarStream.pipe(destStream);
}
function build_check () {
const dirNames = process.cwd().split(/\/|\\/);
const projectName = dirNames[dirNames.length - 1];
const path = 'play/assets'
let folderName = '';
fs.readdirSync(path).find(fileName => {
const st = fs.statSync(`${path}/${fileName}`);
if (st.isDirectory()) {
folderName = fileName;
}
});
if (projectName != folderName) {
throw (`项目名(${projectName})与bundle文件夹名(${folderName})不相同`);
}
let same = false;
const files = fs.readdirSync(`${path}/${folderName}/scene`);
files.forEach(fileName => {
fileName.split('.').forEach((str, idx, arr) => {
if (str == 'fire') {
const sceneName = arr[idx - 1];
if (folderName == sceneName) {
same = true;
}
}
})
});
if (!same) {
throw (`bundle文件夹名称(${folderName})与scene名称不相同`);
}
return projectName;
}
function changeSettingToWebDesktop () {
const path = 'play/assets'
const folderName = getFolderName(path);
editFolderMeta(path, folderName, false);
}
function changeSettingsToBundle () {
const path = 'play/assets'
const folderName = getFolderName(path);
editFolderMeta(path, folderName, true);
}
function replaceUuids () {
console.log('build_step_0 开始~!');
function getFolderName(path) {
let folderName = '';
fs.readdirSync(path).find(fileName => {
const st = fs.statSync(`${path}/${fileName}`);
if (st.isDirectory()) {
folderName = fileName;
}
});
return folderName;
}
function editFolderMeta(path, folderName) {
const metaPath = `${path}/${folderName}.meta`;
const metaDataStr = fs.readFileSync(metaPath);
const metaData = JSON.parse(metaDataStr);
metaData.isBundle = false;
fs.writeFileSync(metaPath, JSON.stringify(metaData));
}
function fileReplace(path, replaceStr, newStr) {
if (!fs.existsSync(path)) {
return;
}
const fileStr = fs.readFileSync(path);
const newFileStr = fileStr.toString().replace(new RegExp(replaceStr.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), 'g'), newStr);
fs.writeFileSync(path, newFileStr);
}
const path = 'play/assets'
const folderName = getFolderName(path);
editFolderMeta(path, folderName);
const oldFireUuid = '57ea7c61-9b8b-498a-b024-c98ee9124beb';
const newFireUuid = v4();
fileReplace(`play/assets/${folderName}/scene/${folderName}.fire.meta`, oldFireUuid, newFireUuid);
fileReplace(`play/assets/${folderName}/scene/${folderName}.fire`, oldFireUuid, newFireUuid);
fileReplace('play/settings/builder.json', oldFireUuid, newFireUuid);
function getShortUuid(uuid) {
const bytes = parse(uuid).subarray(1);
return uuid.substring(0, 5) + Base64.fromUint8Array(bytes).substring(2);
}
const oldJsUuid = 'f4ede462-f8d7-4069-ba80-915611c058ca';
const oldJsShortUuid = 'f4edeRi+NdAabqAkVYRwFjK';
const oldJsId = 'e687yyoRBIzZAOVRL8Sseh';
const newJsUuid = v4();
const newJsShortUuid = getShortUuid(newJsUuid);
const newJsId = v4().replace(/-/g, '').substring(0, oldJsId.length);
fileReplace(`play/assets/${folderName}/scene/${folderName}.ts.meta`, oldJsUuid, newJsUuid);
fileReplace(`play/assets/${folderName}/scene/${folderName}.fire`, oldFireUuid, newFireUuid);
fileReplace(`play/assets/${folderName}/scene/${folderName}.fire`, oldJsShortUuid, newJsShortUuid);
fileReplace(`play/assets/${folderName}/scene/${folderName}.fire`, oldJsId, newJsId);
console.log('build_step_0 完成~!');
}
function replaceIndexHtml () {
const data = fs.readFileSync('play/index.html');
fs.writeFileSync('dist/play/index.html', data);
}
module.exports = {
build: async function () {
const startTime = new Date().getTime();
// 构建前检查
const projectName = build_check();
// 清理旧文件
// 构建form
await removeDir('dist/form');
await buildForm();
// 替换uuid
replaceUuids();
// 改设置为非bundle
changeSettingToWebDesktop();
// 构建play
await removeDir('dist/play');
await buildWebDesktop();
await copyDir('play/build/web-desktop', 'dist/play');
replaceIndexHtml();
console.log('构建 web desktop 成功!');
// 改设置为bundle
changeSettingsToBundle();
await removeDir('dist/android');
await buildAndroidBundle();
await copyDir('play/build_android/jsb-link/remote', 'dist/android');
console.log('构建 android bundle 成功!');
await removeDir('dist/ios');
await buildIosBundle();
await copyDir('play/build_ios/jsb-link/remote', 'dist/ios');
console.log('构建 ios bundle 成功!');
await removeDir('dist/web_desktop');
await buildWebBundle();
await copyDir(`play/build_web_desktop/web-desktop/assets/${projectName}`, 'dist/web_desktop');
console.log('构建 web bundle 成功!');
// 改设置为非bundle
changeSettingToWebDesktop();
createConfigFile(projectName);
compressAll(projectName);
const endTime = new Date().getTime();
const duration = new Date(endTime - startTime);
console.log(`打包完成!`);
console.log(`用时${duration.getMinutes()}${duration.getSeconds()}秒。`);
},
};
{
"platform": "web-desktop",
"debug": true
}
\ No newline at end of file
let fs = require('fs');
const dirNames = __dirname.split('/');
const projectName = dirNames[dirNames.length - 2];
const path = '../play/assets'
let folderName = '';
fs.readdirSync(path).find(fileName => {
const st = fs.statSync(`${path}/${fileName}`);
if (st.isDirectory()) {
folderName = fileName;
}
});
if (projectName != folderName) {
throw (`项目名(${projectName})与bundle文件夹名(${folderName})不相同`);
}
let same = false;
const files = fs.readdirSync(`${path}/${folderName}/scene`);
files.forEach(fileName => {
fileName.split('.').forEach((str, idx, arr) => {
if (str == 'fire') {
const sceneName = arr[idx - 1];
if (folderName == sceneName) {
same = true;
}
}
})
});
if (!same) {
throw (`bundle文件夹名称(${folderName})与scene名称不相同`);
}
// 'caller', 'callee', and 'arguments'
\ No newline at end of file
const fs = require('fs');
const { v4, parse } = require('uuid');
const { Base64 } = require('js-base64');
function getFolderName(path) {
let folderName = '';
fs.readdirSync(path).find(fileName => {
const st = fs.statSync(`${path}/${fileName}`);
if (st.isDirectory()) {
folderName = fileName;
}
});
return folderName;
}
function editFolderMeta(path, folderName) {
const metaPath = `${path}/${folderName}.meta`;
const metaDataStr = fs.readFileSync(metaPath);
const metaData = JSON.parse(metaDataStr);
metaData.isBundle = false;
fs.writeFileSync(metaPath, JSON.stringify(metaData));
}
function fileReplace(path, replaceStr, newStr) {
const fileStr = fs.readFileSync(path);
const newFileStr = fileStr.toString().replace(replaceStr, newStr);
fs.writeFileSync(path, newFileStr);
}
const path = '../play/assets'
const folderName = getFolderName(path);
editFolderMeta(path, folderName);
const oldFireUuid = '57ea7c61-9b8b-498a-b024-c98ee9124beb';
const newFireUuid = v4();
fileReplace(`../play/assets/${folderName}/scene/${folderName}.fire.meta`, oldFireUuid, newFireUuid);
fileReplace(`../play/assets/${folderName}/scene/${folderName}.fire`, oldFireUuid, newFireUuid);
fileReplace('../play/settings/builder.json', oldFireUuid, newFireUuid);
function getShortUuid(uuid) {
const bytes = parse(uuid).subarray(1);
return uuid.substring(0, 5) + Base64.fromUint8Array(bytes).substring(2);
}
const oldJsUuid = 'f4ede462-f8d7-4069-ba80-915611c058ca';
const oldJsShortUuid = 'f4edeRi+NdAabqAkVYRwFjK';
const oldJsId = 'e687yyoRBIzZAOVRL8Sseh';
const newJsUuid = v4();
const newJsShortUuid = getShortUuid(newJsUuid);
const newJsId = v4().replace(/-/g, '').substring(0, oldJsId.length);
fileReplace(`../play/assets/${folderName}/scene/${folderName}.js.meta`, oldJsUuid, newJsUuid);
fileReplace(`../play/assets/${folderName}/scene/${folderName}.fire`, oldFireUuid, newFireUuid);
fileReplace(`../play/assets/${folderName}/scene/${folderName}.fire`, oldJsShortUuid, newJsShortUuid);
fileReplace(`../play/assets/${folderName}/scene/${folderName}.fire`, oldJsId, newJsId);
const { removeDir, copyDir } = require('./utils');
let fs = require('fs');
async function main() {
await removeDir('../dist/play');
await copyDir('../play/build/web-desktop', '../dist/play');
const data = await fs.readFileSync('../play/index.html');
await fs.writeFileSync('../dist/play/index.html', data);
await removeDir('../play/build');
const path = '../play/assets'
let folderName = '';
fs.readdirSync(path).find(fileName => {
const st = fs.statSync(`${path}/${fileName}`);
if (st.isDirectory()) {
folderName = fileName;
}
});
const metaPath = `${path}/${folderName}.meta`;
const metaDataStr = fs.readFileSync(metaPath);
const metaData = JSON.parse(metaDataStr);
metaData.isBundle = true;
metaData.isRemoteBundle = {
ios: true,
android: true
};
fs.writeFileSync(metaPath, JSON.stringify(metaData));
}
main();
\ No newline at end of file
const { removeDir, copyDir } = require('./utils');
async function main() {
await removeDir('../dist/ios');
await copyDir('../play/build_ios/jsb-link/remote', '../dist/ios');
await removeDir('../play/build_ios');
}
main();
\ No newline at end of file
const { removeDir, copyDir } = require('./utils');
async function main() {
await removeDir('../dist/android');
await copyDir('../play/build_android/jsb-link/remote', '../dist/android');
await removeDir('../play/build_android');
}
main();
\ No newline at end of file
const { removeDir, copyDir, fix2 } = require('./utils');
const compressing = require('compressing');
let fs = require('fs');
async function main() {
await removeDir('../dist/web_desktop');
const projectName = await getBundleName('../play/build_web_desktop/web-desktop/assets');
await copyDir(`../play/build_web_desktop/web-desktop/assets/${projectName}`, '../dist/web_desktop');
await removeDir('../play/build_web_desktop');
const bundleData = {
ios: await getBundleData('../dist/ios'),
android: await getBundleData('../dist/android'),
}
fs.writeFileSync('../dist/config.json', JSON.stringify(bundleData));
const tarStream = new compressing.zip.Stream();
tarStream.addEntry('../dist/play');
tarStream.addEntry('../dist/ios');
tarStream.addEntry('../dist/android');
tarStream.addEntry('../dist/web_desktop');
tarStream.addEntry('../dist/config.json');
const destStream = fs.createWriteStream(`../publish/${getReleaseFileName()}.zip`);
tarStream.pipe(destStream);
console.log('打包完成!');
// 删掉发布打包的多余文件
await removeDir('../play/library');
await removeDir('../play/local');
await removeDir('../play/temp');
}
async function getBundleName(path) {
const paths = fs.readdirSync(path);
return paths.find(path => path != 'internal' && path !='main');
}
async function getBundleData(path) {
const bundleData = {
sceneName: '',
version: '',
}
const paths = fs.readdirSync(path);
bundleData.sceneName = paths[0];
const files = fs.readdirSync(path + '/' + bundleData.sceneName);
files.forEach(fileName => {
fileName.split('.').forEach((str, idx, arr) => {
if (str == 'config') {
bundleData.version = arr[idx + 1];
}
})
});
return bundleData;
}
function getReleaseFileName() {
let date = new Date();
let fileName = `Release_${date.getFullYear()}${fix2(date.getMonth() + 1)}${fix2(date.getDate())} `;
fileName += `${fix2(date.getHours())}-${fix2(date.getMinutes())}-${fix2(date.getSeconds())}`;
return fileName;
}
main();
\ No newline at end of file
let fs = require('fs'); const fs = require('fs');
const removeDir = async function (src) {
const exists = await fs.existsSync(src);
if (!exists) {
return;
}
//读取目录
const st = await fs.statSync(src);
const paths = await fs.readdirSync(src);
for (let i = 0; i < paths.length; i++) {
let path = paths[i];
const newSrc = `${src}/${path}`;
const st = await fs.statSync(newSrc);
if (st.isFile()) {
console.log('remove: ' + newSrc);
await fs.unlinkSync(newSrc);
} else if (st.isDirectory()) {
await removeDir(newSrc);
}
}
await fs.rmdirSync(src);
}
const copyDir = async function (src, dst) {
const exists = await fs.existsSync(dst);
if (!exists) {
await fs.mkdirSync(dst);
}
//读取目录
const paths = await fs.readdirSync(src);
for (let i = 0; i < paths.length; i++) {
let path = paths[i];
const newSrc = `${src}/${path}`;
const newDst = `${dst}/${path}`;
const st = await fs.statSync(newSrc);
if (st.isFile()) {
console.log('copy: ' + newDst);
const data = await fs.readFileSync(newSrc);
await fs.writeFileSync(newDst, data);
} else if (st.isDirectory()) {
await copyDir(newSrc, newDst);
}
}
};
module.exports = { module.exports = {
fix2: function (num) { fix2: function (num) {
if (num >= 10) { if (num >= 10) {
...@@ -8,49 +52,6 @@ module.exports = { ...@@ -8,49 +52,6 @@ module.exports = {
return '0' + num; return '0' + num;
} }
}, },
copyDir: copyDir,
copyDir: async function (src, dst) { removeDir: removeDir,
const exists = await fs.existsSync(dst); };
if (!exists) {
await fs.mkdirSync(dst);
}
//读取目录
const paths = await fs.readdirSync(src);
for (let i = 0; i < paths.length; i++) {
let path = paths[i];
const newSrc = `${src}/${path}`;
const newDst = `${dst}/${path}`;
const st = await fs.statSync(newSrc);
if (st.isFile()) {
console.log('copy: ' + newDst);
const data = await fs.readFileSync(newSrc);
await fs.writeFileSync(newDst, data);
} else if (st.isDirectory()) {
arguments.callee(newSrc, newDst);
}
}
},
removeDir: async function (src) {
const exists = await fs.existsSync(src);
if (!exists) {
return;
}
//读取目录
const st = await fs.statSync(src);
const paths = await fs.readdirSync(src);
for (let i = 0; i < paths.length; i++) {
let path = paths[i];
const newSrc = `${src}/${path}`;
const st = await fs.statSync(newSrc);
if (st.isFile()) {
console.log('remove: ' + newSrc);
await fs.unlinkSync(newSrc);
} else if (st.isDirectory()) {
await arguments.callee(newSrc);
}
}
await fs.rmdirSync(src);
}
}
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>NgOne</title>
<!-- <base href="/"> -->
<!-- <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">-->
<meta name="viewport" content="width=device-width, initial-scale=1">
<script type="text/javascript" src="//staging-teach.cdn.ireadabc.com/h5template/h5-static-lib/js/air.js"></script>
<style>
.border {
border-radius: 20px;
border-style: dashed;
padding: 20px;
margin: 20px;
width: 800px;
border-radius: 20px;
border-width: 2px;
border-color: #000000;
}
.error {
border-color: red;
}
.right {
border-color: rgb(50, 255, 50);
}
.normal {
border-color: black;
}
</style>
<script>
let saveDataStr = '';
function loadData() {
window.courseware.getData((data, aspect) => {
const textarea = document.getElementById('saveDataTextarea');
textarea.value = JSON.stringify(data);
saveDataStr = textarea.value.trim();
});
}
function saveData() {
const textarea = document.getElementById('saveDataTextarea');
const textareaStr = textarea.value;
if (textareaStr.trim() == saveDataStr.trim()) {
textarea.className = "normal";
return;
}
try {
const data = JSON.parse(textareaStr);
window.courseware.setData(data);
saveDataStr = textarea.value.trim();
textarea.className = "right";
} catch (e) {
textarea.className = "error";
console.error(e);
}
}
</script>
</head>
<body onload="loadData();" style="background-color: white;">
<div class="border">
保存的数据:
<textarea class="normal" style="width: 100%; height: 300px;" id="saveDataTextarea" onBlur="saveData();"></textarea>
</div>
</body>
</html>
\ No newline at end of file
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
File moved
...@@ -4,6 +4,20 @@ ...@@ -4,6 +4,20 @@
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz",
"integrity": "sha1-UxvHJlF6OytB+FACHGzBXqq1B80=",
"requires": {
"mime-types": "~2.1.24",
"negotiator": "0.6.2"
}
},
"array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz?cache=0&sync_timestamp=1574313293899&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Farray-flatten%2Fdownload%2Farray-flatten-1.1.1.tgz",
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
},
"base-64": { "base-64": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/base-64/download/base-64-1.0.0.tgz", "resolved": "https://registry.npm.taobao.org/base-64/download/base-64-1.0.0.tgz",
...@@ -18,6 +32,33 @@ ...@@ -18,6 +32,33 @@
"safe-buffer": "^5.1.1" "safe-buffer": "^5.1.1"
} }
}, },
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npm.taobao.org/body-parser/download/body-parser-1.19.0.tgz",
"integrity": "sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io=",
"requires": {
"bytes": "3.1.0",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "~1.1.2",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"on-finished": "~2.3.0",
"qs": "6.7.0",
"raw-body": "2.4.0",
"type-is": "~1.6.17"
},
"dependencies": {
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz",
"integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
}
}
},
"buffer-alloc": { "buffer-alloc": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npm.taobao.org/buffer-alloc/download/buffer-alloc-1.2.0.tgz", "resolved": "https://registry.npm.taobao.org/buffer-alloc/download/buffer-alloc-1.2.0.tgz",
...@@ -42,6 +83,16 @@ ...@@ -42,6 +83,16 @@
"resolved": "https://registry.npm.taobao.org/buffer-fill/download/buffer-fill-1.0.0.tgz", "resolved": "https://registry.npm.taobao.org/buffer-fill/download/buffer-fill-1.0.0.tgz",
"integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
}, },
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/bytes/download/bytes-3.1.0.tgz?cache=0&sync_timestamp=1637015083874&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbytes%2Fdownload%2Fbytes-3.1.0.tgz",
"integrity": "sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY="
},
"child_process": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/child_process/download/child_process-1.0.2.tgz",
"integrity": "sha1-sffn/HPSXn/R1FWtyU4UODAYK1o="
},
"compressing": { "compressing": {
"version": "1.5.1", "version": "1.5.1",
"resolved": "https://registry.npm.taobao.org/compressing/download/compressing-1.5.1.tgz", "resolved": "https://registry.npm.taobao.org/compressing/download/compressing-1.5.1.tgz",
...@@ -58,11 +109,69 @@ ...@@ -58,11 +109,69 @@
"yazl": "^2.4.2" "yazl": "^2.4.2"
} }
}, },
"content-disposition": {
"version": "0.5.3",
"resolved": "https://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.3.tgz",
"integrity": "sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70=",
"requires": {
"safe-buffer": "5.1.2"
},
"dependencies": {
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1589129010497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz",
"integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
}
}
},
"content-type": {
"version": "1.0.4",
"resolved": "https://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz",
"integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js="
},
"cookie": {
"version": "0.4.0",
"resolved": "https://registry.npm.taobao.org/cookie/download/cookie-0.4.0.tgz?cache=0&sync_timestamp=1587525865178&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcookie%2Fdownload%2Fcookie-0.4.0.tgz",
"integrity": "sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo="
},
"cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz",
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
},
"core-util-is": { "core-util-is": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz", "resolved": "https://registry.nlark.com/core-util-is/download/core-util-is-1.0.3.tgz",
"integrity": "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U=" "integrity": "sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U="
}, },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/download/debug-2.6.9.tgz",
"integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
"requires": {
"ms": "2.0.0"
}
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz",
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
},
"destroy": {
"version": "1.0.4",
"resolved": "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz",
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
},
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"end-of-stream": { "end-of-stream": {
"version": "1.4.4", "version": "1.4.4",
"resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz", "resolved": "https://registry.npm.taobao.org/end-of-stream/download/end-of-stream-1.4.4.tgz",
...@@ -71,6 +180,60 @@ ...@@ -71,6 +180,60 @@
"once": "^1.4.0" "once": "^1.4.0"
} }
}, },
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz",
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
},
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz",
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
},
"express": {
"version": "4.17.1",
"resolved": "https://registry.npm.taobao.org/express/download/express-4.17.1.tgz",
"integrity": "sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ=",
"requires": {
"accepts": "~1.3.7",
"array-flatten": "1.1.1",
"body-parser": "1.19.0",
"content-disposition": "0.5.3",
"content-type": "~1.0.4",
"cookie": "0.4.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "~1.1.2",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "~1.1.2",
"fresh": "0.5.2",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.5",
"qs": "6.7.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.1.2",
"send": "0.17.1",
"serve-static": "1.14.1",
"setprototypeof": "1.1.1",
"statuses": "~1.5.0",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"dependencies": {
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1589129010497&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz",
"integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0="
}
}
},
"fd-slicer": { "fd-slicer": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/fd-slicer/download/fd-slicer-1.1.0.tgz", "resolved": "https://registry.npm.taobao.org/fd-slicer/download/fd-slicer-1.1.0.tgz",
...@@ -79,11 +242,35 @@ ...@@ -79,11 +242,35 @@
"pend": "~1.2.0" "pend": "~1.2.0"
} }
}, },
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz",
"integrity": "sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=",
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
}
},
"flushwritable": { "flushwritable": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/flushwritable/download/flushwritable-1.0.0.tgz", "resolved": "https://registry.npm.taobao.org/flushwritable/download/flushwritable-1.0.0.tgz",
"integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg=" "integrity": "sha1-PjKNj95BKtR+c44751C00pAENJg="
}, },
"forwarded": {
"version": "0.2.0",
"resolved": "https://registry.nlark.com/forwarded/download/forwarded-0.2.0.tgz?cache=0&sync_timestamp=1622503499867&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fforwarded%2Fdownload%2Fforwarded-0.2.0.tgz",
"integrity": "sha1-ImmTZCiq1MFcfr6XeahL8LKoGBE="
},
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz",
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
},
"fs-constants": { "fs-constants": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/fs-constants/download/fs-constants-1.0.0.tgz", "resolved": "https://registry.npm.taobao.org/fs-constants/download/fs-constants-1.0.0.tgz",
...@@ -94,6 +281,25 @@ ...@@ -94,6 +281,25 @@
"resolved": "https://registry.npm.taobao.org/get-ready/download/get-ready-1.0.0.tgz", "resolved": "https://registry.npm.taobao.org/get-ready/download/get-ready-1.0.0.tgz",
"integrity": "sha1-+RgX8emt7P6hOlYq38jeiDqzR4I=" "integrity": "sha1-+RgX8emt7P6hOlYq38jeiDqzR4I="
}, },
"http-errors": {
"version": "1.7.2",
"resolved": "https://registry.npmmirror.com/http-errors/download/http-errors-1.7.2.tgz?cache=0&sync_timestamp=1636932153279&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhttp-errors%2Fdownload%2Fhttp-errors-1.7.2.tgz",
"integrity": "sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8=",
"requires": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.1",
"statuses": ">= 1.5.0 < 2",
"toidentifier": "1.0.0"
},
"dependencies": {
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
}
}
},
"iconv-lite": { "iconv-lite": {
"version": "0.5.2", "version": "0.5.2",
"resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.5.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.5.2.tgz", "resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.5.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.5.2.tgz",
...@@ -107,6 +313,11 @@ ...@@ -107,6 +313,11 @@
"resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz", "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz",
"integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=" "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w="
}, },
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.nlark.com/ipaddr.js/download/ipaddr.js-1.9.1.tgz",
"integrity": "sha1-v/OFQ+64mEglB5/zoqjmy9RngbM="
},
"isarray": { "isarray": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz",
...@@ -117,6 +328,39 @@ ...@@ -117,6 +328,39 @@
"resolved": "https://registry.npmmirror.com/js-base64/download/js-base64-3.7.2.tgz", "resolved": "https://registry.npmmirror.com/js-base64/download/js-base64-3.7.2.tgz",
"integrity": "sha1-gW0R2BqK/yQWA9Gc5XYeE+Qdd0U=" "integrity": "sha1-gW0R2BqK/yQWA9Gc5XYeE+Qdd0U="
}, },
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
},
"merge-descriptors": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz",
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/mime/download/mime-1.6.0.tgz",
"integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE="
},
"mime-db": {
"version": "1.51.0",
"resolved": "https://registry.npmmirror.com/mime-db/download/mime-db-1.51.0.tgz?cache=0&sync_timestamp=1636426033377&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-db%2Fdownload%2Fmime-db-1.51.0.tgz",
"integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
},
"mime-types": {
"version": "2.1.34",
"resolved": "https://registry.npmmirror.com/mime-types/download/mime-types-2.1.34.tgz?cache=0&sync_timestamp=1636432373429&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmime-types%2Fdownload%2Fmime-types-2.1.34.tgz",
"integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
"requires": {
"mime-db": "1.51.0"
}
},
"minimist": { "minimist": {
"version": "1.2.5", "version": "1.2.5",
"resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz?cache=0&sync_timestamp=1584051509720&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz", "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz?cache=0&sync_timestamp=1584051509720&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fminimist%2Fdownload%2Fminimist-1.2.5.tgz",
...@@ -130,6 +374,24 @@ ...@@ -130,6 +374,24 @@
"minimist": "^1.2.5" "minimist": "^1.2.5"
} }
}, },
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/download/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"negotiator": {
"version": "0.6.2",
"resolved": "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz",
"integrity": "sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs="
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz",
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
"requires": {
"ee-first": "1.1.1"
}
},
"once": { "once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz",
...@@ -138,6 +400,16 @@ ...@@ -138,6 +400,16 @@
"wrappy": "1" "wrappy": "1"
} }
}, },
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz",
"integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ="
},
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1601400247487&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
},
"pend": { "pend": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz", "resolved": "https://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz",
...@@ -148,6 +420,15 @@ ...@@ -148,6 +420,15 @@
"resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz", "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz",
"integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I=" "integrity": "sha1-eCDZsWEgzFXKmud5JoCufbptf+I="
}, },
"proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.nlark.com/proxy-addr/download/proxy-addr-2.0.7.tgz",
"integrity": "sha1-8Z/mnOqzEe65S0LnDowgcPm6ECU=",
"requires": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
}
},
"pump": { "pump": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz", "resolved": "https://registry.npm.taobao.org/pump/download/pump-3.0.0.tgz",
...@@ -157,6 +438,37 @@ ...@@ -157,6 +438,37 @@
"once": "^1.3.1" "once": "^1.3.1"
} }
}, },
"qs": {
"version": "6.7.0",
"resolved": "https://registry.npm.taobao.org/qs/download/qs-6.7.0.tgz",
"integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw="
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz",
"integrity": "sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE="
},
"raw-body": {
"version": "2.4.0",
"resolved": "https://registry.npmmirror.com/raw-body/download/raw-body-2.4.0.tgz?cache=0&sync_timestamp=1637116782389&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fraw-body%2Fdownload%2Fraw-body-2.4.0.tgz",
"integrity": "sha1-oc5vucm8NWylLoklarWQWeE9AzI=",
"requires": {
"bytes": "3.1.0",
"http-errors": "1.7.2",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"dependencies": {
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ficonv-lite%2Fdownload%2Ficonv-lite-0.4.24.tgz",
"integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
}
}
},
"readable-stream": { "readable-stream": {
"version": "2.3.7", "version": "2.3.7",
"resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz", "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz",
...@@ -188,6 +500,54 @@ ...@@ -188,6 +500,54 @@
"resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", "resolved": "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
"integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
}, },
"send": {
"version": "0.17.1",
"resolved": "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz",
"integrity": "sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg=",
"requires": {
"debug": "2.6.9",
"depd": "~1.1.2",
"destroy": "~1.0.4",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "~1.7.2",
"mime": "1.6.0",
"ms": "2.1.1",
"on-finished": "~2.3.0",
"range-parser": "~1.2.1",
"statuses": "~1.5.0"
},
"dependencies": {
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/ms/download/ms-2.1.1.tgz",
"integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo="
}
}
},
"serve-static": {
"version": "1.14.1",
"resolved": "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz",
"integrity": "sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk=",
"requires": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.17.1"
}
},
"setprototypeof": {
"version": "1.1.1",
"resolved": "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz?cache=0&sync_timestamp=1563425414995&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsetprototypeof%2Fdownload%2Fsetprototypeof-1.1.1.tgz",
"integrity": "sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM="
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz?cache=0&sync_timestamp=1609654066899&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstatuses%2Fdownload%2Fstatuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
},
"streamifier": { "streamifier": {
"version": "0.1.1", "version": "0.1.1",
"resolved": "https://registry.npm.taobao.org/streamifier/download/streamifier-0.1.1.tgz", "resolved": "https://registry.npm.taobao.org/streamifier/download/streamifier-0.1.1.tgz",
...@@ -227,16 +587,45 @@ ...@@ -227,16 +587,45 @@
"resolved": "https://registry.npm.taobao.org/to-buffer/download/to-buffer-1.1.1.tgz", "resolved": "https://registry.npm.taobao.org/to-buffer/download/to-buffer-1.1.1.tgz",
"integrity": "sha1-STvUj2LXxD/N7TE6A9ytsuEhOoA=" "integrity": "sha1-STvUj2LXxD/N7TE6A9ytsuEhOoA="
}, },
"toidentifier": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/toidentifier/download/toidentifier-1.0.0.tgz?cache=0&sync_timestamp=1636938499270&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ftoidentifier%2Fdownload%2Ftoidentifier-1.0.0.tgz",
"integrity": "sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM="
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npm.taobao.org/type-is/download/type-is-1.6.18.tgz",
"integrity": "sha1-TlUs0F3wlGfcvE73Od6J8s83wTE=",
"requires": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
}
},
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz",
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
},
"util-deprecate": { "util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
}, },
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz",
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
},
"uuid": { "uuid": {
"version": "8.3.2", "version": "8.3.2",
"resolved": "https://registry.npmmirror.com/uuid/download/uuid-8.3.2.tgz", "resolved": "https://registry.npmmirror.com/uuid/download/uuid-8.3.2.tgz",
"integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I=" "integrity": "sha1-gNW1ztJxu5r2xEXyGhoExgbO++I="
}, },
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz",
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
},
"wrappy": { "wrappy": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz", "resolved": "https://registry.nlark.com/wrappy/download/wrappy-1.0.2.tgz?cache=0&sync_timestamp=1619133505879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwrappy%2Fdownload%2Fwrappy-1.0.2.tgz",
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
"main": "build.js", "main": "build.js",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"build": "sh ./bin/build.sh", "build": "node ./bin/build.js",
"win": "cd bin && build.cmd" "start": "node ./bin/app.js"
}, },
"author": "", "author": "",
"license": "ISC", "license": "ISC",
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
"base-64": "^1.0.0", "base-64": "^1.0.0",
"compressing": "^1.5.1", "compressing": "^1.5.1",
"js-base64": "^3.7.2", "js-base64": "^3.7.2",
"uuid": "^8.3.2" "uuid": "^8.3.2",
"child_process": "^1.0.2",
"express": "^4.17.1"
} }
} }
{ {"ver":"1.1.2","uuid":"c35bb2f6-f24a-4850-ae44-643f2fdc7541","isBundle":false,"bundleName":"","priority":1,"compressionType":{},"optimizeHotUpdate":{},"inlineSpriteFrames":{},"isRemoteBundle":{"ios":false,"android":false},"subMetas":{}}
"ver": "1.1.2", \ No newline at end of file
"uuid": "c35bb2f6-f24a-4850-ae44-643f2fdc7541",
"isBundle": true,
"bundleName": "",
"priority": 1,
"compressionType": {},
"optimizeHotUpdate": {},
"inlineSpriteFrames": {},
"isRemoteBundle": {
"ios": true,
"android": true
},
"subMetas": {}
}
\ No newline at end of file
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