147 lines
6.3 KiB
TypeScript
147 lines
6.3 KiB
TypeScript
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
const crypto = require('crypto');
|
|
export class WxgamePlugin implements plugins.Command {
|
|
private useWxPlugin:boolean = false;
|
|
constructor(useWxPlugin:boolean) {
|
|
this.useWxPlugin = useWxPlugin
|
|
}
|
|
md5Obj = {}
|
|
md5(content) {
|
|
let md5 = crypto.createHash('md5');
|
|
return md5.update(content).digest('hex');
|
|
}
|
|
async onFile(file: plugins.File) {
|
|
if (file.extname == '.js') {
|
|
const filename = file.origin;
|
|
if (filename == "libs/modules/promise/promise.js" || filename == 'libs/modules/promise/promise.min.js') {
|
|
return null;
|
|
}
|
|
if (filename == 'libs/modules/egret/egret.js' || filename == 'libs/modules/egret/egret.min.js') {
|
|
let content = file.contents.toString();
|
|
content += `;window.egret = egret;`;
|
|
content = content.replace(/definition = __global/, "definition = window");
|
|
this.md5Obj[path.basename(filename)] = this.md5(content)
|
|
file.contents = new Buffer(content);
|
|
}
|
|
else {
|
|
let content = file.contents.toString();
|
|
if (
|
|
filename == "libs/modules/res/res.js" ||
|
|
filename == 'libs/modules/res/res.min.js' ||
|
|
filename == 'libs/modules/assetsmanager/assetsmanager.min.js' ||
|
|
filename == 'libs/modules/assetsmanager/assetsmanager.js'
|
|
) {
|
|
content += ";window.RES = RES;"
|
|
}
|
|
if (filename == "libs/modules/eui/eui.js" || filename == 'libs/modules/eui/eui.min.js') {
|
|
content += ";window.eui = eui;"
|
|
}
|
|
if (filename == 'libs/modules/dragonBones/dragonBones.js' || filename == 'libs/modules/dragonBones/dragonBones.min.js') {
|
|
content += ';window.dragonBones = dragonBones';
|
|
}
|
|
content = "var egret = window.egret;" + content;
|
|
if (filename == 'main.js') {
|
|
content += "\n;window.Main = Main;"
|
|
}
|
|
this.md5Obj[path.basename(filename)] = this.md5(content)
|
|
file.contents = new Buffer(content);
|
|
}
|
|
}
|
|
return file;
|
|
}
|
|
async onFinish(pluginContext: plugins.CommandContext) {
|
|
let { projectRoot, outputDir, buildConfig } = pluginContext
|
|
//同步 index.html 配置到 game.js
|
|
const gameJSPath = path.join(outputDir, "game.js");
|
|
if (!fs.existsSync(gameJSPath)) {
|
|
console.log(`${gameJSPath}不存在,请先使用 Launcher 发布微信小游戏`);
|
|
return;
|
|
}
|
|
let gameJSContent = fs.readFileSync(gameJSPath, { encoding: "utf8" });
|
|
const projectConfig = buildConfig.projectConfig;
|
|
const optionStr =
|
|
`entryClassName: ${projectConfig.entryClassName},\n\t\t` +
|
|
`orientation: ${projectConfig.orientation},\n\t\t` +
|
|
`frameRate: ${projectConfig.frameRate},\n\t\t` +
|
|
`scaleMode: ${projectConfig.scaleMode},\n\t\t` +
|
|
`contentWidth: ${projectConfig.contentWidth},\n\t\t` +
|
|
`contentHeight: ${projectConfig.contentHeight},\n\t\t` +
|
|
`showFPS: ${projectConfig.showFPS},\n\t\t` +
|
|
`fpsStyles: ${projectConfig.fpsStyles},\n\t\t` +
|
|
`showLog: ${projectConfig.showLog},\n\t\t` +
|
|
`maxTouches: ${projectConfig.maxTouches},`;
|
|
const reg = /\/\/----auto option start----[\s\S]*\/\/----auto option end----/;
|
|
const replaceStr = '\/\/----auto option start----\n\t\t' + optionStr + '\n\t\t\/\/----auto option end----';
|
|
gameJSContent = gameJSContent.replace(reg, replaceStr);
|
|
fs.writeFileSync(gameJSPath, gameJSContent);
|
|
|
|
//修改横竖屏
|
|
let orientation;
|
|
if (projectConfig.orientation == '"landscape"') {
|
|
orientation = "landscape";
|
|
}
|
|
else {
|
|
orientation = "portrait";
|
|
}
|
|
const gameJSONPath = path.join(outputDir, "game.json");
|
|
let gameJSONContent = this.readData(gameJSONPath)
|
|
gameJSONContent.deviceOrientation = orientation;
|
|
if (buildConfig.command !== "publish" && gameJSONContent.plugins && gameJSONContent.plugins['egret-library']) {
|
|
delete gameJSONContent.plugins["egret-library"]
|
|
}
|
|
this.writeData(gameJSONContent, gameJSONPath)
|
|
|
|
//下面的流程是配置开启微信插件的功能
|
|
let engineVersion = this.readData(path.join(projectRoot, "egretProperties.json")).engineVersion;
|
|
if (!gameJSONContent.plugins) {
|
|
gameJSONContent.plugins = {}
|
|
}
|
|
if(buildConfig.command == "publish" && this.useWxPlugin){
|
|
gameJSONContent.plugins["egret-library"] = {
|
|
"provider": "wx7e2186943221985d",
|
|
"version": engineVersion,
|
|
"path": "egret-library"
|
|
}
|
|
}else{
|
|
gameJSONContent.plugins = {}
|
|
}
|
|
|
|
this.writeData(gameJSONContent, gameJSONPath)
|
|
|
|
if (buildConfig.command !== "publish" || !this.useWxPlugin) {
|
|
return
|
|
}
|
|
|
|
let libDir = path.join(outputDir, "egret-library")
|
|
fs.mkdirSync(libDir)
|
|
let pluginData = { "main": "index.js" }
|
|
this.writeData(pluginData, path.join(libDir, "plugin.json"))
|
|
let engineJS = ['assetsmanager', 'dragonBones', 'egret', 'game', 'eui', 'socket', 'tween']
|
|
let signatureData: any = {
|
|
"provider": "wx7e2186943221985d",
|
|
"signature": []
|
|
}
|
|
for (let i in engineJS) {
|
|
let name = engineJS[i] + '.min.js'
|
|
if (this.md5Obj[name]) {
|
|
let jsInfo: any = {
|
|
"path": name,
|
|
"md5": this.md5Obj[name]
|
|
}
|
|
signatureData.signature.push(jsInfo)
|
|
}
|
|
}
|
|
this.writeData(signatureData, path.join(libDir, "signature.json"))
|
|
fs.writeFileSync(path.join(libDir, "index.js"), null);
|
|
|
|
}
|
|
|
|
readData(filePath: string): any {
|
|
return JSON.parse(fs.readFileSync(filePath, { encoding: "utf8" }));
|
|
}
|
|
writeData(data: object, filePath: string) {
|
|
fs.writeFileSync(filePath, JSON.stringify(data, null, "\t"));
|
|
}
|
|
}
|