confusion.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.initConfusion = exports.hasConfusionFile = exports.isConfusionFile = exports.APP_CONFUSION_FILENAME = void 0;
  7. const path_1 = __importDefault(require("path"));
  8. const utils_1 = require("../../../utils");
  9. const constants_1 = require("../../../constants");
  10. const manifest_1 = require("../../manifest");
  11. function isJsFile(filename) {
  12. return constants_1.EXTNAME_JS_RE.test(filename);
  13. }
  14. function isStaticJsFile(filename) {
  15. return (filename.indexOf('hybrid/html') === 0 ||
  16. filename.indexOf('static/') === 0 ||
  17. filename.indexOf('/static/') !== -1); // subpackages, uni_modules 中的 static 目录
  18. }
  19. const dynamicConfusionJsFiles = [];
  20. exports.APP_CONFUSION_FILENAME = 'app-confusion.js';
  21. function isConfusionFile(filename) {
  22. return dynamicConfusionJsFiles.includes((0, utils_1.normalizePath)(filename));
  23. }
  24. exports.isConfusionFile = isConfusionFile;
  25. function hasConfusionFile(inputDir) {
  26. if (inputDir) {
  27. const manifestJson = (0, manifest_1.parseManifestJsonOnce)(inputDir);
  28. const resources = manifestJson['app-plus']?.confusion?.resources;
  29. if (resources && parseConfusion(resources)[1].length) {
  30. return true;
  31. }
  32. }
  33. return !!dynamicConfusionJsFiles.length;
  34. }
  35. exports.hasConfusionFile = hasConfusionFile;
  36. function parseConfusion(resources) {
  37. const res = {};
  38. const dynamicJsFiles = [];
  39. Object.keys(resources).reduce((res, name) => {
  40. const extname = path_1.default.extname(name);
  41. if (extname === '.nvue') {
  42. res[name.replace('.nvue', '.js')] = resources[name];
  43. }
  44. else if (isJsFile(name)) {
  45. // 静态 js 加密
  46. if (isStaticJsFile(name)) {
  47. res[name] = resources[name];
  48. }
  49. else {
  50. // 非静态 js 将被合并进 app-confusion.js
  51. dynamicJsFiles.push(name);
  52. }
  53. }
  54. else {
  55. throw new Error(`原生混淆仅支持 nvue 页面,错误的页面路径:${name}`);
  56. }
  57. // TODO 旧编译器会检查要加密的 nvue 页面(包括subnvue)是否被使用?后续有时间再考虑支持吧,意义不太大
  58. return res;
  59. }, res);
  60. if (dynamicJsFiles.length) {
  61. res[exports.APP_CONFUSION_FILENAME] = {};
  62. }
  63. return [res, dynamicJsFiles];
  64. }
  65. function initConfusion(manifestJson) {
  66. dynamicConfusionJsFiles.length = 0;
  67. if (!manifestJson.plus.confusion?.resources) {
  68. return;
  69. }
  70. const resources = manifestJson.plus.confusion.resources;
  71. const [res, dynamicJsFiles] = parseConfusion(resources);
  72. manifestJson.plus.confusion.resources = res;
  73. dynamicConfusionJsFiles.push(...dynamicJsFiles);
  74. }
  75. exports.initConfusion = initConfusion;