ttmg-pack 0.4.5 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/typings/index.d.ts +14 -0
- package/dist/utils/i18n.d.ts +2 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ==========================================
|
|
3
3
|
* @Description: ttmg pack
|
|
4
|
-
* @Version: 0.4.
|
|
4
|
+
* @Version: 0.4.6
|
|
5
5
|
* @Author: zhanghongyang.mocha
|
|
6
|
-
* @Date: 2026-03-
|
|
6
|
+
* @Date: 2026-03-26 18:52:11
|
|
7
7
|
* ==========================================
|
|
8
8
|
*/
|
|
9
9
|
'use strict';
|
|
@@ -334,6 +334,7 @@ const messages = {
|
|
|
334
334
|
'check.project.size.success': 'Project size check passed: {sizeMB}MB.',
|
|
335
335
|
'check.project.perf.noSplitNeeded': 'wasmFuncCount < {limit}. No wasm code splitting is needed.',
|
|
336
336
|
'check.project.perf.needSplit': 'The Wasm function count in wasmcode/ exceeds {limit}. Please enable code splitting to optimize performance.',
|
|
337
|
+
'check.project.perf.doc': 'View wasm split guide',
|
|
337
338
|
'check.project.perf.splitEnabled': 'wasmFuncCount >= {limit}, and wasm split is enabled.',
|
|
338
339
|
'check.main.size.failed': 'Main package size check failed: {sizeMB}MB. It must not exceed {limitMB}MB.',
|
|
339
340
|
'check.main.size.success': 'Main package size check passed: {sizeMB}MB.',
|
|
@@ -407,6 +408,7 @@ const messages = {
|
|
|
407
408
|
'check.project.size.success': '项目大小检查通过:当前 {sizeMB}MB。',
|
|
408
409
|
'check.project.perf.noSplitNeeded': 'wasmFuncCount < {limit},无需进行 wasm 代码拆分。',
|
|
409
410
|
'check.project.perf.needSplit': 'wasmcode/ 中的 Wasm 函数数量超过 {limit},请开启代码拆分以优化性能。',
|
|
411
|
+
'check.project.perf.doc': '查看分包文档',
|
|
410
412
|
'check.project.perf.splitEnabled': 'wasmFuncCount >= {limit},且已开启 wasm 拆分。',
|
|
411
413
|
'check.main.size.failed': '主包大小检查失败:当前 {sizeMB}MB,不能超过 {limitMB}MB。',
|
|
412
414
|
'check.main.size.success': '主包大小检查通过:当前 {sizeMB}MB。',
|
|
@@ -1160,6 +1162,7 @@ function checkProjectSize(config, t) {
|
|
|
1160
1162
|
}
|
|
1161
1163
|
}
|
|
1162
1164
|
function checkPerformance(config, t) {
|
|
1165
|
+
const wasmSplitDocLink = 'https://bytedance.larkoffice.com/wiki/DZDzwzYdDiJpBSkrhcTcWailnuh?from=from_parent_docx';
|
|
1163
1166
|
const { entry } = config;
|
|
1164
1167
|
if (!isUnityEngine(entry)) {
|
|
1165
1168
|
return null;
|
|
@@ -1177,7 +1180,10 @@ function checkPerformance(config, t) {
|
|
|
1177
1180
|
const splitConfigPath = path.join(entry, GAME_WASM_SPLIT_CONFIG_FILE_NAME);
|
|
1178
1181
|
const errResult = Object.assign(Object.assign({}, defaultCheckConfig$3), { passed: false, msg: t('check.project.perf.needSplit', {
|
|
1179
1182
|
limit: WASM_FUNC_COUNT_LIMIT,
|
|
1180
|
-
}), type: 'performance', level: 'warning',
|
|
1183
|
+
}), type: 'performance', level: 'warning', detail: {
|
|
1184
|
+
link: wasmSplitDocLink,
|
|
1185
|
+
text: t('check.project.perf.doc'),
|
|
1186
|
+
}, name: 'project' });
|
|
1181
1187
|
if (!fs.existsSync(splitConfigPath)) {
|
|
1182
1188
|
return errResult;
|
|
1183
1189
|
}
|
|
@@ -2420,7 +2426,7 @@ async function buildPkgs(config, context = {}) {
|
|
|
2420
2426
|
let startTime = Date.now();
|
|
2421
2427
|
logger.init(outputDir, true);
|
|
2422
2428
|
logger.info(t('log.build.version', {
|
|
2423
|
-
version: "0.4.
|
|
2429
|
+
version: "0.4.6",
|
|
2424
2430
|
}));
|
|
2425
2431
|
logger.info(t('log.build.start', { startTime }));
|
|
2426
2432
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/utils/ensureDirSync.ts","../src/utils/logger.ts","../src/utils/removeEmptyDir.ts","../src/constants/index.ts","../src/utils/getDirSizeSync.ts","../src/utils/deleteJsFilesSync.ts","../src/utils/deleteNoJsFilesSync.ts","../src/utils/i18n.ts","../src/utils/removeSystemUseless.ts","../src/utils/asyncPool.ts","../src/utils/getSubpackagesConfig.ts","../src/utils/getIndependentPackagesConfig.ts","../src/utils/getMainPkgSize.ts","../src/utils/getProjectSize.ts","../src/utils/getGameEngine.ts","../src/utils/safeBuild.ts","../src/utils/openDataContext.ts","../src/utils/unity/isUnityEngine.ts","../src/utils/unity/getWasmBrCodePath.ts","../src/utils/unity/getWasmBrCodeMd5.ts","../src/utils/unity/getUnityBuildConfig.ts","../src/utils/getCheckConfig.ts","../src/libs/odrPkgs/writeOdrConfig.ts","../src/libs/odrPkgs/makeOdrPkgs.ts","../src/libs/odrPkgs/utils.ts","../src/libs/odrPkgs/getConfigs.ts","../src/libs/odrPkgs/buildOdrPkgs.ts","../src/libs/checkPkgs/checkProject.ts","../src/libs/checkPkgs/checkMainpackage.ts","../src/libs/checkPkgs/checkSubpackages.ts","../src/libs/checkPkgs/checkIndependentPackages.ts","../src/libs/checkPkgs/checkAPI.ts","../src/libs/checkPkgs/index.ts","../src/libs/makePkgs/setup.ts","../src/libs/makePkgs/collectMaps.ts","../src/libs/makePkgs/addDepsToPackages.ts","../src/libs/makePkgs/collectDeps.ts","../src/libs/makePkgs/pack.ts","../src/libs/makePkgs/partition.ts","../src/libs/makePkgs/index.ts","../src/libs/mergePkgs/index.ts","../src/libs/clearPkgs/index.ts","../src/libs/debugPkgs/index.ts","../src/libs/buildPkgs/index.ts","../src/libs/getPkgs/index.ts"],"sourcesContent":["import fs from 'fs';\nexport function ensureDirSync(dir) {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n}\n","import winston from 'winston';\nimport path from 'path';\n\nclass Logger {\n logger: winston.Logger;\n enableLog: boolean;\n output: any;\n constructor() {\n this.logger = null;\n }\n init(output: string, enableLog = true) {\n this.enableLog = enableLog;\n this.logger = winston.createLogger({\n level: 'info',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json(), // 输出为 JSON 格式\n ),\n transports: [\n new winston.transports.File({\n filename: path.join(output, 'pack.log'),\n }),\n new winston.transports.Console(),\n ],\n });\n }\n info(msg: string) {\n if (this.enableLog) {\n this.logger.info(msg);\n }\n }\n error(msg) {\n if (this.enableLog) {\n this.logger.error(msg);\n }\n }\n warn(msg) {\n if (this.enableLog) {\n this.logger.warn(msg);\n }\n }\n debug(msg) {\n if (this.enableLog) {\n this.logger.debug(msg);\n }\n }\n log(msg) {\n this.logger.info(msg);\n }\n setOutput(output) {\n this.output = output;\n }\n}\n\nexport const logger = new Logger();\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * 移除指定目录下所有空文件夹(递归)\n * @param {string} dir 目标目录\n * @returns {boolean} 返回当前目录是否已被删除(即是否为空)\n */\nexport function removeEmptyDir(dir) {\n if (!fs.existsSync(dir)) return false;\n if (!fs.statSync(dir).isDirectory()) return false;\n\n let isEmpty = true;\n const files = fs.readdirSync(dir);\n for (const file of files) {\n const fullPath = path.join(dir, file);\n if (fs.statSync(fullPath).isDirectory()) {\n // 递归处理子目录\n const childIsEmpty = removeEmptyDir(fullPath);\n if (!childIsEmpty) isEmpty = false;\n } else {\n // 有文件,当前目录不为空\n isEmpty = false;\n }\n }\n\n // 如果当前目录为空,删除它\n if (isEmpty) {\n fs.rmSync(dir, { recursive: true });\n return true;\n }\n return false;\n}\n\n","import type { CheckDimension } from '@typings';\nexport const GAME_PACK_CONFIG_FILE_NAME = 'packageConfig.json';\nexport const GAME_PROJECT_CONFIG_FILE_NAME = 'project.config.json';\nexport const GAME_ORIGIN_CONFIG_FILE_NAME = 'game.json';\nexport const GAME_MODULE_CONFIG_FILE_NAME = 'moduleConfig.json';\nexport const GAME_OUTPUT_CONFIG_FILE_NAME = 'output.json';\nexport const GAME_WASM_SPLIT_CONFIG_FILE_NAME = 'webgl-wasm-split.json';\nexport const GAME_MAIN_PACKAGE_NAME = '__GAME__';\nexport const TTPKG_TAG = 'TPKG';\nexport const STTPKG_TAG = 'SPKG';\nexport const TTPKG_VERSION = 2;\nexport const ARK_KEY_LEN = 32;\nexport const ARK_INT_LEN = 4;\nexport const UNIT32_LEN = 4;\nexport const UINT16_LEN = 2;\nexport const STTPKG_VERSION = 1;\nexport const ZSTD_COMPRESS_LEVEL = 19;\nexport const ROLL_FILE_EXT = [\n '.js',\n '.json',\n '.wxml',\n '.ttml',\n '.wxss',\n '.ttss',\n];\nexport const EXT = '';\nexport const BROTLI_COMPRESS_TYPE = 1;\nexport const ZSTD_COMPRESS_TYPE = 3;\n\nexport const STTPKG_EXT = '.txt';\n\nexport const ODR_CODE_DIR_SUFFIX = '_code';\n\nexport const ODR_ASSET_DIR_SUFFIX = '_asset';\n\n// 60MB const ONE_ODR_PKG_LIMIT = 1024 * 1024;\nexport const ONE_ODR_PKG_LIMIT = 1024 * 1024 * 60;\n\nexport const AVAILABLE_ODR_TAG_LIST = [\n 'ttmg_odr_high_channel',\n 'ttmg_odr_middle_channel',\n 'ttmg_odr_normal_channel',\n];\n\nexport const PROJECT_SIZE_LIMIT = 30 * 1024 * 1024;\n\nexport const MAINPACKAGE_SIZE_LIMIT = 4 * 1024 * 1024;\n\nexport const CHECK_DIMENSION: Record<string, CheckDimension> = {\n IndependentPackage: 'independent_package',\n MainPackage: 'main_package',\n Project: 'project',\n SubPackage: 'subpackage',\n};\n\nexport const PACKAGE_TYPE = {\n IndependentPackage: 'independent_package',\n SubPackage: 'sub_package',\n MainPackage: 'main_package',\n};\n\nexport const GAME_ENGINES = {\n UNITY: 'unity',\n};\n\nexport const TTMG_TEMP_DIR = '__TTMG_TEMP__';\n\nexport const USELESS_DIRS = ['node_modules', '__MACOSX', TTMG_TEMP_DIR];\n\nexport const USELESS_FILES = ['.DS_Store', 'Thumbs.db'];\n\nexport const GAME_PKG_SIZE_LIMIT = {\n common: {\n project: 30 * 1024 * 1024,\n main: 4 * 1024 * 1024,\n sub: null,\n independent: 4 * 1024 * 1024,\n },\n unity: {\n project: 60 * 1024 * 1024,\n main: null,\n sub: null,\n independent: null,\n },\n};\n\nexport const WASM_FUNC_COUNT_LIMIT = 80000;","import fs from 'fs';\nimport path from 'path';\nimport { USELESS_DIRS, USELESS_FILES } from '@constants';\n\nexport interface DirSizeOptions {\n rootDir: string;\n entryDir: string;\n filterDirs?: string[]; // 要过滤的目录名或相对路径\n filterFiles?: string[]; // 要过滤的文件名\n filterPatterns?: string[]; // 通配符模式,如 '*.log', 'test-*'\n filterRegex?: RegExp[]; // 正则表达式匹配\n}\n\n/**\n * 递归统计目录下所有文件的大小,支持过滤文件夹和文件\n */\nexport function getDirSizeSync(options: DirSizeOptions): number {\n const {\n rootDir,\n entryDir,\n filterDirs = USELESS_DIRS,\n filterFiles = USELESS_FILES,\n filterPatterns = [],\n filterRegex = [],\n } = options;\n\n let totalSize = 0;\n\n // 检查目录是否存在\n if (!fs.existsSync(entryDir)) {\n return 0;\n }\n\n // 将通配符模式转换为正则表达式\n const patternRegexes = filterPatterns.map(pattern => {\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexStr = escaped.replace(/\\\\\\*/g, '.*').replace(/\\\\\\?/g, '.');\n return new RegExp(`^${regexStr}$`);\n });\n\n // 合并所有正则表达式\n const allRegexes = [...patternRegexes, ...filterRegex];\n\n // 检查是否应该忽略当前条目\n const shouldIgnore = (name: string, isDirectory: boolean): boolean => {\n // 1. 检查精确匹配\n if (isDirectory && filterDirs.includes(name)) {\n return true;\n }\n if (!isDirectory && filterFiles.includes(name)) {\n return true;\n }\n\n // 2. 检查相对路径匹配(针对目录)\n if (isDirectory) {\n const relativePath = path\n .relative(rootDir, path.join(entryDir, name))\n .replace(/\\\\/g, '/');\n if (filterDirs.includes(relativePath)) {\n return true;\n }\n }\n\n // 3. 检查正则表达式匹配\n if (allRegexes.some(regex => regex.test(name))) {\n return true;\n }\n\n return false;\n };\n\n try {\n const entries = fs.readdirSync(entryDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(entryDir, entry.name);\n\n try {\n if (entry.isDirectory()) {\n // 检查是否应该忽略此目录\n if (!shouldIgnore(entry.name, true)) {\n totalSize += getDirSizeSync({\n rootDir,\n entryDir: fullPath,\n filterDirs,\n filterFiles,\n filterPatterns,\n filterRegex,\n });\n }\n } else if (entry.isFile()) {\n // 检查是否应该忽略此文件\n if (!shouldIgnore(entry.name, false)) {\n totalSize += fs.statSync(fullPath).size;\n }\n }\n } catch (err) {\n // 跳过无法访问的文件/目录\n console.warn(`无法访问: ${fullPath}`, (err as Error).message);\n }\n }\n } catch (err) {\n console.warn(`无法读取目录: ${entryDir}`, (err as Error).message);\n }\n\n return totalSize;\n}\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * 同步删除指定目录及其子目录下所有 .js 文件\n * @param {string} dir 目标目录路径\n */\nexport function deleteJsFilesSync(dir) {\n // 读取目录内容\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // 递归处理子目录\n deleteJsFilesSync(fullPath);\n } else if (\n entry.isFile() &&\n (fullPath.endsWith('.js') || fullPath.endsWith('.js.map'))\n ) {\n try {\n fs.unlinkSync(fullPath);\n } catch (err) {}\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport function deleteNoJsFilesSync(dir) {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // 递归处理子目录\n deleteNoJsFilesSync(fullPath);\n } else if (\n entry.isFile() &&\n !(fullPath.endsWith('.js') || fullPath.endsWith('.js.map'))\n ) {\n try {\n fs.unlinkSync(fullPath);\n } catch (err) {}\n }\n }\n}\n","import type { PackLang } from '@typings';\n\ntype MessageParams = Record<string, string | number>;\n\nconst messages = {\n 'en-US': {\n 'log.check.start': 'Start checking project.',\n 'log.check.project.start': 'Start checking project dimension.',\n 'log.check.project.success': 'Project checks passed.',\n 'log.check.config.start': 'Start checking config.',\n 'log.check.projectSize.start': 'Start checking project size.',\n 'log.check.subpackages.start': 'Start checking subpackages in game.json.',\n 'log.check.subpackages.success':\n 'Subpackages config checks passed.',\n 'log.check.mainPackage.start': 'Start checking main package.',\n 'log.check.mainPackageEntry.start':\n 'Start checking main package entry.',\n 'log.check.mainPackageEntry.success':\n 'Main package entry check passed.',\n 'log.check.mainPackageSize.start':\n 'Start checking main package size.',\n 'log.check.mainPackage.success': 'Main package checks passed.',\n 'log.check.independent.start':\n 'Start checking independent subpackages in game.json.',\n 'log.check.independent.success':\n 'Independent subpackages config checks passed.',\n 'log.setup.startGeneratePackageConfig':\n 'Start generating packageConfig.json from game.json.',\n 'log.setup.generatePackageConfigSuccess':\n 'Generated packageConfig.json from game.json successfully.',\n 'log.collectMaps.start':\n 'Start collecting JS files from game source packages.',\n 'log.collectMaps.openDataContextDir':\n 'Open data context directory: {dir}',\n 'log.collectMaps.done':\n 'Collected JS files from game source packages successfully.',\n 'log.makePkgs.start': 'Pack start, startTime: {startTime}',\n 'log.makePkgs.startPackBySource':\n 'Start packing from game source, package: {pkgName}',\n 'log.makePkgs.finishPackBySource':\n 'Finished packing and partitioning from game source, package: {pkgName}',\n 'log.makePkgs.packBySourceCost':\n 'Pack and partition cost, package: {pkgName}, duration: {duration}ms',\n 'log.makePkgs.startOpenData':\n 'Start packing from open data context source.',\n 'log.makePkgs.finishOpenData':\n 'Finished packing from open data context source.',\n 'log.makePkgs.openDataCost':\n 'Open data context packing cost: {duration}ms',\n 'log.makePkgs.end': 'Pack end, duration: {duration}ms',\n 'log.build.version': 'TTMG_PACK_VERSION: {version}',\n 'log.build.start': 'Pack start, startTime: {startTime}',\n 'log.build.end': 'Pack end: {duration}ms',\n 'log.pack.start': 'Pack start, startTime: {startTime}',\n 'log.pack.end': 'Pack end, package: {pkgName}',\n 'log.safeBuild.initStart':\n 'Attempting to initialize esbuild service...',\n 'log.safeBuild.initSuccess':\n 'esbuild service initialized successfully.',\n 'log.safeBuild.initFailed':\n 'Failed to initialize esbuild service:',\n 'log.cleanup.start':\n 'Start cleaning useless files, total entries: {total}',\n 'log.cleanup.accessDirFailed':\n 'Cannot access directory: {dir}, {error}',\n 'log.cleanup.deletedDir':\n 'Deleted useless directory: {path}',\n 'log.cleanup.deletedFile':\n 'Deleted useless file: {path}',\n 'log.cleanup.processFailed':\n 'Cannot process entry: {path}, {error}',\n 'log.cleanup.progress':\n 'Progress: {processed}/{total} ({percentage}%)',\n 'log.cleanup.done': 'Cleanup finished.',\n 'log.cleanup.summary.total': '- Total entries: {total}',\n 'log.cleanup.summary.deletedDirs':\n '- Deleted directories: {deletedDirs}',\n 'log.cleanup.summary.deletedFiles':\n '- Deleted files: {deletedFiles}',\n 'log.cleanup.summary.errors': '- Errors: {errors}',\n 'check.project.gameJson.missing':\n 'Cannot find game.json in the project source. Please make sure game.json exists.',\n 'check.project.gameJson.subPackagesInvalid':\n \"'subPackages' is found in game.json. Please use 'subpackages' (all lowercase) instead.\",\n 'check.project.gameJson.success': 'Check game.json config successfully.',\n 'check.project.size.failed':\n 'Project size check failed: {sizeMB}MB. It must not exceed {limitMB}MB.',\n 'check.project.size.success':\n 'Project size check passed: {sizeMB}MB.',\n 'check.project.perf.noSplitNeeded':\n 'wasmFuncCount < {limit}. No wasm code splitting is needed.',\n 'check.project.perf.needSplit':\n 'The Wasm function count in wasmcode/ exceeds {limit}. Please enable code splitting to optimize performance.',\n 'check.project.perf.splitEnabled':\n 'wasmFuncCount >= {limit}, and wasm split is enabled.',\n 'check.main.size.failed':\n 'Main package size check failed: {sizeMB}MB. It must not exceed {limitMB}MB.',\n 'check.main.size.success':\n 'Main package size check passed: {sizeMB}MB.',\n 'check.main.entry.missing':\n 'Main package entry check failed: game.js must exist in the main package.',\n 'check.main.entry.success':\n 'Main package entry check passed: game.js exists in the main package.',\n 'check.subpackages.config.empty':\n 'Subpackages config check failed: one or more subpackages have an empty root or name. Please ensure every subpackage has non-empty root and name.',\n 'check.subpackages.config.invalidPath':\n 'Subpackages config check failed: subpackage<{name}> has invalid {invalidFields}. Only A-Za-z0-9 _ - . / \\\\ are allowed.',\n 'check.subpackages.config.success':\n 'Subpackage<{name}> config check passed.',\n 'check.subpackages.config.missingDir':\n 'Subpackages config check failed: cannot find entry directory for subpackage<{name}>. Please verify its root path in game.json.',\n 'check.independent.config.empty':\n 'Independent subpackages config check failed: one or more independent subpackages have an empty root or name. Please ensure every independent subpackage has non-empty root and name.',\n 'check.independent.config.missingDir':\n 'Independent subpackages config check failed: cannot find entry directory for independent subpackage<{name}>. Please verify its root path in game.json.',\n 'check.independent.config.success':\n 'Independent subpackage<{name}> config check passed.',\n 'check.pkgSize.success':\n 'Package<{pkgName}> size check passed: {sizeMB}MB.',\n 'check.pkgSize.exceeds':\n 'Package<{pkgName}> size check failed: {sizeMB}MB exceeds limit {limitMB}MB.',\n 'check.api.integrated': '{name} integrated.',\n 'check.api.notIntegrated': '{name} not integrated.',\n 'check.api.suggestedActionSuffix':\n 'Please resolve this before submission to avoid review rejection.',\n 'debug.validation.failed':\n 'Project validation failed (Errors):\\n{errorMsg}',\n },\n 'zh-CN': {\n 'log.check.start': '开始校验项目。',\n 'log.check.project.start': '开始校验项目维度。',\n 'log.check.project.success': '项目校验通过。',\n 'log.check.config.start': '开始校验配置。',\n 'log.check.projectSize.start': '开始校验项目大小。',\n 'log.check.subpackages.start': '开始校验 game.json 中的分包配置。',\n 'log.check.subpackages.success': '分包配置校验通过。',\n 'log.check.mainPackage.start': '开始校验主包。',\n 'log.check.mainPackageEntry.start': '开始校验主包入口。',\n 'log.check.mainPackageEntry.success': '主包入口校验通过。',\n 'log.check.mainPackageSize.start': '开始校验主包大小。',\n 'log.check.mainPackage.success': '主包校验通过。',\n 'log.check.independent.start':\n '开始校验 game.json 中的独立分包配置。',\n 'log.check.independent.success': '独立分包配置校验通过。',\n 'log.setup.startGeneratePackageConfig':\n '开始基于源代码中的 game.json 生成 packageConfig.json。',\n 'log.setup.generatePackageConfigSuccess':\n '基于源代码中的 game.json 生成 packageConfig.json 成功。',\n 'log.collectMaps.start':\n '开始基于游戏源代码收集分包中的 JS 文件。',\n 'log.collectMaps.openDataContextDir':\n '开放数据域目录:{dir}',\n 'log.collectMaps.done':\n '基于游戏源代码收集分包中的 JS 文件完成。',\n 'log.makePkgs.start': '打包开始,开始时间:{startTime}',\n 'log.makePkgs.startPackBySource':\n '开始基于游戏源代码打包,包名:{pkgName}',\n 'log.makePkgs.finishPackBySource':\n '基于游戏源代码打包分包完成,包名:{pkgName}',\n 'log.makePkgs.packBySourceCost':\n '基于游戏源代码打包分包耗时,包名:{pkgName},耗时:{duration}ms',\n 'log.makePkgs.startOpenData':\n '开始基于开放数据域源代码打包。',\n 'log.makePkgs.finishOpenData':\n '基于开放数据域源代码打包完成。',\n 'log.makePkgs.openDataCost':\n '基于开放数据域源代码打包耗时,耗时:{duration}ms',\n 'log.makePkgs.end': '打包结束,总耗时:{duration}ms',\n 'log.build.version': 'TTMG_PACK_VERSION: {version}',\n 'log.build.start': '打包开始,开始时间:{startTime}',\n 'log.build.end': '打包结束:{duration}ms',\n 'log.pack.start': '打包开始,开始时间:{startTime}',\n 'log.pack.end': '打包结束,包名:{pkgName}',\n 'log.safeBuild.initStart': '尝试初始化 esbuild 服务...',\n 'log.safeBuild.initSuccess': 'esbuild 服务初始化成功。',\n 'log.safeBuild.initFailed': '初始化 esbuild 服务失败:',\n 'log.cleanup.start':\n '开始清理无用文件,共 {total} 个条目',\n 'log.cleanup.accessDirFailed':\n '无法访问目录: {dir}, {error}',\n 'log.cleanup.deletedDir':\n '已删除无用目录: {path}',\n 'log.cleanup.deletedFile':\n '已删除无用文件: {path}',\n 'log.cleanup.processFailed':\n '无法处理: {path}, {error}',\n 'log.cleanup.progress':\n '进度: {processed}/{total} ({percentage}%)',\n 'log.cleanup.done': '清理完成!',\n 'log.cleanup.summary.total': '- 总条目: {total}',\n 'log.cleanup.summary.deletedDirs': '- 已删除目录: {deletedDirs}',\n 'log.cleanup.summary.deletedFiles': '- 已删除文件: {deletedFiles}',\n 'log.cleanup.summary.errors': '- 错误数: {errors}',\n 'check.project.gameJson.missing':\n '未在项目源码中找到 game.json,请确认 game.json 文件存在。',\n 'check.project.gameJson.subPackagesInvalid':\n \"在 game.json 中发现了 'subPackages' 字段,请改为全小写的 'subpackages'。\",\n 'check.project.gameJson.success': 'game.json 配置检查通过。',\n 'check.project.size.failed':\n '项目大小检查失败:当前 {sizeMB}MB,不能超过 {limitMB}MB。',\n 'check.project.size.success':\n '项目大小检查通过:当前 {sizeMB}MB。',\n 'check.project.perf.noSplitNeeded':\n 'wasmFuncCount < {limit},无需进行 wasm 代码拆分。',\n 'check.project.perf.needSplit':\n 'wasmcode/ 中的 Wasm 函数数量超过 {limit},请开启代码拆分以优化性能。',\n 'check.project.perf.splitEnabled':\n 'wasmFuncCount >= {limit},且已开启 wasm 拆分。',\n 'check.main.size.failed':\n '主包大小检查失败:当前 {sizeMB}MB,不能超过 {limitMB}MB。',\n 'check.main.size.success':\n '主包大小检查通过:当前 {sizeMB}MB。',\n 'check.main.entry.missing':\n '主包入口检查失败:主包中必须存在 game.js。',\n 'check.main.entry.success':\n '主包入口检查通过:主包中存在 game.js。',\n 'check.subpackages.config.empty':\n '分包配置检查失败:一个或多个分包的 root 或 name 为空,请确保所有分包都配置了非空的 root 和 name。',\n 'check.subpackages.config.invalidPath':\n '分包配置检查失败:分包<{name}> 的 {invalidFields} 含有非法字符,仅允许 A-Za-z0-9 _ - . / \\\\。',\n 'check.subpackages.config.success':\n '分包<{name}> 配置检查通过。',\n 'check.subpackages.config.missingDir':\n '分包配置检查失败:找不到分包<{name}> 的入口目录,请检查 game.json 中的 root 路径。',\n 'check.independent.config.empty':\n '独立分包配置检查失败:一个或多个独立分包的 root 或 name 为空,请确保所有独立分包都配置了非空的 root 和 name。',\n 'check.independent.config.missingDir':\n '独立分包配置检查失败:找不到独立分包<{name}> 的入口目录,请检查 game.json 中的 root 路径。',\n 'check.independent.config.success':\n '独立分包<{name}> 配置检查通过。',\n 'check.pkgSize.success':\n '包<{pkgName}> 大小检查通过:{sizeMB}MB。',\n 'check.pkgSize.exceeds':\n '包<{pkgName}> 大小检查失败:当前 {sizeMB}MB,超过限制 {limitMB}MB。',\n 'check.api.integrated': '{name} 已接入。',\n 'check.api.notIntegrated': '{name} 未接入。',\n 'check.api.suggestedActionSuffix':\n '请在提审之前完成问题处理,避免审核阶段被拒审。',\n 'debug.validation.failed':\n '项目校验失败(错误项):\\n{errorMsg}',\n },\n} as const;\n\nexport type PackMessageKey = keyof typeof messages['en-US'];\nexport type Translate = (\n key: PackMessageKey,\n params?: MessageParams,\n) => string;\n\nfunction format(template: string, params?: MessageParams) {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const value = params[key];\n return value === undefined ? `{${key}}` : String(value);\n });\n}\n\nexport function resolvePackLanguage(lang?: string): PackLang {\n return lang === 'zh-CN' ? 'zh-CN' : 'en-US';\n}\n\nlet runtimePackLang: PackLang = 'en-US';\n\nexport function setPackRuntimeLanguage(lang?: string) {\n runtimePackLang = resolvePackLanguage(lang);\n}\n\nexport function getPackRuntimeLanguage(): PackLang {\n return runtimePackLang;\n}\n\nexport function createPackTranslator(lang?: string): Translate {\n const currentLang = resolvePackLanguage(lang);\n return (key, params) => {\n const template = messages[currentLang][key] ?? messages['en-US'][key] ?? key;\n return format(template, params);\n };\n}\n\nexport function getPackTranslator(): Translate {\n return createPackTranslator(runtimePackLang);\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { logger } from './logger';\nimport { getPackTranslator } from './i18n';\n\nconst uselessFiles = ['.DS_Store', 'Thumbs.db'];\n\nexport interface CleanupProgress {\n total: number;\n processed: number;\n deletedDirs: number;\n deletedFiles: number;\n errors: number;\n}\n\nexport function removeSystemUseless(\n gameEntry: string,\n uselessDirs,\n): CleanupProgress {\n const t = getPackTranslator();\n const progress: CleanupProgress = {\n total: 0,\n processed: 0,\n deletedDirs: 0,\n deletedFiles: 0,\n errors: 0,\n };\n\n // 1. 读取目录\n let files: string[];\n try {\n files = fs.readdirSync(gameEntry);\n progress.total = files.length;\n\n logger.info(t('log.cleanup.start', { total: progress.total }));\n } catch (err) {\n logger.warn(t('log.cleanup.accessDirFailed', {\n dir: gameEntry,\n error: err.message,\n }));\n progress.errors++;\n return progress;\n }\n\n // 2. 处理每个条目\n files.forEach((file, index) => {\n const filePath = path.join(gameEntry, file);\n\n try {\n const stat = fs.statSync(filePath);\n\n if (stat.isDirectory() && uselessDirs.includes(file)) {\n // 删除无用目录\n logger.debug(`正在删除目录: ${filePath}`);\n fs.rmSync(filePath, { recursive: true, force: true });\n progress.deletedDirs++;\n logger.info(t('log.cleanup.deletedDir', { path: filePath }));\n } else if (stat.isFile() && uselessFiles.includes(file)) {\n // 删除无用文件\n logger.debug(`正在删除文件: ${filePath}`);\n fs.rmSync(filePath, { force: true });\n progress.deletedFiles++;\n logger.info(t('log.cleanup.deletedFile', { path: filePath }));\n } else {\n logger.debug(`跳过: ${filePath} (非目标文件/目录)`);\n }\n } catch (err) {\n logger.warn(t('log.cleanup.processFailed', {\n path: filePath,\n error: err.message,\n }));\n progress.errors++;\n }\n\n // 更新进度\n progress.processed = index + 1;\n\n // 可选:每处理10个条目输出一次进度\n if ((index + 1) % 10 === 0 || index + 1 === progress.total) {\n const percentage = Math.round(((index + 1) / progress.total) * 100);\n logger.info(t('log.cleanup.progress', {\n processed: index + 1,\n total: progress.total,\n percentage,\n }));\n }\n });\n\n // 3. 输出总结\n logger.info(t('log.cleanup.done'));\n logger.info(t('log.cleanup.summary.total', { total: progress.total }));\n logger.info(t('log.cleanup.summary.deletedDirs', {\n deletedDirs: progress.deletedDirs,\n }));\n logger.info(t('log.cleanup.summary.deletedFiles', {\n deletedFiles: progress.deletedFiles,\n }));\n logger.info(t('log.cleanup.summary.errors', { errors: progress.errors }));\n\n return progress;\n}\n","export async function asyncPool<T, R>(\n poolLimit: number,\n array: T[],\n iteratorFn: (item: T) => Promise<R>,\n): Promise<R[]> {\n const ret: Promise<R>[] = [];\n const executing: Promise<void>[] = [];\n for (const item of array) {\n // 创建处理当前 item 的 Promise\n const p = Promise.resolve().then(() => iteratorFn(item));\n ret.push(p);\n\n if (poolLimit <= array.length) {\n // 包装 Promise,处理完成后从 executing 中移除\n const e = p.then(() => {\n executing.splice(executing.indexOf(e), 1);\n });\n executing.push(e);\n\n // 达到并发限制时,等待任意一个任务完成\n if (executing.length >= poolLimit) {\n await Promise.race(executing);\n }\n }\n }\n // 等待所有任务完成\n return Promise.all(ret);\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME } from '@constants';\n\nexport function getSubpackagesConfig(entryDir: string) {\n try {\n const gameOriginConfigPath = path.join(\n entryDir,\n GAME_ORIGIN_CONFIG_FILE_NAME,\n );\n const gameOriginConfig = JSON.parse(\n fs.readFileSync(gameOriginConfigPath, 'utf-8'),\n );\n return gameOriginConfig?.subpackages?.filter(sub => !sub.independent) || [];\n } catch (e) {\n return [];\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME } from '@constants';\n\nexport function getIndependentPackagesConfig(entryDir: string) {\n try {\n const gameOriginConfigPath = path.join(\n entryDir,\n GAME_ORIGIN_CONFIG_FILE_NAME,\n );\n const gameOriginConfig = JSON.parse(\n fs.readFileSync(gameOriginConfigPath, 'utf-8'),\n );\n return gameOriginConfig?.subpackages?.filter(sub => sub.independent) || [];\n } catch (e) {\n return [];\n }\n}\n","import { getDirSizeSync } from './getDirSizeSync';\nimport path from 'path';\nimport fs from 'fs';\nimport {\n GAME_ORIGIN_CONFIG_FILE_NAME,\n USELESS_DIRS,\n} from '@constants';\n\nexport function getMainPkgSize({ entryDir }: { entryDir: string }) {\n // 先获取分包根目录,这样如果有 subPackages 配置错误,会在这里抛出\n const subpackagesRoots = getSubpackagesRoots(entryDir);\n\n return getDirSizeSync({\n rootDir: entryDir,\n entryDir,\n filterDirs: [...subpackagesRoots, ...USELESS_DIRS],\n });\n}\n\nfunction getSubpackagesRoots(entryDir: string) {\n const originConfigPath = path.join(entryDir, GAME_ORIGIN_CONFIG_FILE_NAME);\n try {\n const originConfig = JSON.parse(fs.readFileSync(originConfigPath, 'utf8'));\n \n // 优先使用小写的 subpackages,如果没有,再使用小驼峰的 subPackages\n const roots =\n originConfig.subpackages?.map((item: { root: string }) => item.root) ||\n originConfig.subPackages?.map((item: { root: string }) => item.root) ||\n [];\n /**\n * 移除掉头和尾的 /\n */\n return roots.map(root => root.replace(/^\\/|\\/$/g, ''));\n } catch (e) {\n return [];\n }\n}\n","import { getDirSizeSync } from './getDirSizeSync';\n\nexport function getProjectSize({ entryDir }: { entryDir: string }) {\n return getDirSizeSync({\n rootDir: entryDir,\n entryDir,\n });\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME } from '../constants';\nexport function getGameEngine(gameEntry: string): 'unity' | 'cocos' | 'unknown' {\n const gameJsonConfigPath = path.join(gameEntry, GAME_ORIGIN_CONFIG_FILE_NAME);\n if (!fs.existsSync(gameJsonConfigPath)) {\n return 'unknown';\n }\n let gameJsonConfig: any;\n try {\n gameJsonConfig = JSON.parse(fs.readFileSync(gameJsonConfigPath, 'utf-8'));\n const gameEngine = gameJsonConfig?.gameEngine;\n if (!gameEngine) {\n return 'unknown';\n }\n return gameEngine;\n } catch (error) {\n return 'unknown';\n }\n}","import { logger } from './logger';\nimport { getPackTranslator } from './i18n';\n// file: ttmg-pack/src/esbuildRunner.ts\nimport { build, BuildOptions, BuildResult } from 'esbuild';\n\nlet initializePromise: Promise<void> | null = null;\n\n/**\n * 确保一个异步函数在整个应用生命周期内只被执行一次。\n * @param fn 一个返回 Promise 的初始化函数。\n */\nexport function ensureOnce(fn: () => Promise<void>): Promise<void> {\n if (!initializePromise) {\n initializePromise = fn();\n }\n return initializePromise;\n}\n\n// 这个函数就是我们的“初始化函数”。\n// 它会执行一次 esbuild.build,目的是为了“唤醒”并安全地启动 esbuild 的后台服务。\n// 我们选择一个几乎无害的操作,比如转换一个空字符串。\nconst initializeEsbuild = async (): Promise<void> => {\n const t = getPackTranslator();\n try {\n logger.info(t('log.safeBuild.initStart'));\n // 执行一个非常轻量的 build 操作来触发服务启动。\n await build({\n stdin: { contents: '' },\n write: false,\n bundle: false,\n logLevel: \"silent\"\n });\n logger.info(t('log.safeBuild.initSuccess'));\n } catch (e) {\n logger.error(t('log.safeBuild.initFailed'));\n // 如果初始化失败,允许重试\n throw e;\n }\n};\n\n/**\n * 一个安全的、可以并发调用的 esbuild build 函数。\n * 它会先等待全局的初始化完成后,再执行自己的 build 任务。\n */\nexport async function safeBuild(options: BuildOptions): Promise<BuildResult> {\n // 确保 esbuild 服务已经初始化。\n // 无论多少个 safeBuild 被同时调用,initializeEsbuild() 只会执行一次。\n // 所有调用都会在这里等待,直到那唯一的初始化完成。\n await ensureOnce(initializeEsbuild);\n\n // 初始化完成后,现在可以安全地、并发地调用真正的 build 了。\n return build(options);\n}\n","import { safeBuild } from './safeBuild';\nimport { writeFileSync } from 'fs';\nimport fs from 'fs';\nimport { logger } from './logger';\nimport path from 'path';\nconst bareToRelativePlugin = {\n name: 'bare-to-relative',\n setup(build) {\n // 匹配不以 . 或 / 开头的 .js 文件路径\n build.onResolve({ filter: /^[^./].*\\.js$/ }, args => {\n return {\n path: path.resolve(args.resolveDir, args.path),\n };\n });\n },\n};\n\n/**\n *\n * @param entryDir 游戏项目根目录\n * @returns\n */\nexport async function buildOpenDataContext({\n entryDir,\n outputDir,\n}: {\n entryDir: string;\n outputDir: string;\n}) {\n const { entry: openDataContextEntry, msg } = getOpenDataContextEntry({\n entryDir,\n });\n if (!openDataContextEntry) {\n return;\n } else {\n logger.info(msg);\n }\n /**\n * 这里需要做个兼容,有 index.js 就不做拼接 index.js\n */\n let inputPath = path.join(entryDir, openDataContextEntry, 'index.js');\n if (!fs.existsSync(inputPath)) {\n inputPath = path.join(entryDir, openDataContextEntry);\n }\n const outputPath = path.join(outputDir, 'openDataContextCode.txt');\n let jsCode = await genOpenDataContext(inputPath);\n writeFileSync(outputPath, jsCode);\n}\n\n/**\n *\n * @param param0\n * @returns\n */\nexport const getOpenDataContextEntry = ({ entryDir }: { entryDir: string }) => {\n const gameConfigPath = path.join(entryDir, 'game.json');\n if (!fs.existsSync(gameConfigPath)) {\n return {\n entry: undefined,\n msg: 'game.json not found, make sure the project is in the root directory of the game',\n };\n }\n try {\n const gameConfig = JSON.parse(fs.readFileSync(gameConfigPath, 'utf-8'));\n return {\n entry: gameConfig.openDataContext,\n msg: 'success',\n };\n } catch (e) {\n return {\n entry: undefined,\n msg: 'read game.json failed, your game.json is invalid json file, please check it',\n };\n }\n};\n\nasync function genOpenDataContext(entryPath: string) {\n const result = await safeBuild({\n entryPoints: [entryPath],\n bundle: true,\n platform: 'browser',\n format: 'iife',\n minify: true,\n write: false,\n loader: {\n '.png': 'dataurl',\n '.jpg': 'dataurl',\n '.jpeg': 'dataurl',\n '.gif': 'dataurl',\n '.svg': 'dataurl',\n '.webp': 'dataurl',\n },\n plugins: [bareToRelativePlugin]\n });\n const jsCode = result?.outputFiles?.[0]?.text || '';\n return jsCode;\n}\n","import { getGameEngine } from '../getGameEngine';\n\nexport function isUnityEngine(gameEntry: string) {\n return getGameEngine(gameEntry) === 'unity';\n}","import path from 'path';\nimport fs from 'fs';\nimport { isUnityEngine } from './isUnityEngine';\n\n\nexport function getWasmBrCodePath({\n entryDir,\n}: {\n entryDir: string;\n}): string {\n if (!isUnityEngine(entryDir)) {\n return '';\n } else {\n /**\n * 检查项目下存在一个名为 wasmcode 的文件夹,且文件夹下存在一个文件后缀为 .webgl.wasm.code.unityweb.wasm.br 的文件。,如果满足条件,就展示 true,否则 返回 false\n */\n\n const wasmCodeDir = path.join(entryDir, 'wasmcode');\n if (!fs.existsSync(wasmCodeDir)) {\n return '';\n }\n const wasmBrFiles = fs.readdirSync(wasmCodeDir).filter(file => file.endsWith('.webgl.wasm.code.unityweb.wasm.br'));\n if (wasmBrFiles.length === 0) {\n return '';\n } else {\n return path.relative(entryDir, path.join(wasmCodeDir, wasmBrFiles[0]));\n }\n }\n}\n\n","import path from 'path';\nimport fs from 'fs';\n\nexport function getWasmBrCodeMd5({ entryDir }: { entryDir: string }): string {\n // originalWasmMd5\n try {\n const gameConfig = JSON.parse(\n fs.readFileSync(path.join(entryDir, 'game.json'), 'utf-8'),\n );\n return gameConfig.originalWasmMd5 || '';\n } catch {\n return '';\n }\n}\n","import { GAME_PKG_SIZE_LIMIT } from '@constants'\nimport { BuildConfig } from '@typings'\nexport function getUnityBuildConfig(): Partial<BuildConfig['build']> {\n return {\n pkgSizeLimit: GAME_PKG_SIZE_LIMIT.unity.project,\n mainPkgSizeLimit: GAME_PKG_SIZE_LIMIT.unity.main,\n independentSubPkgSizeLimit: GAME_PKG_SIZE_LIMIT.unity.independent,\n }\n}","import { getUnityBuildConfig, isUnityEngine } from './unity';\nimport { BuildConfig } from '@typings';\n\nexport function getCheckConfig(config: BuildConfig):\n Partial<BuildConfig['build']> {\n if (isUnityEngine(config.entry)) {\n return getUnityBuildConfig()\n } else {\n return {\n pkgSizeLimit: 30 * 1024 * 1024,\n mainPkgSizeLimit: 4 * 1024 * 1024,\n independentSubPkgSizeLimit: 4 * 1024 * 1024,\n };\n }\n}\n","import { logger } from '@utils';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nimport {\n GAME_PACK_CONFIG_FILE_NAME,\n ODR_ASSET_DIR_SUFFIX,\n ODR_CODE_DIR_SUFFIX,\n} from '@constants';\n\n/**\n * 将 packageConfig packages 中 分拆的包 配置迁移到 odr_packages 中\n */\n\nexport async function writeOdrConfig(outputDir: string) {\n logger.info('writeOdrPackagesConfig start');\n const outputPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);\n const config = JSON.parse(fs.readFileSync(outputPath, 'utf-8'));\n const packages = config.packages;\n const odrPackages = config.odr_packages || {};\n for (const pkgName in packages) {\n if (pkgName.endsWith(ODR_CODE_DIR_SUFFIX)) {\n /**\n * 找到 assets 对应的包\n */\n const pkgConfig = packages[pkgName];\n const relatedPkgName = pkgName.split(ODR_CODE_DIR_SUFFIX)[0];\n if (!odrPackages[relatedPkgName]) {\n odrPackages[relatedPkgName] = {};\n }\n odrPackages[relatedPkgName] = {\n ...odrPackages[relatedPkgName],\n root: pkgConfig.root,\n code_output: pkgConfig.output,\n code_md5: pkgConfig.md5,\n main: pkgConfig.main,\n dependencies: pkgConfig.dependencies,\n type: pkgConfig.type,\n };\n delete packages[pkgName];\n }\n if (pkgName.endsWith(ODR_ASSET_DIR_SUFFIX)) {\n const relatedPkgName = pkgName.split(ODR_ASSET_DIR_SUFFIX)[0];\n const pkgConfig = packages[pkgName];\n odrPackages[relatedPkgName] = {\n ...odrPackages[relatedPkgName],\n root: pkgConfig.root,\n asset_output: pkgConfig.output,\n asset_md5: pkgConfig.md5,\n };\n delete packages[pkgName];\n }\n }\n config.odr_packages = odrPackages;\n fs.writeFileSync(outputPath, JSON.stringify(config, null, 2));\n logger.info('writeOdrPackagesConfig end');\n}\n","import path from 'path';\nimport fs from 'fs';\nimport {\n ensureDirSync,\n deleteNoJsFilesSync,\n logger,\n deleteJsFilesSync,\n} from '@utils';\n\nimport {\n GAME_PACK_CONFIG_FILE_NAME,\n ODR_ASSET_DIR_SUFFIX,\n ODR_CODE_DIR_SUFFIX,\n STTPKG_EXT,\n} from '@constants';\n\nexport async function makeOdrPkgs(outputDir: string) {\n let startTime = Date.now();\n logger.info(`makeOdrPkgs start, ${startTime}`);\n const outputPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);\n const config = JSON.parse(fs.readFileSync(outputPath, 'utf-8'));\n const packages = config.packages;\n for (const pkgName in packages) {\n /**\n * 将原本的分包配置,转换为 odr 的配置,\n * 将原本产物按照原路径,分别拆分成两个文件夹:js 部分 package_name_code,asset 部分 package_name_asset\n */\n const pkgOutput = path.join(outputDir, pkgName);\n const codeOutput = path.join(outputDir, `${pkgName}${ODR_CODE_DIR_SUFFIX}`);\n const assetOutput = path.join(\n outputDir,\n `${pkgName}${ODR_ASSET_DIR_SUFFIX}`,\n );\n if (packages[pkgName].type === 'game') {\n ensureDirSync(codeOutput);\n ensureDirSync(assetOutput);\n fs.cpSync(pkgOutput, codeOutput, { recursive: true });\n fs.cpSync(pkgOutput, assetOutput, { recursive: true });\n deleteNoJsFilesSync(codeOutput);\n deleteJsFilesSync(assetOutput);\n }\n\n /**\n * 写入配置\n */\n packages[`${pkgName}${ODR_CODE_DIR_SUFFIX}`] = {\n ...packages[pkgName],\n code_url: '',\n code_md5: '',\n output: `${pkgName}${ODR_CODE_DIR_SUFFIX}${STTPKG_EXT}`,\n };\n packages[`${pkgName}${ODR_ASSET_DIR_SUFFIX}`] = {\n ...packages[pkgName],\n asset_url: '',\n asset_md5: '',\n output: `${pkgName}${ODR_ASSET_DIR_SUFFIX}${STTPKG_EXT}`,\n };\n }\n fs.writeFileSync(outputPath, JSON.stringify(config, null, 2));\n logger.info(`makeOdrPkgs end, ${Date.now() - startTime}ms`);\n}\n","import { logger } from '@utils';\nimport { ODRPackages } from '@typings';\n\n// export function fetchGames(params: { size: number; offset: number }): Promise<{\n// data: Array<{\n// id: string;\n// packages: ODRPackages;\n// }>;\n// total: number;\n// }> {\n// const { size, offset } = params;\n// const url = `https://game-odr.bytedance.net/odr/api/v1/games?size=${size}&offset=${offset}`;\n// return fetch(url).then(res => res.json());\n// }\n\n// export async function fetchAllGames(): Promise<Array<{\n// id: string;\n// packages: ODRPackages;\n// }>> {\n// const size = 100;\n// let offset = 0;\n// let total = 0;\n// const games: Array<{\n// id: string;\n// packages: ODRPackages;\n// }> = [];\n// while (true) {\n// const res = await fetchGames({ size, offset });\n// games.push(...res.data);\n// total = res.total;\n// if (games.length >= total) {\n// break;\n// }\n// offset += size;\n// }\n// return games;\n// }\n\nimport fs from 'fs/promises';\nimport path from 'path';\nimport fetch from 'node-fetch';\n\nexport async function downloadAndSaveCodesAsync(\n games,\n tempDir,\n concurrency = 5, // 并发数\n) {\n // 1. 生成所有下载任务\n const tasks = [];\n\n for (const game of games) {\n const { id: gameId, packages } = game;\n const gameDir = path.join(tempDir, gameId);\n await fs.mkdir(gameDir, { recursive: true });\n\n for (const packageName in packages) {\n const packageInfo = packages[packageName];\n const { code_url } = packageInfo;\n const fileName = `${packageName}.txt`;\n const filePath = path.join(gameDir, fileName);\n\n tasks.push({\n code_url,\n filePath,\n packageName,\n });\n }\n }\n\n // 2. 用并发池执行所有任务\n await asyncPool(concurrency, tasks, async task => {\n const { code_url, filePath, packageName } = task;\n console.log(`start to download ${packageName}`);\n try {\n const res = await fetch(code_url);\n if (!res.ok)\n throw new Error(`Failed to fetch ${code_url}: ${res.statusText}`);\n const buffer = Buffer.from(await res.arrayBuffer());\n await fs.writeFile(filePath, buffer);\n console.log(`finish to download ${packageName}`);\n } catch (err) {\n console.error(`Error downloading ${packageName}:`, err);\n }\n });\n}\n\nasync function asyncPool(poolLimit, array, iteratorFn) {\n const ret = [];\n const executing = [];\n for (const item of array) {\n const p = Promise.resolve().then(() => iteratorFn(item));\n ret.push(p);\n if (poolLimit <= array.length) {\n const e = p.then(() => executing.splice(executing.indexOf(e), 1));\n executing.push(e);\n if (executing.length >= poolLimit) {\n await Promise.race(executing);\n }\n }\n }\n return Promise.all(ret);\n}\n","import data from './config.json';\n\nexport function getOdrConfigs() {\n const { MinisPackagingInfoMap } = data;\n return Object.keys(MinisPackagingInfoMap).map(clientKey => {\n return {\n id: clientKey,\n packages: JSON.parse(MinisPackagingInfoMap[clientKey].ODRPackages),\n };\n });\n}\n","/**\n * 合并请求拆包\n */\nimport fs from 'fs';\nimport path from 'path';\nimport { getDirSizeSync, logger } from '@utils';\nimport { downloadAndSaveCodesAsync } from './utils';\nimport { AVAILABLE_ODR_TAG_LIST, ONE_ODR_PKG_LIMIT } from '@constants';\nimport { getOdrConfigs } from './getConfigs';\n\nexport async function buildOdrPkgs({ tempDir }: { tempDir: string }) {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true });\n }\n fs.mkdirSync(tempDir);\n const games = getOdrConfigs();\n logger.info('odr_games');\n await downloadAndSaveCodesAsync(games, tempDir);\n const gamesContentSize = {};\n for (const game of games) {\n const { id: gameId } = game;\n const gameDir = path.join(tempDir, gameId);\n gamesContentSize[gameId] = getDirSizeSync({\n rootDir: tempDir,\n entryDir: gameDir,\n filterDirs: [],\n });\n }\n // ODR TAG 分配\n const odrTagGameMap = {};\n AVAILABLE_ODR_TAG_LIST.forEach(tag => {\n odrTagGameMap[tag] = [];\n });\n // 用于产出 TTMGODRConfig\n const TTMGODRConfig = {};\n for (const game of games) {\n const { id: gameId, packages } = game;\n const gameSize = gamesContentSize[gameId];\n if (gameSize > ONE_ODR_PKG_LIMIT) continue;\n let assignedTag = null;\n for (const odrTag of AVAILABLE_ODR_TAG_LIST) {\n const odrTagDir = path.join(tempDir, odrTag);\n if (!fs.existsSync(odrTagDir)) fs.mkdirSync(odrTagDir);\n const currentTagSize = odrTagGameMap[odrTag].reduce(\n (sum, gid) => sum + gamesContentSize[gid],\n 0,\n );\n if (currentTagSize + gameSize <= ONE_ODR_PKG_LIMIT) {\n // 复制资源\n const srcDir = path.join(tempDir, gameId);\n const destDir = path.join(odrTagDir, gameId);\n fs.cpSync(srcDir, destDir, { recursive: true });\n odrTagGameMap[odrTag].push(gameId);\n assignedTag = odrTag;\n break;\n }\n }\n if (!assignedTag) continue; // 没有分配成功就跳过\n // 构建 TTMGODRConfig\n\n TTMGODRConfig[gameId] = {\n tag: assignedTag,\n packages: {},\n };\n for (const packageName in packages) {\n const pkg = packages[packageName];\n logger.info(`TTMGODRConfig[gameId].packages, ${pkg}, ${packageName}`);\n TTMGODRConfig[gameId].packages[packageName] = {\n root: pkg.root,\n main: pkg.main,\n // code_md5: pkg.code_md5,\n asset_md5: pkg.asset_md5,\n asset_url: pkg.asset_url,\n };\n }\n console.log(`finish to build ${gameId}`);\n fs.rmSync(path.join(tempDir, gameId), { recursive: true });\n }\n // 写入 JSON 文件\n const configPath = path.join(tempDir, 'TTMG_ODR_CONFIG.json');\n fs.writeFileSync(configPath, JSON.stringify(TTMGODRConfig, null, 2), 'utf-8');\n logger.info(`TTMG_ODR_CONFIG.json 已生成: ${configPath}`);\n}\n","import path from 'path';\nimport fs from 'fs';\nimport {\n BuildConfig,\n CheckConfigResult,\n CheckSizeResult,\n CheckDimension,\n CheckPerfResult,\n} from '@typings';\nimport {\n GAME_ORIGIN_CONFIG_FILE_NAME,\n CHECK_DIMENSION,\n GAME_WASM_SPLIT_CONFIG_FILE_NAME,\n WASM_FUNC_COUNT_LIMIT,\n} from '@constants';\nimport { logger, getProjectSize, getCheckConfig, isUnityEngine } from '@utils';\nimport type { Translate } from '@utils';\n\nconst defaultCheckConfig: {\n name: string;\n dimension: CheckDimension;\n required: boolean;\n} = {\n name: 'project',\n dimension: CHECK_DIMENSION.Project,\n required: true,\n};\nexport function checkProject(config: BuildConfig, t: Translate) {\n logger.info(t('log.check.project.start'));\n const gameJsonCheckResult = checkGameJson(config, t);\n const checkSizeResult = checkProjectSize(config, t);\n const checkPerfResult = checkPerformance(config, t);\n /**\n * 过滤掉空的\n */\n const result = [gameJsonCheckResult, checkSizeResult, checkPerfResult].filter(\n Boolean,\n );\n if (result.every(item => item.passed)) {\n logger.info(t('log.check.project.success'));\n }\n return result;\n}\n\nexport function checkGameJson(\n config: BuildConfig,\n t: Translate,\n): CheckConfigResult {\n logger.info(t('log.check.config.start'));\n const gameJsonPath = path.join(config.entry, GAME_ORIGIN_CONFIG_FILE_NAME);\n if (!fs.existsSync(gameJsonPath)) {\n const errMsg = t('check.project.gameJson.missing');\n logger.error(errMsg);\n\n if (config?.dev?.enable) {\n return {\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n name: 'project',\n ...defaultCheckConfig,\n };\n } else {\n throw new Error(errMsg);\n }\n } else {\n const gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));\n if (gameJson.subPackages) {\n const errMsg = t('check.project.gameJson.subPackagesInvalid');\n logger.error(errMsg);\n if (config?.dev?.enable) {\n return {\n passed: false,\n msg: errMsg,\n type: 'config',\n name: 'project',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n };\n } else {\n throw new Error(errMsg);\n }\n }\n const msg = t('check.project.gameJson.success');\n logger.info(msg);\n return {\n passed: true,\n msg,\n type: 'config',\n level: 'info',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n };\n }\n}\n/**\n * 检查游戏大小是否超出限制\n * @param param0\n * @returns\n */\n\nexport function checkProjectSize(\n config: BuildConfig,\n t: Translate,\n): CheckSizeResult {\n logger.info(t('log.check.projectSize.start'));\n const { entry: entryDir, dev } = config;\n const { pkgSizeLimit } = getCheckConfig(config);\n const enableDev = dev?.enable;\n const gameSize = getProjectSize({ entryDir });\n const gameSizeMB = (gameSize / (1024 * 1024)).toFixed(2);\n const limitMB = (pkgSizeLimit / (1024 * 1024)).toFixed(2);\n if (gameSize > pkgSizeLimit) {\n const errMsg = t('check.project.size.failed', { sizeMB: gameSizeMB, limitMB });\n logger.error(errMsg);\n if (enableDev) {\n return {\n passed: false,\n name: 'project',\n msg: errMsg,\n type: 'size',\n level: 'warning',\n size: gameSize,\n ...defaultCheckConfig,\n };\n } else {\n throw new Error(errMsg);\n }\n } else {\n /**\n * 游戏大小检查通过\n */\n const logMsg = t('check.project.size.success', { sizeMB: gameSizeMB });\n logger.info(logMsg);\n return {\n passed: true,\n msg: logMsg,\n name: 'project',\n type: 'size',\n level: 'info',\n size: gameSize,\n ...defaultCheckConfig,\n };\n }\n}\n\nfunction checkPerformance(\n config: BuildConfig,\n t: Translate,\n): CheckPerfResult | null {\n const { entry } = config;\n if (!isUnityEngine(entry)) {\n return null;\n }\n\n const gameJsonPath = path.join(entry, GAME_ORIGIN_CONFIG_FILE_NAME);\n const gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));\n if (!('wasmFuncCount' in gameJson)) {\n return null;\n }\n if (gameJson?.wasmFuncCount < WASM_FUNC_COUNT_LIMIT) {\n return {\n ...defaultCheckConfig,\n passed: true,\n msg: t('check.project.perf.noSplitNeeded', {\n limit: WASM_FUNC_COUNT_LIMIT,\n }),\n type: 'performance',\n level: 'info',\n name: 'project',\n };\n }\n\n const splitConfigPath = path.join(entry, GAME_WASM_SPLIT_CONFIG_FILE_NAME);\n\n const errResult: CheckPerfResult = {\n ...defaultCheckConfig,\n passed: false,\n msg: t('check.project.perf.needSplit', {\n limit: WASM_FUNC_COUNT_LIMIT,\n }),\n type: 'performance',\n level: 'warning',\n name: 'project',\n };\n if (!fs.existsSync(splitConfigPath)) {\n return errResult;\n }\n\n const splitConfig = JSON.parse(fs.readFileSync(splitConfigPath, 'utf-8'));\n if (splitConfig?.enableWasmSplit !== true) {\n return errResult;\n } else {\n return {\n ...defaultCheckConfig,\n passed: true,\n msg: t('check.project.perf.splitEnabled', {\n limit: WASM_FUNC_COUNT_LIMIT,\n }),\n type: 'performance',\n level: 'info',\n name: 'project',\n };\n }\n}\n","import * as path from 'path';\nimport * as fs from 'fs';\nimport {\n BuildConfig,\n CheckConfigResult,\n CheckSizeResult,\n CheckDimension,\n} from '@typings';\nimport { CHECK_DIMENSION } from '@constants';\nimport { logger, getMainPkgSize, getCheckConfig } from '@utils';\nimport type { Translate } from '@utils';\nconst defaultCheckConfig: {\n name: string;\n dimension: CheckDimension;\n required: boolean;\n} = {\n name: 'main',\n dimension: CHECK_DIMENSION.MainPackage,\n required: true,\n};\n/**\n * 检查主包大小是否超出限制\n * @param param0\n * @returns\n */\nexport function checkMainPackageSize(\n config: BuildConfig,\n t: Translate,\n): CheckSizeResult {\n logger.info(t('log.check.mainPackageSize.start'));\n const { entry: entryDir, dev } = config;\n const { mainPkgSizeLimit } = getCheckConfig(config);\n const mainPkgSize = getMainPkgSize({ entryDir });\n const mainPkgSizeMB = (mainPkgSize / (1024 * 1024)).toFixed(2);\n const limitMB = (mainPkgSizeLimit / (1024 * 1024)).toFixed(2);\n if (mainPkgSize > mainPkgSizeLimit) {\n const errMsg = t('check.main.size.failed', {\n sizeMB: mainPkgSizeMB,\n limitMB,\n });\n logger.error(errMsg);\n if (dev?.enable) {\n return {\n passed: false,\n msg: errMsg,\n size: mainPkgSize,\n type: 'size',\n level: 'warning',\n ...defaultCheckConfig,\n };\n } else {\n throw new Error(errMsg);\n }\n } else {\n return {\n passed: true,\n msg: t('check.main.size.success', {\n sizeMB: mainPkgSizeMB,\n }),\n size: mainPkgSize,\n type: 'size',\n level: 'info',\n ...defaultCheckConfig,\n };\n }\n}\n\nexport function checkMainPackageEntry(\n config: BuildConfig,\n t: Translate,\n): CheckConfigResult {\n logger.info(t('log.check.mainPackageEntry.start'));\n const { entry: entryDir } = config;\n const gameJsPath = path.join(entryDir, 'game.js');\n if (!fs.existsSync(gameJsPath)) {\n const errMsg = t('check.main.entry.missing');\n logger.error(errMsg);\n if (config.dev?.enable) {\n return {\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: 'game.js',\n ...defaultCheckConfig,\n };\n }\n throw new Error(errMsg);\n }\n logger.info(t('log.check.mainPackageEntry.success'));\n return {\n passed: true,\n msg: t('check.main.entry.success'),\n type: 'config',\n level: 'info',\n file: 'game.js',\n ...defaultCheckConfig,\n };\n}\n\nexport function checkMainPackage(\n config: BuildConfig,\n t: Translate,\n): (CheckConfigResult | CheckSizeResult)[] {\n const checkResults = [];\n\n logger.info(t('log.check.mainPackage.start'));\n\n /**\n * 检查 game.js 是否存在\n */\n\n checkResults.push(\n checkMainPackageEntry(config, t),\n );\n\n if (getCheckConfig(config)?.mainPkgSizeLimit) {\n checkResults.push(\n checkMainPackageSize(config, t),\n );\n }\n if (checkResults.every(item => item.passed)) {\n logger.info(t('log.check.mainPackage.success'));\n }\n return checkResults;\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { logger, getSubpackagesConfig } from '@utils';\nimport type { Translate } from '@utils';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME } from '@constants';\nimport {\n CheckConfigResult,\n CheckSizeResult,\n BuildConfig,\n CheckDimension,\n} from '@typings';\nfunction isValidPath(path) {\n // 仅允许 A-Za-z0-9 _ - . / \\\n // 说明:\n // - 这是“字符白名单”校验,不涉及路径语义(如 ..、绝对路径、重复分隔符等)\n return /^[A-Za-z0-9._\\-\\\\/]+$/.test(path);\n}\n\nconst defaultCheckConfig: {\n name: string;\n dimension: CheckDimension;\n required: boolean;\n} = {\n name: 'subpackage',\n dimension: 'subpackage',\n required: true,\n};\n\nexport function checkSubpackages(\n config: BuildConfig,\n t: Translate,\n): (CheckConfigResult | CheckSizeResult)[] {\n const { entry: entryDir } = config;\n const checkResults: (CheckConfigResult | CheckSizeResult)[] = [];\n /**\n * 校验 subpackage 大小\n * 开始校验 subpackages 配置是否有效\n */\n logger.info(t('log.check.subpackages.start'));\n \n\n \n const subpackages = getSubpackagesConfig(entryDir);\n subpackages.forEach(sub => {\n /**\n * 校验 subpackage 配置是否为空\n */\n if (!sub.name || !sub.root) {\n const errMsg = t('check.subpackages.config.empty');\n logger.error(errMsg);\n if (config?.dev?.enable) {\n checkResults.push({\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n } else {\n throw new Error(errMsg);\n }\n } else if (!isValidPath(sub.root) || !isValidPath(sub.name)) {\n const invalidFields = [\n !isValidPath(sub.root) ? 'root' : '',\n !isValidPath(sub.name) ? 'name' : '',\n ]\n .filter(Boolean)\n .join('/');\n const errMsg = t('check.subpackages.config.invalidPath', {\n name: sub.name,\n invalidFields,\n });\n logger.error(errMsg);\n if (config?.dev?.enable) {\n checkResults.push({\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n } else {\n throw new Error(errMsg);\n }\n } else {\n checkResults.push({\n passed: true,\n msg: t('check.subpackages.config.success', {\n name: sub.name,\n }),\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n }\n /**\n * 校验 subpackage 配置是否有效\n */\n const subpackageEntryDir = path.join(entryDir, sub.root);\n // 检查是文件或者文件夹是否存在\n if (!fs.existsSync(subpackageEntryDir)) {\n const errMsg = t('check.subpackages.config.missingDir', {\n name: sub.name,\n });\n logger.error(errMsg);\n if (config?.dev?.enable) {\n checkResults.push({\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n } else {\n throw new Error(errMsg);\n }\n } else {\n checkResults.push({\n passed: true,\n msg: t('check.subpackages.config.success', {\n name: sub.name,\n }),\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n }\n });\n if (checkResults.length && checkResults.every(item => item.passed)) {\n logger.info(t('log.check.subpackages.success'));\n }\n return checkResults;\n}\n","import path from 'path';\nimport fs from 'fs';\nimport {\n logger,\n getIndependentPackagesConfig,\n getDirSizeSync,\n getCheckConfig,\n} from '@utils';\nimport type { Translate } from '@utils';\nimport {\n BuildConfig,\n CheckConfigResult,\n CheckDimension,\n CheckSizeResult,\n} from '@typings';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME, CHECK_DIMENSION } from '@constants';\n\nconst defaultCheckConfig: {\n dimension: CheckDimension;\n required: boolean;\n} = {\n dimension: CHECK_DIMENSION.IndependentPackage,\n required: true,\n};\nexport function checkIndependentPackages(\n config: BuildConfig,\n t: Translate,\n) {\n const { entry: entryDir } = config;\n const isEnableDev = config?.dev?.enable;\n const checkResults: (CheckConfigResult | CheckSizeResult)[] = [];\n /**\n * 开始校验 subpackages 配置是否有效\n */\n logger.info(t('log.check.independent.start'));\n const independentSubpackages = getIndependentPackagesConfig(entryDir);\n independentSubpackages.forEach(sub => {\n /**\n * 校验 independent subpackage 配置是否为空\n */\n if (!sub.name || !sub.root) {\n const errMsg = t('check.independent.config.empty');\n logger.error(errMsg);\n if (isEnableDev) {\n checkResults.push({\n ...defaultCheckConfig,\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n name: sub.name,\n });\n } else {\n throw new Error(errMsg);\n }\n } else {\n checkResults.push({\n ...defaultCheckConfig,\n passed: true,\n msg: t('check.independent.config.success', {\n name: sub.name,\n }),\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n name: sub.name,\n });\n }\n /**\n * 校验 independent subpackage 配置是否有效\n */\n const subpackageEntryDir = path.join(entryDir, sub.root);\n\n // 检查是文件或者文件夹是否存在\n if (!fs.existsSync(subpackageEntryDir)) {\n const errMsg = t('check.independent.config.missingDir', {\n name: sub.name,\n });\n logger.error(errMsg);\n if (isEnableDev) {\n checkResults.push({\n ...defaultCheckConfig,\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n name: sub.name,\n });\n } else {\n throw new Error(errMsg);\n }\n } else {\n checkResults.push({\n passed: true,\n msg: t('check.independent.config.success', {\n name: sub.name,\n }),\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n dimension: CHECK_DIMENSION.IndependentPackage,\n required: true,\n name: sub.name,\n });\n }\n /**\n * 校验 independent subpackage 包大小,不做校验\n */\n const { independentSubPkgSizeLimit } = getCheckConfig(config);\n if (independentSubPkgSizeLimit) {\n const checkSizeResult = checkPkgSize({\n entryDir: subpackageEntryDir,\n pkgName: sub.name,\n limit: independentSubPkgSizeLimit,\n dimension: CHECK_DIMENSION.IndependentPackage,\n level: isEnableDev ? 'warning' : 'error',\n t,\n });\n checkResults.push(checkSizeResult);\n logger.info(checkSizeResult.msg);\n if (!checkSizeResult.passed) {\n if (isEnableDev) {\n } else {\n throw new Error(checkSizeResult.msg);\n }\n }\n }\n });\n if (checkResults.length && checkResults.every(item => item.passed)) {\n logger.info(t('log.check.independent.success'));\n }\n return checkResults;\n}\n\nexport function checkPkgSize({\n entryDir,\n limit,\n pkgName,\n dimension,\n level,\n t,\n}: {\n entryDir: string;\n limit: number;\n pkgName: string;\n dimension: CheckSizeResult['dimension'];\n level: CheckSizeResult['level'];\n t: Translate;\n}): CheckSizeResult {\n const size = getDirSizeSync({\n rootDir: entryDir,\n entryDir,\n });\n const passed = size <= limit;\n const sizeMB = size / 1024 / 1024;\n const limitMB = limit / 1024 / 1024;\n return {\n passed,\n msg: passed\n ? t('check.pkgSize.success', {\n pkgName,\n sizeMB: sizeMB.toFixed(2),\n })\n : t('check.pkgSize.exceeds', {\n pkgName,\n sizeMB: sizeMB.toFixed(2),\n limitMB: limitMB.toFixed(2),\n }),\n type: 'size',\n level,\n size,\n dimension,\n required: true,\n name: pkgName,\n };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { CheckAPIResult, BuildConfig } from '@typings';\nimport type { Translate } from '@utils';\n\n/**\n * 检查游戏产物中是否调用了指定的 API\n */\n\nconst API_LIST: {\n name: string;\n desc: string;\n}[] = [\n {\n name: 'login',\n desc: 'Login to get open id',\n },\n {\n name: 'createRewardedVideoAd',\n desc: 'Integrate rewarded video ads',\n },\n\n {\n name: 'addShortcut',\n desc: 'Add game shortcut to home screen',\n },\n {\n name: \"getShortcutMissionReward\",\n desc: \"Get shortcut mission reward\"\n },\n {\n name: 'startEntranceMission',\n desc: 'Jump to TikTok personal sidebar',\n },\n {\n name: \"getEntranceMissionReward\",\n desc: \"Get entrance mission reward\"\n }\n ];\n\ntype CheckResult = Array<CheckAPIResult>;\n\nexport function checkAPI(config: BuildConfig, t: Translate): CheckResult {\n if (!config?.build?.enableAPICheck) {\n return [];\n }\n const exts = ['.js', '.ts'];\n // 预编译正则,尽量减少误报:匹配独立的标识符或对象调用形式\n // 例如:\\b(login)\\b 或 \\.login\\s*\\( 或 =\\s*login\\b\n const apiRegexMap = new Map<string, RegExp>(\n API_LIST.map(({ name }) => {\n // 组合模式:独立词边界 或 点调用 或 解构/赋值场景\n const pattern = [\n `\\\\b${escapeRegex(name)}\\\\b`, // 独立标识符\n `\\\\.${escapeRegex(name)}\\\\s*\\\\(`, // 对象.方法(\n `\\\\b${escapeRegex(name)}\\\\s*:\\\\s*`, // 对象字面量属性\n `\\\\b${escapeRegex(name)}\\\\s*=`, // 赋值给该名\n `\\\\b${escapeRegex(name)}\\\\s*\\\\(`, // 直接函数调用\n ].join('|');\n return [name, new RegExp(pattern, 'm')];\n }),\n );\n\n // 结果初始化\n const hitFilesMap = new Map<string, Set<string>>();\n for (const { name } of API_LIST) {\n hitFilesMap.set(name, new Set());\n }\n\n // 深度优先遍历\n const stack: string[] = [config.entry];\n while (stack.length) {\n const current = stack.pop()!;\n const stat = fs.statSync(current);\n\n if (stat.isDirectory()) {\n // 可根据需要排除目录\n const base = path.basename(current);\n if (\n ['node_modules', '.git', 'dist', 'build', 'out', '.cache'].includes(\n base,\n )\n ) {\n continue;\n }\n const children = fs.readdirSync(current);\n for (const child of children) {\n stack.push(path.join(current, child));\n }\n continue;\n }\n\n // 文件:后缀过滤\n const ext = path.extname(current).toLowerCase();\n if (!exts.includes(ext)) {\n continue;\n }\n\n // 读取文本\n let content = '';\n try {\n content = fs.readFileSync(current, 'utf8');\n } catch {\n // 读取失败则跳过\n continue;\n }\n\n // 粗略跳过很大的文件,避免性能问题(可调)\n if (content.length > 5_000_000) continue;\n\n // 检测每个 API\n for (const { name } of API_LIST) {\n const reg = apiRegexMap.get(name)!;\n if (reg.test(content)) {\n hitFilesMap.get(name)!.add(current);\n }\n }\n }\n\n const results: CheckResult = API_LIST.map(({ name }) => {\n const files = Array.from(hitFilesMap.get(name) || []);\n const passed = files.length > 0;\n return {\n name,\n msg: passed\n ? t('check.api.integrated', { name })\n : `${t('check.api.notIntegrated', { name })} ${t('check.api.suggestedActionSuffix')}`,\n passed,\n files,\n type: 'api',\n level: 'warning',\n required: false,\n dimension: 'project',\n };\n });\n return results;\n}\n\n/**\n * 转义正则特殊字符\n */\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import {\n logger,\n createPackTranslator,\n setPackRuntimeLanguage,\n getPackTranslator,\n} from '@utils';\nimport { BuildConfig, CheckResult, PackContext } from '@typings';\nimport { checkProject } from './checkProject';\nimport { checkMainPackage } from './checkMainpackage';\nimport { checkSubpackages } from './checkSubpackages';\nimport { checkIndependentPackages } from './checkIndependentPackages';\nimport { checkAPI } from './checkAPI';\n\nexport async function checkPkgs(\n config: BuildConfig,\n context: PackContext = {},\n): Promise<CheckResult[]> {\n setPackRuntimeLanguage(context?.lang);\n const t = createPackTranslator(context?.lang);\n logger.info(getPackTranslator()('log.check.start'));\n /**\n * 1. 校验项目\n */\n\n const projectCheckResult = checkProject(config, t);\n /**\n * 2. 如果有,校验分包\n */\n const subpackagesCheckResult = checkSubpackages(config, t);\n\n /**\n * 3. 校验主包\n */\n const mainPackageCheckResult = checkMainPackage(config, t);\n\n /**\n * 校验独立分包\n */\n const independentPackagesCheckResult = checkIndependentPackages(config, t);\n\n /**\n * 校验 API 调用\n */\n const apiCheckResult = checkAPI(config, t);\n\n return [\n ...projectCheckResult,\n ...mainPackageCheckResult,\n ...subpackagesCheckResult,\n ...independentPackagesCheckResult,\n ...apiCheckResult,\n ];\n}\n","import fs from 'fs';\nimport path from 'path';\nimport {\n GAME_PACK_CONFIG_FILE_NAME,\n GAME_ORIGIN_CONFIG_FILE_NAME,\n GAME_MAIN_PACKAGE_NAME,\n STTPKG_EXT,\n PACKAGE_TYPE,\n} from '@constants';\n\nimport { logger, getPackTranslator } from '@utils';\n\nimport { BuildConfig } from '@typings';\n\nexport async function setup(config: BuildConfig): Promise<{\n packages: Record<string, {\n url: string;\n md5: string;\n root: string;\n main: string;\n output: string;\n type: string;\n dependencies: string[];\n }>;\n fyf_packages: Array<{\n value: string;\n label: string;\n type: any;\n }>;\n}> {\n const t = getPackTranslator();\n const { entry: entryDir, output: outputDir } = config;\n logger.info(t('log.setup.startGeneratePackageConfig'));\n const gameJsonPath = path.join(entryDir, GAME_ORIGIN_CONFIG_FILE_NAME);\n const gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));\n\n const packages = {};\n // fyf for your feed 缩写,代表可用于视频锚点投放使用的包\n const fyfPackages = [\n {\n value: GAME_MAIN_PACKAGE_NAME,\n label: 'Main (Main package)',\n type: PACKAGE_TYPE.MainPackage,\n },\n ];\n\n // 主包\n packages[GAME_MAIN_PACKAGE_NAME] = {\n url: '',\n md5: '',\n root: '',\n main: 'game.js',\n output: `${GAME_MAIN_PACKAGE_NAME}${STTPKG_EXT}`,\n type: 'game',\n dependencies: []\n };\n\n transformSubPackages(gameJson.subpackages).forEach(\n ({ name, root, main, independent }) => {\n // root 是目录\n packages[name] = {\n url: '',\n md5: '',\n root,\n main,\n output: `${name}${STTPKG_EXT}`,\n independent,\n type: 'game',\n dependencies: []\n };\n if (independent) {\n fyfPackages.push({\n value: name,\n label: `${name} (Independent package)`,\n type: PACKAGE_TYPE.IndependentPackage,\n });\n }\n },\n );\n\n const result = {\n packages,\n fyf_packages: fyfPackages,\n };\n if (fs.existsSync(outputDir)) {\n fs.rmSync(outputDir, { recursive: true });\n }\n fs.mkdirSync(outputDir);\n fs.writeFileSync(\n path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME),\n JSON.stringify(result, null, 2),\n );\n logger.info(t('log.setup.generatePackageConfigSuccess'));\n return result;\n}\n\nfunction transformSubPackages(\n configs: Array<{\n name: string;\n root: string;\n independent?: boolean;\n }>,\n) {\n if (!configs || configs.length === 0) {\n return [];\n }\n function normalizeName(name) {\n return String(name).replace(/^\\/+|\\/+$/g, '');\n }\n\n function getMainFromRoot(root: string) {\n if (isDirectory(root)) {\n // 将 Windows 下的 \\\\ 替换为 /\n return path.join(root, 'game.js').replace(/\\\\/g, '/');\n }\n return root;\n }\n\n function isDirectory(str) {\n // 以 / 结尾,或没有 .js 结尾且没有 . 号\n return str.endsWith('/') || !/\\.[a-zA-Z0-9]+$/.test(str);\n }\n\n function normalizeRoot(root: string): string {\n // 去掉头部和尾部的所有斜杠\n return root.replace(/^\\/+|\\/+$/g, '');\n }\n\n return configs.map(config => {\n const name = normalizeName(config.name);\n let main = getMainFromRoot(config.root);\n // test\n let root = normalizeRoot(config.root);\n return { main, root, name, independent: config.independent || false };\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { logger, getOpenDataContextEntry, getPackTranslator } from '@utils';\nimport { BuildConfig } from '@typings';\n\nexport function flattenMaps(allMaps) {\n const list = [];\n Object.values(allMaps).forEach(map => {\n Object.values(map).forEach(arr => {\n list.push(...arr);\n });\n });\n return list;\n}\n// 递归收集 JS 文件,但可排除指定目录\nfunction collectPkgJsFiles({\n entry,\n root,\n exts = ['.js', '.ts', '.jsx', '.tsx'],\n excludeDirs = [],\n}: {\n entry: string;\n root: string;\n exts: string[];\n excludeDirs: string[];\n}) {\n let files = [];\n if (!fs.existsSync(entry)) return files;\n const entries = fs.readdirSync(entry, { withFileTypes: true });\n for (const item of entries) {\n const fullPath = path.join(entry, item.name);\n if (item.isDirectory()) {\n /**\n * 计算 item 与 root 的相对路径\n */\n /**\n * 讲 \\ 替换为 /\n */\n const relativePath = path.relative(root, fullPath).replace(/\\\\/g, '/');\n if (excludeDirs.find(dir => dir === relativePath)) {\n continue; // 跳过排除目录\n }\n files = files.concat(\n collectPkgJsFiles({\n entry: fullPath,\n root: root,\n exts: exts,\n excludeDirs,\n }),\n ); // 只排除一级\n } else if (exts.some(ext => item.name.endsWith(ext))) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\n// 构建每个包的 map\nexport function collectMaps(\n config: BuildConfig,\n packages: Record<string, { root: string }>,\n) {\n const t = getPackTranslator();\n const { entry: entryDir } = config;\n logger.info(t('log.collectMaps.start'));\n const result = {};\n // 1. 先收集所有分包根目录名(如 subpackages/level1、subpackages/level2)\n const subRoots = Object.values(packages)\n .filter(pkg => pkg.root && pkg.root !== '')\n .map(pkg => pkg.root) // 只提取一级目录名\n .filter(Boolean);\n\n for (const pkgName in packages) {\n const pkg = packages[pkgName];\n let srcRoot;\n let jsFiles;\n if (pkgName === '__GAME__') {\n const uniqueSubRoots = Array.from(new Set(subRoots));\n const { entry: openDataContextEntry } = getOpenDataContextEntry({\n entryDir,\n });\n if (openDataContextEntry) {\n uniqueSubRoots.push(openDataContextEntry);\n logger.info(t('log.collectMaps.openDataContextDir', {\n dir: openDataContextEntry,\n }));\n }\n // 主包:只收集 entryDir 下非分包目录, 并排除 开放数据域的文件夹目录(如果有)\n jsFiles = collectPkgJsFiles({\n entry: entryDir,\n root: entryDir,\n exts: ['.js', '.ts', '.jsx', '.tsx'],\n excludeDirs: uniqueSubRoots,\n });\n srcRoot = entryDir;\n } else {\n // 分包:只收集自己目录\n srcRoot = path.join(entryDir, pkg.root);\n jsFiles = collectPkgJsFiles({\n entry: srcRoot,\n root: srcRoot,\n exts: ['.js', '.ts', '.jsx', '.tsx'],\n excludeDirs: [],\n });\n }\n // 以包的 srcRoot 为基准生成相对路径\n const list = [];\n jsFiles.forEach(absPath => {\n list.push(path.relative(entryDir, absPath).replace(/\\\\/g, '/'));\n });\n const packNameRoot = packages[pkgName].root;\n result[pkgName] = {\n [packNameRoot ? `${packNameRoot}/game.pack.js` : 'game.pack.js']: list,\n };\n }\n logger.info(t('log.collectMaps.done'));\n return result;\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { STTPKG_EXT, GAME_PACK_CONFIG_FILE_NAME, GAME_ORIGIN_CONFIG_FILE_NAME, GAME_MAIN_PACKAGE_NAME } from '@constants';\nimport fetch from 'node-fetch';\nimport { BuildConfig } from '@typings';\n\ntype PluginMeta = {\n PackageCDNURL: string;\n PackageMD5: string;\n PluginName?: string;\n PluginVersion?: string;\n};\n\n/**\n * 根据 TikTok DevPortal 接口获取插件包信息(url + md5)\n *\n * 对应 curl:\n * POST https://developers.tiktok.com/tiktok/v4/devportal/minigame/plugin_meta/get\n * body: { plugin_name, plugin_version }\n */\nexport async function getPluginInfo(params: {\n plugin_name: string;\n plugin_version: string;\n baseUrl?: string; // 默认 https://developers.tiktok.com\n headers?: Record<string, string>; // 例如:{ 'x-use-ppe': '1', 'x-tt-env': 'ppe_unity_plugin_meta' }\n}): Promise<{ url: string; md5: string }> {\n const baseUrl = params.baseUrl ?? 'https://developers.tiktok.com';\n const url = `${baseUrl}/tiktok/v4/devportal/minigame/plugin_meta/get`;\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(params.headers ?? {}),\n },\n body: JSON.stringify({\n plugin_name: params.plugin_name,\n plugin_version: params.plugin_version,\n }),\n });\n const json: any = await res.json();\n const meta: PluginMeta | undefined =\n json?.PluginMeta ?? json?.data?.PluginMeta ?? json?.result?.PluginMeta ?? json?.data?.result?.PluginMeta;\n if (!meta?.PackageCDNURL || !meta?.PackageMD5) {\n throw new Error(`[ttmg-pack]: The current game plugin version does not exist. plugin_name: ${params.plugin_name}, plugin_version: ${params.plugin_version}, error: ${JSON.stringify(json)}`);\n }\n\n return { url: meta.PackageCDNURL, md5: meta.PackageMD5 };\n}\n\n\nexport async function addDepsToPackages(gameEntry: string, outputDir: string, allDeps: Record<string, string[]>, config?: BuildConfig) {\n const gamePackConfigPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);\n const gameJsonPath = path.join(gameEntry, GAME_ORIGIN_CONFIG_FILE_NAME);\n let gamePackConfig: any;\n let gameJson: any;\n let pluginConfig: any;\n try {\n gamePackConfig = JSON.parse(fs.readFileSync(gamePackConfigPath, 'utf-8'));\n gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));\n pluginConfig = gameJson.plugins;\n } catch (error) {\n throw new Error('[ttmg-pack] Failed to read package file game.json or packageConfig.json');\n }\n\n if (!config?.dev?.enable) {\n const unityDeps = ['data-package', 'StreamingAssets', 'wasmcode', 'wasmcode-android', 'wasmcode-ios'];\n for (const dep of unityDeps) {\n // 如果 game.json 的 subpackages 里有这个包,则添加进 __GAME__ 的 dependencies\n if ((gameJson.subpackages ?? []).some(pkg => pkg.name === dep)) {\n gamePackConfig.packages[GAME_MAIN_PACKAGE_NAME].dependencies.push(dep);\n }\n }\n }\n\n for (const [pkgName, plugins] of Object.entries(allDeps)) {\n for (const pluginName of plugins) {\n if (!pluginConfig?.[pluginName]) continue;\n\n const version = pluginConfig[pluginName].version;\n const pluginPkgName = `${pluginName}_${version}`;\n\n let url: string = '';\n let md5: string = '';\n\n if (config?.dev?.enable) {\n try {\n const res = await getPluginInfo({\n plugin_name: pluginName.toLowerCase(),\n plugin_version: version\n });\n url = res.url;\n md5 = res.md5;\n } catch (error) {\n throw new Error(`[ttmg-pack] Failed to get plugin info: ${error.message} plugin_name: ${pluginName}, plugin_version: ${version}`);\n }\n }\n\n gamePackConfig.packages[pkgName].dependencies.push(pluginPkgName);\n if (!gamePackConfig.packages[pluginPkgName]) {\n gamePackConfig.packages[pluginPkgName] = {\n url,\n md5,\n root: pluginPkgName,\n main: `${pluginPkgName}/index.js`,\n output: `${pluginPkgName}${STTPKG_EXT}`,\n independent: false,\n type: 'plugin',\n dependencies: [],\n };\n } else {\n // 如果已存在,也覆盖 url/md5,保证最新\n gamePackConfig.packages[pluginPkgName].url = url;\n gamePackConfig.packages[pluginPkgName].md5 = md5;\n }\n }\n }\n\n try {\n fs.writeFileSync(gamePackConfigPath, JSON.stringify(gamePackConfig, null, 2));\n } catch (error) {\n throw new Error(`[ttmg-pack] Failed to write package file packageConfig.json: ${error.message} path: ${gamePackConfigPath}`);\n }\n}","import fs from 'fs';\nimport path from 'path';\nimport acorn from 'acorn';\nimport glob from 'glob';\nimport { addDepsToPackages } from './addDepsToPackages';\nimport { BuildConfig } from '@typings';\n\nexport async function collectDeps(config: BuildConfig, packages) {\n const { entry: gameEntry, output: gameOutput } = config;\n // 自动扫描 game 目录下的一级文件夹作为根前缀\n const rootPrefixes = getRootPrefixes(gameEntry);\n\n // 查找所有 JS 文件\n const files = glob.sync('**/*.js', {\n cwd: gameEntry,\n ignore: [],\n });\n\n const requireCalls = [];\n files.forEach(file => {\n const fullPath = path.join(gameEntry, file);\n const code = fs.readFileSync(fullPath, 'utf-8');\n let ast;\n try {\n ast = acorn.parse(code, { ecmaVersion: 'latest', sourceType: 'module' });\n } catch (e) {\n // 跳过无法解析的文件\n return;\n }\n\n walkAst(ast, node => {\n // require('xxx') 或 requireAsync('xxx')\n if (\n node.type === 'CallExpression' &&\n node.callee.type === 'Identifier' &&\n (node.callee.name === 'require' ||\n node.callee.name === 'requireAsync') &&\n node.arguments.length > 0 &&\n node.arguments[0].type === 'Literal' &&\n typeof node.arguments[0].value === 'string'\n ) {\n const requirePath = node.arguments[0].value;\n let resolvedPath = null;\n\n if (requirePath.startsWith('.')) {\n resolvedPath = path.resolve(path.dirname(fullPath), requirePath);\n } else if (requirePath.startsWith('/')) {\n resolvedPath = path.resolve(gameEntry, '.' + requirePath);\n } else {\n for (const prefix of rootPrefixes) {\n if (requirePath.startsWith(prefix)) {\n resolvedPath = path.resolve(gameEntry, requirePath);\n break;\n }\n }\n }\n\n // 校验文件是否存在(支持 .js/.ts/.jsx/.tsx 后缀自动补全)\n if (resolvedPath && !fileExistsWithExtensions(resolvedPath)) {\n resolvedPath = null;\n }\n\n requireCalls.push({\n file: path.relative(gameEntry, fullPath),\n type: 'game',\n callee: node.callee.name,\n requirePath,\n resolvedPath: resolvedPath\n ? path.relative(gameEntry, resolvedPath)\n : '',\n });\n } else if (node.type === 'CallExpression' &&\n node.callee.type === 'Identifier' &&\n node.callee.name === 'requirePlugin' &&\n node.arguments.length > 0 &&\n node.arguments[0].type === 'Literal') {\n const requirePath = node.arguments[0].value;\n\n requireCalls.push({\n file: path.relative(gameEntry, fullPath),\n type: 'plugin',\n callee: node.callee.name,\n requirePath,\n resolvedPath: requirePath,\n });\n }\n });\n });\n\n const newRequireCalls = requireCalls.map(i => {\n /**\n * 基于 packages 来判断\n */\n let depModule = '';\n if (i.type === 'plugin') {\n depModule = i.requirePath.split('/')[0];\n } else if (i.type === 'game') {\n Object.keys(packages).forEach(pkg => {\n if (i.resolvedPath && i.resolvedPath.startsWith(packages[pkg].root)) {\n depModule = pkg;\n }\n });\n }\n\n let curModule = '';\n Object.keys(packages).forEach(pkg => {\n if (i.file.startsWith(packages[pkg].root)) {\n curModule = pkg;\n }\n });\n return {\n ...i,\n curModule,\n depModule,\n };\n });\n // 只统计 JS/TS/JSX/TSX 文件依赖\n const exts = ['.js', '.ts', '.jsx', '.tsx'];\n const isJsLike = f => exts.some(ext => f.endsWith(ext));\n\n const result: {\n packageDeps: Record<string, Record<string, string>>,\n pluginDeps: Record<string, string[]>,\n } = newRequireCalls.reduce((acc, cur) => {\n if (!acc.packageDeps[cur.curModule]) {\n acc.packageDeps[cur.curModule] = {};\n }\n if (!acc.pluginDeps[cur.curModule]) {\n acc.pluginDeps[cur.curModule] = [];\n }\n if (cur.curModule === cur.depModule) {\n return acc;\n }\n if (cur.resolvedPath && isJsLike(cur.resolvedPath) && cur.type === 'game') {\n acc.packageDeps[cur.curModule][cur.resolvedPath] = cur.depModule;\n } else if (cur.type === 'plugin') {\n acc.pluginDeps[cur.curModule].push(cur.depModule);\n }\n return acc;\n }, {\n packageDeps: {},\n pluginDeps: {},\n });\n\n await addDepsToPackages(gameEntry, gameOutput, result.pluginDeps, config);\n\n return result;\n}\n\nfunction getRootPrefixes(gameEntry) {\n return fs\n .readdirSync(gameEntry)\n .filter(name => {\n const fullPath = path.join(gameEntry, name);\n return (\n fs.statSync(fullPath).isDirectory() &&\n !['node_modules', 'dist', 'build', 'output'].includes(name)\n );\n })\n .map(name => name + '/');\n}\n\nfunction walkAst(node, cb) {\n cb(node);\n for (let key in node) {\n if (node.hasOwnProperty(key)) {\n const child = node[key];\n if (Array.isArray(child)) {\n child.forEach(c => c && typeof c.type === 'string' && walkAst(c, cb));\n } else if (child && typeof child.type === 'string') {\n walkAst(child, cb);\n }\n }\n }\n}\n\n// 支持 .js/.ts/.jsx/.tsx 自动补全\nfunction fileExistsWithExtensions(filePath) {\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) return true;\n const exts = ['.js', '.ts', '.jsx', '.tsx'];\n for (const ext of exts) {\n if (fs.existsSync(filePath + ext) && fs.statSync(filePath + ext).isFile())\n return true;\n }\n return false;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport MagicString, { Bundle } from 'magic-string';\nimport {\n GAME_MODULE_CONFIG_FILE_NAME,\n GAME_MAIN_PACKAGE_NAME,\n} from '@constants';\nimport { BuildConfig } from '@typings';\nimport {\n logger,\n ensureDirSync,\n safeBuild,\n buildOpenDataContext,\n getPackTranslator,\n} from '@utils';\n\nexport async function pack({\n gameEntry,\n pkgName,\n allDeps,\n allMaps,\n pkgConfig,\n destRoot,\n config,\n}: {\n gameEntry: string;\n pkgName: string;\n allDeps: any;\n allMaps: Record<string, Record<string, string[]>>;\n pkgConfig: {\n main: string;\n root: string;\n };\n destRoot: string;\n config: BuildConfig;\n}) {\n const t = getPackTranslator();\n let startTime = Date.now();\n logger.info(t('log.pack.start', { startTime }));\n const packMap = allMaps[pkgName];\n const moduleConfig = {\n main: pkgConfig.main,\n deps: allDeps.packageDeps[pkgName] || {},\n map: allMaps[pkgName],\n };\n\n ensureDirSync(destRoot);\n /**\n * 把 openDataContext 代码放到 destRoot 下\n */\n if (pkgName === GAME_MAIN_PACKAGE_NAME) {\n await buildOpenDataContext({\n entryDir: gameEntry,\n outputDir: destRoot,\n });\n }\n\n fs.writeFileSync(\n path.join(destRoot, GAME_MODULE_CONFIG_FILE_NAME),\n JSON.stringify(moduleConfig),\n );\n for (const packFileName in packMap) {\n const relPaths = packMap[packFileName];\n if (!Array.isArray(relPaths) || relPaths.length === 0) continue;\n\n const concat = new Bundle({ separator: '\\n' });\n for (const relPath of relPaths) {\n const absPath = path.join(gameEntry, relPath);\n if (!fs.existsSync(absPath)) continue;\n if (path.basename(absPath) === packFileName) continue;\n\n if (/\\.js$/i.test(relPath)) {\n const result = await safeBuild({\n // 1. 指定入口文件,esbuild 会自己去读取\n entryPoints: [absPath],\n // 2. 传递你原来的编译选项\n format: 'cjs',\n target: 'es2020',\n minify: false,\n charset: 'utf8',\n keepNames: true,\n logLevel: 'silent',\n write: false,\n bundle: false,\n });\n // 5. 从内存中的结果获取编译后的代码\n // result.outputFiles 是一个数组,bundle:false 时通常只有一个元素\n const code = result.outputFiles[0].text;\n // loader: 'js',\n // format: 'cjs',\n // target: 'es2015',\n // minify: false, // 关闭压缩,避免字面量与属性被改写\n // charset: 'utf8', // 避免 ascii-only 导致 unicode 再编码\n // keepNames: true,\n // });\n // const code = fs.readFileSync(absPath, 'utf-8');\n const fileId = relPath.replace(/\\\\/g, '/');\n const defineHeader = `define(\"game:${fileId}\", [\"require\", \"requireAsync\", \"module\", \"exports\", \"sandboxGlobal\"], function(require, requireAsync, module, exports, sandboxGlobal){\\nwith(sandboxGlobal){\\n`;\n const defineFooter = `\\n}\\n});\\n`;\n const fileMagic = new MagicString(code, { filename: fileId });\n fileMagic.prepend(defineHeader);\n fileMagic.append(defineFooter);\n concat.addSource({ content: fileMagic, filename: fileId });\n }\n }\n const outFile = path.join(destRoot, path.basename(packFileName));\n const bundledCode = concat.toString();\n // await assertSyntax(bundledCode, packFileName);\n\n if (config?.dev?.enableSourcemap) {\n const map = concat.generateMap({\n hires: true,\n includeContent: true,\n file: path.basename(packFileName), // 推荐用最终输出文件名\n });\n /**\n * 如果是走内敛\n */\n if (config?.dev?.inlineSourcemap) {\n // 生成 base 64\n const base64 = Buffer.from(map.toString()).toString('base64');\n const sourcemapContent = `data:application/json;base64,${base64}`;\n // 4. 写入 sourcemap 内容\n const fileContent =\n bundledCode +\n `\\n//# sourceMappingURL=${sourcemapContent}` + // 只写文件名即可,和 JS 文件同目录\n `\\n//# sourceURL=${packFileName}`;\n fs.writeFileSync(outFile, fileContent, 'utf-8');\n } else {\n const sourcemapBaseUrl = `http://${config?.dev?.host}:${config?.dev?.port}/game/files`;\n // 1. 生成 sourcemap 文件路径\n const mapFileName = path.basename(packFileName) + '.map';\n const mapFilePath = path.join(destRoot, mapFileName);\n // 2. 写入 sourcemap 文件\n fs.writeFileSync(mapFilePath, map.toString(), 'utf-8');\n // 3. JS 文件末尾加外链注释\n const fileContent =\n bundledCode +\n `\\n//# sourceMappingURL=${sourcemapBaseUrl}/${packFileName}.map` + // 只写文件名即可,和 JS 文件同目录\n `\\n//# sourceURL=${packFileName}`;\n fs.writeFileSync(outFile, fileContent, 'utf-8');\n }\n } else {\n const fileContent = bundledCode + `\\n//# sourceURL=${packFileName}`;\n fs.writeFileSync(outFile, fileContent, 'utf-8');\n }\n logger.info(t('log.pack.end', { pkgName }));\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { ensureDirSync } from '@utils';\n\nexport async function partition({\n pkgRoot,\n destRoot,\n packedFiles,\n gameEntry,\n gameOutput,\n skipDirs = [],\n isRoot = true,\n}) {\n if (!fs.existsSync(pkgRoot)) return;\n const entries = fs.readdirSync(pkgRoot, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(pkgRoot, entry.name);\n const destPath = path.join(destRoot, entry.name);\n const fullPath = path.join(pkgRoot, entry.name);\n // 只在第一层判断是否跳过分包目录\n if (entry.isDirectory()) {\n const relativePath = path.relative(gameEntry, fullPath).replace(/\\\\/g, '/');\n if (skipDirs.find(dir => dir === relativePath)) {\n continue; // 跳过分包目录\n }\n }\n if (entry.isDirectory()) {\n partition({\n pkgRoot: srcPath,\n destRoot: destPath,\n gameOutput,\n packedFiles,\n gameEntry,\n skipDirs,\n isRoot: false, // 递归下去不再判断\n });\n } else {\n ensureDirSync(path.dirname(destPath));\n if (!packedFiles.includes(path.relative(gameEntry, srcPath).replace(/\\\\/g, '/'))) {\n fs.copyFileSync(srcPath, destPath);\n }\n }\n }\n}\n","import path from 'path';\nimport { BuildConfig } from '@typings';\nimport {\n logger,\n removeEmptyDir,\n asyncPool,\n getPackTranslator,\n} from '@utils';\nimport { setup } from './setup';\nimport { flattenMaps, collectMaps } from './collectMaps';\nimport { collectDeps } from './collectDeps';\nimport { pack } from './pack';\nimport { partition } from './partition';\n\nexport async function makePkgs(\n config: BuildConfig,\n) {\n const t = getPackTranslator();\n const { entry: gameEntry, output: gameOutput } = config;\n let startTime = Date.now();\n logger.info(t('log.makePkgs.start', { startTime }));\n const { packages } = await setup(config);\n const allDeps = await collectDeps(config, packages);\n const allMaps = collectMaps(config, packages);\n const pkgOutput = {};\n\n /**\n * 基于 asyncPool 并发打包\n */\n\n await asyncPool(10, Object.keys(allMaps), async pkgName => {\n logger.info(t('log.makePkgs.startPackBySource', { pkgName }));\n let startTime = Date.now();\n const pkgConfig = packages[pkgName];\n const pkgRoot = path.join(gameEntry, pkgConfig.root);\n const destRoot = path.join(gameOutput, pkgName, pkgConfig.root);\n\n /**\n * 打包\n */\n await pack({\n gameEntry,\n allDeps,\n allMaps,\n pkgName,\n pkgConfig,\n destRoot,\n config,\n });\n\n /**\n * 分包\n */\n await partition({\n gameEntry,\n gameOutput,\n pkgRoot,\n destRoot,\n packedFiles: flattenMaps(allMaps),\n skipDirs: Object.values(packages)?.map(item => item.root) || [],\n });\n\n const pkgRootDir = path.join(gameOutput, pkgName);\n removeEmptyDir(pkgRootDir);\n logger.info(t('log.makePkgs.finishPackBySource', { pkgName }));\n logger.info(t('log.makePkgs.packBySourceCost', {\n pkgName,\n duration: Date.now() - startTime,\n }));\n });\n\n /**\n * build open data context\n */\n logger.info(t('log.makePkgs.startOpenData'));\n startTime = Date.now();\n\n logger.info(t('log.makePkgs.finishOpenData'));\n logger.info(t('log.makePkgs.openDataCost', {\n duration: Date.now() - startTime,\n }));\n\n logger.info(t('log.makePkgs.end', {\n duration: Date.now() - startTime,\n }));\n\n return pkgOutput;\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { logger } from '@utils';\nimport { ProjectConfig } from '@typings';\nimport { GAME_PACK_CONFIG_FILE_NAME } from '@constants';\n\n/**\n * 将 packages 中的每个 package 下的文件内容合并到 outputDir 下,不保留 package name\n * @param outputDir 输出目录\n */\nexport async function mergePkgs(outputDir: string) {\n logger.info('mergePkgs start');\n const gamePackConfigPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);\n let gamePackConfig: ProjectConfig;\n try {\n gamePackConfig = JSON.parse(fs.readFileSync(gamePackConfigPath, 'utf-8'));\n } catch (err) {\n logger.error(\n `读取配置文件失败: ${gamePackConfigPath}, err: ${err.message}`,\n );\n return;\n }\n\n const packages = gamePackConfig.packages;\n if (!packages || typeof packages !== 'object') {\n logger.error('配置文件中 packages 字段无效, 请检查配置');\n return;\n }\n\n for (const pkgName of Object.keys(packages)) {\n const pkgDir = path.join(outputDir, pkgName);\n if (!fs.existsSync(pkgDir)) {\n logger.warn(`package 目录不存在: ${pkgDir}`);\n continue;\n }\n\n const files = await fs.promises.readdir(pkgDir);\n for (const file of files) {\n const srcPath = path.join(pkgDir, file);\n const destPath = path.join(outputDir, file);\n\n try {\n const stat = await fs.promises.stat(srcPath);\n if (stat.isFile()) {\n await fs.promises.copyFile(srcPath, destPath);\n // 复制好了之后就删除\n await fs.promises.rm(srcPath, {\n recursive: true,\n force: true,\n });\n } else if (stat.isDirectory()) {\n await fs.promises.cp(srcPath, destPath, { recursive: true });\n // 复制好了之后就删除\n await fs.promises.rm(srcPath, { recursive: true, force: true }); \n } else if (stat.isSymbolicLink()) {\n const linkTarget = fs.readlinkSync(srcPath);\n // 判断目标是否已存在符号链接\n if (fs.existsSync(destPath)) {\n await fs.promises.rm(destPath, { force: true });\n }\n await fs.promises.symlink(\n linkTarget,\n destPath,\n stat.isDirectory() ? 'dir' : 'file',\n );\n }\n logger.info(`合并文件/目录: ${srcPath} -> ${destPath}`);\n } catch (err) {\n logger.error(`处理文件失败: ${srcPath}, err: ${err.message}`);\n }\n }\n /**\n * 如果最后 pkgDir 为空,就删除 \n */\n if (fs.readdirSync(pkgDir).length === 0) {\n fs.rmSync(pkgDir, { recursive: true, force: true });\n logger.info(`已删除 package 目录: ${pkgDir}`);\n }\n }\n\n logger.info('mergePkgs 完成');\n}\n","import { removeSystemUseless } from '@utils';\nimport { BuildConfig } from '@typings';\nexport async function clearPkgs(\n config: BuildConfig,\n uselessDirs = ['node_modules', '__MACOSX'],\n) {\n removeSystemUseless(config.entry, uselessDirs);\n}\n","import fs from 'fs';\nimport path from 'path';\nimport {\n logger,\n createPackTranslator,\n setPackRuntimeLanguage,\n} from '@utils';\nimport { GAME_PACK_CONFIG_FILE_NAME } from '@constants';\nimport { BuildConfig, CheckResult, ProjectConfig, PackContext } from '@typings';\nimport { checkPkgs } from '../checkPkgs';\nimport { clearPkgs } from '../clearPkgs';\nimport { mergePkgs } from '../mergePkgs';\nimport { makePkgs } from '../makePkgs';\n\nexport async function debugPkgs(\n config: BuildConfig,\n context: PackContext = {},\n): Promise<{\n isSuccess: boolean;\n errorMsg?: string;\n packages?: ProjectConfig['packages'];\n checkResults?: CheckResult[];\n}> {\n setPackRuntimeLanguage(context?.lang);\n const t = createPackTranslator(context?.lang);\n const {\n output: outputDir,\n dev: { enableLog },\n } = config;\n logger.init(outputDir, enableLog);\n\n try {\n /**\n * 清理\n */\n\n clearPkgs(config);\n /**\n * 校验\n */\n const checkResults = await checkPkgs(\n config,\n context,\n );\n\n /**\n * 如果有任何 error 类型的校验项失败,则不再继续后续流程,直接返回错误\n */\n const errorResults = checkResults.filter(\n item => !item.passed && item.level === 'error',\n );\n if (errorResults.length > 0) {\n const errorMsg = errorResults\n .map(item => `[${item.name || item.type}] ${item.msg}`)\n .join('\\n');\n return {\n isSuccess: false,\n errorMsg: t('debug.validation.failed', { errorMsg }),\n checkResults,\n };\n }\n\n /**\n * 打包\n */\n await makePkgs(config);\n\n /**\n * 合并\n */\n await mergePkgs(outputDir);\n\n /**\n * 返回 packageConfig\n */\n const packageConfig = fs.readFileSync(\n path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME),\n 'utf-8',\n );\n const packageConfigJson = JSON.parse(packageConfig);\n return {\n isSuccess: true,\n packages: packageConfigJson.packages,\n checkResults,\n };\n } catch (error) {\n return {\n isSuccess: false,\n errorMsg: error.message,\n };\n }\n}\n","import { logger, setPackRuntimeLanguage, getPackTranslator } from '@utils';\nimport { TTMG_TEMP_DIR } from '@constants';\nimport { BuildConfig, PackContext } from '@typings';\nimport { checkPkgs } from '../checkPkgs';\nimport { makePkgs } from '../makePkgs';\nimport { makeOdrPkgs } from '../odrPkgs';\nimport { clearPkgs } from '../clearPkgs';\n\nexport async function buildPkgs(\n config: BuildConfig,\n context: PackContext = {},\n) {\n setPackRuntimeLanguage(context?.lang);\n const t = getPackTranslator();\n const { output: outputDir, build } = config;\n let startTime = Date.now();\n logger.init(outputDir, true);\n logger.info(t('log.build.version', {\n version: process.env.TTMG_PACK_VERSION,\n }));\n logger.info(t('log.build.start', { startTime }));\n\n /**\n * 清理\n */\n await clearPkgs(config, ['node_modules', '__MACOSX', TTMG_TEMP_DIR]);\n\n /**\n * 校验\n */\n await checkPkgs(\n config,\n context,\n );\n\n /**\n * 打包\n */\n await makePkgs(config);\n\n if (build?.enableOdr) {\n /**\n * 等待文件全部读写完成后\n */\n await makeOdrPkgs(outputDir);\n /**\n * 分拆 odr 包\n */\n }\n\n logger.info(t('log.build.end', { duration: Date.now() - startTime }));\n}\n","import path from 'path';\nimport { GAME_MAIN_PACKAGE_NAME } from '@constants';\nimport type { GetPkgsResult } from '@typings';\nimport {\n getDirSizeSync,\n getIndependentPackagesConfig,\n getMainPkgSize,\n getProjectSize,\n getGameEngine,\n getWasmBrCodePath,\n getWasmBrCodeMd5,\n} from '@utils';\n\nexport async function getPkgs({\n entryDir,\n}: {\n entryDir: string;\n}): Promise<GetPkgsResult> {\n const independentPackages = getIndependentPackagesConfig(entryDir);\n /**\n *\n */\n const packages: GetPkgsResult['packages'] = [\n {\n type: 'main',\n size: getMainPkgSize({ entryDir }),\n name: GAME_MAIN_PACKAGE_NAME,\n root: '',\n },\n ...independentPackages.map(sub => ({\n type: 'independent',\n size: getDirSizeSync({\n rootDir: entryDir,\n entryDir: path.join(entryDir, sub.root),\n }),\n name: sub.name,\n root: sub.root,\n })),\n ];\n const wasmCodePath = getWasmBrCodePath({ entryDir });\n if (wasmCodePath) {\n const wasmBrCodeMd5 = getWasmBrCodeMd5({ entryDir });\n packages.push({\n type: 'wasmcode',\n name: 'wasmcode',\n root: wasmCodePath,\n md5: wasmBrCodeMd5,\n });\n }\n return {\n size: getProjectSize({\n entryDir,\n }),\n engine: getGameEngine(entryDir),\n packages,\n };\n}\n"],"names":["asyncPool","build","writeFileSync","path","fs","defaultCheckConfig","Bundle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/utils/ensureDirSync.ts","../src/utils/logger.ts","../src/utils/removeEmptyDir.ts","../src/constants/index.ts","../src/utils/getDirSizeSync.ts","../src/utils/deleteJsFilesSync.ts","../src/utils/deleteNoJsFilesSync.ts","../src/utils/i18n.ts","../src/utils/removeSystemUseless.ts","../src/utils/asyncPool.ts","../src/utils/getSubpackagesConfig.ts","../src/utils/getIndependentPackagesConfig.ts","../src/utils/getMainPkgSize.ts","../src/utils/getProjectSize.ts","../src/utils/getGameEngine.ts","../src/utils/safeBuild.ts","../src/utils/openDataContext.ts","../src/utils/unity/isUnityEngine.ts","../src/utils/unity/getWasmBrCodePath.ts","../src/utils/unity/getWasmBrCodeMd5.ts","../src/utils/unity/getUnityBuildConfig.ts","../src/utils/getCheckConfig.ts","../src/libs/odrPkgs/writeOdrConfig.ts","../src/libs/odrPkgs/makeOdrPkgs.ts","../src/libs/odrPkgs/utils.ts","../src/libs/odrPkgs/getConfigs.ts","../src/libs/odrPkgs/buildOdrPkgs.ts","../src/libs/checkPkgs/checkProject.ts","../src/libs/checkPkgs/checkMainpackage.ts","../src/libs/checkPkgs/checkSubpackages.ts","../src/libs/checkPkgs/checkIndependentPackages.ts","../src/libs/checkPkgs/checkAPI.ts","../src/libs/checkPkgs/index.ts","../src/libs/makePkgs/setup.ts","../src/libs/makePkgs/collectMaps.ts","../src/libs/makePkgs/addDepsToPackages.ts","../src/libs/makePkgs/collectDeps.ts","../src/libs/makePkgs/pack.ts","../src/libs/makePkgs/partition.ts","../src/libs/makePkgs/index.ts","../src/libs/mergePkgs/index.ts","../src/libs/clearPkgs/index.ts","../src/libs/debugPkgs/index.ts","../src/libs/buildPkgs/index.ts","../src/libs/getPkgs/index.ts"],"sourcesContent":["import fs from 'fs';\nexport function ensureDirSync(dir) {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n}\n","import winston from 'winston';\nimport path from 'path';\n\nclass Logger {\n logger: winston.Logger;\n enableLog: boolean;\n output: any;\n constructor() {\n this.logger = null;\n }\n init(output: string, enableLog = true) {\n this.enableLog = enableLog;\n this.logger = winston.createLogger({\n level: 'info',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json(), // 输出为 JSON 格式\n ),\n transports: [\n new winston.transports.File({\n filename: path.join(output, 'pack.log'),\n }),\n new winston.transports.Console(),\n ],\n });\n }\n info(msg: string) {\n if (this.enableLog) {\n this.logger.info(msg);\n }\n }\n error(msg) {\n if (this.enableLog) {\n this.logger.error(msg);\n }\n }\n warn(msg) {\n if (this.enableLog) {\n this.logger.warn(msg);\n }\n }\n debug(msg) {\n if (this.enableLog) {\n this.logger.debug(msg);\n }\n }\n log(msg) {\n this.logger.info(msg);\n }\n setOutput(output) {\n this.output = output;\n }\n}\n\nexport const logger = new Logger();\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * 移除指定目录下所有空文件夹(递归)\n * @param {string} dir 目标目录\n * @returns {boolean} 返回当前目录是否已被删除(即是否为空)\n */\nexport function removeEmptyDir(dir) {\n if (!fs.existsSync(dir)) return false;\n if (!fs.statSync(dir).isDirectory()) return false;\n\n let isEmpty = true;\n const files = fs.readdirSync(dir);\n for (const file of files) {\n const fullPath = path.join(dir, file);\n if (fs.statSync(fullPath).isDirectory()) {\n // 递归处理子目录\n const childIsEmpty = removeEmptyDir(fullPath);\n if (!childIsEmpty) isEmpty = false;\n } else {\n // 有文件,当前目录不为空\n isEmpty = false;\n }\n }\n\n // 如果当前目录为空,删除它\n if (isEmpty) {\n fs.rmSync(dir, { recursive: true });\n return true;\n }\n return false;\n}\n\n","import type { CheckDimension } from '@typings';\nexport const GAME_PACK_CONFIG_FILE_NAME = 'packageConfig.json';\nexport const GAME_PROJECT_CONFIG_FILE_NAME = 'project.config.json';\nexport const GAME_ORIGIN_CONFIG_FILE_NAME = 'game.json';\nexport const GAME_MODULE_CONFIG_FILE_NAME = 'moduleConfig.json';\nexport const GAME_OUTPUT_CONFIG_FILE_NAME = 'output.json';\nexport const GAME_WASM_SPLIT_CONFIG_FILE_NAME = 'webgl-wasm-split.json';\nexport const GAME_MAIN_PACKAGE_NAME = '__GAME__';\nexport const TTPKG_TAG = 'TPKG';\nexport const STTPKG_TAG = 'SPKG';\nexport const TTPKG_VERSION = 2;\nexport const ARK_KEY_LEN = 32;\nexport const ARK_INT_LEN = 4;\nexport const UNIT32_LEN = 4;\nexport const UINT16_LEN = 2;\nexport const STTPKG_VERSION = 1;\nexport const ZSTD_COMPRESS_LEVEL = 19;\nexport const ROLL_FILE_EXT = [\n '.js',\n '.json',\n '.wxml',\n '.ttml',\n '.wxss',\n '.ttss',\n];\nexport const EXT = '';\nexport const BROTLI_COMPRESS_TYPE = 1;\nexport const ZSTD_COMPRESS_TYPE = 3;\n\nexport const STTPKG_EXT = '.txt';\n\nexport const ODR_CODE_DIR_SUFFIX = '_code';\n\nexport const ODR_ASSET_DIR_SUFFIX = '_asset';\n\n// 60MB const ONE_ODR_PKG_LIMIT = 1024 * 1024;\nexport const ONE_ODR_PKG_LIMIT = 1024 * 1024 * 60;\n\nexport const AVAILABLE_ODR_TAG_LIST = [\n 'ttmg_odr_high_channel',\n 'ttmg_odr_middle_channel',\n 'ttmg_odr_normal_channel',\n];\n\nexport const PROJECT_SIZE_LIMIT = 30 * 1024 * 1024;\n\nexport const MAINPACKAGE_SIZE_LIMIT = 4 * 1024 * 1024;\n\nexport const CHECK_DIMENSION: Record<string, CheckDimension> = {\n IndependentPackage: 'independent_package',\n MainPackage: 'main_package',\n Project: 'project',\n SubPackage: 'subpackage',\n};\n\nexport const PACKAGE_TYPE = {\n IndependentPackage: 'independent_package',\n SubPackage: 'sub_package',\n MainPackage: 'main_package',\n};\n\nexport const GAME_ENGINES = {\n UNITY: 'unity',\n};\n\nexport const TTMG_TEMP_DIR = '__TTMG_TEMP__';\n\nexport const USELESS_DIRS = ['node_modules', '__MACOSX', TTMG_TEMP_DIR];\n\nexport const USELESS_FILES = ['.DS_Store', 'Thumbs.db'];\n\nexport const GAME_PKG_SIZE_LIMIT = {\n common: {\n project: 30 * 1024 * 1024,\n main: 4 * 1024 * 1024,\n sub: null,\n independent: 4 * 1024 * 1024,\n },\n unity: {\n project: 60 * 1024 * 1024,\n main: null,\n sub: null,\n independent: null,\n },\n};\n\nexport const WASM_FUNC_COUNT_LIMIT = 80000;","import fs from 'fs';\nimport path from 'path';\nimport { USELESS_DIRS, USELESS_FILES } from '@constants';\n\nexport interface DirSizeOptions {\n rootDir: string;\n entryDir: string;\n filterDirs?: string[]; // 要过滤的目录名或相对路径\n filterFiles?: string[]; // 要过滤的文件名\n filterPatterns?: string[]; // 通配符模式,如 '*.log', 'test-*'\n filterRegex?: RegExp[]; // 正则表达式匹配\n}\n\n/**\n * 递归统计目录下所有文件的大小,支持过滤文件夹和文件\n */\nexport function getDirSizeSync(options: DirSizeOptions): number {\n const {\n rootDir,\n entryDir,\n filterDirs = USELESS_DIRS,\n filterFiles = USELESS_FILES,\n filterPatterns = [],\n filterRegex = [],\n } = options;\n\n let totalSize = 0;\n\n // 检查目录是否存在\n if (!fs.existsSync(entryDir)) {\n return 0;\n }\n\n // 将通配符模式转换为正则表达式\n const patternRegexes = filterPatterns.map(pattern => {\n const escaped = pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regexStr = escaped.replace(/\\\\\\*/g, '.*').replace(/\\\\\\?/g, '.');\n return new RegExp(`^${regexStr}$`);\n });\n\n // 合并所有正则表达式\n const allRegexes = [...patternRegexes, ...filterRegex];\n\n // 检查是否应该忽略当前条目\n const shouldIgnore = (name: string, isDirectory: boolean): boolean => {\n // 1. 检查精确匹配\n if (isDirectory && filterDirs.includes(name)) {\n return true;\n }\n if (!isDirectory && filterFiles.includes(name)) {\n return true;\n }\n\n // 2. 检查相对路径匹配(针对目录)\n if (isDirectory) {\n const relativePath = path\n .relative(rootDir, path.join(entryDir, name))\n .replace(/\\\\/g, '/');\n if (filterDirs.includes(relativePath)) {\n return true;\n }\n }\n\n // 3. 检查正则表达式匹配\n if (allRegexes.some(regex => regex.test(name))) {\n return true;\n }\n\n return false;\n };\n\n try {\n const entries = fs.readdirSync(entryDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(entryDir, entry.name);\n\n try {\n if (entry.isDirectory()) {\n // 检查是否应该忽略此目录\n if (!shouldIgnore(entry.name, true)) {\n totalSize += getDirSizeSync({\n rootDir,\n entryDir: fullPath,\n filterDirs,\n filterFiles,\n filterPatterns,\n filterRegex,\n });\n }\n } else if (entry.isFile()) {\n // 检查是否应该忽略此文件\n if (!shouldIgnore(entry.name, false)) {\n totalSize += fs.statSync(fullPath).size;\n }\n }\n } catch (err) {\n // 跳过无法访问的文件/目录\n console.warn(`无法访问: ${fullPath}`, (err as Error).message);\n }\n }\n } catch (err) {\n console.warn(`无法读取目录: ${entryDir}`, (err as Error).message);\n }\n\n return totalSize;\n}\n","import fs from 'fs';\nimport path from 'path';\n\n/**\n * 同步删除指定目录及其子目录下所有 .js 文件\n * @param {string} dir 目标目录路径\n */\nexport function deleteJsFilesSync(dir) {\n // 读取目录内容\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // 递归处理子目录\n deleteJsFilesSync(fullPath);\n } else if (\n entry.isFile() &&\n (fullPath.endsWith('.js') || fullPath.endsWith('.js.map'))\n ) {\n try {\n fs.unlinkSync(fullPath);\n } catch (err) {}\n }\n }\n}\n","import fs from 'fs';\nimport path from 'path';\n\nexport function deleteNoJsFilesSync(dir) {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // 递归处理子目录\n deleteNoJsFilesSync(fullPath);\n } else if (\n entry.isFile() &&\n !(fullPath.endsWith('.js') || fullPath.endsWith('.js.map'))\n ) {\n try {\n fs.unlinkSync(fullPath);\n } catch (err) {}\n }\n }\n}\n","import type { PackLang } from '@typings';\n\ntype MessageParams = Record<string, string | number>;\n\nconst messages = {\n 'en-US': {\n 'log.check.start': 'Start checking project.',\n 'log.check.project.start': 'Start checking project dimension.',\n 'log.check.project.success': 'Project checks passed.',\n 'log.check.config.start': 'Start checking config.',\n 'log.check.projectSize.start': 'Start checking project size.',\n 'log.check.subpackages.start': 'Start checking subpackages in game.json.',\n 'log.check.subpackages.success':\n 'Subpackages config checks passed.',\n 'log.check.mainPackage.start': 'Start checking main package.',\n 'log.check.mainPackageEntry.start':\n 'Start checking main package entry.',\n 'log.check.mainPackageEntry.success':\n 'Main package entry check passed.',\n 'log.check.mainPackageSize.start':\n 'Start checking main package size.',\n 'log.check.mainPackage.success': 'Main package checks passed.',\n 'log.check.independent.start':\n 'Start checking independent subpackages in game.json.',\n 'log.check.independent.success':\n 'Independent subpackages config checks passed.',\n 'log.setup.startGeneratePackageConfig':\n 'Start generating packageConfig.json from game.json.',\n 'log.setup.generatePackageConfigSuccess':\n 'Generated packageConfig.json from game.json successfully.',\n 'log.collectMaps.start':\n 'Start collecting JS files from game source packages.',\n 'log.collectMaps.openDataContextDir':\n 'Open data context directory: {dir}',\n 'log.collectMaps.done':\n 'Collected JS files from game source packages successfully.',\n 'log.makePkgs.start': 'Pack start, startTime: {startTime}',\n 'log.makePkgs.startPackBySource':\n 'Start packing from game source, package: {pkgName}',\n 'log.makePkgs.finishPackBySource':\n 'Finished packing and partitioning from game source, package: {pkgName}',\n 'log.makePkgs.packBySourceCost':\n 'Pack and partition cost, package: {pkgName}, duration: {duration}ms',\n 'log.makePkgs.startOpenData':\n 'Start packing from open data context source.',\n 'log.makePkgs.finishOpenData':\n 'Finished packing from open data context source.',\n 'log.makePkgs.openDataCost':\n 'Open data context packing cost: {duration}ms',\n 'log.makePkgs.end': 'Pack end, duration: {duration}ms',\n 'log.build.version': 'TTMG_PACK_VERSION: {version}',\n 'log.build.start': 'Pack start, startTime: {startTime}',\n 'log.build.end': 'Pack end: {duration}ms',\n 'log.pack.start': 'Pack start, startTime: {startTime}',\n 'log.pack.end': 'Pack end, package: {pkgName}',\n 'log.safeBuild.initStart':\n 'Attempting to initialize esbuild service...',\n 'log.safeBuild.initSuccess':\n 'esbuild service initialized successfully.',\n 'log.safeBuild.initFailed':\n 'Failed to initialize esbuild service:',\n 'log.cleanup.start':\n 'Start cleaning useless files, total entries: {total}',\n 'log.cleanup.accessDirFailed':\n 'Cannot access directory: {dir}, {error}',\n 'log.cleanup.deletedDir':\n 'Deleted useless directory: {path}',\n 'log.cleanup.deletedFile':\n 'Deleted useless file: {path}',\n 'log.cleanup.processFailed':\n 'Cannot process entry: {path}, {error}',\n 'log.cleanup.progress':\n 'Progress: {processed}/{total} ({percentage}%)',\n 'log.cleanup.done': 'Cleanup finished.',\n 'log.cleanup.summary.total': '- Total entries: {total}',\n 'log.cleanup.summary.deletedDirs':\n '- Deleted directories: {deletedDirs}',\n 'log.cleanup.summary.deletedFiles':\n '- Deleted files: {deletedFiles}',\n 'log.cleanup.summary.errors': '- Errors: {errors}',\n 'check.project.gameJson.missing':\n 'Cannot find game.json in the project source. Please make sure game.json exists.',\n 'check.project.gameJson.subPackagesInvalid':\n \"'subPackages' is found in game.json. Please use 'subpackages' (all lowercase) instead.\",\n 'check.project.gameJson.success': 'Check game.json config successfully.',\n 'check.project.size.failed':\n 'Project size check failed: {sizeMB}MB. It must not exceed {limitMB}MB.',\n 'check.project.size.success':\n 'Project size check passed: {sizeMB}MB.',\n 'check.project.perf.noSplitNeeded':\n 'wasmFuncCount < {limit}. No wasm code splitting is needed.',\n 'check.project.perf.needSplit':\n 'The Wasm function count in wasmcode/ exceeds {limit}. Please enable code splitting to optimize performance.',\n 'check.project.perf.doc': 'View wasm split guide',\n 'check.project.perf.splitEnabled':\n 'wasmFuncCount >= {limit}, and wasm split is enabled.',\n 'check.main.size.failed':\n 'Main package size check failed: {sizeMB}MB. It must not exceed {limitMB}MB.',\n 'check.main.size.success':\n 'Main package size check passed: {sizeMB}MB.',\n 'check.main.entry.missing':\n 'Main package entry check failed: game.js must exist in the main package.',\n 'check.main.entry.success':\n 'Main package entry check passed: game.js exists in the main package.',\n 'check.subpackages.config.empty':\n 'Subpackages config check failed: one or more subpackages have an empty root or name. Please ensure every subpackage has non-empty root and name.',\n 'check.subpackages.config.invalidPath':\n 'Subpackages config check failed: subpackage<{name}> has invalid {invalidFields}. Only A-Za-z0-9 _ - . / \\\\ are allowed.',\n 'check.subpackages.config.success':\n 'Subpackage<{name}> config check passed.',\n 'check.subpackages.config.missingDir':\n 'Subpackages config check failed: cannot find entry directory for subpackage<{name}>. Please verify its root path in game.json.',\n 'check.independent.config.empty':\n 'Independent subpackages config check failed: one or more independent subpackages have an empty root or name. Please ensure every independent subpackage has non-empty root and name.',\n 'check.independent.config.missingDir':\n 'Independent subpackages config check failed: cannot find entry directory for independent subpackage<{name}>. Please verify its root path in game.json.',\n 'check.independent.config.success':\n 'Independent subpackage<{name}> config check passed.',\n 'check.pkgSize.success':\n 'Package<{pkgName}> size check passed: {sizeMB}MB.',\n 'check.pkgSize.exceeds':\n 'Package<{pkgName}> size check failed: {sizeMB}MB exceeds limit {limitMB}MB.',\n 'check.api.integrated': '{name} integrated.',\n 'check.api.notIntegrated': '{name} not integrated.',\n 'check.api.suggestedActionSuffix':\n 'Please resolve this before submission to avoid review rejection.',\n 'debug.validation.failed':\n 'Project validation failed (Errors):\\n{errorMsg}',\n },\n 'zh-CN': {\n 'log.check.start': '开始校验项目。',\n 'log.check.project.start': '开始校验项目维度。',\n 'log.check.project.success': '项目校验通过。',\n 'log.check.config.start': '开始校验配置。',\n 'log.check.projectSize.start': '开始校验项目大小。',\n 'log.check.subpackages.start': '开始校验 game.json 中的分包配置。',\n 'log.check.subpackages.success': '分包配置校验通过。',\n 'log.check.mainPackage.start': '开始校验主包。',\n 'log.check.mainPackageEntry.start': '开始校验主包入口。',\n 'log.check.mainPackageEntry.success': '主包入口校验通过。',\n 'log.check.mainPackageSize.start': '开始校验主包大小。',\n 'log.check.mainPackage.success': '主包校验通过。',\n 'log.check.independent.start':\n '开始校验 game.json 中的独立分包配置。',\n 'log.check.independent.success': '独立分包配置校验通过。',\n 'log.setup.startGeneratePackageConfig':\n '开始基于源代码中的 game.json 生成 packageConfig.json。',\n 'log.setup.generatePackageConfigSuccess':\n '基于源代码中的 game.json 生成 packageConfig.json 成功。',\n 'log.collectMaps.start':\n '开始基于游戏源代码收集分包中的 JS 文件。',\n 'log.collectMaps.openDataContextDir':\n '开放数据域目录:{dir}',\n 'log.collectMaps.done':\n '基于游戏源代码收集分包中的 JS 文件完成。',\n 'log.makePkgs.start': '打包开始,开始时间:{startTime}',\n 'log.makePkgs.startPackBySource':\n '开始基于游戏源代码打包,包名:{pkgName}',\n 'log.makePkgs.finishPackBySource':\n '基于游戏源代码打包分包完成,包名:{pkgName}',\n 'log.makePkgs.packBySourceCost':\n '基于游戏源代码打包分包耗时,包名:{pkgName},耗时:{duration}ms',\n 'log.makePkgs.startOpenData':\n '开始基于开放数据域源代码打包。',\n 'log.makePkgs.finishOpenData':\n '基于开放数据域源代码打包完成。',\n 'log.makePkgs.openDataCost':\n '基于开放数据域源代码打包耗时,耗时:{duration}ms',\n 'log.makePkgs.end': '打包结束,总耗时:{duration}ms',\n 'log.build.version': 'TTMG_PACK_VERSION: {version}',\n 'log.build.start': '打包开始,开始时间:{startTime}',\n 'log.build.end': '打包结束:{duration}ms',\n 'log.pack.start': '打包开始,开始时间:{startTime}',\n 'log.pack.end': '打包结束,包名:{pkgName}',\n 'log.safeBuild.initStart': '尝试初始化 esbuild 服务...',\n 'log.safeBuild.initSuccess': 'esbuild 服务初始化成功。',\n 'log.safeBuild.initFailed': '初始化 esbuild 服务失败:',\n 'log.cleanup.start':\n '开始清理无用文件,共 {total} 个条目',\n 'log.cleanup.accessDirFailed':\n '无法访问目录: {dir}, {error}',\n 'log.cleanup.deletedDir':\n '已删除无用目录: {path}',\n 'log.cleanup.deletedFile':\n '已删除无用文件: {path}',\n 'log.cleanup.processFailed':\n '无法处理: {path}, {error}',\n 'log.cleanup.progress':\n '进度: {processed}/{total} ({percentage}%)',\n 'log.cleanup.done': '清理完成!',\n 'log.cleanup.summary.total': '- 总条目: {total}',\n 'log.cleanup.summary.deletedDirs': '- 已删除目录: {deletedDirs}',\n 'log.cleanup.summary.deletedFiles': '- 已删除文件: {deletedFiles}',\n 'log.cleanup.summary.errors': '- 错误数: {errors}',\n 'check.project.gameJson.missing':\n '未在项目源码中找到 game.json,请确认 game.json 文件存在。',\n 'check.project.gameJson.subPackagesInvalid':\n \"在 game.json 中发现了 'subPackages' 字段,请改为全小写的 'subpackages'。\",\n 'check.project.gameJson.success': 'game.json 配置检查通过。',\n 'check.project.size.failed':\n '项目大小检查失败:当前 {sizeMB}MB,不能超过 {limitMB}MB。',\n 'check.project.size.success':\n '项目大小检查通过:当前 {sizeMB}MB。',\n 'check.project.perf.noSplitNeeded':\n 'wasmFuncCount < {limit},无需进行 wasm 代码拆分。',\n 'check.project.perf.needSplit':\n 'wasmcode/ 中的 Wasm 函数数量超过 {limit},请开启代码拆分以优化性能。',\n 'check.project.perf.doc': '查看分包文档',\n 'check.project.perf.splitEnabled':\n 'wasmFuncCount >= {limit},且已开启 wasm 拆分。',\n 'check.main.size.failed':\n '主包大小检查失败:当前 {sizeMB}MB,不能超过 {limitMB}MB。',\n 'check.main.size.success':\n '主包大小检查通过:当前 {sizeMB}MB。',\n 'check.main.entry.missing':\n '主包入口检查失败:主包中必须存在 game.js。',\n 'check.main.entry.success':\n '主包入口检查通过:主包中存在 game.js。',\n 'check.subpackages.config.empty':\n '分包配置检查失败:一个或多个分包的 root 或 name 为空,请确保所有分包都配置了非空的 root 和 name。',\n 'check.subpackages.config.invalidPath':\n '分包配置检查失败:分包<{name}> 的 {invalidFields} 含有非法字符,仅允许 A-Za-z0-9 _ - . / \\\\。',\n 'check.subpackages.config.success':\n '分包<{name}> 配置检查通过。',\n 'check.subpackages.config.missingDir':\n '分包配置检查失败:找不到分包<{name}> 的入口目录,请检查 game.json 中的 root 路径。',\n 'check.independent.config.empty':\n '独立分包配置检查失败:一个或多个独立分包的 root 或 name 为空,请确保所有独立分包都配置了非空的 root 和 name。',\n 'check.independent.config.missingDir':\n '独立分包配置检查失败:找不到独立分包<{name}> 的入口目录,请检查 game.json 中的 root 路径。',\n 'check.independent.config.success':\n '独立分包<{name}> 配置检查通过。',\n 'check.pkgSize.success':\n '包<{pkgName}> 大小检查通过:{sizeMB}MB。',\n 'check.pkgSize.exceeds':\n '包<{pkgName}> 大小检查失败:当前 {sizeMB}MB,超过限制 {limitMB}MB。',\n 'check.api.integrated': '{name} 已接入。',\n 'check.api.notIntegrated': '{name} 未接入。',\n 'check.api.suggestedActionSuffix':\n '请在提审之前完成问题处理,避免审核阶段被拒审。',\n 'debug.validation.failed':\n '项目校验失败(错误项):\\n{errorMsg}',\n },\n} as const;\n\nexport type PackMessageKey = keyof typeof messages['en-US'];\nexport type Translate = (\n key: PackMessageKey,\n params?: MessageParams,\n) => string;\n\nfunction format(template: string, params?: MessageParams) {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_, key: string) => {\n const value = params[key];\n return value === undefined ? `{${key}}` : String(value);\n });\n}\n\nexport function resolvePackLanguage(lang?: string): PackLang {\n return lang === 'zh-CN' ? 'zh-CN' : 'en-US';\n}\n\nlet runtimePackLang: PackLang = 'en-US';\n\nexport function setPackRuntimeLanguage(lang?: string) {\n runtimePackLang = resolvePackLanguage(lang);\n}\n\nexport function getPackRuntimeLanguage(): PackLang {\n return runtimePackLang;\n}\n\nexport function createPackTranslator(lang?: string): Translate {\n const currentLang = resolvePackLanguage(lang);\n return (key, params) => {\n const template = messages[currentLang][key] ?? messages['en-US'][key] ?? key;\n return format(template, params);\n };\n}\n\nexport function getPackTranslator(): Translate {\n return createPackTranslator(runtimePackLang);\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { logger } from './logger';\nimport { getPackTranslator } from './i18n';\n\nconst uselessFiles = ['.DS_Store', 'Thumbs.db'];\n\nexport interface CleanupProgress {\n total: number;\n processed: number;\n deletedDirs: number;\n deletedFiles: number;\n errors: number;\n}\n\nexport function removeSystemUseless(\n gameEntry: string,\n uselessDirs,\n): CleanupProgress {\n const t = getPackTranslator();\n const progress: CleanupProgress = {\n total: 0,\n processed: 0,\n deletedDirs: 0,\n deletedFiles: 0,\n errors: 0,\n };\n\n // 1. 读取目录\n let files: string[];\n try {\n files = fs.readdirSync(gameEntry);\n progress.total = files.length;\n\n logger.info(t('log.cleanup.start', { total: progress.total }));\n } catch (err) {\n logger.warn(t('log.cleanup.accessDirFailed', {\n dir: gameEntry,\n error: err.message,\n }));\n progress.errors++;\n return progress;\n }\n\n // 2. 处理每个条目\n files.forEach((file, index) => {\n const filePath = path.join(gameEntry, file);\n\n try {\n const stat = fs.statSync(filePath);\n\n if (stat.isDirectory() && uselessDirs.includes(file)) {\n // 删除无用目录\n logger.debug(`正在删除目录: ${filePath}`);\n fs.rmSync(filePath, { recursive: true, force: true });\n progress.deletedDirs++;\n logger.info(t('log.cleanup.deletedDir', { path: filePath }));\n } else if (stat.isFile() && uselessFiles.includes(file)) {\n // 删除无用文件\n logger.debug(`正在删除文件: ${filePath}`);\n fs.rmSync(filePath, { force: true });\n progress.deletedFiles++;\n logger.info(t('log.cleanup.deletedFile', { path: filePath }));\n } else {\n logger.debug(`跳过: ${filePath} (非目标文件/目录)`);\n }\n } catch (err) {\n logger.warn(t('log.cleanup.processFailed', {\n path: filePath,\n error: err.message,\n }));\n progress.errors++;\n }\n\n // 更新进度\n progress.processed = index + 1;\n\n // 可选:每处理10个条目输出一次进度\n if ((index + 1) % 10 === 0 || index + 1 === progress.total) {\n const percentage = Math.round(((index + 1) / progress.total) * 100);\n logger.info(t('log.cleanup.progress', {\n processed: index + 1,\n total: progress.total,\n percentage,\n }));\n }\n });\n\n // 3. 输出总结\n logger.info(t('log.cleanup.done'));\n logger.info(t('log.cleanup.summary.total', { total: progress.total }));\n logger.info(t('log.cleanup.summary.deletedDirs', {\n deletedDirs: progress.deletedDirs,\n }));\n logger.info(t('log.cleanup.summary.deletedFiles', {\n deletedFiles: progress.deletedFiles,\n }));\n logger.info(t('log.cleanup.summary.errors', { errors: progress.errors }));\n\n return progress;\n}\n","export async function asyncPool<T, R>(\n poolLimit: number,\n array: T[],\n iteratorFn: (item: T) => Promise<R>,\n): Promise<R[]> {\n const ret: Promise<R>[] = [];\n const executing: Promise<void>[] = [];\n for (const item of array) {\n // 创建处理当前 item 的 Promise\n const p = Promise.resolve().then(() => iteratorFn(item));\n ret.push(p);\n\n if (poolLimit <= array.length) {\n // 包装 Promise,处理完成后从 executing 中移除\n const e = p.then(() => {\n executing.splice(executing.indexOf(e), 1);\n });\n executing.push(e);\n\n // 达到并发限制时,等待任意一个任务完成\n if (executing.length >= poolLimit) {\n await Promise.race(executing);\n }\n }\n }\n // 等待所有任务完成\n return Promise.all(ret);\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME } from '@constants';\n\nexport function getSubpackagesConfig(entryDir: string) {\n try {\n const gameOriginConfigPath = path.join(\n entryDir,\n GAME_ORIGIN_CONFIG_FILE_NAME,\n );\n const gameOriginConfig = JSON.parse(\n fs.readFileSync(gameOriginConfigPath, 'utf-8'),\n );\n return gameOriginConfig?.subpackages?.filter(sub => !sub.independent) || [];\n } catch (e) {\n return [];\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME } from '@constants';\n\nexport function getIndependentPackagesConfig(entryDir: string) {\n try {\n const gameOriginConfigPath = path.join(\n entryDir,\n GAME_ORIGIN_CONFIG_FILE_NAME,\n );\n const gameOriginConfig = JSON.parse(\n fs.readFileSync(gameOriginConfigPath, 'utf-8'),\n );\n return gameOriginConfig?.subpackages?.filter(sub => sub.independent) || [];\n } catch (e) {\n return [];\n }\n}\n","import { getDirSizeSync } from './getDirSizeSync';\nimport path from 'path';\nimport fs from 'fs';\nimport {\n GAME_ORIGIN_CONFIG_FILE_NAME,\n USELESS_DIRS,\n} from '@constants';\n\nexport function getMainPkgSize({ entryDir }: { entryDir: string }) {\n // 先获取分包根目录,这样如果有 subPackages 配置错误,会在这里抛出\n const subpackagesRoots = getSubpackagesRoots(entryDir);\n\n return getDirSizeSync({\n rootDir: entryDir,\n entryDir,\n filterDirs: [...subpackagesRoots, ...USELESS_DIRS],\n });\n}\n\nfunction getSubpackagesRoots(entryDir: string) {\n const originConfigPath = path.join(entryDir, GAME_ORIGIN_CONFIG_FILE_NAME);\n try {\n const originConfig = JSON.parse(fs.readFileSync(originConfigPath, 'utf8'));\n \n // 优先使用小写的 subpackages,如果没有,再使用小驼峰的 subPackages\n const roots =\n originConfig.subpackages?.map((item: { root: string }) => item.root) ||\n originConfig.subPackages?.map((item: { root: string }) => item.root) ||\n [];\n /**\n * 移除掉头和尾的 /\n */\n return roots.map(root => root.replace(/^\\/|\\/$/g, ''));\n } catch (e) {\n return [];\n }\n}\n","import { getDirSizeSync } from './getDirSizeSync';\n\nexport function getProjectSize({ entryDir }: { entryDir: string }) {\n return getDirSizeSync({\n rootDir: entryDir,\n entryDir,\n });\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME } from '../constants';\nexport function getGameEngine(gameEntry: string): 'unity' | 'cocos' | 'unknown' {\n const gameJsonConfigPath = path.join(gameEntry, GAME_ORIGIN_CONFIG_FILE_NAME);\n if (!fs.existsSync(gameJsonConfigPath)) {\n return 'unknown';\n }\n let gameJsonConfig: any;\n try {\n gameJsonConfig = JSON.parse(fs.readFileSync(gameJsonConfigPath, 'utf-8'));\n const gameEngine = gameJsonConfig?.gameEngine;\n if (!gameEngine) {\n return 'unknown';\n }\n return gameEngine;\n } catch (error) {\n return 'unknown';\n }\n}","import { logger } from './logger';\nimport { getPackTranslator } from './i18n';\n// file: ttmg-pack/src/esbuildRunner.ts\nimport { build, BuildOptions, BuildResult } from 'esbuild';\n\nlet initializePromise: Promise<void> | null = null;\n\n/**\n * 确保一个异步函数在整个应用生命周期内只被执行一次。\n * @param fn 一个返回 Promise 的初始化函数。\n */\nexport function ensureOnce(fn: () => Promise<void>): Promise<void> {\n if (!initializePromise) {\n initializePromise = fn();\n }\n return initializePromise;\n}\n\n// 这个函数就是我们的“初始化函数”。\n// 它会执行一次 esbuild.build,目的是为了“唤醒”并安全地启动 esbuild 的后台服务。\n// 我们选择一个几乎无害的操作,比如转换一个空字符串。\nconst initializeEsbuild = async (): Promise<void> => {\n const t = getPackTranslator();\n try {\n logger.info(t('log.safeBuild.initStart'));\n // 执行一个非常轻量的 build 操作来触发服务启动。\n await build({\n stdin: { contents: '' },\n write: false,\n bundle: false,\n logLevel: \"silent\"\n });\n logger.info(t('log.safeBuild.initSuccess'));\n } catch (e) {\n logger.error(t('log.safeBuild.initFailed'));\n // 如果初始化失败,允许重试\n throw e;\n }\n};\n\n/**\n * 一个安全的、可以并发调用的 esbuild build 函数。\n * 它会先等待全局的初始化完成后,再执行自己的 build 任务。\n */\nexport async function safeBuild(options: BuildOptions): Promise<BuildResult> {\n // 确保 esbuild 服务已经初始化。\n // 无论多少个 safeBuild 被同时调用,initializeEsbuild() 只会执行一次。\n // 所有调用都会在这里等待,直到那唯一的初始化完成。\n await ensureOnce(initializeEsbuild);\n\n // 初始化完成后,现在可以安全地、并发地调用真正的 build 了。\n return build(options);\n}\n","import { safeBuild } from './safeBuild';\nimport { writeFileSync } from 'fs';\nimport fs from 'fs';\nimport { logger } from './logger';\nimport path from 'path';\nconst bareToRelativePlugin = {\n name: 'bare-to-relative',\n setup(build) {\n // 匹配不以 . 或 / 开头的 .js 文件路径\n build.onResolve({ filter: /^[^./].*\\.js$/ }, args => {\n return {\n path: path.resolve(args.resolveDir, args.path),\n };\n });\n },\n};\n\n/**\n *\n * @param entryDir 游戏项目根目录\n * @returns\n */\nexport async function buildOpenDataContext({\n entryDir,\n outputDir,\n}: {\n entryDir: string;\n outputDir: string;\n}) {\n const { entry: openDataContextEntry, msg } = getOpenDataContextEntry({\n entryDir,\n });\n if (!openDataContextEntry) {\n return;\n } else {\n logger.info(msg);\n }\n /**\n * 这里需要做个兼容,有 index.js 就不做拼接 index.js\n */\n let inputPath = path.join(entryDir, openDataContextEntry, 'index.js');\n if (!fs.existsSync(inputPath)) {\n inputPath = path.join(entryDir, openDataContextEntry);\n }\n const outputPath = path.join(outputDir, 'openDataContextCode.txt');\n let jsCode = await genOpenDataContext(inputPath);\n writeFileSync(outputPath, jsCode);\n}\n\n/**\n *\n * @param param0\n * @returns\n */\nexport const getOpenDataContextEntry = ({ entryDir }: { entryDir: string }) => {\n const gameConfigPath = path.join(entryDir, 'game.json');\n if (!fs.existsSync(gameConfigPath)) {\n return {\n entry: undefined,\n msg: 'game.json not found, make sure the project is in the root directory of the game',\n };\n }\n try {\n const gameConfig = JSON.parse(fs.readFileSync(gameConfigPath, 'utf-8'));\n return {\n entry: gameConfig.openDataContext,\n msg: 'success',\n };\n } catch (e) {\n return {\n entry: undefined,\n msg: 'read game.json failed, your game.json is invalid json file, please check it',\n };\n }\n};\n\nasync function genOpenDataContext(entryPath: string) {\n const result = await safeBuild({\n entryPoints: [entryPath],\n bundle: true,\n platform: 'browser',\n format: 'iife',\n minify: true,\n write: false,\n loader: {\n '.png': 'dataurl',\n '.jpg': 'dataurl',\n '.jpeg': 'dataurl',\n '.gif': 'dataurl',\n '.svg': 'dataurl',\n '.webp': 'dataurl',\n },\n plugins: [bareToRelativePlugin]\n });\n const jsCode = result?.outputFiles?.[0]?.text || '';\n return jsCode;\n}\n","import { getGameEngine } from '../getGameEngine';\n\nexport function isUnityEngine(gameEntry: string) {\n return getGameEngine(gameEntry) === 'unity';\n}","import path from 'path';\nimport fs from 'fs';\nimport { isUnityEngine } from './isUnityEngine';\n\n\nexport function getWasmBrCodePath({\n entryDir,\n}: {\n entryDir: string;\n}): string {\n if (!isUnityEngine(entryDir)) {\n return '';\n } else {\n /**\n * 检查项目下存在一个名为 wasmcode 的文件夹,且文件夹下存在一个文件后缀为 .webgl.wasm.code.unityweb.wasm.br 的文件。,如果满足条件,就展示 true,否则 返回 false\n */\n\n const wasmCodeDir = path.join(entryDir, 'wasmcode');\n if (!fs.existsSync(wasmCodeDir)) {\n return '';\n }\n const wasmBrFiles = fs.readdirSync(wasmCodeDir).filter(file => file.endsWith('.webgl.wasm.code.unityweb.wasm.br'));\n if (wasmBrFiles.length === 0) {\n return '';\n } else {\n return path.relative(entryDir, path.join(wasmCodeDir, wasmBrFiles[0]));\n }\n }\n}\n\n","import path from 'path';\nimport fs from 'fs';\n\nexport function getWasmBrCodeMd5({ entryDir }: { entryDir: string }): string {\n // originalWasmMd5\n try {\n const gameConfig = JSON.parse(\n fs.readFileSync(path.join(entryDir, 'game.json'), 'utf-8'),\n );\n return gameConfig.originalWasmMd5 || '';\n } catch {\n return '';\n }\n}\n","import { GAME_PKG_SIZE_LIMIT } from '@constants'\nimport { BuildConfig } from '@typings'\nexport function getUnityBuildConfig(): Partial<BuildConfig['build']> {\n return {\n pkgSizeLimit: GAME_PKG_SIZE_LIMIT.unity.project,\n mainPkgSizeLimit: GAME_PKG_SIZE_LIMIT.unity.main,\n independentSubPkgSizeLimit: GAME_PKG_SIZE_LIMIT.unity.independent,\n }\n}","import { getUnityBuildConfig, isUnityEngine } from './unity';\nimport { BuildConfig } from '@typings';\n\nexport function getCheckConfig(config: BuildConfig):\n Partial<BuildConfig['build']> {\n if (isUnityEngine(config.entry)) {\n return getUnityBuildConfig()\n } else {\n return {\n pkgSizeLimit: 30 * 1024 * 1024,\n mainPkgSizeLimit: 4 * 1024 * 1024,\n independentSubPkgSizeLimit: 4 * 1024 * 1024,\n };\n }\n}\n","import { logger } from '@utils';\nimport * as path from 'path';\nimport * as fs from 'fs';\n\nimport {\n GAME_PACK_CONFIG_FILE_NAME,\n ODR_ASSET_DIR_SUFFIX,\n ODR_CODE_DIR_SUFFIX,\n} from '@constants';\n\n/**\n * 将 packageConfig packages 中 分拆的包 配置迁移到 odr_packages 中\n */\n\nexport async function writeOdrConfig(outputDir: string) {\n logger.info('writeOdrPackagesConfig start');\n const outputPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);\n const config = JSON.parse(fs.readFileSync(outputPath, 'utf-8'));\n const packages = config.packages;\n const odrPackages = config.odr_packages || {};\n for (const pkgName in packages) {\n if (pkgName.endsWith(ODR_CODE_DIR_SUFFIX)) {\n /**\n * 找到 assets 对应的包\n */\n const pkgConfig = packages[pkgName];\n const relatedPkgName = pkgName.split(ODR_CODE_DIR_SUFFIX)[0];\n if (!odrPackages[relatedPkgName]) {\n odrPackages[relatedPkgName] = {};\n }\n odrPackages[relatedPkgName] = {\n ...odrPackages[relatedPkgName],\n root: pkgConfig.root,\n code_output: pkgConfig.output,\n code_md5: pkgConfig.md5,\n main: pkgConfig.main,\n dependencies: pkgConfig.dependencies,\n type: pkgConfig.type,\n };\n delete packages[pkgName];\n }\n if (pkgName.endsWith(ODR_ASSET_DIR_SUFFIX)) {\n const relatedPkgName = pkgName.split(ODR_ASSET_DIR_SUFFIX)[0];\n const pkgConfig = packages[pkgName];\n odrPackages[relatedPkgName] = {\n ...odrPackages[relatedPkgName],\n root: pkgConfig.root,\n asset_output: pkgConfig.output,\n asset_md5: pkgConfig.md5,\n };\n delete packages[pkgName];\n }\n }\n config.odr_packages = odrPackages;\n fs.writeFileSync(outputPath, JSON.stringify(config, null, 2));\n logger.info('writeOdrPackagesConfig end');\n}\n","import path from 'path';\nimport fs from 'fs';\nimport {\n ensureDirSync,\n deleteNoJsFilesSync,\n logger,\n deleteJsFilesSync,\n} from '@utils';\n\nimport {\n GAME_PACK_CONFIG_FILE_NAME,\n ODR_ASSET_DIR_SUFFIX,\n ODR_CODE_DIR_SUFFIX,\n STTPKG_EXT,\n} from '@constants';\n\nexport async function makeOdrPkgs(outputDir: string) {\n let startTime = Date.now();\n logger.info(`makeOdrPkgs start, ${startTime}`);\n const outputPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);\n const config = JSON.parse(fs.readFileSync(outputPath, 'utf-8'));\n const packages = config.packages;\n for (const pkgName in packages) {\n /**\n * 将原本的分包配置,转换为 odr 的配置,\n * 将原本产物按照原路径,分别拆分成两个文件夹:js 部分 package_name_code,asset 部分 package_name_asset\n */\n const pkgOutput = path.join(outputDir, pkgName);\n const codeOutput = path.join(outputDir, `${pkgName}${ODR_CODE_DIR_SUFFIX}`);\n const assetOutput = path.join(\n outputDir,\n `${pkgName}${ODR_ASSET_DIR_SUFFIX}`,\n );\n if (packages[pkgName].type === 'game') {\n ensureDirSync(codeOutput);\n ensureDirSync(assetOutput);\n fs.cpSync(pkgOutput, codeOutput, { recursive: true });\n fs.cpSync(pkgOutput, assetOutput, { recursive: true });\n deleteNoJsFilesSync(codeOutput);\n deleteJsFilesSync(assetOutput);\n }\n\n /**\n * 写入配置\n */\n packages[`${pkgName}${ODR_CODE_DIR_SUFFIX}`] = {\n ...packages[pkgName],\n code_url: '',\n code_md5: '',\n output: `${pkgName}${ODR_CODE_DIR_SUFFIX}${STTPKG_EXT}`,\n };\n packages[`${pkgName}${ODR_ASSET_DIR_SUFFIX}`] = {\n ...packages[pkgName],\n asset_url: '',\n asset_md5: '',\n output: `${pkgName}${ODR_ASSET_DIR_SUFFIX}${STTPKG_EXT}`,\n };\n }\n fs.writeFileSync(outputPath, JSON.stringify(config, null, 2));\n logger.info(`makeOdrPkgs end, ${Date.now() - startTime}ms`);\n}\n","import { logger } from '@utils';\nimport { ODRPackages } from '@typings';\n\n// export function fetchGames(params: { size: number; offset: number }): Promise<{\n// data: Array<{\n// id: string;\n// packages: ODRPackages;\n// }>;\n// total: number;\n// }> {\n// const { size, offset } = params;\n// const url = `https://game-odr.bytedance.net/odr/api/v1/games?size=${size}&offset=${offset}`;\n// return fetch(url).then(res => res.json());\n// }\n\n// export async function fetchAllGames(): Promise<Array<{\n// id: string;\n// packages: ODRPackages;\n// }>> {\n// const size = 100;\n// let offset = 0;\n// let total = 0;\n// const games: Array<{\n// id: string;\n// packages: ODRPackages;\n// }> = [];\n// while (true) {\n// const res = await fetchGames({ size, offset });\n// games.push(...res.data);\n// total = res.total;\n// if (games.length >= total) {\n// break;\n// }\n// offset += size;\n// }\n// return games;\n// }\n\nimport fs from 'fs/promises';\nimport path from 'path';\nimport fetch from 'node-fetch';\n\nexport async function downloadAndSaveCodesAsync(\n games,\n tempDir,\n concurrency = 5, // 并发数\n) {\n // 1. 生成所有下载任务\n const tasks = [];\n\n for (const game of games) {\n const { id: gameId, packages } = game;\n const gameDir = path.join(tempDir, gameId);\n await fs.mkdir(gameDir, { recursive: true });\n\n for (const packageName in packages) {\n const packageInfo = packages[packageName];\n const { code_url } = packageInfo;\n const fileName = `${packageName}.txt`;\n const filePath = path.join(gameDir, fileName);\n\n tasks.push({\n code_url,\n filePath,\n packageName,\n });\n }\n }\n\n // 2. 用并发池执行所有任务\n await asyncPool(concurrency, tasks, async task => {\n const { code_url, filePath, packageName } = task;\n console.log(`start to download ${packageName}`);\n try {\n const res = await fetch(code_url);\n if (!res.ok)\n throw new Error(`Failed to fetch ${code_url}: ${res.statusText}`);\n const buffer = Buffer.from(await res.arrayBuffer());\n await fs.writeFile(filePath, buffer);\n console.log(`finish to download ${packageName}`);\n } catch (err) {\n console.error(`Error downloading ${packageName}:`, err);\n }\n });\n}\n\nasync function asyncPool(poolLimit, array, iteratorFn) {\n const ret = [];\n const executing = [];\n for (const item of array) {\n const p = Promise.resolve().then(() => iteratorFn(item));\n ret.push(p);\n if (poolLimit <= array.length) {\n const e = p.then(() => executing.splice(executing.indexOf(e), 1));\n executing.push(e);\n if (executing.length >= poolLimit) {\n await Promise.race(executing);\n }\n }\n }\n return Promise.all(ret);\n}\n","import data from './config.json';\n\nexport function getOdrConfigs() {\n const { MinisPackagingInfoMap } = data;\n return Object.keys(MinisPackagingInfoMap).map(clientKey => {\n return {\n id: clientKey,\n packages: JSON.parse(MinisPackagingInfoMap[clientKey].ODRPackages),\n };\n });\n}\n","/**\n * 合并请求拆包\n */\nimport fs from 'fs';\nimport path from 'path';\nimport { getDirSizeSync, logger } from '@utils';\nimport { downloadAndSaveCodesAsync } from './utils';\nimport { AVAILABLE_ODR_TAG_LIST, ONE_ODR_PKG_LIMIT } from '@constants';\nimport { getOdrConfigs } from './getConfigs';\n\nexport async function buildOdrPkgs({ tempDir }: { tempDir: string }) {\n if (fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true });\n }\n fs.mkdirSync(tempDir);\n const games = getOdrConfigs();\n logger.info('odr_games');\n await downloadAndSaveCodesAsync(games, tempDir);\n const gamesContentSize = {};\n for (const game of games) {\n const { id: gameId } = game;\n const gameDir = path.join(tempDir, gameId);\n gamesContentSize[gameId] = getDirSizeSync({\n rootDir: tempDir,\n entryDir: gameDir,\n filterDirs: [],\n });\n }\n // ODR TAG 分配\n const odrTagGameMap = {};\n AVAILABLE_ODR_TAG_LIST.forEach(tag => {\n odrTagGameMap[tag] = [];\n });\n // 用于产出 TTMGODRConfig\n const TTMGODRConfig = {};\n for (const game of games) {\n const { id: gameId, packages } = game;\n const gameSize = gamesContentSize[gameId];\n if (gameSize > ONE_ODR_PKG_LIMIT) continue;\n let assignedTag = null;\n for (const odrTag of AVAILABLE_ODR_TAG_LIST) {\n const odrTagDir = path.join(tempDir, odrTag);\n if (!fs.existsSync(odrTagDir)) fs.mkdirSync(odrTagDir);\n const currentTagSize = odrTagGameMap[odrTag].reduce(\n (sum, gid) => sum + gamesContentSize[gid],\n 0,\n );\n if (currentTagSize + gameSize <= ONE_ODR_PKG_LIMIT) {\n // 复制资源\n const srcDir = path.join(tempDir, gameId);\n const destDir = path.join(odrTagDir, gameId);\n fs.cpSync(srcDir, destDir, { recursive: true });\n odrTagGameMap[odrTag].push(gameId);\n assignedTag = odrTag;\n break;\n }\n }\n if (!assignedTag) continue; // 没有分配成功就跳过\n // 构建 TTMGODRConfig\n\n TTMGODRConfig[gameId] = {\n tag: assignedTag,\n packages: {},\n };\n for (const packageName in packages) {\n const pkg = packages[packageName];\n logger.info(`TTMGODRConfig[gameId].packages, ${pkg}, ${packageName}`);\n TTMGODRConfig[gameId].packages[packageName] = {\n root: pkg.root,\n main: pkg.main,\n // code_md5: pkg.code_md5,\n asset_md5: pkg.asset_md5,\n asset_url: pkg.asset_url,\n };\n }\n console.log(`finish to build ${gameId}`);\n fs.rmSync(path.join(tempDir, gameId), { recursive: true });\n }\n // 写入 JSON 文件\n const configPath = path.join(tempDir, 'TTMG_ODR_CONFIG.json');\n fs.writeFileSync(configPath, JSON.stringify(TTMGODRConfig, null, 2), 'utf-8');\n logger.info(`TTMG_ODR_CONFIG.json 已生成: ${configPath}`);\n}\n","import path from 'path';\nimport fs from 'fs';\nimport {\n BuildConfig,\n CheckConfigResult,\n CheckSizeResult,\n CheckDimension,\n CheckPerfResult,\n} from '@typings';\nimport {\n GAME_ORIGIN_CONFIG_FILE_NAME,\n CHECK_DIMENSION,\n GAME_WASM_SPLIT_CONFIG_FILE_NAME,\n WASM_FUNC_COUNT_LIMIT,\n} from '@constants';\nimport { logger, getProjectSize, getCheckConfig, isUnityEngine } from '@utils';\nimport type { Translate } from '@utils';\n\nconst defaultCheckConfig: {\n name: string;\n dimension: CheckDimension;\n required: boolean;\n} = {\n name: 'project',\n dimension: CHECK_DIMENSION.Project,\n required: true,\n};\nexport function checkProject(config: BuildConfig, t: Translate) {\n logger.info(t('log.check.project.start'));\n const gameJsonCheckResult = checkGameJson(config, t);\n const checkSizeResult = checkProjectSize(config, t);\n const checkPerfResult = checkPerformance(config, t);\n /**\n * 过滤掉空的\n */\n const result = [gameJsonCheckResult, checkSizeResult, checkPerfResult].filter(\n Boolean,\n );\n if (result.every(item => item.passed)) {\n logger.info(t('log.check.project.success'));\n }\n return result;\n}\n\nexport function checkGameJson(\n config: BuildConfig,\n t: Translate,\n): CheckConfigResult {\n logger.info(t('log.check.config.start'));\n const gameJsonPath = path.join(config.entry, GAME_ORIGIN_CONFIG_FILE_NAME);\n if (!fs.existsSync(gameJsonPath)) {\n const errMsg = t('check.project.gameJson.missing');\n logger.error(errMsg);\n\n if (config?.dev?.enable) {\n return {\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n name: 'project',\n ...defaultCheckConfig,\n };\n } else {\n throw new Error(errMsg);\n }\n } else {\n const gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));\n if (gameJson.subPackages) {\n const errMsg = t('check.project.gameJson.subPackagesInvalid');\n logger.error(errMsg);\n if (config?.dev?.enable) {\n return {\n passed: false,\n msg: errMsg,\n type: 'config',\n name: 'project',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n };\n } else {\n throw new Error(errMsg);\n }\n }\n const msg = t('check.project.gameJson.success');\n logger.info(msg);\n return {\n passed: true,\n msg,\n type: 'config',\n level: 'info',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n };\n }\n}\n/**\n * 检查游戏大小是否超出限制\n * @param param0\n * @returns\n */\n\nexport function checkProjectSize(\n config: BuildConfig,\n t: Translate,\n): CheckSizeResult {\n logger.info(t('log.check.projectSize.start'));\n const { entry: entryDir, dev } = config;\n const { pkgSizeLimit } = getCheckConfig(config);\n const enableDev = dev?.enable;\n const gameSize = getProjectSize({ entryDir });\n const gameSizeMB = (gameSize / (1024 * 1024)).toFixed(2);\n const limitMB = (pkgSizeLimit / (1024 * 1024)).toFixed(2);\n if (gameSize > pkgSizeLimit) {\n const errMsg = t('check.project.size.failed', { sizeMB: gameSizeMB, limitMB });\n logger.error(errMsg);\n if (enableDev) {\n return {\n passed: false,\n name: 'project',\n msg: errMsg,\n type: 'size',\n level: 'warning',\n size: gameSize,\n ...defaultCheckConfig,\n };\n } else {\n throw new Error(errMsg);\n }\n } else {\n /**\n * 游戏大小检查通过\n */\n const logMsg = t('check.project.size.success', { sizeMB: gameSizeMB });\n logger.info(logMsg);\n return {\n passed: true,\n msg: logMsg,\n name: 'project',\n type: 'size',\n level: 'info',\n size: gameSize,\n ...defaultCheckConfig,\n };\n }\n}\n\nfunction checkPerformance(\n config: BuildConfig,\n t: Translate,\n): CheckPerfResult | null {\n const wasmSplitDocLink =\n 'https://bytedance.larkoffice.com/wiki/DZDzwzYdDiJpBSkrhcTcWailnuh?from=from_parent_docx';\n const { entry } = config;\n if (!isUnityEngine(entry)) {\n return null;\n }\n\n const gameJsonPath = path.join(entry, GAME_ORIGIN_CONFIG_FILE_NAME);\n const gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));\n if (!('wasmFuncCount' in gameJson)) {\n return null;\n }\n if (gameJson?.wasmFuncCount < WASM_FUNC_COUNT_LIMIT) {\n return {\n ...defaultCheckConfig,\n passed: true,\n msg: t('check.project.perf.noSplitNeeded', {\n limit: WASM_FUNC_COUNT_LIMIT,\n }),\n type: 'performance',\n level: 'info',\n name: 'project',\n };\n }\n\n const splitConfigPath = path.join(entry, GAME_WASM_SPLIT_CONFIG_FILE_NAME);\n\n const errResult: CheckPerfResult = {\n ...defaultCheckConfig,\n passed: false,\n msg: t('check.project.perf.needSplit', {\n limit: WASM_FUNC_COUNT_LIMIT,\n }),\n type: 'performance',\n level: 'warning',\n detail: {\n link: wasmSplitDocLink,\n text: t('check.project.perf.doc'),\n },\n name: 'project',\n };\n if (!fs.existsSync(splitConfigPath)) {\n return errResult;\n }\n\n const splitConfig = JSON.parse(fs.readFileSync(splitConfigPath, 'utf-8'));\n if (splitConfig?.enableWasmSplit !== true) {\n return errResult;\n } else {\n return {\n ...defaultCheckConfig,\n passed: true,\n msg: t('check.project.perf.splitEnabled', {\n limit: WASM_FUNC_COUNT_LIMIT,\n }),\n type: 'performance',\n level: 'info',\n name: 'project',\n };\n }\n}\n","import * as path from 'path';\nimport * as fs from 'fs';\nimport {\n BuildConfig,\n CheckConfigResult,\n CheckSizeResult,\n CheckDimension,\n} from '@typings';\nimport { CHECK_DIMENSION } from '@constants';\nimport { logger, getMainPkgSize, getCheckConfig } from '@utils';\nimport type { Translate } from '@utils';\nconst defaultCheckConfig: {\n name: string;\n dimension: CheckDimension;\n required: boolean;\n} = {\n name: 'main',\n dimension: CHECK_DIMENSION.MainPackage,\n required: true,\n};\n/**\n * 检查主包大小是否超出限制\n * @param param0\n * @returns\n */\nexport function checkMainPackageSize(\n config: BuildConfig,\n t: Translate,\n): CheckSizeResult {\n logger.info(t('log.check.mainPackageSize.start'));\n const { entry: entryDir, dev } = config;\n const { mainPkgSizeLimit } = getCheckConfig(config);\n const mainPkgSize = getMainPkgSize({ entryDir });\n const mainPkgSizeMB = (mainPkgSize / (1024 * 1024)).toFixed(2);\n const limitMB = (mainPkgSizeLimit / (1024 * 1024)).toFixed(2);\n if (mainPkgSize > mainPkgSizeLimit) {\n const errMsg = t('check.main.size.failed', {\n sizeMB: mainPkgSizeMB,\n limitMB,\n });\n logger.error(errMsg);\n if (dev?.enable) {\n return {\n passed: false,\n msg: errMsg,\n size: mainPkgSize,\n type: 'size',\n level: 'warning',\n ...defaultCheckConfig,\n };\n } else {\n throw new Error(errMsg);\n }\n } else {\n return {\n passed: true,\n msg: t('check.main.size.success', {\n sizeMB: mainPkgSizeMB,\n }),\n size: mainPkgSize,\n type: 'size',\n level: 'info',\n ...defaultCheckConfig,\n };\n }\n}\n\nexport function checkMainPackageEntry(\n config: BuildConfig,\n t: Translate,\n): CheckConfigResult {\n logger.info(t('log.check.mainPackageEntry.start'));\n const { entry: entryDir } = config;\n const gameJsPath = path.join(entryDir, 'game.js');\n if (!fs.existsSync(gameJsPath)) {\n const errMsg = t('check.main.entry.missing');\n logger.error(errMsg);\n if (config.dev?.enable) {\n return {\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: 'game.js',\n ...defaultCheckConfig,\n };\n }\n throw new Error(errMsg);\n }\n logger.info(t('log.check.mainPackageEntry.success'));\n return {\n passed: true,\n msg: t('check.main.entry.success'),\n type: 'config',\n level: 'info',\n file: 'game.js',\n ...defaultCheckConfig,\n };\n}\n\nexport function checkMainPackage(\n config: BuildConfig,\n t: Translate,\n): (CheckConfigResult | CheckSizeResult)[] {\n const checkResults = [];\n\n logger.info(t('log.check.mainPackage.start'));\n\n /**\n * 检查 game.js 是否存在\n */\n\n checkResults.push(\n checkMainPackageEntry(config, t),\n );\n\n if (getCheckConfig(config)?.mainPkgSizeLimit) {\n checkResults.push(\n checkMainPackageSize(config, t),\n );\n }\n if (checkResults.every(item => item.passed)) {\n logger.info(t('log.check.mainPackage.success'));\n }\n return checkResults;\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { logger, getSubpackagesConfig } from '@utils';\nimport type { Translate } from '@utils';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME } from '@constants';\nimport {\n CheckConfigResult,\n CheckSizeResult,\n BuildConfig,\n CheckDimension,\n} from '@typings';\nfunction isValidPath(path) {\n // 仅允许 A-Za-z0-9 _ - . / \\\n // 说明:\n // - 这是“字符白名单”校验,不涉及路径语义(如 ..、绝对路径、重复分隔符等)\n return /^[A-Za-z0-9._\\-\\\\/]+$/.test(path);\n}\n\nconst defaultCheckConfig: {\n name: string;\n dimension: CheckDimension;\n required: boolean;\n} = {\n name: 'subpackage',\n dimension: 'subpackage',\n required: true,\n};\n\nexport function checkSubpackages(\n config: BuildConfig,\n t: Translate,\n): (CheckConfigResult | CheckSizeResult)[] {\n const { entry: entryDir } = config;\n const checkResults: (CheckConfigResult | CheckSizeResult)[] = [];\n /**\n * 校验 subpackage 大小\n * 开始校验 subpackages 配置是否有效\n */\n logger.info(t('log.check.subpackages.start'));\n \n\n \n const subpackages = getSubpackagesConfig(entryDir);\n subpackages.forEach(sub => {\n /**\n * 校验 subpackage 配置是否为空\n */\n if (!sub.name || !sub.root) {\n const errMsg = t('check.subpackages.config.empty');\n logger.error(errMsg);\n if (config?.dev?.enable) {\n checkResults.push({\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n } else {\n throw new Error(errMsg);\n }\n } else if (!isValidPath(sub.root) || !isValidPath(sub.name)) {\n const invalidFields = [\n !isValidPath(sub.root) ? 'root' : '',\n !isValidPath(sub.name) ? 'name' : '',\n ]\n .filter(Boolean)\n .join('/');\n const errMsg = t('check.subpackages.config.invalidPath', {\n name: sub.name,\n invalidFields,\n });\n logger.error(errMsg);\n if (config?.dev?.enable) {\n checkResults.push({\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n } else {\n throw new Error(errMsg);\n }\n } else {\n checkResults.push({\n passed: true,\n msg: t('check.subpackages.config.success', {\n name: sub.name,\n }),\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n }\n /**\n * 校验 subpackage 配置是否有效\n */\n const subpackageEntryDir = path.join(entryDir, sub.root);\n // 检查是文件或者文件夹是否存在\n if (!fs.existsSync(subpackageEntryDir)) {\n const errMsg = t('check.subpackages.config.missingDir', {\n name: sub.name,\n });\n logger.error(errMsg);\n if (config?.dev?.enable) {\n checkResults.push({\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n } else {\n throw new Error(errMsg);\n }\n } else {\n checkResults.push({\n passed: true,\n msg: t('check.subpackages.config.success', {\n name: sub.name,\n }),\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n ...defaultCheckConfig,\n });\n }\n });\n if (checkResults.length && checkResults.every(item => item.passed)) {\n logger.info(t('log.check.subpackages.success'));\n }\n return checkResults;\n}\n","import path from 'path';\nimport fs from 'fs';\nimport {\n logger,\n getIndependentPackagesConfig,\n getDirSizeSync,\n getCheckConfig,\n} from '@utils';\nimport type { Translate } from '@utils';\nimport {\n BuildConfig,\n CheckConfigResult,\n CheckDimension,\n CheckSizeResult,\n} from '@typings';\nimport { GAME_ORIGIN_CONFIG_FILE_NAME, CHECK_DIMENSION } from '@constants';\n\nconst defaultCheckConfig: {\n dimension: CheckDimension;\n required: boolean;\n} = {\n dimension: CHECK_DIMENSION.IndependentPackage,\n required: true,\n};\nexport function checkIndependentPackages(\n config: BuildConfig,\n t: Translate,\n) {\n const { entry: entryDir } = config;\n const isEnableDev = config?.dev?.enable;\n const checkResults: (CheckConfigResult | CheckSizeResult)[] = [];\n /**\n * 开始校验 subpackages 配置是否有效\n */\n logger.info(t('log.check.independent.start'));\n const independentSubpackages = getIndependentPackagesConfig(entryDir);\n independentSubpackages.forEach(sub => {\n /**\n * 校验 independent subpackage 配置是否为空\n */\n if (!sub.name || !sub.root) {\n const errMsg = t('check.independent.config.empty');\n logger.error(errMsg);\n if (isEnableDev) {\n checkResults.push({\n ...defaultCheckConfig,\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n name: sub.name,\n });\n } else {\n throw new Error(errMsg);\n }\n } else {\n checkResults.push({\n ...defaultCheckConfig,\n passed: true,\n msg: t('check.independent.config.success', {\n name: sub.name,\n }),\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n name: sub.name,\n });\n }\n /**\n * 校验 independent subpackage 配置是否有效\n */\n const subpackageEntryDir = path.join(entryDir, sub.root);\n\n // 检查是文件或者文件夹是否存在\n if (!fs.existsSync(subpackageEntryDir)) {\n const errMsg = t('check.independent.config.missingDir', {\n name: sub.name,\n });\n logger.error(errMsg);\n if (isEnableDev) {\n checkResults.push({\n ...defaultCheckConfig,\n passed: false,\n msg: errMsg,\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n name: sub.name,\n });\n } else {\n throw new Error(errMsg);\n }\n } else {\n checkResults.push({\n passed: true,\n msg: t('check.independent.config.success', {\n name: sub.name,\n }),\n type: 'config',\n level: 'error',\n file: GAME_ORIGIN_CONFIG_FILE_NAME,\n dimension: CHECK_DIMENSION.IndependentPackage,\n required: true,\n name: sub.name,\n });\n }\n /**\n * 校验 independent subpackage 包大小,不做校验\n */\n const { independentSubPkgSizeLimit } = getCheckConfig(config);\n if (independentSubPkgSizeLimit) {\n const checkSizeResult = checkPkgSize({\n entryDir: subpackageEntryDir,\n pkgName: sub.name,\n limit: independentSubPkgSizeLimit,\n dimension: CHECK_DIMENSION.IndependentPackage,\n level: isEnableDev ? 'warning' : 'error',\n t,\n });\n checkResults.push(checkSizeResult);\n logger.info(checkSizeResult.msg);\n if (!checkSizeResult.passed) {\n if (isEnableDev) {\n } else {\n throw new Error(checkSizeResult.msg);\n }\n }\n }\n });\n if (checkResults.length && checkResults.every(item => item.passed)) {\n logger.info(t('log.check.independent.success'));\n }\n return checkResults;\n}\n\nexport function checkPkgSize({\n entryDir,\n limit,\n pkgName,\n dimension,\n level,\n t,\n}: {\n entryDir: string;\n limit: number;\n pkgName: string;\n dimension: CheckSizeResult['dimension'];\n level: CheckSizeResult['level'];\n t: Translate;\n}): CheckSizeResult {\n const size = getDirSizeSync({\n rootDir: entryDir,\n entryDir,\n });\n const passed = size <= limit;\n const sizeMB = size / 1024 / 1024;\n const limitMB = limit / 1024 / 1024;\n return {\n passed,\n msg: passed\n ? t('check.pkgSize.success', {\n pkgName,\n sizeMB: sizeMB.toFixed(2),\n })\n : t('check.pkgSize.exceeds', {\n pkgName,\n sizeMB: sizeMB.toFixed(2),\n limitMB: limitMB.toFixed(2),\n }),\n type: 'size',\n level,\n size,\n dimension,\n required: true,\n name: pkgName,\n };\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { CheckAPIResult, BuildConfig } from '@typings';\nimport type { Translate } from '@utils';\n\n/**\n * 检查游戏产物中是否调用了指定的 API\n */\n\nconst API_LIST: {\n name: string;\n desc: string;\n}[] = [\n {\n name: 'login',\n desc: 'Login to get open id',\n },\n {\n name: 'createRewardedVideoAd',\n desc: 'Integrate rewarded video ads',\n },\n\n {\n name: 'addShortcut',\n desc: 'Add game shortcut to home screen',\n },\n {\n name: \"getShortcutMissionReward\",\n desc: \"Get shortcut mission reward\"\n },\n {\n name: 'startEntranceMission',\n desc: 'Jump to TikTok personal sidebar',\n },\n {\n name: \"getEntranceMissionReward\",\n desc: \"Get entrance mission reward\"\n }\n ];\n\ntype CheckResult = Array<CheckAPIResult>;\n\nexport function checkAPI(config: BuildConfig, t: Translate): CheckResult {\n if (!config?.build?.enableAPICheck) {\n return [];\n }\n const exts = ['.js', '.ts'];\n // 预编译正则,尽量减少误报:匹配独立的标识符或对象调用形式\n // 例如:\\b(login)\\b 或 \\.login\\s*\\( 或 =\\s*login\\b\n const apiRegexMap = new Map<string, RegExp>(\n API_LIST.map(({ name }) => {\n // 组合模式:独立词边界 或 点调用 或 解构/赋值场景\n const pattern = [\n `\\\\b${escapeRegex(name)}\\\\b`, // 独立标识符\n `\\\\.${escapeRegex(name)}\\\\s*\\\\(`, // 对象.方法(\n `\\\\b${escapeRegex(name)}\\\\s*:\\\\s*`, // 对象字面量属性\n `\\\\b${escapeRegex(name)}\\\\s*=`, // 赋值给该名\n `\\\\b${escapeRegex(name)}\\\\s*\\\\(`, // 直接函数调用\n ].join('|');\n return [name, new RegExp(pattern, 'm')];\n }),\n );\n\n // 结果初始化\n const hitFilesMap = new Map<string, Set<string>>();\n for (const { name } of API_LIST) {\n hitFilesMap.set(name, new Set());\n }\n\n // 深度优先遍历\n const stack: string[] = [config.entry];\n while (stack.length) {\n const current = stack.pop()!;\n const stat = fs.statSync(current);\n\n if (stat.isDirectory()) {\n // 可根据需要排除目录\n const base = path.basename(current);\n if (\n ['node_modules', '.git', 'dist', 'build', 'out', '.cache'].includes(\n base,\n )\n ) {\n continue;\n }\n const children = fs.readdirSync(current);\n for (const child of children) {\n stack.push(path.join(current, child));\n }\n continue;\n }\n\n // 文件:后缀过滤\n const ext = path.extname(current).toLowerCase();\n if (!exts.includes(ext)) {\n continue;\n }\n\n // 读取文本\n let content = '';\n try {\n content = fs.readFileSync(current, 'utf8');\n } catch {\n // 读取失败则跳过\n continue;\n }\n\n // 粗略跳过很大的文件,避免性能问题(可调)\n if (content.length > 5_000_000) continue;\n\n // 检测每个 API\n for (const { name } of API_LIST) {\n const reg = apiRegexMap.get(name)!;\n if (reg.test(content)) {\n hitFilesMap.get(name)!.add(current);\n }\n }\n }\n\n const results: CheckResult = API_LIST.map(({ name }) => {\n const files = Array.from(hitFilesMap.get(name) || []);\n const passed = files.length > 0;\n return {\n name,\n msg: passed\n ? t('check.api.integrated', { name })\n : `${t('check.api.notIntegrated', { name })} ${t('check.api.suggestedActionSuffix')}`,\n passed,\n files,\n type: 'api',\n level: 'warning',\n required: false,\n dimension: 'project',\n };\n });\n return results;\n}\n\n/**\n * 转义正则特殊字符\n */\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import {\n logger,\n createPackTranslator,\n setPackRuntimeLanguage,\n getPackTranslator,\n} from '@utils';\nimport { BuildConfig, CheckResult, PackContext } from '@typings';\nimport { checkProject } from './checkProject';\nimport { checkMainPackage } from './checkMainpackage';\nimport { checkSubpackages } from './checkSubpackages';\nimport { checkIndependentPackages } from './checkIndependentPackages';\nimport { checkAPI } from './checkAPI';\n\nexport async function checkPkgs(\n config: BuildConfig,\n context: PackContext = {},\n): Promise<CheckResult[]> {\n setPackRuntimeLanguage(context?.lang);\n const t = createPackTranslator(context?.lang);\n logger.info(getPackTranslator()('log.check.start'));\n /**\n * 1. 校验项目\n */\n\n const projectCheckResult = checkProject(config, t);\n /**\n * 2. 如果有,校验分包\n */\n const subpackagesCheckResult = checkSubpackages(config, t);\n\n /**\n * 3. 校验主包\n */\n const mainPackageCheckResult = checkMainPackage(config, t);\n\n /**\n * 校验独立分包\n */\n const independentPackagesCheckResult = checkIndependentPackages(config, t);\n\n /**\n * 校验 API 调用\n */\n const apiCheckResult = checkAPI(config, t);\n\n return [\n ...projectCheckResult,\n ...mainPackageCheckResult,\n ...subpackagesCheckResult,\n ...independentPackagesCheckResult,\n ...apiCheckResult,\n ];\n}\n","import fs from 'fs';\nimport path from 'path';\nimport {\n GAME_PACK_CONFIG_FILE_NAME,\n GAME_ORIGIN_CONFIG_FILE_NAME,\n GAME_MAIN_PACKAGE_NAME,\n STTPKG_EXT,\n PACKAGE_TYPE,\n} from '@constants';\n\nimport { logger, getPackTranslator } from '@utils';\n\nimport { BuildConfig } from '@typings';\n\nexport async function setup(config: BuildConfig): Promise<{\n packages: Record<string, {\n url: string;\n md5: string;\n root: string;\n main: string;\n output: string;\n type: string;\n dependencies: string[];\n }>;\n fyf_packages: Array<{\n value: string;\n label: string;\n type: any;\n }>;\n}> {\n const t = getPackTranslator();\n const { entry: entryDir, output: outputDir } = config;\n logger.info(t('log.setup.startGeneratePackageConfig'));\n const gameJsonPath = path.join(entryDir, GAME_ORIGIN_CONFIG_FILE_NAME);\n const gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));\n\n const packages = {};\n // fyf for your feed 缩写,代表可用于视频锚点投放使用的包\n const fyfPackages = [\n {\n value: GAME_MAIN_PACKAGE_NAME,\n label: 'Main (Main package)',\n type: PACKAGE_TYPE.MainPackage,\n },\n ];\n\n // 主包\n packages[GAME_MAIN_PACKAGE_NAME] = {\n url: '',\n md5: '',\n root: '',\n main: 'game.js',\n output: `${GAME_MAIN_PACKAGE_NAME}${STTPKG_EXT}`,\n type: 'game',\n dependencies: []\n };\n\n transformSubPackages(gameJson.subpackages).forEach(\n ({ name, root, main, independent }) => {\n // root 是目录\n packages[name] = {\n url: '',\n md5: '',\n root,\n main,\n output: `${name}${STTPKG_EXT}`,\n independent,\n type: 'game',\n dependencies: []\n };\n if (independent) {\n fyfPackages.push({\n value: name,\n label: `${name} (Independent package)`,\n type: PACKAGE_TYPE.IndependentPackage,\n });\n }\n },\n );\n\n const result = {\n packages,\n fyf_packages: fyfPackages,\n };\n if (fs.existsSync(outputDir)) {\n fs.rmSync(outputDir, { recursive: true });\n }\n fs.mkdirSync(outputDir);\n fs.writeFileSync(\n path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME),\n JSON.stringify(result, null, 2),\n );\n logger.info(t('log.setup.generatePackageConfigSuccess'));\n return result;\n}\n\nfunction transformSubPackages(\n configs: Array<{\n name: string;\n root: string;\n independent?: boolean;\n }>,\n) {\n if (!configs || configs.length === 0) {\n return [];\n }\n function normalizeName(name) {\n return String(name).replace(/^\\/+|\\/+$/g, '');\n }\n\n function getMainFromRoot(root: string) {\n if (isDirectory(root)) {\n // 将 Windows 下的 \\\\ 替换为 /\n return path.join(root, 'game.js').replace(/\\\\/g, '/');\n }\n return root;\n }\n\n function isDirectory(str) {\n // 以 / 结尾,或没有 .js 结尾且没有 . 号\n return str.endsWith('/') || !/\\.[a-zA-Z0-9]+$/.test(str);\n }\n\n function normalizeRoot(root: string): string {\n // 去掉头部和尾部的所有斜杠\n return root.replace(/^\\/+|\\/+$/g, '');\n }\n\n return configs.map(config => {\n const name = normalizeName(config.name);\n let main = getMainFromRoot(config.root);\n // test\n let root = normalizeRoot(config.root);\n return { main, root, name, independent: config.independent || false };\n });\n}\n","import fs from 'fs';\nimport path from 'path';\nimport { logger, getOpenDataContextEntry, getPackTranslator } from '@utils';\nimport { BuildConfig } from '@typings';\n\nexport function flattenMaps(allMaps) {\n const list = [];\n Object.values(allMaps).forEach(map => {\n Object.values(map).forEach(arr => {\n list.push(...arr);\n });\n });\n return list;\n}\n// 递归收集 JS 文件,但可排除指定目录\nfunction collectPkgJsFiles({\n entry,\n root,\n exts = ['.js', '.ts', '.jsx', '.tsx'],\n excludeDirs = [],\n}: {\n entry: string;\n root: string;\n exts: string[];\n excludeDirs: string[];\n}) {\n let files = [];\n if (!fs.existsSync(entry)) return files;\n const entries = fs.readdirSync(entry, { withFileTypes: true });\n for (const item of entries) {\n const fullPath = path.join(entry, item.name);\n if (item.isDirectory()) {\n /**\n * 计算 item 与 root 的相对路径\n */\n /**\n * 讲 \\ 替换为 /\n */\n const relativePath = path.relative(root, fullPath).replace(/\\\\/g, '/');\n if (excludeDirs.find(dir => dir === relativePath)) {\n continue; // 跳过排除目录\n }\n files = files.concat(\n collectPkgJsFiles({\n entry: fullPath,\n root: root,\n exts: exts,\n excludeDirs,\n }),\n ); // 只排除一级\n } else if (exts.some(ext => item.name.endsWith(ext))) {\n files.push(fullPath);\n }\n }\n return files;\n}\n\n// 构建每个包的 map\nexport function collectMaps(\n config: BuildConfig,\n packages: Record<string, { root: string }>,\n) {\n const t = getPackTranslator();\n const { entry: entryDir } = config;\n logger.info(t('log.collectMaps.start'));\n const result = {};\n // 1. 先收集所有分包根目录名(如 subpackages/level1、subpackages/level2)\n const subRoots = Object.values(packages)\n .filter(pkg => pkg.root && pkg.root !== '')\n .map(pkg => pkg.root) // 只提取一级目录名\n .filter(Boolean);\n\n for (const pkgName in packages) {\n const pkg = packages[pkgName];\n let srcRoot;\n let jsFiles;\n if (pkgName === '__GAME__') {\n const uniqueSubRoots = Array.from(new Set(subRoots));\n const { entry: openDataContextEntry } = getOpenDataContextEntry({\n entryDir,\n });\n if (openDataContextEntry) {\n uniqueSubRoots.push(openDataContextEntry);\n logger.info(t('log.collectMaps.openDataContextDir', {\n dir: openDataContextEntry,\n }));\n }\n // 主包:只收集 entryDir 下非分包目录, 并排除 开放数据域的文件夹目录(如果有)\n jsFiles = collectPkgJsFiles({\n entry: entryDir,\n root: entryDir,\n exts: ['.js', '.ts', '.jsx', '.tsx'],\n excludeDirs: uniqueSubRoots,\n });\n srcRoot = entryDir;\n } else {\n // 分包:只收集自己目录\n srcRoot = path.join(entryDir, pkg.root);\n jsFiles = collectPkgJsFiles({\n entry: srcRoot,\n root: srcRoot,\n exts: ['.js', '.ts', '.jsx', '.tsx'],\n excludeDirs: [],\n });\n }\n // 以包的 srcRoot 为基准生成相对路径\n const list = [];\n jsFiles.forEach(absPath => {\n list.push(path.relative(entryDir, absPath).replace(/\\\\/g, '/'));\n });\n const packNameRoot = packages[pkgName].root;\n result[pkgName] = {\n [packNameRoot ? `${packNameRoot}/game.pack.js` : 'game.pack.js']: list,\n };\n }\n logger.info(t('log.collectMaps.done'));\n return result;\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { STTPKG_EXT, GAME_PACK_CONFIG_FILE_NAME, GAME_ORIGIN_CONFIG_FILE_NAME, GAME_MAIN_PACKAGE_NAME } from '@constants';\nimport fetch from 'node-fetch';\nimport { BuildConfig } from '@typings';\n\ntype PluginMeta = {\n PackageCDNURL: string;\n PackageMD5: string;\n PluginName?: string;\n PluginVersion?: string;\n};\n\n/**\n * 根据 TikTok DevPortal 接口获取插件包信息(url + md5)\n *\n * 对应 curl:\n * POST https://developers.tiktok.com/tiktok/v4/devportal/minigame/plugin_meta/get\n * body: { plugin_name, plugin_version }\n */\nexport async function getPluginInfo(params: {\n plugin_name: string;\n plugin_version: string;\n baseUrl?: string; // 默认 https://developers.tiktok.com\n headers?: Record<string, string>; // 例如:{ 'x-use-ppe': '1', 'x-tt-env': 'ppe_unity_plugin_meta' }\n}): Promise<{ url: string; md5: string }> {\n const baseUrl = params.baseUrl ?? 'https://developers.tiktok.com';\n const url = `${baseUrl}/tiktok/v4/devportal/minigame/plugin_meta/get`;\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(params.headers ?? {}),\n },\n body: JSON.stringify({\n plugin_name: params.plugin_name,\n plugin_version: params.plugin_version,\n }),\n });\n const json: any = await res.json();\n const meta: PluginMeta | undefined =\n json?.PluginMeta ?? json?.data?.PluginMeta ?? json?.result?.PluginMeta ?? json?.data?.result?.PluginMeta;\n if (!meta?.PackageCDNURL || !meta?.PackageMD5) {\n throw new Error(`[ttmg-pack]: The current game plugin version does not exist. plugin_name: ${params.plugin_name}, plugin_version: ${params.plugin_version}, error: ${JSON.stringify(json)}`);\n }\n\n return { url: meta.PackageCDNURL, md5: meta.PackageMD5 };\n}\n\n\nexport async function addDepsToPackages(gameEntry: string, outputDir: string, allDeps: Record<string, string[]>, config?: BuildConfig) {\n const gamePackConfigPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);\n const gameJsonPath = path.join(gameEntry, GAME_ORIGIN_CONFIG_FILE_NAME);\n let gamePackConfig: any;\n let gameJson: any;\n let pluginConfig: any;\n try {\n gamePackConfig = JSON.parse(fs.readFileSync(gamePackConfigPath, 'utf-8'));\n gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));\n pluginConfig = gameJson.plugins;\n } catch (error) {\n throw new Error('[ttmg-pack] Failed to read package file game.json or packageConfig.json');\n }\n\n if (!config?.dev?.enable) {\n const unityDeps = ['data-package', 'StreamingAssets', 'wasmcode', 'wasmcode-android', 'wasmcode-ios'];\n for (const dep of unityDeps) {\n // 如果 game.json 的 subpackages 里有这个包,则添加进 __GAME__ 的 dependencies\n if ((gameJson.subpackages ?? []).some(pkg => pkg.name === dep)) {\n gamePackConfig.packages[GAME_MAIN_PACKAGE_NAME].dependencies.push(dep);\n }\n }\n }\n\n for (const [pkgName, plugins] of Object.entries(allDeps)) {\n for (const pluginName of plugins) {\n if (!pluginConfig?.[pluginName]) continue;\n\n const version = pluginConfig[pluginName].version;\n const pluginPkgName = `${pluginName}_${version}`;\n\n let url: string = '';\n let md5: string = '';\n\n if (config?.dev?.enable) {\n try {\n const res = await getPluginInfo({\n plugin_name: pluginName.toLowerCase(),\n plugin_version: version\n });\n url = res.url;\n md5 = res.md5;\n } catch (error) {\n throw new Error(`[ttmg-pack] Failed to get plugin info: ${error.message} plugin_name: ${pluginName}, plugin_version: ${version}`);\n }\n }\n\n gamePackConfig.packages[pkgName].dependencies.push(pluginPkgName);\n if (!gamePackConfig.packages[pluginPkgName]) {\n gamePackConfig.packages[pluginPkgName] = {\n url,\n md5,\n root: pluginPkgName,\n main: `${pluginPkgName}/index.js`,\n output: `${pluginPkgName}${STTPKG_EXT}`,\n independent: false,\n type: 'plugin',\n dependencies: [],\n };\n } else {\n // 如果已存在,也覆盖 url/md5,保证最新\n gamePackConfig.packages[pluginPkgName].url = url;\n gamePackConfig.packages[pluginPkgName].md5 = md5;\n }\n }\n }\n\n try {\n fs.writeFileSync(gamePackConfigPath, JSON.stringify(gamePackConfig, null, 2));\n } catch (error) {\n throw new Error(`[ttmg-pack] Failed to write package file packageConfig.json: ${error.message} path: ${gamePackConfigPath}`);\n }\n}","import fs from 'fs';\nimport path from 'path';\nimport acorn from 'acorn';\nimport glob from 'glob';\nimport { addDepsToPackages } from './addDepsToPackages';\nimport { BuildConfig } from '@typings';\n\nexport async function collectDeps(config: BuildConfig, packages) {\n const { entry: gameEntry, output: gameOutput } = config;\n // 自动扫描 game 目录下的一级文件夹作为根前缀\n const rootPrefixes = getRootPrefixes(gameEntry);\n\n // 查找所有 JS 文件\n const files = glob.sync('**/*.js', {\n cwd: gameEntry,\n ignore: [],\n });\n\n const requireCalls = [];\n files.forEach(file => {\n const fullPath = path.join(gameEntry, file);\n const code = fs.readFileSync(fullPath, 'utf-8');\n let ast;\n try {\n ast = acorn.parse(code, { ecmaVersion: 'latest', sourceType: 'module' });\n } catch (e) {\n // 跳过无法解析的文件\n return;\n }\n\n walkAst(ast, node => {\n // require('xxx') 或 requireAsync('xxx')\n if (\n node.type === 'CallExpression' &&\n node.callee.type === 'Identifier' &&\n (node.callee.name === 'require' ||\n node.callee.name === 'requireAsync') &&\n node.arguments.length > 0 &&\n node.arguments[0].type === 'Literal' &&\n typeof node.arguments[0].value === 'string'\n ) {\n const requirePath = node.arguments[0].value;\n let resolvedPath = null;\n\n if (requirePath.startsWith('.')) {\n resolvedPath = path.resolve(path.dirname(fullPath), requirePath);\n } else if (requirePath.startsWith('/')) {\n resolvedPath = path.resolve(gameEntry, '.' + requirePath);\n } else {\n for (const prefix of rootPrefixes) {\n if (requirePath.startsWith(prefix)) {\n resolvedPath = path.resolve(gameEntry, requirePath);\n break;\n }\n }\n }\n\n // 校验文件是否存在(支持 .js/.ts/.jsx/.tsx 后缀自动补全)\n if (resolvedPath && !fileExistsWithExtensions(resolvedPath)) {\n resolvedPath = null;\n }\n\n requireCalls.push({\n file: path.relative(gameEntry, fullPath),\n type: 'game',\n callee: node.callee.name,\n requirePath,\n resolvedPath: resolvedPath\n ? path.relative(gameEntry, resolvedPath)\n : '',\n });\n } else if (node.type === 'CallExpression' &&\n node.callee.type === 'Identifier' &&\n node.callee.name === 'requirePlugin' &&\n node.arguments.length > 0 &&\n node.arguments[0].type === 'Literal') {\n const requirePath = node.arguments[0].value;\n\n requireCalls.push({\n file: path.relative(gameEntry, fullPath),\n type: 'plugin',\n callee: node.callee.name,\n requirePath,\n resolvedPath: requirePath,\n });\n }\n });\n });\n\n const newRequireCalls = requireCalls.map(i => {\n /**\n * 基于 packages 来判断\n */\n let depModule = '';\n if (i.type === 'plugin') {\n depModule = i.requirePath.split('/')[0];\n } else if (i.type === 'game') {\n Object.keys(packages).forEach(pkg => {\n if (i.resolvedPath && i.resolvedPath.startsWith(packages[pkg].root)) {\n depModule = pkg;\n }\n });\n }\n\n let curModule = '';\n Object.keys(packages).forEach(pkg => {\n if (i.file.startsWith(packages[pkg].root)) {\n curModule = pkg;\n }\n });\n return {\n ...i,\n curModule,\n depModule,\n };\n });\n // 只统计 JS/TS/JSX/TSX 文件依赖\n const exts = ['.js', '.ts', '.jsx', '.tsx'];\n const isJsLike = f => exts.some(ext => f.endsWith(ext));\n\n const result: {\n packageDeps: Record<string, Record<string, string>>,\n pluginDeps: Record<string, string[]>,\n } = newRequireCalls.reduce((acc, cur) => {\n if (!acc.packageDeps[cur.curModule]) {\n acc.packageDeps[cur.curModule] = {};\n }\n if (!acc.pluginDeps[cur.curModule]) {\n acc.pluginDeps[cur.curModule] = [];\n }\n if (cur.curModule === cur.depModule) {\n return acc;\n }\n if (cur.resolvedPath && isJsLike(cur.resolvedPath) && cur.type === 'game') {\n acc.packageDeps[cur.curModule][cur.resolvedPath] = cur.depModule;\n } else if (cur.type === 'plugin') {\n acc.pluginDeps[cur.curModule].push(cur.depModule);\n }\n return acc;\n }, {\n packageDeps: {},\n pluginDeps: {},\n });\n\n await addDepsToPackages(gameEntry, gameOutput, result.pluginDeps, config);\n\n return result;\n}\n\nfunction getRootPrefixes(gameEntry) {\n return fs\n .readdirSync(gameEntry)\n .filter(name => {\n const fullPath = path.join(gameEntry, name);\n return (\n fs.statSync(fullPath).isDirectory() &&\n !['node_modules', 'dist', 'build', 'output'].includes(name)\n );\n })\n .map(name => name + '/');\n}\n\nfunction walkAst(node, cb) {\n cb(node);\n for (let key in node) {\n if (node.hasOwnProperty(key)) {\n const child = node[key];\n if (Array.isArray(child)) {\n child.forEach(c => c && typeof c.type === 'string' && walkAst(c, cb));\n } else if (child && typeof child.type === 'string') {\n walkAst(child, cb);\n }\n }\n }\n}\n\n// 支持 .js/.ts/.jsx/.tsx 自动补全\nfunction fileExistsWithExtensions(filePath) {\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) return true;\n const exts = ['.js', '.ts', '.jsx', '.tsx'];\n for (const ext of exts) {\n if (fs.existsSync(filePath + ext) && fs.statSync(filePath + ext).isFile())\n return true;\n }\n return false;\n}\n","import fs from 'fs';\nimport path from 'path';\nimport MagicString, { Bundle } from 'magic-string';\nimport {\n GAME_MODULE_CONFIG_FILE_NAME,\n GAME_MAIN_PACKAGE_NAME,\n} from '@constants';\nimport { BuildConfig } from '@typings';\nimport {\n logger,\n ensureDirSync,\n safeBuild,\n buildOpenDataContext,\n getPackTranslator,\n} from '@utils';\n\nexport async function pack({\n gameEntry,\n pkgName,\n allDeps,\n allMaps,\n pkgConfig,\n destRoot,\n config,\n}: {\n gameEntry: string;\n pkgName: string;\n allDeps: any;\n allMaps: Record<string, Record<string, string[]>>;\n pkgConfig: {\n main: string;\n root: string;\n };\n destRoot: string;\n config: BuildConfig;\n}) {\n const t = getPackTranslator();\n let startTime = Date.now();\n logger.info(t('log.pack.start', { startTime }));\n const packMap = allMaps[pkgName];\n const moduleConfig = {\n main: pkgConfig.main,\n deps: allDeps.packageDeps[pkgName] || {},\n map: allMaps[pkgName],\n };\n\n ensureDirSync(destRoot);\n /**\n * 把 openDataContext 代码放到 destRoot 下\n */\n if (pkgName === GAME_MAIN_PACKAGE_NAME) {\n await buildOpenDataContext({\n entryDir: gameEntry,\n outputDir: destRoot,\n });\n }\n\n fs.writeFileSync(\n path.join(destRoot, GAME_MODULE_CONFIG_FILE_NAME),\n JSON.stringify(moduleConfig),\n );\n for (const packFileName in packMap) {\n const relPaths = packMap[packFileName];\n if (!Array.isArray(relPaths) || relPaths.length === 0) continue;\n\n const concat = new Bundle({ separator: '\\n' });\n for (const relPath of relPaths) {\n const absPath = path.join(gameEntry, relPath);\n if (!fs.existsSync(absPath)) continue;\n if (path.basename(absPath) === packFileName) continue;\n\n if (/\\.js$/i.test(relPath)) {\n const result = await safeBuild({\n // 1. 指定入口文件,esbuild 会自己去读取\n entryPoints: [absPath],\n // 2. 传递你原来的编译选项\n format: 'cjs',\n target: 'es2020',\n minify: false,\n charset: 'utf8',\n keepNames: true,\n logLevel: 'silent',\n write: false,\n bundle: false,\n });\n // 5. 从内存中的结果获取编译后的代码\n // result.outputFiles 是一个数组,bundle:false 时通常只有一个元素\n const code = result.outputFiles[0].text;\n // loader: 'js',\n // format: 'cjs',\n // target: 'es2015',\n // minify: false, // 关闭压缩,避免字面量与属性被改写\n // charset: 'utf8', // 避免 ascii-only 导致 unicode 再编码\n // keepNames: true,\n // });\n // const code = fs.readFileSync(absPath, 'utf-8');\n const fileId = relPath.replace(/\\\\/g, '/');\n const defineHeader = `define(\"game:${fileId}\", [\"require\", \"requireAsync\", \"module\", \"exports\", \"sandboxGlobal\"], function(require, requireAsync, module, exports, sandboxGlobal){\\nwith(sandboxGlobal){\\n`;\n const defineFooter = `\\n}\\n});\\n`;\n const fileMagic = new MagicString(code, { filename: fileId });\n fileMagic.prepend(defineHeader);\n fileMagic.append(defineFooter);\n concat.addSource({ content: fileMagic, filename: fileId });\n }\n }\n const outFile = path.join(destRoot, path.basename(packFileName));\n const bundledCode = concat.toString();\n // await assertSyntax(bundledCode, packFileName);\n\n if (config?.dev?.enableSourcemap) {\n const map = concat.generateMap({\n hires: true,\n includeContent: true,\n file: path.basename(packFileName), // 推荐用最终输出文件名\n });\n /**\n * 如果是走内敛\n */\n if (config?.dev?.inlineSourcemap) {\n // 生成 base 64\n const base64 = Buffer.from(map.toString()).toString('base64');\n const sourcemapContent = `data:application/json;base64,${base64}`;\n // 4. 写入 sourcemap 内容\n const fileContent =\n bundledCode +\n `\\n//# sourceMappingURL=${sourcemapContent}` + // 只写文件名即可,和 JS 文件同目录\n `\\n//# sourceURL=${packFileName}`;\n fs.writeFileSync(outFile, fileContent, 'utf-8');\n } else {\n const sourcemapBaseUrl = `http://${config?.dev?.host}:${config?.dev?.port}/game/files`;\n // 1. 生成 sourcemap 文件路径\n const mapFileName = path.basename(packFileName) + '.map';\n const mapFilePath = path.join(destRoot, mapFileName);\n // 2. 写入 sourcemap 文件\n fs.writeFileSync(mapFilePath, map.toString(), 'utf-8');\n // 3. JS 文件末尾加外链注释\n const fileContent =\n bundledCode +\n `\\n//# sourceMappingURL=${sourcemapBaseUrl}/${packFileName}.map` + // 只写文件名即可,和 JS 文件同目录\n `\\n//# sourceURL=${packFileName}`;\n fs.writeFileSync(outFile, fileContent, 'utf-8');\n }\n } else {\n const fileContent = bundledCode + `\\n//# sourceURL=${packFileName}`;\n fs.writeFileSync(outFile, fileContent, 'utf-8');\n }\n logger.info(t('log.pack.end', { pkgName }));\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { ensureDirSync } from '@utils';\n\nexport async function partition({\n pkgRoot,\n destRoot,\n packedFiles,\n gameEntry,\n gameOutput,\n skipDirs = [],\n isRoot = true,\n}) {\n if (!fs.existsSync(pkgRoot)) return;\n const entries = fs.readdirSync(pkgRoot, { withFileTypes: true });\n for (const entry of entries) {\n const srcPath = path.join(pkgRoot, entry.name);\n const destPath = path.join(destRoot, entry.name);\n const fullPath = path.join(pkgRoot, entry.name);\n // 只在第一层判断是否跳过分包目录\n if (entry.isDirectory()) {\n const relativePath = path.relative(gameEntry, fullPath).replace(/\\\\/g, '/');\n if (skipDirs.find(dir => dir === relativePath)) {\n continue; // 跳过分包目录\n }\n }\n if (entry.isDirectory()) {\n partition({\n pkgRoot: srcPath,\n destRoot: destPath,\n gameOutput,\n packedFiles,\n gameEntry,\n skipDirs,\n isRoot: false, // 递归下去不再判断\n });\n } else {\n ensureDirSync(path.dirname(destPath));\n if (!packedFiles.includes(path.relative(gameEntry, srcPath).replace(/\\\\/g, '/'))) {\n fs.copyFileSync(srcPath, destPath);\n }\n }\n }\n}\n","import path from 'path';\nimport { BuildConfig } from '@typings';\nimport {\n logger,\n removeEmptyDir,\n asyncPool,\n getPackTranslator,\n} from '@utils';\nimport { setup } from './setup';\nimport { flattenMaps, collectMaps } from './collectMaps';\nimport { collectDeps } from './collectDeps';\nimport { pack } from './pack';\nimport { partition } from './partition';\n\nexport async function makePkgs(\n config: BuildConfig,\n) {\n const t = getPackTranslator();\n const { entry: gameEntry, output: gameOutput } = config;\n let startTime = Date.now();\n logger.info(t('log.makePkgs.start', { startTime }));\n const { packages } = await setup(config);\n const allDeps = await collectDeps(config, packages);\n const allMaps = collectMaps(config, packages);\n const pkgOutput = {};\n\n /**\n * 基于 asyncPool 并发打包\n */\n\n await asyncPool(10, Object.keys(allMaps), async pkgName => {\n logger.info(t('log.makePkgs.startPackBySource', { pkgName }));\n let startTime = Date.now();\n const pkgConfig = packages[pkgName];\n const pkgRoot = path.join(gameEntry, pkgConfig.root);\n const destRoot = path.join(gameOutput, pkgName, pkgConfig.root);\n\n /**\n * 打包\n */\n await pack({\n gameEntry,\n allDeps,\n allMaps,\n pkgName,\n pkgConfig,\n destRoot,\n config,\n });\n\n /**\n * 分包\n */\n await partition({\n gameEntry,\n gameOutput,\n pkgRoot,\n destRoot,\n packedFiles: flattenMaps(allMaps),\n skipDirs: Object.values(packages)?.map(item => item.root) || [],\n });\n\n const pkgRootDir = path.join(gameOutput, pkgName);\n removeEmptyDir(pkgRootDir);\n logger.info(t('log.makePkgs.finishPackBySource', { pkgName }));\n logger.info(t('log.makePkgs.packBySourceCost', {\n pkgName,\n duration: Date.now() - startTime,\n }));\n });\n\n /**\n * build open data context\n */\n logger.info(t('log.makePkgs.startOpenData'));\n startTime = Date.now();\n\n logger.info(t('log.makePkgs.finishOpenData'));\n logger.info(t('log.makePkgs.openDataCost', {\n duration: Date.now() - startTime,\n }));\n\n logger.info(t('log.makePkgs.end', {\n duration: Date.now() - startTime,\n }));\n\n return pkgOutput;\n}\n","import path from 'path';\nimport fs from 'fs';\nimport { logger } from '@utils';\nimport { ProjectConfig } from '@typings';\nimport { GAME_PACK_CONFIG_FILE_NAME } from '@constants';\n\n/**\n * 将 packages 中的每个 package 下的文件内容合并到 outputDir 下,不保留 package name\n * @param outputDir 输出目录\n */\nexport async function mergePkgs(outputDir: string) {\n logger.info('mergePkgs start');\n const gamePackConfigPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);\n let gamePackConfig: ProjectConfig;\n try {\n gamePackConfig = JSON.parse(fs.readFileSync(gamePackConfigPath, 'utf-8'));\n } catch (err) {\n logger.error(\n `读取配置文件失败: ${gamePackConfigPath}, err: ${err.message}`,\n );\n return;\n }\n\n const packages = gamePackConfig.packages;\n if (!packages || typeof packages !== 'object') {\n logger.error('配置文件中 packages 字段无效, 请检查配置');\n return;\n }\n\n for (const pkgName of Object.keys(packages)) {\n const pkgDir = path.join(outputDir, pkgName);\n if (!fs.existsSync(pkgDir)) {\n logger.warn(`package 目录不存在: ${pkgDir}`);\n continue;\n }\n\n const files = await fs.promises.readdir(pkgDir);\n for (const file of files) {\n const srcPath = path.join(pkgDir, file);\n const destPath = path.join(outputDir, file);\n\n try {\n const stat = await fs.promises.stat(srcPath);\n if (stat.isFile()) {\n await fs.promises.copyFile(srcPath, destPath);\n // 复制好了之后就删除\n await fs.promises.rm(srcPath, {\n recursive: true,\n force: true,\n });\n } else if (stat.isDirectory()) {\n await fs.promises.cp(srcPath, destPath, { recursive: true });\n // 复制好了之后就删除\n await fs.promises.rm(srcPath, { recursive: true, force: true }); \n } else if (stat.isSymbolicLink()) {\n const linkTarget = fs.readlinkSync(srcPath);\n // 判断目标是否已存在符号链接\n if (fs.existsSync(destPath)) {\n await fs.promises.rm(destPath, { force: true });\n }\n await fs.promises.symlink(\n linkTarget,\n destPath,\n stat.isDirectory() ? 'dir' : 'file',\n );\n }\n logger.info(`合并文件/目录: ${srcPath} -> ${destPath}`);\n } catch (err) {\n logger.error(`处理文件失败: ${srcPath}, err: ${err.message}`);\n }\n }\n /**\n * 如果最后 pkgDir 为空,就删除 \n */\n if (fs.readdirSync(pkgDir).length === 0) {\n fs.rmSync(pkgDir, { recursive: true, force: true });\n logger.info(`已删除 package 目录: ${pkgDir}`);\n }\n }\n\n logger.info('mergePkgs 完成');\n}\n","import { removeSystemUseless } from '@utils';\nimport { BuildConfig } from '@typings';\nexport async function clearPkgs(\n config: BuildConfig,\n uselessDirs = ['node_modules', '__MACOSX'],\n) {\n removeSystemUseless(config.entry, uselessDirs);\n}\n","import fs from 'fs';\nimport path from 'path';\nimport {\n logger,\n createPackTranslator,\n setPackRuntimeLanguage,\n} from '@utils';\nimport { GAME_PACK_CONFIG_FILE_NAME } from '@constants';\nimport { BuildConfig, CheckResult, ProjectConfig, PackContext } from '@typings';\nimport { checkPkgs } from '../checkPkgs';\nimport { clearPkgs } from '../clearPkgs';\nimport { mergePkgs } from '../mergePkgs';\nimport { makePkgs } from '../makePkgs';\n\nexport async function debugPkgs(\n config: BuildConfig,\n context: PackContext = {},\n): Promise<{\n isSuccess: boolean;\n errorMsg?: string;\n packages?: ProjectConfig['packages'];\n checkResults?: CheckResult[];\n}> {\n setPackRuntimeLanguage(context?.lang);\n const t = createPackTranslator(context?.lang);\n const {\n output: outputDir,\n dev: { enableLog },\n } = config;\n logger.init(outputDir, enableLog);\n\n try {\n /**\n * 清理\n */\n\n clearPkgs(config);\n /**\n * 校验\n */\n const checkResults = await checkPkgs(\n config,\n context,\n );\n\n /**\n * 如果有任何 error 类型的校验项失败,则不再继续后续流程,直接返回错误\n */\n const errorResults = checkResults.filter(\n item => !item.passed && item.level === 'error',\n );\n if (errorResults.length > 0) {\n const errorMsg = errorResults\n .map(item => `[${item.name || item.type}] ${item.msg}`)\n .join('\\n');\n return {\n isSuccess: false,\n errorMsg: t('debug.validation.failed', { errorMsg }),\n checkResults,\n };\n }\n\n /**\n * 打包\n */\n await makePkgs(config);\n\n /**\n * 合并\n */\n await mergePkgs(outputDir);\n\n /**\n * 返回 packageConfig\n */\n const packageConfig = fs.readFileSync(\n path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME),\n 'utf-8',\n );\n const packageConfigJson = JSON.parse(packageConfig);\n return {\n isSuccess: true,\n packages: packageConfigJson.packages,\n checkResults,\n };\n } catch (error) {\n return {\n isSuccess: false,\n errorMsg: error.message,\n };\n }\n}\n","import { logger, setPackRuntimeLanguage, getPackTranslator } from '@utils';\nimport { TTMG_TEMP_DIR } from '@constants';\nimport { BuildConfig, PackContext } from '@typings';\nimport { checkPkgs } from '../checkPkgs';\nimport { makePkgs } from '../makePkgs';\nimport { makeOdrPkgs } from '../odrPkgs';\nimport { clearPkgs } from '../clearPkgs';\n\nexport async function buildPkgs(\n config: BuildConfig,\n context: PackContext = {},\n) {\n setPackRuntimeLanguage(context?.lang);\n const t = getPackTranslator();\n const { output: outputDir, build } = config;\n let startTime = Date.now();\n logger.init(outputDir, true);\n logger.info(t('log.build.version', {\n version: process.env.TTMG_PACK_VERSION,\n }));\n logger.info(t('log.build.start', { startTime }));\n\n /**\n * 清理\n */\n await clearPkgs(config, ['node_modules', '__MACOSX', TTMG_TEMP_DIR]);\n\n /**\n * 校验\n */\n await checkPkgs(\n config,\n context,\n );\n\n /**\n * 打包\n */\n await makePkgs(config);\n\n if (build?.enableOdr) {\n /**\n * 等待文件全部读写完成后\n */\n await makeOdrPkgs(outputDir);\n /**\n * 分拆 odr 包\n */\n }\n\n logger.info(t('log.build.end', { duration: Date.now() - startTime }));\n}\n","import path from 'path';\nimport { GAME_MAIN_PACKAGE_NAME } from '@constants';\nimport type { GetPkgsResult } from '@typings';\nimport {\n getDirSizeSync,\n getIndependentPackagesConfig,\n getMainPkgSize,\n getProjectSize,\n getGameEngine,\n getWasmBrCodePath,\n getWasmBrCodeMd5,\n} from '@utils';\n\nexport async function getPkgs({\n entryDir,\n}: {\n entryDir: string;\n}): Promise<GetPkgsResult> {\n const independentPackages = getIndependentPackagesConfig(entryDir);\n /**\n *\n */\n const packages: GetPkgsResult['packages'] = [\n {\n type: 'main',\n size: getMainPkgSize({ entryDir }),\n name: GAME_MAIN_PACKAGE_NAME,\n root: '',\n },\n ...independentPackages.map(sub => ({\n type: 'independent',\n size: getDirSizeSync({\n rootDir: entryDir,\n entryDir: path.join(entryDir, sub.root),\n }),\n name: sub.name,\n root: sub.root,\n })),\n ];\n const wasmCodePath = getWasmBrCodePath({ entryDir });\n if (wasmCodePath) {\n const wasmBrCodeMd5 = getWasmBrCodeMd5({ entryDir });\n packages.push({\n type: 'wasmcode',\n name: 'wasmcode',\n root: wasmCodePath,\n md5: wasmBrCodeMd5,\n });\n }\n return {\n size: getProjectSize({\n entryDir,\n }),\n engine: getGameEngine(entryDir),\n packages,\n };\n}\n"],"names":["asyncPool","build","writeFileSync","path","fs","defaultCheckConfig","Bundle"],"mappings":"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"}
|
package/dist/typings/index.d.ts
CHANGED
|
@@ -40,11 +40,22 @@ export type PackLang = 'en-US' | 'zh-CN';
|
|
|
40
40
|
export interface PackContext {
|
|
41
41
|
lang?: PackLang;
|
|
42
42
|
}
|
|
43
|
+
export interface CheckDetail {
|
|
44
|
+
/**
|
|
45
|
+
* 可选的文档/指南链接,用于在 IDE/CLI 中透出更多信息。
|
|
46
|
+
*/
|
|
47
|
+
link?: string;
|
|
48
|
+
/**
|
|
49
|
+
* 可选的展示文案(如“查看分包文档”),若缺省则由上层决定展示方式。
|
|
50
|
+
*/
|
|
51
|
+
text?: string;
|
|
52
|
+
}
|
|
43
53
|
export interface CheckSizeResult {
|
|
44
54
|
passed: boolean;
|
|
45
55
|
msg: string;
|
|
46
56
|
type: 'size';
|
|
47
57
|
level?: 'error' | 'warning' | 'info';
|
|
58
|
+
detail?: CheckDetail;
|
|
48
59
|
size: number;
|
|
49
60
|
name: string;
|
|
50
61
|
required: boolean;
|
|
@@ -55,6 +66,7 @@ export interface CheckConfigResult {
|
|
|
55
66
|
msg: string;
|
|
56
67
|
type: 'config';
|
|
57
68
|
level?: 'error' | 'warning' | 'info';
|
|
69
|
+
detail?: CheckDetail;
|
|
58
70
|
file: string;
|
|
59
71
|
name: string;
|
|
60
72
|
required: boolean;
|
|
@@ -67,6 +79,7 @@ export interface CheckAPIResult {
|
|
|
67
79
|
msg: string;
|
|
68
80
|
type: 'api';
|
|
69
81
|
level?: 'error' | 'warning' | 'info';
|
|
82
|
+
detail?: CheckDetail;
|
|
70
83
|
name: string;
|
|
71
84
|
required: boolean;
|
|
72
85
|
dimension: CheckDimension;
|
|
@@ -87,6 +100,7 @@ export interface CheckPerfResult {
|
|
|
87
100
|
msg: string;
|
|
88
101
|
type: 'performance';
|
|
89
102
|
level?: 'error' | 'warning' | 'info';
|
|
103
|
+
detail?: CheckDetail;
|
|
90
104
|
name: string;
|
|
91
105
|
required: boolean;
|
|
92
106
|
dimension: CheckDimension;
|
package/dist/utils/i18n.d.ts
CHANGED
|
@@ -55,6 +55,7 @@ declare const messages: {
|
|
|
55
55
|
readonly 'check.project.size.success': "Project size check passed: {sizeMB}MB.";
|
|
56
56
|
readonly 'check.project.perf.noSplitNeeded': "wasmFuncCount < {limit}. No wasm code splitting is needed.";
|
|
57
57
|
readonly 'check.project.perf.needSplit': "The Wasm function count in wasmcode/ exceeds {limit}. Please enable code splitting to optimize performance.";
|
|
58
|
+
readonly 'check.project.perf.doc': "View wasm split guide";
|
|
58
59
|
readonly 'check.project.perf.splitEnabled': "wasmFuncCount >= {limit}, and wasm split is enabled.";
|
|
59
60
|
readonly 'check.main.size.failed': "Main package size check failed: {sizeMB}MB. It must not exceed {limitMB}MB.";
|
|
60
61
|
readonly 'check.main.size.success': "Main package size check passed: {sizeMB}MB.";
|
|
@@ -128,6 +129,7 @@ declare const messages: {
|
|
|
128
129
|
readonly 'check.project.size.success': "项目大小检查通过:当前 {sizeMB}MB。";
|
|
129
130
|
readonly 'check.project.perf.noSplitNeeded': "wasmFuncCount < {limit},无需进行 wasm 代码拆分。";
|
|
130
131
|
readonly 'check.project.perf.needSplit': "wasmcode/ 中的 Wasm 函数数量超过 {limit},请开启代码拆分以优化性能。";
|
|
132
|
+
readonly 'check.project.perf.doc': "查看分包文档";
|
|
131
133
|
readonly 'check.project.perf.splitEnabled': "wasmFuncCount >= {limit},且已开启 wasm 拆分。";
|
|
132
134
|
readonly 'check.main.size.failed': "主包大小检查失败:当前 {sizeMB}MB,不能超过 {limitMB}MB。";
|
|
133
135
|
readonly 'check.main.size.success': "主包大小检查通过:当前 {sizeMB}MB。";
|