soyoo-cocos/htmlChannelScript.js

186 lines
6.8 KiB
JavaScript

import * as fs from "fs";
import * as path from "path";
import do_task from "./single-html/build.js";
import { createDist } from "./common/utils.js";
// 处理 HTML 渠道
async function processHtmlChannels(options) {
const outputPrefix = options.outputPrefix || "";
const htmlChannel = options.htmlChannel || [
"applovin",
"unity",
"appier",
"ironsource",
"mintegral",
"moloco",
];
for (const channelName of htmlChannel) {
// 遍历 networks 目录下的所有js文件,获取 文件名 然后删除 web-mobile 目录下的同名文件
const files = fs.readdirSync(path.join("networks"));
for (const file of files) {
if (file.endsWith(".js")) {
const destinationFile = path.join("web-mobile", file);
if (fs.existsSync(destinationFile)) {
fs.unlinkSync(destinationFile);
console.log(`已删除: ${destinationFile}`);
}
}
}
// tiktok 处理
const tiktokConfig = path.join("web-mobile", `config.json`);
if (fs.existsSync(tiktokConfig)) {
fs.unlinkSync(tiktokConfig);
}
const tiktokJs = path.join("web-mobile", `tiktok.js`);
if (fs.existsSync(tiktokJs)) {
fs.unlinkSync(tiktokJs);
}
// 从 networks 找到复制到 web-mobile 中
if (["applovin", "unity", "appier", "ironsource"].includes(channelName)) {
const mraidSupportFile = path.join("networks", "mraid_support.js");
const mraidDestinationFile = path.join("web-mobile", "mraid_support.js");
if (fs.existsSync(mraidSupportFile)) {
fs.copyFileSync(mraidSupportFile, mraidDestinationFile);
console.log(`已复制: ${mraidSupportFile}${mraidDestinationFile}`);
}
} else if (["mintegral", "moloco"].includes(channelName)) {
const fileName = `${channelName}.js`;
const sourceFile = path.join("networks", fileName);
const destFile = path.join("web-mobile", fileName);
if (fs.existsSync(sourceFile)) {
fs.copyFileSync(sourceFile, destFile);
console.log(`已复制: ${sourceFile}${destFile}`);
}
}
if (["facebook", "google", "tiktok"].includes(channelName)) {
if (channelName == "tiktok") {
fs.copyFileSync(
path.join("facebook/config.json"),
path.join("web-mobile", `config.json`)
);
fs.copyFileSync(
path.join("tiktok/tiktok.js"),
path.join("web-mobile", `tiktok.js`)
);
} else {
const sourceFile = path.join("networks", `${channelName}.js`);
const destinationFile = path.join("web-mobile", `${channelName}.js`);
console.log("------------------------", sourceFile);
if (fs.existsSync(sourceFile)) {
fs.copyFileSync(sourceFile, destinationFile);
console.log(`已复制: ${sourceFile}${destinationFile}`);
}
}
}
const htmlFilePath = path.join("web-mobile", "index.html");
// 读取 index.html 文件
let htmlContent = fs.readFileSync(htmlFilePath, "utf-8");
// 移除非当前渠道包的 <script> 标签
htmlChannel.forEach((channel) => {
if (channel !== channelName) {
const scriptRegex = new RegExp(
`<script src="${channel}.js" charset="utf-8"></script>\\n`,
"g"
);
htmlContent = htmlContent.replace(scriptRegex, "");
}
});
// 移除 mraid_support.js 和 mraid.js 的 <script> 标签
htmlContent = htmlContent.replace(
/<script src="mraid_support.js" charset="utf-8"><\/script>\n/g,
""
);
htmlContent = htmlContent.replace(
/<script src="mraid.js"><\/script>\n/g,
""
);
// 检查并插入新的渠道 script 标签
let channelScriptTag = '';
if (["applovin", "unity", "appier", "ironsource"].includes(channelName)) {
channelScriptTag = ` <script src="mraid_support.js" charset="utf-8"></script>\n`;
} else {
// @TODO
if (!channelName == "facebook") {
channelScriptTag = ` <script src="${channelName}.js" charset="utf-8"></script>\n`;
}
}
if (!htmlContent.includes(channelScriptTag)) {
htmlContent = htmlContent.replace(
/<\/head>/,
`${channelScriptTag}</head>`
);
}
// 替换包含 window.vConsole = new VConsole 的 <script> 标签, 引用 cocos2d-js-min.js
const vConsoleScriptRegex =
/<script type="text\/javascript">[\s\S]*?window\.vConsole = new VConsole\(\);[\s\S]*?<\/script>/;
// @TODO cocos的名称需要从web-mobile文件夹中获取找到
const cocosFileName = fs
.readdirSync("web-mobile")
.find(
(file) => file.startsWith("cocos2d-js-min") && file.endsWith(".js")
);
const cocosScriptTag = `<script src="${cocosFileName}" charset="utf-8"></script>\n`;
htmlContent = htmlContent.replace(vConsoleScriptRegex, cocosScriptTag);
// 额外引入 loader-and-starter.js 和 asset-map.js 到 body 中
const loaderScriptTag = `<script src="loader-and-starter.js" charset="utf-8"></script>\n`;
const assetMapScriptTag = `<script src="asset-map.js" charset="utf-8"></script>\n`;
const bodyScriptTags = `${cocosScriptTag}${loaderScriptTag}${assetMapScriptTag}`;
if (
!htmlContent.includes(cocosScriptTag) &&
!htmlContent.includes(assetMapScriptTag)
) {
htmlContent = htmlContent.replace(cocosScriptTag, bodyScriptTags);
}
// 移除单渠道的 SDK script 标签
if (!["tiktok", "facebook", "google"].includes(channelName)) {
const sdkScriptTag = `<script src="https://sf16-muse-va.ibytedtos.com/obj/union-fe-nc-i18n/playable/sdk/playable-sdk.js"></script>\n`;
htmlContent = htmlContent.replace(sdkScriptTag, "");
}
fs.writeFileSync(htmlFilePath, htmlContent);
console.log(`已将 ${channelName}.js 和相关 script 引入到 index.html 中`);
// 调用 do_task 方法,将 web-mobile 下的所有包打包成一个 HTML
createDist();
do_task();
// 如果是 ironsource 渠道,将 <script src="mraid.js"></script> 插入到 body 标签之前
if (channelName === "ironsource") {
htmlContent = fs.readFileSync(path.join("dist", "index.html"), "utf-8");
htmlContent = htmlContent.replace(
/<\/body>/,
`<script src="mraid.js"></script></body>`
);
fs.writeFileSync(path.join("dist", "index.html"), htmlContent);
console.log(
`已将 <script src="mraid.js"></script> 写入到 ironsource.html 的 body 标签之前`
);
}
// 重命名生成的 index.html 为对应的渠道名称
const distIndexPath = path.join("dist", "index.html");
const channelIndexPath = path.join(
"dist",
`${outputPrefix}${channelName}.html`
);
if (fs.existsSync(distIndexPath)) {
fs.renameSync(distIndexPath, channelIndexPath);
console.log(`已重命名 index.html 为 ${channelName}.html`);
}
}
}
export default processHtmlChannels;