| 15 | * dumper instance |
| 16 | */ |
| 17 | export function pluginEdgeDumper(dumper: Dumper) { |
| 18 | Template.macro('dumper' as any, dumper) |
| 19 | |
| 20 | return (edge: Edge) => { |
| 21 | edge.registerTag({ |
| 22 | tagName: 'dump', |
| 23 | block: false, |
| 24 | seekable: true, |
| 25 | noNewLine: true, |
| 26 | compile(parser, buffer, token) { |
| 27 | const parsed = parser.utils.transformAst( |
| 28 | parser.utils.generateAST(token.properties.jsArg, token.loc, token.filename), |
| 29 | token.filename, |
| 30 | parser |
| 31 | ) |
| 32 | |
| 33 | buffer.writeExpression( |
| 34 | `template.stacks.pushOnceTo('dumper', 'dumper_globals', template.dumper.getHeadElements(state.cspNonce))`, |
| 35 | token.filename, |
| 36 | token.loc.start.line |
| 37 | ) |
| 38 | |
| 39 | buffer.outputExpression( |
| 40 | `template.dumper.dumpToHtml(${parser.utils.stringify(parsed)}, { cspNonce: state.cspNonce, source: { location: $filename, line: $lineNumber } })`, |
| 41 | token.filename, |
| 42 | token.loc.start.line, |
| 43 | true |
| 44 | ) |
| 45 | }, |
| 46 | }) |
| 47 | |
| 48 | edge.registerTag({ |
| 49 | tagName: 'dd', |
| 50 | block: false, |
| 51 | seekable: true, |
| 52 | noNewLine: true, |
| 53 | compile(parser, buffer, token) { |
| 54 | const parsed = parser.utils.transformAst( |
| 55 | parser.utils.generateAST(token.properties.jsArg, token.loc, token.filename), |
| 56 | token.filename, |
| 57 | parser |
| 58 | ) |
| 59 | |
| 60 | /** |
| 61 | * Dump/Die statement to catch error and convert it into |
| 62 | * an Edge error |
| 63 | */ |
| 64 | const ddStatement = [ |
| 65 | 'try {', |
| 66 | ` template.dumper.dd(${parser.utils.stringify(parsed)})`, |
| 67 | '} catch (error) {', |
| 68 | ` if (error.code === 'E_DUMP_DIE_EXCEPTION') {`, |
| 69 | ' const edgeError = template.createError(error.message, $filename, $lineNumber)', |
| 70 | ' error.fileName = $filename', |
| 71 | ' error.lineNumber = $lineNumber', |
| 72 | ' edgeError.handle = function (_, ctx) {', |
| 73 | ' return error.handle(error, ctx)', |
| 74 | ' }', |