ttmg-pack 0.3.4 → 0.3.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 +359 -0
- package/dist/index.js +197 -302
- package/dist/index.js.map +1 -1
- package/dist/libs/buildPkgs/index.d.ts +0 -1
- package/dist/libs/buildPlugins/index.d.ts +1 -1
- package/dist/libs/checkPkgs/checkAPI.d.ts +1 -4
- package/dist/libs/checkPkgs/checkIndependentPackages.d.ts +3 -2
- package/dist/libs/checkPkgs/checkMainpackage.d.ts +3 -9
- package/dist/libs/checkPkgs/checkPkgPath.d.ts +1 -0
- package/dist/libs/checkPkgs/checkProject.d.ts +3 -4
- package/dist/libs/checkPkgs/checkSubpackages.d.ts +1 -1
- package/dist/libs/checkPkgs/index.d.ts +1 -4
- package/dist/libs/clearPkgs/index.d.ts +2 -1
- package/dist/libs/extractPkgs/hasAnyNodeModulesShallow.d.ts +1 -0
- package/dist/libs/extractPkgs/index.d.ts +6 -0
- package/dist/libs/index.d.ts +1 -0
- package/dist/libs/makePkgs/collectDeps.d.ts +3 -2
- package/dist/libs/makePkgs/collectMaps.d.ts +2 -2
- package/dist/libs/makePkgs/extract/NodeModuleExtractor.d.ts +39 -0
- package/dist/libs/makePkgs/extract/hasAnyNodeModulesShallow.d.ts +1 -0
- package/dist/libs/makePkgs/extract/index.d.ts +6 -0
- package/dist/libs/makePkgs/extract.d.ts +4 -0
- package/dist/libs/makePkgs/index.d.ts +1 -10
- package/dist/libs/makePkgs/setup.d.ts +14 -5
- package/dist/libs/makePlugins/collectPluginMaps.d.ts +2 -0
- package/dist/libs/makePlugins/index.d.ts +6 -0
- package/dist/libs/makePlugins/packPlugin.d.ts +13 -0
- package/dist/typings/index.d.ts +3 -0
- package/dist/utils/NodeModuleExtractor.d.ts +38 -0
- package/dist/utils/overrideConfig.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ==========================================
|
|
3
3
|
* @Description: ttmg pack
|
|
4
|
-
* @Version: 0.3.
|
|
4
|
+
* @Version: 0.3.6
|
|
5
5
|
* @Author: zhanghongyang.mocha
|
|
6
|
-
* @Date: 2026-02-
|
|
6
|
+
* @Date: 2026-02-28 16:23:17
|
|
7
7
|
* ==========================================
|
|
8
8
|
*/
|
|
9
9
|
'use strict';
|
|
@@ -390,10 +390,12 @@ function getIndependentPackagesConfig(entryDir) {
|
|
|
390
390
|
}
|
|
391
391
|
|
|
392
392
|
function getMainPkgSize({ entryDir }) {
|
|
393
|
+
// 先获取分包根目录,这样如果有 subPackages 配置错误,会在这里抛出
|
|
394
|
+
const subpackagesRoots = getSubpackagesRoots(entryDir);
|
|
393
395
|
return getDirSizeSync({
|
|
394
396
|
rootDir: entryDir,
|
|
395
397
|
entryDir,
|
|
396
|
-
filterDirs: [...
|
|
398
|
+
filterDirs: [...subpackagesRoots, ...USELESS_DIRS],
|
|
397
399
|
});
|
|
398
400
|
}
|
|
399
401
|
function getSubpackagesRoots(entryDir) {
|
|
@@ -401,6 +403,10 @@ function getSubpackagesRoots(entryDir) {
|
|
|
401
403
|
const originConfigPath = path.join(entryDir, GAME_ORIGIN_CONFIG_FILE_NAME);
|
|
402
404
|
try {
|
|
403
405
|
const originConfig = JSON.parse(fs.readFileSync(originConfigPath, 'utf8'));
|
|
406
|
+
// 检查是否使用了小驼峰命名
|
|
407
|
+
if (originConfig.subPackages) {
|
|
408
|
+
throw new Error('Error: \'subPackages\' is found in game.json. Please use \'subpackages\' (all lowercase) instead.');
|
|
409
|
+
}
|
|
404
410
|
const roots = ((_a = originConfig.subpackages) === null || _a === void 0 ? void 0 : _a.map((item) => item.root)) ||
|
|
405
411
|
[];
|
|
406
412
|
/**
|
|
@@ -409,7 +415,7 @@ function getSubpackagesRoots(entryDir) {
|
|
|
409
415
|
return roots.map(root => root.replace(/^\/|\/$/g, ''));
|
|
410
416
|
}
|
|
411
417
|
catch (e) {
|
|
412
|
-
|
|
418
|
+
throw e;
|
|
413
419
|
}
|
|
414
420
|
}
|
|
415
421
|
|
|
@@ -629,40 +635,6 @@ function getCheckConfig(config) {
|
|
|
629
635
|
}
|
|
630
636
|
}
|
|
631
637
|
|
|
632
|
-
function copyDirectory(src, dest) {
|
|
633
|
-
try {
|
|
634
|
-
if (!fs.existsSync(dest)) {
|
|
635
|
-
fs.mkdirSync(dest, { recursive: true });
|
|
636
|
-
}
|
|
637
|
-
const items = fs.readdirSync(src);
|
|
638
|
-
const normalizedDest = path.resolve(dest) + path.sep;
|
|
639
|
-
items.forEach(item => {
|
|
640
|
-
const srcPath = path.join(src, item);
|
|
641
|
-
const destPath = path.join(dest, item);
|
|
642
|
-
// 检查当前要处理的源路径是否就是目标路径
|
|
643
|
-
// 这可以防止将目标目录本身复制到自身中
|
|
644
|
-
if (path.resolve(srcPath) === path.resolve(dest)) {
|
|
645
|
-
return; // 跳过目标目录本身
|
|
646
|
-
}
|
|
647
|
-
// 获取文件状态
|
|
648
|
-
const stat = fs.statSync(srcPath);
|
|
649
|
-
if (stat.isFile()) {
|
|
650
|
-
// 复制文件
|
|
651
|
-
fs.copyFileSync(srcPath, destPath);
|
|
652
|
-
}
|
|
653
|
-
else if (stat.isDirectory()) {
|
|
654
|
-
const childNormalizedSrc = path.resolve(srcPath) + path.sep;
|
|
655
|
-
if (!normalizedDest.startsWith(childNormalizedSrc)) {
|
|
656
|
-
copyDirectory(srcPath, destPath);
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
});
|
|
660
|
-
}
|
|
661
|
-
catch (error) {
|
|
662
|
-
logger.error(`copyDirectory error: ${error}`);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
|
|
666
638
|
/**
|
|
667
639
|
* 将 packageConfig packages 中 分拆的包 配置迁移到 odr_packages 中
|
|
668
640
|
*/
|
|
@@ -918,40 +890,50 @@ const defaultCheckConfig$3 = {
|
|
|
918
890
|
name: 'project',
|
|
919
891
|
dimension: CHECK_DIMENSION.Project,
|
|
920
892
|
};
|
|
921
|
-
function checkProject(
|
|
893
|
+
function checkProject(config) {
|
|
922
894
|
logger.info('start check project');
|
|
923
|
-
const
|
|
924
|
-
const
|
|
925
|
-
// const projectConfigCheckResult = checkProjectConfig(entryDir, config);
|
|
895
|
+
const gameJsonCheckResult = checkGameJson(config);
|
|
896
|
+
const checkSizeResult = checkProjectSize(config);
|
|
926
897
|
const result = [
|
|
927
|
-
checkSizeResult,
|
|
928
898
|
gameJsonCheckResult,
|
|
929
|
-
|
|
899
|
+
checkSizeResult,
|
|
930
900
|
];
|
|
931
901
|
if (result.every(item => item.passed)) {
|
|
932
902
|
logger.info('check project successfully');
|
|
933
903
|
}
|
|
934
904
|
return result;
|
|
935
905
|
}
|
|
936
|
-
function checkGameJson(
|
|
937
|
-
var _a;
|
|
906
|
+
function checkGameJson(config) {
|
|
907
|
+
var _a, _b;
|
|
938
908
|
logger.info('start check config');
|
|
939
|
-
const gameJsonPath = path.join(
|
|
909
|
+
const gameJsonPath = path.join(config.entry, GAME_ORIGIN_CONFIG_FILE_NAME);
|
|
940
910
|
if (!fs.existsSync(gameJsonPath)) {
|
|
941
911
|
const errMsg = 'Can not find game.json in game source code, please check it';
|
|
942
912
|
logger.error(errMsg);
|
|
943
913
|
if ((_a = config === null || config === void 0 ? void 0 : config.dev) === null || _a === void 0 ? void 0 : _a.enable) {
|
|
944
914
|
console.log('\x1b[1m\x1b[33m%s\x1b[0m', `❗️ ${errMsg}`);
|
|
945
|
-
return Object.assign({ passed: false, msg: errMsg, type: 'config', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$3);
|
|
915
|
+
return Object.assign({ passed: false, msg: errMsg, type: 'config', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME, name: 'project' }, defaultCheckConfig$3);
|
|
946
916
|
}
|
|
947
917
|
else {
|
|
948
918
|
throw new Error(errMsg);
|
|
949
919
|
}
|
|
950
920
|
}
|
|
951
921
|
else {
|
|
922
|
+
const gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));
|
|
923
|
+
if (gameJson.subPackages) {
|
|
924
|
+
const errMsg = `Error: 'subPackages' is found in ${GAME_ORIGIN_CONFIG_FILE_NAME}. Please use 'subpackages' (all lowercase) instead.`;
|
|
925
|
+
if ((_b = config === null || config === void 0 ? void 0 : config.dev) === null || _b === void 0 ? void 0 : _b.enable) {
|
|
926
|
+
logger.error(errMsg);
|
|
927
|
+
console.log('\x1b[1m\x1b[33m%s\x1b[0m', `❗️ ${errMsg}`);
|
|
928
|
+
return Object.assign({ passed: false, msg: errMsg, type: 'config', name: 'project', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$3);
|
|
929
|
+
}
|
|
930
|
+
else {
|
|
931
|
+
throw new Error(errMsg);
|
|
932
|
+
}
|
|
933
|
+
}
|
|
952
934
|
const msg = 'Check game.json config successfully';
|
|
953
935
|
logger.info(msg);
|
|
954
|
-
return Object.assign({ passed: true, msg,
|
|
936
|
+
return Object.assign({ passed: true, msg, type: 'config', level: 'info', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$3);
|
|
955
937
|
}
|
|
956
938
|
}
|
|
957
939
|
/**
|
|
@@ -959,9 +941,9 @@ function checkGameJson(entryDir, config) {
|
|
|
959
941
|
* @param param0
|
|
960
942
|
* @returns
|
|
961
943
|
*/
|
|
962
|
-
function checkProjectSize(
|
|
944
|
+
function checkProjectSize(config) {
|
|
963
945
|
logger.info('start check project size');
|
|
964
|
-
const { dev } = config;
|
|
946
|
+
const { entry: entryDir, dev } = config;
|
|
965
947
|
const { pkgSizeLimit } = getCheckConfig(config);
|
|
966
948
|
const enableDev = dev === null || dev === void 0 ? void 0 : dev.enable;
|
|
967
949
|
const gameSize = getProjectSize({ entryDir });
|
|
@@ -972,7 +954,7 @@ function checkProjectSize(entryDir, config) {
|
|
|
972
954
|
logger.error(errMsg);
|
|
973
955
|
if (enableDev) {
|
|
974
956
|
console.log('\x1b[1m\x1b[33m%s\x1b[0m', errMsg);
|
|
975
|
-
return Object.assign({ passed: false, msg: errMsg, type: 'size', size: gameSize }, defaultCheckConfig$3);
|
|
957
|
+
return Object.assign({ passed: false, name: 'project', msg: errMsg, type: 'size', level: 'warning', size: gameSize }, defaultCheckConfig$3);
|
|
976
958
|
}
|
|
977
959
|
else {
|
|
978
960
|
throw new Error(errMsg);
|
|
@@ -984,7 +966,7 @@ function checkProjectSize(entryDir, config) {
|
|
|
984
966
|
*/
|
|
985
967
|
const logMsg = `Check project size successfully, size: ${gameSizeMB}MB`;
|
|
986
968
|
logger.info(logMsg);
|
|
987
|
-
return Object.assign({ passed: true, msg: logMsg, name: 'project', type: 'size', size: gameSize }, defaultCheckConfig$3);
|
|
969
|
+
return Object.assign({ passed: true, msg: logMsg, name: 'project', type: 'size', level: 'info', size: gameSize }, defaultCheckConfig$3);
|
|
988
970
|
}
|
|
989
971
|
}
|
|
990
972
|
|
|
@@ -997,9 +979,9 @@ const defaultCheckConfig$2 = {
|
|
|
997
979
|
* @param param0
|
|
998
980
|
* @returns
|
|
999
981
|
*/
|
|
1000
|
-
function checkMainPackageSize(
|
|
982
|
+
function checkMainPackageSize(config) {
|
|
1001
983
|
logger.info('start check main package size');
|
|
1002
|
-
const { dev } = config;
|
|
984
|
+
const { entry: entryDir, dev } = config;
|
|
1003
985
|
const { mainPkgSizeLimit } = getCheckConfig(config);
|
|
1004
986
|
const mainPkgSize = getMainPkgSize({ entryDir });
|
|
1005
987
|
const mainPkgSizeMB = (mainPkgSize / (1024 * 1024)).toFixed(2);
|
|
@@ -1009,47 +991,42 @@ function checkMainPackageSize({ entryDir, config, }) {
|
|
|
1009
991
|
logger.error(errMsg);
|
|
1010
992
|
if (dev === null || dev === void 0 ? void 0 : dev.enable) {
|
|
1011
993
|
console.log('\x1b[1m\x1b[33m%s\x1b[0m', `❗️ ${errMsg}`);
|
|
1012
|
-
return Object.assign({ passed: false, msg: errMsg, size: mainPkgSize, type: 'size' }, defaultCheckConfig$2);
|
|
994
|
+
return Object.assign({ passed: false, msg: errMsg, size: mainPkgSize, type: 'size', level: 'warning' }, defaultCheckConfig$2);
|
|
1013
995
|
}
|
|
1014
996
|
else {
|
|
1015
997
|
throw new Error(errMsg);
|
|
1016
998
|
}
|
|
1017
999
|
}
|
|
1018
1000
|
else {
|
|
1019
|
-
return Object.assign({ passed: true, msg: `Check main package size successfully, size: ${mainPkgSizeMB}MB`, size: mainPkgSize, type: 'size' }, defaultCheckConfig$2);
|
|
1001
|
+
return Object.assign({ passed: true, msg: `Check main package size successfully, size: ${mainPkgSizeMB}MB`, size: mainPkgSize, type: 'size', level: 'info' }, defaultCheckConfig$2);
|
|
1020
1002
|
}
|
|
1021
1003
|
}
|
|
1022
|
-
function checkMainPackageEntry(
|
|
1004
|
+
function checkMainPackageEntry(config) {
|
|
1023
1005
|
var _a;
|
|
1024
1006
|
logger.info('start check main package entry');
|
|
1007
|
+
const { entry: entryDir } = config;
|
|
1025
1008
|
const gameJsPath = path__namespace.join(entryDir, 'game.js');
|
|
1026
1009
|
if (!fs__namespace.existsSync(gameJsPath)) {
|
|
1027
1010
|
const errMsg = 'Check main package entry failed, game.js must exist in main package!';
|
|
1028
1011
|
logger.error(errMsg);
|
|
1029
1012
|
if ((_a = config.dev) === null || _a === void 0 ? void 0 : _a.enable) {
|
|
1030
1013
|
console.log('\x1b[1m\x1b[33m%s\x1b[0m', errMsg);
|
|
1031
|
-
return Object.assign({ passed: false, msg: errMsg, type: 'config', file: 'game.js' }, defaultCheckConfig$2);
|
|
1014
|
+
return Object.assign({ passed: false, msg: errMsg, type: 'config', level: 'error', file: 'game.js' }, defaultCheckConfig$2);
|
|
1032
1015
|
}
|
|
1033
1016
|
}
|
|
1034
1017
|
logger.info('check game.js successfully');
|
|
1035
|
-
return Object.assign({ passed: true, msg: 'Check main package entry successfully, game.js must exist in main package!', type: 'config', file: 'game.js' }, defaultCheckConfig$2);
|
|
1018
|
+
return Object.assign({ passed: true, msg: 'Check main package entry successfully, game.js must exist in main package!', type: 'config', level: 'info', file: 'game.js' }, defaultCheckConfig$2);
|
|
1036
1019
|
}
|
|
1037
|
-
function checkMainPackage(
|
|
1020
|
+
function checkMainPackage(config) {
|
|
1038
1021
|
var _a;
|
|
1039
1022
|
const checkResults = [];
|
|
1040
1023
|
logger.info('start check main package');
|
|
1041
1024
|
/**
|
|
1042
1025
|
* 检查 game.js 是否存在
|
|
1043
1026
|
*/
|
|
1044
|
-
checkResults.push(checkMainPackageEntry(
|
|
1045
|
-
entryDir,
|
|
1046
|
-
config,
|
|
1047
|
-
}));
|
|
1027
|
+
checkResults.push(checkMainPackageEntry(config));
|
|
1048
1028
|
if ((_a = getCheckConfig(config)) === null || _a === void 0 ? void 0 : _a.mainPkgSizeLimit) {
|
|
1049
|
-
checkResults.push(checkMainPackageSize(
|
|
1050
|
-
entryDir,
|
|
1051
|
-
config,
|
|
1052
|
-
}));
|
|
1029
|
+
checkResults.push(checkMainPackageSize(config));
|
|
1053
1030
|
}
|
|
1054
1031
|
if (checkResults.every(item => item.passed)) {
|
|
1055
1032
|
logger.info('Check main package successfully');
|
|
@@ -1067,7 +1044,8 @@ const defaultCheckConfig$1 = {
|
|
|
1067
1044
|
name: 'subpackage',
|
|
1068
1045
|
dimension: 'subpackage',
|
|
1069
1046
|
};
|
|
1070
|
-
function checkSubpackages(
|
|
1047
|
+
function checkSubpackages(config) {
|
|
1048
|
+
const { entry: entryDir } = config;
|
|
1071
1049
|
const checkResults = [];
|
|
1072
1050
|
/**
|
|
1073
1051
|
* 校验 subpackage 大小
|
|
@@ -1085,7 +1063,7 @@ function checkSubpackages(entryDir, config) {
|
|
|
1085
1063
|
logger.error(errMsg);
|
|
1086
1064
|
if ((_a = config === null || config === void 0 ? void 0 : config.dev) === null || _a === void 0 ? void 0 : _a.enable) {
|
|
1087
1065
|
console.log('\x1b[1m\x1b[33m%s\x1b[0m', `❗️ ${errMsg}`);
|
|
1088
|
-
checkResults.push(Object.assign({ passed: false, msg: errMsg, type: 'config', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1066
|
+
checkResults.push(Object.assign({ passed: false, msg: errMsg, type: 'config', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1089
1067
|
}
|
|
1090
1068
|
else {
|
|
1091
1069
|
throw new Error(errMsg);
|
|
@@ -1096,14 +1074,14 @@ function checkSubpackages(entryDir, config) {
|
|
|
1096
1074
|
logger.error(errMsg);
|
|
1097
1075
|
if ((_b = config === null || config === void 0 ? void 0 : config.dev) === null || _b === void 0 ? void 0 : _b.enable) {
|
|
1098
1076
|
console.log('\x1b[1m\x1b[33m%s\x1b[0m', `❗️ ${errMsg}`);
|
|
1099
|
-
checkResults.push(Object.assign({ passed: false, msg: errMsg, type: 'config', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1077
|
+
checkResults.push(Object.assign({ passed: false, msg: errMsg, type: 'config', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1100
1078
|
}
|
|
1101
1079
|
else {
|
|
1102
1080
|
throw new Error(errMsg);
|
|
1103
1081
|
}
|
|
1104
1082
|
}
|
|
1105
1083
|
else {
|
|
1106
|
-
checkResults.push(Object.assign({ passed: true, msg: `Check subpackage<${sub.name}> config successfully`, type: 'config', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1084
|
+
checkResults.push(Object.assign({ passed: true, msg: `Check subpackage<${sub.name}> config successfully`, type: 'config', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1107
1085
|
}
|
|
1108
1086
|
/**
|
|
1109
1087
|
* 校验 subpackage 配置是否有效
|
|
@@ -1115,14 +1093,14 @@ function checkSubpackages(entryDir, config) {
|
|
|
1115
1093
|
logger.error(errMsg);
|
|
1116
1094
|
if ((_c = config === null || config === void 0 ? void 0 : config.dev) === null || _c === void 0 ? void 0 : _c.enable) {
|
|
1117
1095
|
console.log('\x1b[1m\x1b[33m%s\x1b[0m', `❗️ ${errMsg}`);
|
|
1118
|
-
checkResults.push(Object.assign({ passed: false, msg: errMsg, type: 'config', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1096
|
+
checkResults.push(Object.assign({ passed: false, msg: errMsg, type: 'config', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1119
1097
|
}
|
|
1120
1098
|
else {
|
|
1121
1099
|
throw new Error(errMsg);
|
|
1122
1100
|
}
|
|
1123
1101
|
}
|
|
1124
1102
|
else {
|
|
1125
|
-
checkResults.push(Object.assign({ passed: true, msg: `Check subpackage<${sub.name}> config successfully`, type: 'config', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1103
|
+
checkResults.push(Object.assign({ passed: true, msg: `Check subpackage<${sub.name}> config successfully`, type: 'config', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME }, defaultCheckConfig$1));
|
|
1126
1104
|
}
|
|
1127
1105
|
});
|
|
1128
1106
|
if (checkResults.length && checkResults.every(item => item.passed)) {
|
|
@@ -1134,8 +1112,9 @@ function checkSubpackages(entryDir, config) {
|
|
|
1134
1112
|
const defaultCheckConfig = {
|
|
1135
1113
|
dimension: CHECK_DIMENSION.IndependentPackage,
|
|
1136
1114
|
};
|
|
1137
|
-
function checkIndependentPackages(
|
|
1115
|
+
function checkIndependentPackages(config) {
|
|
1138
1116
|
var _a;
|
|
1117
|
+
const { entry: entryDir } = config;
|
|
1139
1118
|
const isEnableDev = (_a = config === null || config === void 0 ? void 0 : config.dev) === null || _a === void 0 ? void 0 : _a.enable;
|
|
1140
1119
|
const checkResults = [];
|
|
1141
1120
|
/**
|
|
@@ -1152,14 +1131,14 @@ function checkIndependentPackages(entryDir, config) {
|
|
|
1152
1131
|
logger.error(errMsg);
|
|
1153
1132
|
if (isEnableDev) {
|
|
1154
1133
|
console.log('\x1b[1m\x1b[33m%s\x1b[0m', `❗️${errMsg}`);
|
|
1155
|
-
checkResults.push(Object.assign(Object.assign({}, defaultCheckConfig), { passed: false, msg: errMsg, type: 'config', file: GAME_ORIGIN_CONFIG_FILE_NAME, name: sub.name }));
|
|
1134
|
+
checkResults.push(Object.assign(Object.assign({}, defaultCheckConfig), { passed: false, msg: errMsg, type: 'config', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME, name: sub.name }));
|
|
1156
1135
|
}
|
|
1157
1136
|
else {
|
|
1158
1137
|
throw new Error(errMsg);
|
|
1159
1138
|
}
|
|
1160
1139
|
}
|
|
1161
1140
|
else {
|
|
1162
|
-
checkResults.push(Object.assign(Object.assign({}, defaultCheckConfig), { passed: true, msg: `Check independent package<${sub.name}> config successfully`, type: 'config', file: GAME_ORIGIN_CONFIG_FILE_NAME, name: sub.name }));
|
|
1141
|
+
checkResults.push(Object.assign(Object.assign({}, defaultCheckConfig), { passed: true, msg: `Check independent package<${sub.name}> config successfully`, type: 'config', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME, name: sub.name }));
|
|
1163
1142
|
}
|
|
1164
1143
|
/**
|
|
1165
1144
|
* 校验 independent subpackage 配置是否有效
|
|
@@ -1171,7 +1150,7 @@ function checkIndependentPackages(entryDir, config) {
|
|
|
1171
1150
|
logger.error(errMsg);
|
|
1172
1151
|
if (isEnableDev) {
|
|
1173
1152
|
console.log('\x1b[1m\x1b[33m%s\x1b[0m', `❗️ ${errMsg}`);
|
|
1174
|
-
checkResults.push(Object.assign(Object.assign({}, defaultCheckConfig), { passed: false, msg: errMsg, type: 'config', file: GAME_ORIGIN_CONFIG_FILE_NAME, name: sub.name }));
|
|
1153
|
+
checkResults.push(Object.assign(Object.assign({}, defaultCheckConfig), { passed: false, msg: errMsg, type: 'config', level: 'error', file: GAME_ORIGIN_CONFIG_FILE_NAME, name: sub.name }));
|
|
1175
1154
|
}
|
|
1176
1155
|
else {
|
|
1177
1156
|
throw new Error(errMsg);
|
|
@@ -1182,6 +1161,7 @@ function checkIndependentPackages(entryDir, config) {
|
|
|
1182
1161
|
passed: true,
|
|
1183
1162
|
msg: `Check independent package<${sub.name}> config successfully`,
|
|
1184
1163
|
type: 'config',
|
|
1164
|
+
level: 'error',
|
|
1185
1165
|
file: GAME_ORIGIN_CONFIG_FILE_NAME,
|
|
1186
1166
|
dimension: CHECK_DIMENSION.IndependentPackage,
|
|
1187
1167
|
name: sub.name,
|
|
@@ -1197,6 +1177,7 @@ function checkIndependentPackages(entryDir, config) {
|
|
|
1197
1177
|
pkgName: sub.name,
|
|
1198
1178
|
limit: independentSubPkgSizeLimit,
|
|
1199
1179
|
dimension: CHECK_DIMENSION.IndependentPackage,
|
|
1180
|
+
level: isEnableDev ? 'warning' : 'error',
|
|
1200
1181
|
});
|
|
1201
1182
|
checkResults.push(checkSizeResult);
|
|
1202
1183
|
logger.info(checkSizeResult.msg);
|
|
@@ -1215,7 +1196,7 @@ function checkIndependentPackages(entryDir, config) {
|
|
|
1215
1196
|
}
|
|
1216
1197
|
return checkResults;
|
|
1217
1198
|
}
|
|
1218
|
-
function checkPkgSize({ entryDir, limit, pkgName, dimension, }) {
|
|
1199
|
+
function checkPkgSize({ entryDir, limit, pkgName, dimension, level, }) {
|
|
1219
1200
|
const size = getDirSizeSync({
|
|
1220
1201
|
rootDir: entryDir,
|
|
1221
1202
|
entryDir,
|
|
@@ -1229,6 +1210,7 @@ function checkPkgSize({ entryDir, limit, pkgName, dimension, }) {
|
|
|
1229
1210
|
? `Check package ${pkgName} size ${sizeMB.toFixed(2)}MB check successfully`
|
|
1230
1211
|
: `Check package ${pkgName} size ${sizeMB.toFixed(2)}MB exceeds limit ${limitMB.toFixed(2)}MB`,
|
|
1231
1212
|
type: 'size',
|
|
1213
|
+
level,
|
|
1232
1214
|
size,
|
|
1233
1215
|
dimension,
|
|
1234
1216
|
name: pkgName,
|
|
@@ -1264,7 +1246,7 @@ const API_LIST = [
|
|
|
1264
1246
|
desc: "Get entrance mission reward"
|
|
1265
1247
|
}
|
|
1266
1248
|
];
|
|
1267
|
-
function checkAPI(
|
|
1249
|
+
function checkAPI(config) {
|
|
1268
1250
|
var _a;
|
|
1269
1251
|
if (!((_a = config === null || config === void 0 ? void 0 : config.build) === null || _a === void 0 ? void 0 : _a.enableAPICheck)) {
|
|
1270
1252
|
return [];
|
|
@@ -1289,7 +1271,7 @@ function checkAPI({ entryDir, config, }) {
|
|
|
1289
1271
|
hitFilesMap.set(name, new Set());
|
|
1290
1272
|
}
|
|
1291
1273
|
// 深度优先遍历
|
|
1292
|
-
const stack = [
|
|
1274
|
+
const stack = [config.entry];
|
|
1293
1275
|
while (stack.length) {
|
|
1294
1276
|
const current = stack.pop();
|
|
1295
1277
|
const stat = fs.statSync(current);
|
|
@@ -1338,6 +1320,7 @@ function checkAPI({ entryDir, config, }) {
|
|
|
1338
1320
|
passed: files.length > 0,
|
|
1339
1321
|
files,
|
|
1340
1322
|
type: 'api',
|
|
1323
|
+
level: 'warning',
|
|
1341
1324
|
required: false,
|
|
1342
1325
|
dimension: 'project',
|
|
1343
1326
|
};
|
|
@@ -1351,28 +1334,28 @@ function escapeRegex(s) {
|
|
|
1351
1334
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
1352
1335
|
}
|
|
1353
1336
|
|
|
1354
|
-
async function checkPkgs(
|
|
1337
|
+
async function checkPkgs(config) {
|
|
1355
1338
|
logger.info('开始校验项目');
|
|
1356
1339
|
/**
|
|
1357
1340
|
* 1. 校验项目
|
|
1358
1341
|
*/
|
|
1359
|
-
const projectCheckResult = checkProject(
|
|
1342
|
+
const projectCheckResult = checkProject(config);
|
|
1360
1343
|
/**
|
|
1361
|
-
* 2.
|
|
1344
|
+
* 2. 如果有,校验分包
|
|
1362
1345
|
*/
|
|
1363
|
-
const
|
|
1346
|
+
const subpackagesCheckResult = checkSubpackages(config);
|
|
1364
1347
|
/**
|
|
1365
|
-
* 3.
|
|
1348
|
+
* 3. 校验主包
|
|
1366
1349
|
*/
|
|
1367
|
-
const
|
|
1350
|
+
const mainPackageCheckResult = checkMainPackage(config);
|
|
1368
1351
|
/**
|
|
1369
1352
|
* 校验独立分包
|
|
1370
1353
|
*/
|
|
1371
|
-
const independentPackagesCheckResult = checkIndependentPackages(
|
|
1354
|
+
const independentPackagesCheckResult = checkIndependentPackages(config);
|
|
1372
1355
|
/**
|
|
1373
1356
|
* 校验 API 调用
|
|
1374
1357
|
*/
|
|
1375
|
-
const apiCheckResult = checkAPI(
|
|
1358
|
+
const apiCheckResult = checkAPI(config);
|
|
1376
1359
|
return [
|
|
1377
1360
|
...projectCheckResult,
|
|
1378
1361
|
...mainPackageCheckResult,
|
|
@@ -1382,7 +1365,8 @@ async function checkPkgs({ entryDir, config, }) {
|
|
|
1382
1365
|
];
|
|
1383
1366
|
}
|
|
1384
1367
|
|
|
1385
|
-
async function setup(
|
|
1368
|
+
async function setup(config) {
|
|
1369
|
+
const { entry: entryDir, output: outputDir } = config;
|
|
1386
1370
|
logger.info('开始基于源代码中的 game.json 生成 packageConfig.json');
|
|
1387
1371
|
const gameJsonPath = path.join(entryDir, GAME_ORIGIN_CONFIG_FILE_NAME);
|
|
1388
1372
|
const gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));
|
|
@@ -1510,7 +1494,8 @@ function collectPkgJsFiles({ entry, root, exts = ['.js', '.ts', '.jsx', '.tsx'],
|
|
|
1510
1494
|
return files;
|
|
1511
1495
|
}
|
|
1512
1496
|
// 构建每个包的 map
|
|
1513
|
-
function collectMaps(
|
|
1497
|
+
function collectMaps(config, packages) {
|
|
1498
|
+
const { entry: entryDir } = config;
|
|
1514
1499
|
logger.info('开始基于游戏源代码收集分包中的 JS 文件');
|
|
1515
1500
|
const result = {};
|
|
1516
1501
|
// 1. 先收集所有分包根目录名(如 subpackages/level1、subpackages/level2)
|
|
@@ -1563,29 +1548,95 @@ function collectMaps(entryDir, packages) {
|
|
|
1563
1548
|
logger.info('基于游戏源代码收集分包中的 JS 文件完成');
|
|
1564
1549
|
return result;
|
|
1565
1550
|
}
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
const
|
|
1577
|
-
|
|
1578
|
-
|
|
1551
|
+
|
|
1552
|
+
/**
|
|
1553
|
+
* 根据 TikTok DevPortal 接口获取插件包信息(url + md5)
|
|
1554
|
+
*
|
|
1555
|
+
* 对应 curl:
|
|
1556
|
+
* POST https://developers.tiktok.com/tiktok/v4/devportal/minigame/plugin_meta/get
|
|
1557
|
+
* body: { plugin_name, plugin_version }
|
|
1558
|
+
*/
|
|
1559
|
+
async function getPluginInfo(params) {
|
|
1560
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
1561
|
+
const baseUrl = (_a = params.baseUrl) !== null && _a !== void 0 ? _a : 'https://developers.tiktok.com';
|
|
1562
|
+
const url = `${baseUrl}/tiktok/v4/devportal/minigame/plugin_meta/get`;
|
|
1563
|
+
const res = await fetch(url, {
|
|
1564
|
+
method: 'POST',
|
|
1565
|
+
headers: Object.assign({ 'Content-Type': 'application/json' }, ((_b = params.headers) !== null && _b !== void 0 ? _b : {})),
|
|
1566
|
+
body: JSON.stringify({
|
|
1567
|
+
plugin_name: params.plugin_name,
|
|
1568
|
+
plugin_version: params.plugin_version,
|
|
1569
|
+
}),
|
|
1579
1570
|
});
|
|
1580
|
-
const
|
|
1581
|
-
result
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
return
|
|
1571
|
+
const json = await res.json();
|
|
1572
|
+
const meta = (_g = (_e = (_c = json === null || json === void 0 ? void 0 : json.PluginMeta) !== null && _c !== void 0 ? _c : (_d = json === null || json === void 0 ? void 0 : json.data) === null || _d === void 0 ? void 0 : _d.PluginMeta) !== null && _e !== void 0 ? _e : (_f = json === null || json === void 0 ? void 0 : json.result) === null || _f === void 0 ? void 0 : _f.PluginMeta) !== null && _g !== void 0 ? _g : (_j = (_h = json === null || json === void 0 ? void 0 : json.data) === null || _h === void 0 ? void 0 : _h.result) === null || _j === void 0 ? void 0 : _j.PluginMeta;
|
|
1573
|
+
if (!(meta === null || meta === void 0 ? void 0 : meta.PackageCDNURL) || !(meta === null || meta === void 0 ? void 0 : meta.PackageMD5)) {
|
|
1574
|
+
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)}`);
|
|
1575
|
+
}
|
|
1576
|
+
return { url: meta.PackageCDNURL, md5: meta.PackageMD5 };
|
|
1577
|
+
}
|
|
1578
|
+
async function addDepsToPackages(gameEntry, outputDir, allDeps) {
|
|
1579
|
+
var _a;
|
|
1580
|
+
const gamePackConfigPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);
|
|
1581
|
+
const gameJsonPath = path.join(gameEntry, GAME_ORIGIN_CONFIG_FILE_NAME);
|
|
1582
|
+
let gamePackConfig;
|
|
1583
|
+
let gameJson;
|
|
1584
|
+
let pluginConfig;
|
|
1585
|
+
try {
|
|
1586
|
+
gamePackConfig = JSON.parse(fs.readFileSync(gamePackConfigPath, 'utf-8'));
|
|
1587
|
+
gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));
|
|
1588
|
+
pluginConfig = gameJson.plugins;
|
|
1589
|
+
}
|
|
1590
|
+
catch (error) {
|
|
1591
|
+
throw new Error('[ttmg-pack] Failed to read package file game.json or packageConfig.json');
|
|
1592
|
+
}
|
|
1593
|
+
const unityDeps = ['data-package', 'StreamingAssets', 'wasmcode', 'wasmcode-android', 'wasmcode-ios'];
|
|
1594
|
+
for (const dep of unityDeps) {
|
|
1595
|
+
// 如果 game.json 的 subpackages 里有这个包,则添加进 __GAME__ 的 dependencies
|
|
1596
|
+
if (((_a = gameJson.subpackages) !== null && _a !== void 0 ? _a : []).some(pkg => pkg.name === dep)) {
|
|
1597
|
+
gamePackConfig.packages[GAME_MAIN_PACKAGE_NAME].dependencies.push(dep);
|
|
1598
|
+
}
|
|
1599
|
+
}
|
|
1600
|
+
for (const [pkgName, plugins] of Object.entries(allDeps)) {
|
|
1601
|
+
for (const pluginName of plugins) {
|
|
1602
|
+
if (!(pluginConfig === null || pluginConfig === void 0 ? void 0 : pluginConfig[pluginName]))
|
|
1603
|
+
continue;
|
|
1604
|
+
const version = pluginConfig[pluginName].version;
|
|
1605
|
+
const pluginPkgName = `${pluginName}_${version}`;
|
|
1606
|
+
const { url, md5 } = await getPluginInfo({
|
|
1607
|
+
plugin_name: pluginName.toLowerCase(),
|
|
1608
|
+
plugin_version: version
|
|
1609
|
+
});
|
|
1610
|
+
gamePackConfig.packages[pkgName].dependencies.push(pluginPkgName);
|
|
1611
|
+
if (!gamePackConfig.packages[pluginPkgName]) {
|
|
1612
|
+
gamePackConfig.packages[pluginPkgName] = {
|
|
1613
|
+
url,
|
|
1614
|
+
md5,
|
|
1615
|
+
root: pluginPkgName,
|
|
1616
|
+
main: `${pluginPkgName}/index.js`,
|
|
1617
|
+
output: `${pluginPkgName}${STTPKG_EXT}`,
|
|
1618
|
+
independent: false,
|
|
1619
|
+
type: 'plugin',
|
|
1620
|
+
dependencies: [],
|
|
1621
|
+
};
|
|
1622
|
+
}
|
|
1623
|
+
else {
|
|
1624
|
+
// 如果已存在,也覆盖 url/md5,保证最新
|
|
1625
|
+
gamePackConfig.packages[pluginPkgName].url = url;
|
|
1626
|
+
gamePackConfig.packages[pluginPkgName].md5 = md5;
|
|
1627
|
+
}
|
|
1628
|
+
}
|
|
1629
|
+
}
|
|
1630
|
+
try {
|
|
1631
|
+
fs.writeFileSync(gamePackConfigPath, JSON.stringify(gamePackConfig, null, 2));
|
|
1632
|
+
}
|
|
1633
|
+
catch (error) {
|
|
1634
|
+
throw new Error(`[ttmg-pack] Failed to write package file packageConfig.json: ${error.message} path: ${gamePackConfigPath}`);
|
|
1635
|
+
}
|
|
1586
1636
|
}
|
|
1587
1637
|
|
|
1588
|
-
function collectDeps(
|
|
1638
|
+
async function collectDeps(config, packages) {
|
|
1639
|
+
const { entry: gameEntry, output: gameOutput } = config;
|
|
1589
1640
|
// 自动扫描 game 目录下的一级文件夹作为根前缀
|
|
1590
1641
|
const rootPrefixes = getRootPrefixes(gameEntry);
|
|
1591
1642
|
// 查找所有 JS 文件
|
|
@@ -1708,6 +1759,7 @@ function collectDeps(gameEntry, packages) {
|
|
|
1708
1759
|
packageDeps: {},
|
|
1709
1760
|
pluginDeps: {},
|
|
1710
1761
|
});
|
|
1762
|
+
await addDepsToPackages(gameEntry, gameOutput, result.pluginDeps);
|
|
1711
1763
|
return result;
|
|
1712
1764
|
}
|
|
1713
1765
|
function getRootPrefixes(gameEntry) {
|
|
@@ -1804,8 +1856,7 @@ async function pack({ gameEntry, pkgName, allDeps, allMaps, pkgConfig, destRoot,
|
|
|
1804
1856
|
// });
|
|
1805
1857
|
// const code = fs.readFileSync(absPath, 'utf-8');
|
|
1806
1858
|
const fileId = relPath.replace(/\\/g, '/');
|
|
1807
|
-
const
|
|
1808
|
-
const defineHeader = `define("${schema}:${fileId}", ["require", "requireAsync", "module", "exports", "sandboxGlobal"], function(require, requireAsync, module, exports, sandboxGlobal){\nwith(sandboxGlobal){\n`;
|
|
1859
|
+
const defineHeader = `define("game:${fileId}", ["require", "requireAsync", "module", "exports", "sandboxGlobal"], function(require, requireAsync, module, exports, sandboxGlobal){\nwith(sandboxGlobal){\n`;
|
|
1809
1860
|
const defineFooter = `\n}\n});\n`;
|
|
1810
1861
|
const fileMagic = new MagicString(code, { filename: fileId });
|
|
1811
1862
|
fileMagic.prepend(defineHeader);
|
|
@@ -1892,105 +1943,19 @@ async function partition({ pkgRoot, destRoot, packedFiles, gameEntry, gameOutput
|
|
|
1892
1943
|
}
|
|
1893
1944
|
}
|
|
1894
1945
|
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
*
|
|
1898
|
-
* 对应 curl:
|
|
1899
|
-
* POST https://developers.tiktok.com/tiktok/v4/devportal/minigame/plugin_meta/get
|
|
1900
|
-
* body: { plugin_name, plugin_version }
|
|
1901
|
-
*/
|
|
1902
|
-
async function getPluginInfo(params) {
|
|
1903
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
1904
|
-
const baseUrl = (_a = params.baseUrl) !== null && _a !== void 0 ? _a : 'https://developers.tiktok.com';
|
|
1905
|
-
const url = `${baseUrl}/tiktok/v4/devportal/minigame/plugin_meta/get`;
|
|
1906
|
-
const res = await fetch(url, {
|
|
1907
|
-
method: 'POST',
|
|
1908
|
-
headers: Object.assign({ 'Content-Type': 'application/json' }, ((_b = params.headers) !== null && _b !== void 0 ? _b : {})),
|
|
1909
|
-
body: JSON.stringify({
|
|
1910
|
-
plugin_name: params.plugin_name,
|
|
1911
|
-
plugin_version: params.plugin_version,
|
|
1912
|
-
}),
|
|
1913
|
-
});
|
|
1914
|
-
const json = await res.json();
|
|
1915
|
-
const meta = (_g = (_e = (_c = json === null || json === void 0 ? void 0 : json.PluginMeta) !== null && _c !== void 0 ? _c : (_d = json === null || json === void 0 ? void 0 : json.data) === null || _d === void 0 ? void 0 : _d.PluginMeta) !== null && _e !== void 0 ? _e : (_f = json === null || json === void 0 ? void 0 : json.result) === null || _f === void 0 ? void 0 : _f.PluginMeta) !== null && _g !== void 0 ? _g : (_j = (_h = json === null || json === void 0 ? void 0 : json.data) === null || _h === void 0 ? void 0 : _h.result) === null || _j === void 0 ? void 0 : _j.PluginMeta;
|
|
1916
|
-
if (!(meta === null || meta === void 0 ? void 0 : meta.PackageCDNURL) || !(meta === null || meta === void 0 ? void 0 : meta.PackageMD5)) {
|
|
1917
|
-
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)}`);
|
|
1918
|
-
}
|
|
1919
|
-
return { url: meta.PackageCDNURL, md5: meta.PackageMD5 };
|
|
1920
|
-
}
|
|
1921
|
-
async function addDepsToPackages(gameEntry, outputDir, allDeps) {
|
|
1922
|
-
const gamePackConfigPath = path.join(outputDir, GAME_PACK_CONFIG_FILE_NAME);
|
|
1923
|
-
const gameJsonPath = path.join(gameEntry, GAME_ORIGIN_CONFIG_FILE_NAME);
|
|
1924
|
-
let gamePackConfig;
|
|
1925
|
-
let gameJson;
|
|
1926
|
-
let pluginConfig;
|
|
1927
|
-
try {
|
|
1928
|
-
gamePackConfig = JSON.parse(fs.readFileSync(gamePackConfigPath, 'utf-8'));
|
|
1929
|
-
gameJson = JSON.parse(fs.readFileSync(gameJsonPath, 'utf-8'));
|
|
1930
|
-
pluginConfig = gameJson.plugins;
|
|
1931
|
-
}
|
|
1932
|
-
catch (error) {
|
|
1933
|
-
throw new Error('[ttmg-pack] Failed to read package file game.json or packageConfig.json');
|
|
1934
|
-
}
|
|
1935
|
-
const unityDeps = ['data-package', 'StreamingAssets', 'wasmcode', 'wasmcode-android', 'wasmcode-ios'];
|
|
1936
|
-
for (const dep of unityDeps) {
|
|
1937
|
-
// 如果 game.json 的 subpackages 里有这个包,则添加进 __GAME__ 的 dependencies
|
|
1938
|
-
if (gameJson.subpackages.some(pkg => pkg.name === dep)) {
|
|
1939
|
-
gamePackConfig.packages[GAME_MAIN_PACKAGE_NAME].dependencies.push(dep);
|
|
1940
|
-
}
|
|
1941
|
-
}
|
|
1942
|
-
for (const [pkgName, plugins] of Object.entries(allDeps)) {
|
|
1943
|
-
for (const pluginName of plugins) {
|
|
1944
|
-
if (!(pluginConfig === null || pluginConfig === void 0 ? void 0 : pluginConfig[pluginName]))
|
|
1945
|
-
continue;
|
|
1946
|
-
const version = pluginConfig[pluginName].version;
|
|
1947
|
-
const pluginPkgName = `${pluginName}_${version}`;
|
|
1948
|
-
const { url, md5 } = await getPluginInfo({
|
|
1949
|
-
plugin_name: pluginName.toLowerCase(),
|
|
1950
|
-
plugin_version: version
|
|
1951
|
-
});
|
|
1952
|
-
gamePackConfig.packages[pkgName].dependencies.push(pluginPkgName);
|
|
1953
|
-
if (!gamePackConfig.packages[pluginPkgName]) {
|
|
1954
|
-
gamePackConfig.packages[pluginPkgName] = {
|
|
1955
|
-
url,
|
|
1956
|
-
md5,
|
|
1957
|
-
root: pluginPkgName,
|
|
1958
|
-
main: `${pluginPkgName}/index.js`,
|
|
1959
|
-
output: `${pluginPkgName}${STTPKG_EXT}`,
|
|
1960
|
-
independent: false,
|
|
1961
|
-
type: 'plugin',
|
|
1962
|
-
dependencies: [],
|
|
1963
|
-
};
|
|
1964
|
-
}
|
|
1965
|
-
else {
|
|
1966
|
-
// 如果已存在,也覆盖 url/md5,保证最新
|
|
1967
|
-
gamePackConfig.packages[pluginPkgName].url = url;
|
|
1968
|
-
gamePackConfig.packages[pluginPkgName].md5 = md5;
|
|
1969
|
-
}
|
|
1970
|
-
}
|
|
1971
|
-
}
|
|
1972
|
-
fs.writeFileSync(gamePackConfigPath, JSON.stringify(gamePackConfig, null, 2));
|
|
1973
|
-
}
|
|
1974
|
-
|
|
1975
|
-
function getSkipDirs({ packages, entryDir, }) {
|
|
1976
|
-
const skipDirs = [];
|
|
1977
|
-
if (packages) {
|
|
1978
|
-
skipDirs.push(...Object.values(packages).map(item => item.root));
|
|
1979
|
-
}
|
|
1980
|
-
return skipDirs;
|
|
1981
|
-
}
|
|
1982
|
-
async function makePkgs({ gameEntry, gameOutput, config, }) {
|
|
1946
|
+
async function makePkgs(config) {
|
|
1947
|
+
const { entry: gameEntry, output: gameOutput } = config;
|
|
1983
1948
|
let startTime = Date.now();
|
|
1984
1949
|
logger.info(`pack start,startTime:${startTime}`);
|
|
1985
|
-
const { packages } = await setup(
|
|
1986
|
-
const allDeps = collectDeps(
|
|
1987
|
-
|
|
1988
|
-
const allMaps = collectMaps(gameEntry, packages);
|
|
1950
|
+
const { packages } = await setup(config);
|
|
1951
|
+
const allDeps = await collectDeps(config, packages);
|
|
1952
|
+
const allMaps = collectMaps(config, packages);
|
|
1989
1953
|
const pkgOutput = {};
|
|
1990
1954
|
/**
|
|
1991
1955
|
* 基于 asyncPool 并发打包
|
|
1992
1956
|
*/
|
|
1993
1957
|
await asyncPool$1(10, Object.keys(allMaps), async (pkgName) => {
|
|
1958
|
+
var _a;
|
|
1994
1959
|
logger.info(`开始基于游戏源代码打包,包名:${pkgName}`);
|
|
1995
1960
|
let startTime = Date.now();
|
|
1996
1961
|
const pkgConfig = packages[pkgName];
|
|
@@ -2017,7 +1982,7 @@ async function makePkgs({ gameEntry, gameOutput, config, }) {
|
|
|
2017
1982
|
pkgRoot,
|
|
2018
1983
|
destRoot,
|
|
2019
1984
|
packedFiles: flattenMaps(allMaps),
|
|
2020
|
-
skipDirs:
|
|
1985
|
+
skipDirs: ((_a = Object.values(packages)) === null || _a === void 0 ? void 0 : _a.map(item => item.root)) || [],
|
|
2021
1986
|
});
|
|
2022
1987
|
const pkgRootDir = path.join(gameOutput, pkgName);
|
|
2023
1988
|
removeEmptyDir(pkgRootDir);
|
|
@@ -2034,46 +1999,6 @@ async function makePkgs({ gameEntry, gameOutput, config, }) {
|
|
|
2034
1999
|
logger.info(`pack end,duration:${Date.now() - startTime}ms`);
|
|
2035
2000
|
return pkgOutput;
|
|
2036
2001
|
}
|
|
2037
|
-
async function makePlugin({ gameEntry, gameOutput, config, }) {
|
|
2038
|
-
try {
|
|
2039
|
-
const pluginConfig = fs.readFileSync(path.join(gameEntry, 'plugin.json'), 'utf-8');
|
|
2040
|
-
const { name, main, version } = JSON.parse(pluginConfig);
|
|
2041
|
-
const pluginName = `${name}_${version}`;
|
|
2042
|
-
// 把 entryDir 下的所有文件复制到 entryDir/plugin
|
|
2043
|
-
const pluginDir = path.join(gameEntry, pluginName);
|
|
2044
|
-
copyDirectory(gameEntry, pluginDir);
|
|
2045
|
-
const packages = {
|
|
2046
|
-
[pluginName]: {
|
|
2047
|
-
url: '',
|
|
2048
|
-
md5: '',
|
|
2049
|
-
root: pluginName,
|
|
2050
|
-
main,
|
|
2051
|
-
output: `${pluginName}${STTPKG_EXT}`,
|
|
2052
|
-
type: 'game',
|
|
2053
|
-
dependencies: []
|
|
2054
|
-
}
|
|
2055
|
-
};
|
|
2056
|
-
fs.writeFileSync(path.join(gameOutput, GAME_PACK_CONFIG_FILE_NAME), JSON.stringify({ packages }, null, 2));
|
|
2057
|
-
const pluginEntry = path.join(gameEntry, pluginName);
|
|
2058
|
-
const allMaps = collectPluginMaps(gameEntry, pluginEntry, pluginName);
|
|
2059
|
-
await pack({
|
|
2060
|
-
gameEntry,
|
|
2061
|
-
allDeps: {
|
|
2062
|
-
packageDeps: {},
|
|
2063
|
-
pluginDeps: {},
|
|
2064
|
-
},
|
|
2065
|
-
allMaps,
|
|
2066
|
-
pkgName: pluginName,
|
|
2067
|
-
pkgConfig: packages[pluginName],
|
|
2068
|
-
destRoot: path.join(gameOutput, pluginName, packages[pluginName].root),
|
|
2069
|
-
config,
|
|
2070
|
-
});
|
|
2071
|
-
}
|
|
2072
|
-
catch (error) {
|
|
2073
|
-
logger.error('plugin.json 不存在');
|
|
2074
|
-
return;
|
|
2075
|
-
}
|
|
2076
|
-
}
|
|
2077
2002
|
|
|
2078
2003
|
/**
|
|
2079
2004
|
* 将 packages 中的每个 package 下的文件内容合并到 outputDir 下,不保留 package name
|
|
@@ -2145,33 +2070,40 @@ async function mergePkgs(outputDir) {
|
|
|
2145
2070
|
logger.info('mergePkgs 完成');
|
|
2146
2071
|
}
|
|
2147
2072
|
|
|
2148
|
-
async function clearPkgs(
|
|
2149
|
-
removeSystemUseless(
|
|
2073
|
+
async function clearPkgs(config, uselessDirs = ['node_modules', '__MACOSX']) {
|
|
2074
|
+
removeSystemUseless(config.entry, uselessDirs);
|
|
2150
2075
|
}
|
|
2151
2076
|
|
|
2152
2077
|
async function debugPkgs(config) {
|
|
2153
|
-
const {
|
|
2078
|
+
const { output: outputDir, dev: { enableLog }, } = config;
|
|
2154
2079
|
logger.init(outputDir, enableLog);
|
|
2155
2080
|
try {
|
|
2156
2081
|
/**
|
|
2157
2082
|
* 清理
|
|
2158
2083
|
*/
|
|
2159
|
-
clearPkgs(
|
|
2084
|
+
clearPkgs(config);
|
|
2160
2085
|
/**
|
|
2161
2086
|
* 校验
|
|
2162
2087
|
*/
|
|
2163
|
-
const checkResults = await checkPkgs(
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2088
|
+
const checkResults = await checkPkgs(config);
|
|
2089
|
+
/**
|
|
2090
|
+
* 如果有任何 error 类型的校验项失败,则不再继续后续流程,直接返回错误
|
|
2091
|
+
*/
|
|
2092
|
+
const errorResults = checkResults.filter(item => !item.passed && item.level === 'error');
|
|
2093
|
+
if (errorResults.length > 0) {
|
|
2094
|
+
const errorMsg = errorResults
|
|
2095
|
+
.map(item => `[${item.name || item.type}] ${item.msg}`)
|
|
2096
|
+
.join('\n');
|
|
2097
|
+
return {
|
|
2098
|
+
isSuccess: false,
|
|
2099
|
+
errorMsg: `Project validation failed (Errors):\n${errorMsg}`,
|
|
2100
|
+
checkResults,
|
|
2101
|
+
};
|
|
2102
|
+
}
|
|
2167
2103
|
/**
|
|
2168
2104
|
* 打包
|
|
2169
2105
|
*/
|
|
2170
|
-
await makePkgs(
|
|
2171
|
-
gameEntry: entryDir,
|
|
2172
|
-
gameOutput: outputDir,
|
|
2173
|
-
config,
|
|
2174
|
-
});
|
|
2106
|
+
await makePkgs(config);
|
|
2175
2107
|
/**
|
|
2176
2108
|
* 合并
|
|
2177
2109
|
*/
|
|
@@ -2196,60 +2128,23 @@ async function debugPkgs(config) {
|
|
|
2196
2128
|
}
|
|
2197
2129
|
|
|
2198
2130
|
async function buildPkgs(config) {
|
|
2199
|
-
|
|
2200
|
-
if (((_a = config === null || config === void 0 ? void 0 : config.build) === null || _a === void 0 ? void 0 : _a.type) === 'plugin') {
|
|
2201
|
-
await buildPlugin(config);
|
|
2202
|
-
return;
|
|
2203
|
-
}
|
|
2204
|
-
const { entry: entryDir, output: outputDir, build } = config;
|
|
2131
|
+
const { output: outputDir, build } = config;
|
|
2205
2132
|
let startTime = Date.now();
|
|
2206
2133
|
logger.init(outputDir, true);
|
|
2207
|
-
logger.info(`TTMG_PACK_VERSION: ${"0.3.
|
|
2134
|
+
logger.info(`TTMG_PACK_VERSION: ${"0.3.6"}`);
|
|
2208
2135
|
logger.info(`pack start, startTime:${startTime}`);
|
|
2209
2136
|
/**
|
|
2210
2137
|
* 清理
|
|
2211
2138
|
*/
|
|
2212
|
-
clearPkgs(
|
|
2139
|
+
await clearPkgs(config, ['node_modules', '__MACOSX', TTMG_TEMP_DIR]);
|
|
2213
2140
|
/**
|
|
2214
2141
|
* 校验
|
|
2215
2142
|
*/
|
|
2216
|
-
await checkPkgs(
|
|
2217
|
-
entryDir,
|
|
2218
|
-
config,
|
|
2219
|
-
});
|
|
2220
|
-
/**
|
|
2221
|
-
* 打包
|
|
2222
|
-
*/
|
|
2223
|
-
await makePkgs({
|
|
2224
|
-
config,
|
|
2225
|
-
gameEntry: entryDir,
|
|
2226
|
-
gameOutput: outputDir,
|
|
2227
|
-
});
|
|
2228
|
-
if (build === null || build === void 0 ? void 0 : build.enableOdr) {
|
|
2229
|
-
/**
|
|
2230
|
-
* 等待文件全部读写完成后
|
|
2231
|
-
*/
|
|
2232
|
-
await makeOdrPkgs(outputDir);
|
|
2233
|
-
/**
|
|
2234
|
-
* 分拆 odr 包
|
|
2235
|
-
*/
|
|
2236
|
-
}
|
|
2237
|
-
logger.info(`pack end:${Date.now() - startTime}ms`);
|
|
2238
|
-
}
|
|
2239
|
-
async function buildPlugin(originConfig) {
|
|
2240
|
-
const { entry: entryDir, output: outputDir, build } = originConfig;
|
|
2241
|
-
let startTime = Date.now();
|
|
2242
|
-
logger.init(outputDir, true);
|
|
2243
|
-
logger.info(`TTMG_PACK_VERSION: ${"0.3.4"}`);
|
|
2244
|
-
logger.info(`pack start, startTime:${startTime}`);
|
|
2143
|
+
await checkPkgs(config);
|
|
2245
2144
|
/**
|
|
2246
2145
|
* 打包
|
|
2247
2146
|
*/
|
|
2248
|
-
await
|
|
2249
|
-
config: originConfig,
|
|
2250
|
-
gameEntry: entryDir,
|
|
2251
|
-
gameOutput: outputDir,
|
|
2252
|
-
});
|
|
2147
|
+
await makePkgs(config);
|
|
2253
2148
|
if (build === null || build === void 0 ? void 0 : build.enableOdr) {
|
|
2254
2149
|
/**
|
|
2255
2150
|
* 等待文件全部读写完成后
|