fix-alipay-event-source.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const fs = require('fs');
  2. const path = require('path');
  3. function fixAlipayEventSource() {
  4. const taroJsPath = path.join(__dirname, '../dist/taro.js');
  5. if (!fs.existsSync(taroJsPath)) {
  6. console.log('Error: dist/taro.js not found');
  7. return false;
  8. }
  9. console.log('Fixing EventSource in dist/taro.js...');
  10. let content = fs.readFileSync(taroJsPath, 'utf8');
  11. const replacement =
  12. 'class EventSource{data={};get(e){return this.data[e]};set(e,t){this.data[e]=t};delete(e){delete this.data[e]};has(e){return e in this.data};removeNode(e){const{sid:t,uid:n}=e;this.delete(t);n!==t&&n&&this.delete(n)};removeNodeTree(e){this.removeNode(e);const{childNodes:t}=e;t.forEach(e=>this.removeNodeTree(e))}}const r=new EventSource';
  13. // Taro 4.x: 类名被压缩 (如 class i extends Map) → 通过 removeNode 特征匹配
  14. const minifiedPattern =
  15. /class \w+ extends Map\{removeNode\([\s\S]*?removeNodeTree\([\s\S]*?\}\}const r=new \w+/g;
  16. if (minifiedPattern.test(content)) {
  17. content = content.replace(minifiedPattern, replacement);
  18. fs.writeFileSync(taroJsPath, content, 'utf8');
  19. console.log('Success: Minified EventSource (Map) fixed');
  20. return true;
  21. }
  22. // Taro 3.x: 未压缩的 class EventSource extends Map
  23. const oldEventSource = /class EventSource extends Map \{[\s\S]*?\}/g;
  24. const newEventSource = `class EventSource {
  25. data = {};
  26. get(id) {
  27. return this.data[id];
  28. }
  29. set(id, value) {
  30. this.data[id] = value;
  31. }
  32. delete(id) {
  33. delete this.data[id];
  34. }
  35. has(id) {
  36. return id in this.data;
  37. }
  38. removeNode(child) {
  39. const { sid, uid } = child;
  40. this.delete(sid);
  41. if (uid !== sid && uid) this.delete(uid);
  42. }
  43. removeNodeTree(child) {
  44. this.removeNode(child);
  45. const { childNodes } = child;
  46. childNodes.forEach((node) => this.removeNodeTree(node));
  47. }
  48. }`;
  49. if (oldEventSource.test(content)) {
  50. content = content.replace(oldEventSource, newEventSource);
  51. fs.writeFileSync(taroJsPath, content, 'utf8');
  52. console.log('Success: EventSource fixed');
  53. return true;
  54. }
  55. console.log('Info: EventSource pattern not found, skipping');
  56. return false;
  57. }
  58. module.exports = fixAlipayEventSource;
  59. if (require.main === module) {
  60. fixAlipayEventSource();
  61. }