index.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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.generateCodeFrameWithSwiftStacktrace = exports.generateCodeFrameWithKotlinStacktrace = exports.generateCodeFrameWithSourceMapPath = exports.generateCodeFrameSourceMapConsumer = void 0;
  7. const fs_1 = __importDefault(require("fs"));
  8. const path_1 = __importDefault(require("path"));
  9. const source_map_1 = require("source-map");
  10. const stacktrace_1 = require("../stacktrace");
  11. function generateCodeFrameSourceMapConsumer(consumer, m, options = {}) {
  12. if (m.file) {
  13. const res = consumer.originalPositionFor({
  14. line: m.line,
  15. column: m.column,
  16. });
  17. if (res.source != null && res.line != null && res.column != null) {
  18. let code = consumer.sourceContentFor(res.source, true);
  19. if (code) {
  20. code = (0, stacktrace_1.generateCodeFrame)(code, { line: res.line, column: res.column });
  21. if (options.replaceTabsWithSpace) {
  22. code = code.replace(/\t/g, ' ');
  23. }
  24. return {
  25. type: m.type,
  26. file: res.source,
  27. line: res.line,
  28. column: res.column,
  29. message: m.message,
  30. code,
  31. };
  32. }
  33. }
  34. }
  35. }
  36. exports.generateCodeFrameSourceMapConsumer = generateCodeFrameSourceMapConsumer;
  37. function initConsumer(filename) {
  38. if (fs_1.default.existsSync(filename)) {
  39. return new source_map_1.SourceMapConsumer(fs_1.default.readFileSync(filename, 'utf8'));
  40. }
  41. return Promise.resolve(undefined);
  42. }
  43. function generateCodeFrameWithSourceMapPath(filename, messages, options = {}) {
  44. if (typeof messages === 'string') {
  45. try {
  46. messages = JSON.parse(messages);
  47. }
  48. catch (e) { }
  49. }
  50. if (Array.isArray(messages) && messages.length) {
  51. return new Promise((resolve) => {
  52. initConsumer(filename).then((consumer) => {
  53. resolve(messages
  54. .map((m) => {
  55. if (m.file && consumer) {
  56. const message = generateCodeFrameSourceMapConsumer(consumer, m, options);
  57. if (message) {
  58. return message;
  59. }
  60. }
  61. if (!m.file) {
  62. m.file = '';
  63. }
  64. return m;
  65. })
  66. .filter(Boolean));
  67. });
  68. });
  69. }
  70. return Promise.resolve([]);
  71. }
  72. exports.generateCodeFrameWithSourceMapPath = generateCodeFrameWithSourceMapPath;
  73. function resolveSourceMapPath(sourceMapFilename, name, outputDir) {
  74. const is_uni_modules = path_1.default.basename(path_1.default.dirname(name)) === 'uni_modules';
  75. return path_1.default.resolve(outputDir, '../.sourcemap/app', name, is_uni_modules ? 'utssdk' : '', sourceMapFilename);
  76. }
  77. function generateCodeFrameWithKotlinStacktrace(stacktrace, { name, inputDir, outputDir }) {
  78. const sourceMapFilename = resolveSourceMapPath('app-android/index.kt.map', name, outputDir);
  79. return generateCodeFrameWithStacktrace(stacktrace, /e:\s+(.*):\s+\(([0-9]+),\s+([0-9]+)\):\s+(.*)/g, {
  80. sourceRoot: inputDir,
  81. sourceMapFilename,
  82. });
  83. }
  84. exports.generateCodeFrameWithKotlinStacktrace = generateCodeFrameWithKotlinStacktrace;
  85. function generateCodeFrameWithSwiftStacktrace(stacktrace, { name, inputDir, outputDir }) {
  86. const sourceMapFilename = resolveSourceMapPath('app-ios/index.swift.map', name, outputDir);
  87. return generateCodeFrameWithStacktrace(stacktrace, /(.*):([0-9]+):([0-9]+):\s+error:\s+(.*)/g, {
  88. sourceRoot: inputDir,
  89. sourceMapFilename,
  90. });
  91. }
  92. exports.generateCodeFrameWithSwiftStacktrace = generateCodeFrameWithSwiftStacktrace;
  93. function generateCodeFrameWithStacktrace(stacktrace, regexp, { sourceRoot, sourceMapFilename, replaceTabsWithSpace, }) {
  94. return new Promise((resolve) => {
  95. initConsumer(sourceMapFilename).then((consumer) => {
  96. if (!consumer) {
  97. return resolve(stacktrace);
  98. }
  99. resolve(stacktrace.replace(regexp, (substring, file, line, column, message) => {
  100. const m = generateCodeFrameSourceMapConsumer(consumer, {
  101. type: 'error',
  102. file,
  103. message,
  104. line: parseInt(line),
  105. column: parseInt(column),
  106. }, { sourceRoot, replaceTabsWithSpace });
  107. if (!m) {
  108. return substring;
  109. }
  110. return `error: ${message}
  111. at ${m.file}:${m.line}:${m.column}
  112. ${m.code}
  113. `;
  114. }));
  115. });
  116. });
  117. }