From f28b511f5613913fb1f8a57a3c03611e770772c1 Mon Sep 17 00:00:00 2001 From: Leonidas <329182+leonidaz@users.noreply.github.com> Date: Thu, 24 Sep 2026 09:22:42 -0400 Subject: [PATCH 1/6] feat: map delimiters and keywords inside nodes from the parser's tokens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The root visitor maps every node's start and end, which covers tokens that open a node. Tokens inside a node have no node boundary to anchor them: the brackets of a computed key, the parentheses of parameter lists, calls and control-flow heads, the braces of import and export lists, static blocks, switch and enum bodies, template interpolations, and every keyword written after a node's first token (`function` after `async`, `else`, `finally`, `while` in `do … while`, `default` after `export`, `type` after `import`, class and member modifiers, `extends`, `implements`, `in`, `of`, `as`, `satisfies`). A new `tokens` option takes the parser's token list (Acorn's `onToken`, Babel's `tokens`, ESLint-style `ast.tokens`). The tokens of interest are indexed once, sorted if the parser emitted them out of order, and each one is found by a bounded binary search from a position the AST does know. Without tokens they stay unmapped. Closing delimiters that end a node (`)` of a call, `]` of an array or computed member, `}` of an object, switch, enum or interface body) are mapped from the node's end without tokens, as BlockStatement already does. Printed output is unchanged; 61 sample maps gain segments. Co-Authored-By: Claude Fable 5.1 --- .changeset/token-delimiters.md | 5 + src/languages/ts/index.js | 632 ++++++++++++------ src/languages/ts/public.ts | 2 +- src/languages/ts/tokens.js | 175 +++++ src/languages/tsx/public.ts | 2 +- src/languages/types.ts | 22 + test/common.js | 3 +- .../samples/array-expressions/expected.js.map | 2 +- .../expected.js.map | 2 +- test/samples/basic/expected.js.map | 2 +- test/samples/call-expressions/expected.js.map | 2 +- .../samples/chain-expressions/expected.js.map | 2 +- test/samples/class-extends/expected.js.map | 2 +- .../class-static-block/expected.js.map | 2 +- .../expected.js.map | 2 +- test/samples/comment-block/expected.js.map | 2 +- test/samples/comment-inline/expected.js.map | 2 +- .../expected.js.map | 2 +- .../expected.js.map | 2 +- test/samples/computed-getter/expected.js.map | 2 +- .../samples/deconflict-method/expected.js.map | 2 +- .../destructured-assignment/expected.js.map | 2 +- .../destructured-declaration/expected.js.map | 2 +- .../function-expression/expected.js.map | 2 +- .../samples/import-attributes/expected.js.map | 2 +- test/samples/jsx-basic/expected.jsx.map | 2 +- test/samples/method/expected.js.map | 2 +- .../object-expressions/expected.js.map | 2 +- test/samples/object-format/expected.js.map | 2 +- .../parenthesized-expression/expected.js.map | 2 +- test/samples/switch/expected.js.map | 2 +- test/samples/tagged-template/expected.js.map | 2 +- test/samples/try-catch/expected.js.map | 2 +- .../samples/ts-array-patterns/expected.ts.map | 2 +- .../ts-arrow-as-const-object/expected.ts.map | 2 +- .../expected.ts.map | 2 +- test/samples/ts-as-expression/expected.ts.map | 2 +- .../ts-comment-signature/expected.ts.map | 2 +- .../ts-declaration-modifiers/expected.ts.map | 2 +- .../ts-declare-interface-type/expected.ts.map | 2 +- .../samples/ts-declare-module/expected.ts.map | 2 +- test/samples/ts-declare/expected.ts.map | 2 +- .../ts-decorators-class/expected.ts.map | 2 +- .../ts-decorators-expression/expected.ts.map | 2 +- test/samples/ts-decorators/expected.ts.map | 2 +- test/samples/ts-enums/expected.ts.map | 2 +- .../ts-generic-references/expected.ts.map | 2 +- test/samples/ts-generic-types/expected.ts.map | 2 +- test/samples/ts-implements/expected.ts.map | 2 +- .../ts-index-access-type/expected.ts.map | 2 +- test/samples/ts-infer-extends/expected.ts.map | 2 +- test/samples/ts-interfaces/expected.ts.map | 2 +- test/samples/ts-keywords/expected.ts.map | 2 +- test/samples/ts-mapped-type/expected.ts.map | 2 +- .../expected.ts.map | 2 +- .../ts-module-declaration/expected.ts.map | 2 +- .../ts-object-patterns/expected.ts.map | 2 +- .../ts-optional-parameter/expected.ts.map | 2 +- .../ts-parameter-decorators/expected.ts.map | 2 +- .../ts-readonly-signatures/expected.ts.map | 2 +- .../ts-satisfies-expression/expected.ts.map | 2 +- test/samples/ts-signatures/expected.ts.map | 2 +- .../expected.ts.map | 2 +- .../ts-tagged-template/expected.ts.map | 2 +- .../ts-type-level-syntax/expected.ts.map | 2 +- test/samples/ts-types/expected.ts.map | 2 +- test/samples/ts-utility-types/expected.ts.map | 2 +- .../tsx-type-parameters/expected.tsx.map | 2 +- test/samples/var-declaration/expected.js.map | 2 +- test/sourcemap-keywords.test.js | 373 +++++++++++ 70 files changed, 1080 insertions(+), 258 deletions(-) create mode 100644 .changeset/token-delimiters.md create mode 100644 src/languages/ts/tokens.js diff --git a/.changeset/token-delimiters.md b/.changeset/token-delimiters.md new file mode 100644 index 00000000..0f494099 --- /dev/null +++ b/.changeset/token-delimiters.md @@ -0,0 +1,5 @@ +--- +'esrap': minor +--- + +feat: add a `tokens` option to the `ts` and `tsx` languages. Pass the parser's tokens and everything inside a node that no node boundary locates is mapped to its source position: the brackets of computed keys, the parentheses of parameter lists, calls and control-flow heads, the braces of import and export lists, enums and static blocks, template interpolations, and keywords after a node's first token such as `function` after `async`, `else`, `finally`, `while`, `default`, `type`, class and member modifiers, `extends`, `implements`, `in`, `of`, `as` and `satisfies`. Closing delimiters at a node's end are mapped from the node's end without tokens. diff --git a/src/languages/ts/index.js b/src/languages/ts/index.js index 389ff397..75e6dcb3 100644 --- a/src/languages/ts/index.js +++ b/src/languages/ts/index.js @@ -3,6 +3,9 @@ /** @import { TSOptions, BaseComment } from '../types.js' */ import { Context } from 'esrap'; +/** @typedef {{ line: number, column: number }} Position */ +import { token_locator } from './tokens.js'; + // Keep the public type parser-independent while checking all expression kinds. /** * @type {Record} @@ -146,6 +149,45 @@ function write_comment(comment, context) { } } +/** + * Where a node's keywords start: after its decorators, if any + * @param {TSESTree.Node & { decorators?: TSESTree.Decorator[] }} node + */ +function after_decorators(node) { + return node.decorators?.at(-1)?.loc?.end ?? node.loc?.start; +} + +/** + * Writes a token at a known source position (its start, or its whole location + * when the end is known too), or unmapped without one + * @param {Context} context + * @param {string} text + * @param {Position | { start: Position, end: Position } | undefined} at + */ +function write_at(context, text, at) { + if (!at) { + context.write(text); + return; + } + + const start = 'start' in at ? at.start : at; + context.location(start.line, start.column); + context.write(text); + if ('start' in at) context.location(at.end.line, at.end.column); +} + +/** + * Writes a closing delimiter that ends at `end` — the last character of a node + * whose grammar ends with it + * @param {Context} context + * @param {string} text + * @param {{ line: number, column: number } | undefined} end + */ +function write_before(context, text, end) { + if (end) context.location(end.line, end.column - text.length); + context.write(text); +} + /** * @param {Context} context * @param {string} token @@ -328,13 +370,15 @@ export default (options = {}) => { /** * @param {Context} context - * @param {{ attributes?: TSESTree.ImportAttribute[], assertions?: TSESTree.ImportAttribute[] }} node + * @param {TSESTree.Node & { attributes?: TSESTree.ImportAttribute[], assertions?: TSESTree.ImportAttribute[] }} node */ function write_import_attributes(context, node) { const attributes = node.attributes ?? node.assertions; if (!attributes || attributes.length === 0) return; - context.write(node.attributes ? ' with { ' : ' assert { '); + context.write(node.attributes ? ' with ' : ' assert '); + write_at(context, '{', enclosing(node, attributes[0], '{')); + context.write(' '); for (let i = 0; i < attributes.length; i += 1) { const { key, value } = attributes[i]; @@ -344,7 +388,8 @@ export default (options = {}) => { if (i < attributes.length - 1) context.write(', '); } - context.write(' }'); + context.write(' '); + write_at(context, '}', enclosing(node, attributes[attributes.length - 1], '}')); } /** @@ -476,6 +521,39 @@ export default (options = {}) => { } } + const { locate, enclosing } = token_locator(options); + + /** + * A parenthesised parameter list. `(` is the first one after `prefix` (the + * type parameters, name or key before the list) or, without one, in the + * node; `)` is the last one before `suffix` (the return type or body after + * the list) or the node's end. Both are looked up in `tokens`. + * @param {Context} context + * @param {TSESTree.Node} node + * @param {TSESTree.Node[]} params + * @param {TSESTree.Node | null | undefined} prefix + * @param {TSESTree.Node | null | undefined} suffix + */ + function write_params(context, node, params, prefix, suffix) { + const until = suffix?.loc?.start ?? node.loc?.end; + write_at(context, '(', locate(node, '(', prefix?.loc?.end ?? node.loc?.start, 'after')); + sequence(context, params, until ?? null, false); + write_at(context, ')', locate(node, ')', until, 'before')); + } + + /** + * A keyword that is not the first token of `node`, so only the tokens locate + * it: the first `word` after `from` (the node's start, or the end of what + * precedes the keyword) within the node. + * @param {Context} context + * @param {TSESTree.Node} node + * @param {string} word + * @param {Position | undefined} [from] + */ + function write_keyword(context, node, word, from = node.loc?.start) { + write_at(context, word, locate(node, word, from, 'after')); + } + const shared = { /** * @param {TSESTree.ArrayExpression | TSESTree.ArrayPattern} node @@ -490,7 +568,7 @@ export default (options = {}) => { node.loc?.end ?? null, false ); - context.write(']'); + write_before(context, ']', node.loc?.end); if ('typeAnnotation' in node && node.typeAnnotation) context.visit(node.typeAnnotation); }, @@ -568,7 +646,11 @@ export default (options = {}) => { const open = context.new(); const join = context.new(); - context.write('('); + write_at( + context, + '(', + locate(node, '(', (node.typeArguments ?? node.callee).loc?.end, 'after') + ); context.append(open); // if the final argument is multiline, it doesn't need to force all the @@ -621,7 +703,9 @@ export default (options = {}) => { join.write(' '); } - context.write(')'); + // a `new` expression may have no parentheses in the source + if (node.type === 'CallExpression') write_before(context, ')', node.loc?.end); + else write_at(context, ')', locate(node, ')', node.loc?.end, 'before')); }, /** @@ -635,9 +719,17 @@ export default (options = {}) => { } } - if (node.declare) context.write('declare '); - if (node.abstract) context.write('abstract '); - context.write('class '); + const from = after_decorators(node); + if (node.declare) { + write_keyword(context, node, 'declare', from); + context.write(' '); + } + if (node.abstract) { + write_keyword(context, node, 'abstract', from); + context.write(' '); + } + write_keyword(context, node, 'class', from); + context.write(' '); if (node.id) { context.visit(node.id); @@ -652,7 +744,8 @@ export default (options = {}) => { } if (node.superClass) { - context.write('extends '); + write_keyword(context, node, 'extends', (node.typeParameters ?? node.id)?.loc?.end); + context.write(' '); // the `extends` clause is a LeftHandSideExpression; anything lower (a // logical/binary/conditional/etc.) must be parenthesized const wrap_super = @@ -671,7 +764,12 @@ export default (options = {}) => { } if (node.implements && node.implements.length > 0) { - context.write('implements'); + write_keyword( + context, + node, + 'implements', + (node.superClass ?? node.typeParameters ?? node.id)?.loc?.end + ); sequence(context, node.implements, node.body.loc?.start ?? null, true); } @@ -685,18 +783,29 @@ export default (options = {}) => { 'ForInStatement|ForOfStatement': (node, context) => { token(context, 'for', node); context.write(' '); - if (node.type === 'ForOfStatement' && node.await) context.write('await '); - context.write('('); + if (node.type === 'ForOfStatement' && node.await) { + write_keyword(context, node, 'await'); + context.write(' '); + } + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); if (node.left.type === 'VariableDeclaration') { - handle_var_declaration(node.left, context); + handle_var_declaration(node.left, context, false, write_keyword); } else { context.visit(node.left); } - context.write(node.type === 'ForInStatement' ? ' in ' : ' of '); + context.write(' '); + write_keyword( + context, + node, + node.type === 'ForInStatement' ? 'in' : 'of', + node.left.loc?.end + ); + context.write(' '); context.visit(node.right); - context.write(') '); + write_at(context, ')', locate(node, ')', node.body.loc?.start, 'before')); + context.write(' '); context.visit(node.body); }, @@ -705,8 +814,12 @@ export default (options = {}) => { * @param {Context} context */ 'FunctionDeclaration|FunctionExpression': (node, context) => { - if (node.async) context.write('async '); - context.write(node.generator ? 'function* ' : 'function '); + if (node.async) { + write_keyword(context, node, 'async'); + context.write(' '); + } + write_keyword(context, node, 'function'); + context.write(node.generator ? '* ' : ' '); if (node.id) track_binding(node.id); @@ -717,9 +830,13 @@ export default (options = {}) => { } track_bindings(node.params); - context.write('('); - sequence(context, node.params, (node.returnType ?? node.body).loc?.start ?? null, false); - context.write(')'); + write_params( + context, + node, + node.params, + node.typeParameters ?? node.id, + node.returnType ?? node.body + ); if (node.returnType) context.visit(node.returnType); @@ -739,52 +856,62 @@ export default (options = {}) => { } } + const from = after_decorators(node); + // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions if (node.abstract || node.type === 'TSAbstractMethodDefinition') { - context.write('abstract '); + write_keyword(context, node, 'abstract', from); + context.write(' '); } if (node.accessibility) { - context.write(node.accessibility + ' '); + write_keyword(context, node, node.accessibility, from); + context.write(' '); } if (node.override) { - context.write('override '); + write_keyword(context, node, 'override', from); + context.write(' '); } if (node.static) { - context.write('static '); + write_keyword(context, node, 'static', from); + context.write(' '); } if (node.kind === 'get' || node.kind === 'set') { - context.write(node.kind + ' '); + write_keyword(context, node, node.kind, from); + context.write(' '); } if (node.value.async) { - context.write('async '); + write_keyword(context, node, 'async', from); + context.write(' '); } if (node.value.generator) context.write('*'); - if (node.computed) context.write('['); + if (node.computed) write_at(context, '[', enclosing(node, node.key, '[')); context.visit(node.key); - if (node.computed) context.write(']'); + if (node.computed) write_at(context, ']', enclosing(node, node.key, ']')); // optional method (`m?()`) if (node.optional) context.write('?'); - // @ts-expect-error `typeParameters` lives on the method node, not its value - if (node.typeParameters) context.visit(node.typeParameters); + // `typeParameters` lives on the method node, not its value + const method_type_parameters = + /** @type {{ typeParameters?: TSESTree.TSTypeParameterDeclaration }} */ (node) + .typeParameters; + if (method_type_parameters) context.visit(method_type_parameters); track_bindings(node.value.params); - context.write('('); - sequence( + write_params( context, + node, node.value.params, - (node.value.returnType ?? node.value.body)?.loc?.start ?? node.loc?.end ?? null, - false + method_type_parameters ?? node.key, + node.value.returnType ?? node.value.body ); - context.write(')'); if (node.value.returnType) context.visit(node.value.returnType); @@ -811,10 +938,16 @@ export default (options = {}) => { } } - if (node.declare) context.write('declare '); + const from = after_decorators(node); + + if (node.declare) { + write_keyword(context, node, 'declare', from); + context.write(' '); + } if (node.accessibility) { - context.write(node.accessibility + ' '); + write_keyword(context, node, node.accessibility, from); + context.write(' '); } if ( @@ -823,16 +956,24 @@ export default (options = {}) => { node.type === 'TSAbstractPropertyDefinition' || node.type === 'TSAbstractAccessorProperty' ) { - context.write('abstract '); + write_keyword(context, node, 'abstract', from); + context.write(' '); } if (node.static) { - context.write('static '); + write_keyword(context, node, 'static', from); + context.write(' '); } - if (node.override) context.write('override '); + if (node.override) { + write_keyword(context, node, 'override', from); + context.write(' '); + } - if (node.readonly) context.write('readonly '); + if (node.readonly) { + write_keyword(context, node, 'readonly', from); + context.write(' '); + } if ( // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions @@ -840,13 +981,14 @@ export default (options = {}) => { node.type === 'AccessorProperty' || node.type === 'TSAbstractAccessorProperty' ) { - context.write('accessor '); + write_keyword(context, node, 'accessor', from); + context.write(' '); } if (node.computed) { - context.write('['); + write_at(context, '[', enclosing(node, node.key, '[')); context.visit(node.key); - context.write(']'); + write_at(context, ']', enclosing(node, node.key, ']')); } else { context.visit(node.key); } @@ -902,17 +1044,11 @@ export default (options = {}) => { } // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions - track_bindings(node.parameters ?? node.params); - context.write('('); - sequence( - context, - // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions - node.parameters ?? node.params, - // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions - (node.typeAnnotation ?? node.returnType)?.loc?.start ?? node.loc?.end ?? null, - false - ); - context.write(')'); + const parameters = node.parameters ?? node.params; + // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions + const return_type = node.typeAnnotation ?? node.returnType; + track_bindings(parameters); + write_params(context, node, parameters, node.typeParameters, return_type); // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions if (node.typeAnnotation || node.returnType) { @@ -927,23 +1063,21 @@ export default (options = {}) => { */ 'TSFunctionType|TSConstructorType': (node, context) => { if (node.type === 'TSConstructorType') { - if (node.abstract) context.write('abstract '); - context.write('new '); + if (node.abstract) { + write_keyword(context, node, 'abstract'); + context.write(' '); + } + write_keyword(context, node, 'new'); + context.write(' '); } if (node.typeParameters) context.visit(node.typeParameters); // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions - track_bindings(node.parameters ?? node.params); - context.write('('); - sequence( - context, - // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions - node.parameters ?? node.params, - // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions - (node.typeAnnotation ?? node.returnType)?.loc?.start ?? node.loc?.end ?? null, - false - ); - context.write(')'); + const parameters = node.parameters ?? node.params; + // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions + const return_type = node.typeAnnotation ?? node.returnType; + track_bindings(parameters); + write_params(context, node, parameters, node.typeParameters, return_type); context.write(' => '); @@ -1002,16 +1136,23 @@ export default (options = {}) => { ArrayPattern: shared['ArrayExpression|ArrayPattern'], ArrowFunctionExpression: (node, context) => { - if (node.async) context.write('async '); + if (node.async) { + write_keyword(context, node, 'async'); + context.write(' '); + } if (node.typeParameters) { context.visit(node.typeParameters); } track_bindings(node.params); - context.write('('); - sequence(context, node.params, (node.returnType ?? node.body).loc?.start ?? null, false); - context.write(')'); + write_params( + context, + node, + node.params, + node.typeParameters ?? node.id, + node.returnType ?? node.body + ); if (node.returnType) context.visit(node.returnType); @@ -1136,9 +1277,13 @@ export default (options = {}) => { token(context, 'do', node); context.write(' '); context.visit(node.body); - context.write(' while ('); + context.write(' '); + write_keyword(context, node, 'while', node.body.loc?.end); + context.write(' '); + write_at(context, '(', locate(node, '(', node.body.loc?.end, 'after')); context.visit(node.test); - context.write(');'); + write_at(context, ')', locate(node, ')', node.loc?.end, 'before')); + context.write(';'); }, EmptyStatement(node, context) { @@ -1148,10 +1293,16 @@ export default (options = {}) => { ExportAllDeclaration(node, context) { token(context, 'export', node); - context.write(node.exportKind === 'type' ? ' type * ' : ' * '); + context.write(' '); + if (node.exportKind === 'type') { + write_keyword(context, node, 'type'); + context.write(' '); + } + context.write('* '); if (node.exported) { - context.write('as '); + write_keyword(context, node, 'as'); + context.write(' '); context.visit(node.exported); } @@ -1163,7 +1314,9 @@ export default (options = {}) => { ExportDefaultDeclaration(node, context) { token(context, 'export', node); - context.write(' default '); + context.write(' '); + write_keyword(context, node, 'default'); + context.write(' '); context.visit(node.declaration); @@ -1198,11 +1351,14 @@ export default (options = {}) => { token(context, 'export', node); context.write(' '); - if (node.exportKind === 'type') context.write('type '); + if (node.exportKind === 'type') { + write_keyword(context, node, 'type'); + context.write(' '); + } - context.write('{'); + write_at(context, '{', locate(node, '{', node.loc?.start, 'after')); sequence(context, node.specifiers, node.source?.loc?.start ?? node.loc?.end ?? null, true); - context.write('}'); + write_at(context, '}', locate(node, '}', node.source?.loc?.start ?? node.loc?.end, 'before')); if (node.source) { context.write(' from '); @@ -1215,13 +1371,16 @@ export default (options = {}) => { ExportSpecifier(node, context) { if (node.exportKind === 'type') { - context.write('type '); + write_keyword(context, node, 'type'); + context.write(' '); } context.visit(node.local); if (!same_module_name(node.local, node.exported)) { - context.write(' as '); + context.write(' '); + write_keyword(context, node, 'as', node.local.loc?.end); + context.write(' '); context.visit(node.exported); } }, @@ -1235,11 +1394,12 @@ export default (options = {}) => { ForStatement: (node, context) => { token(context, 'for', node); - context.write(' ('); + context.write(' '); + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); if (node.init) { if (node.init.type === 'VariableDeclaration') { - handle_var_declaration(node.init, context, true); + handle_var_declaration(node.init, context, true, write_keyword); } else { maybe_wrap(context, node.init, contains_in_operator(node.init)); } @@ -1250,7 +1410,8 @@ export default (options = {}) => { context.write('; '); if (node.update) context.visit(node.update); - context.write(') '); + write_at(context, ')', locate(node, ')', node.body.loc?.start, 'before')); + context.write(' '); context.visit(node.body); }, @@ -1278,9 +1439,11 @@ export default (options = {}) => { IfStatement(node, context) { token(context, 'if', node); - context.write(' ('); + context.write(' '); + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); context.visit(node.test); - context.write(') '); + write_at(context, ')', locate(node, ')', node.consequent.loc?.start, 'before')); + context.write(' '); if (node.alternate && statement_ends_with_unmatched_if(node.consequent)) { context.write('{'); @@ -1296,7 +1459,8 @@ export default (options = {}) => { if (node.alternate) { context.space(); - context.write('else '); + write_keyword(context, node, 'else', node.consequent.loc?.end); + context.write(' '); context.visit(node.alternate); } }, @@ -1331,7 +1495,10 @@ export default (options = {}) => { } } - if (node.importKind == 'type') context.write('type '); + if (node.importKind == 'type') { + write_keyword(context, node, 'type'); + context.write(' '); + } if (default_specifier) { context.write(default_specifier.local.name, default_specifier); @@ -1343,9 +1510,9 @@ export default (options = {}) => { } if (named_specifiers.length > 0) { - context.write('{'); + write_at(context, '{', locate(node, '{', node.loc?.start, 'after')); sequence(context, named_specifiers, node.source.loc?.start ?? null, true); - context.write('}'); + write_at(context, '}', locate(node, '}', node.source.loc?.start, 'before')); } context.write(' from '); @@ -1356,7 +1523,7 @@ export default (options = {}) => { ImportExpression(node, context) { token(context, 'import', node); - context.write('('); + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); context.visit(node.source); //@ts-expect-error for some reason the types haven't been updated if (node.arguments) { @@ -1371,15 +1538,20 @@ export default (options = {}) => { context.write(', '); context.visit(node.options); } - context.write(')'); + write_before(context, ')', node.loc?.end); }, ImportSpecifier(node, context) { - if (node.importKind == 'type') context.write('type '); + if (node.importKind == 'type') { + write_keyword(context, node, 'type'); + context.write(' '); + } if (!same_module_name(node.imported, node.local)) { context.visit(node.imported); - context.write(' as '); + context.write(' '); + write_keyword(context, node, 'as', node.imported.loc?.end); + context.write(' '); context.visit(node.local); } else { context.visit(node.local); @@ -1422,9 +1594,9 @@ export default (options = {}) => { if (node.optional) { context.write('?.'); } - context.write('['); + write_at(context, '[', enclosing(node, node.property, '[')); context.visit(node.property); - context.write(']'); + write_before(context, ']', node.loc?.end); } else { context.write(node.optional ? '?.' : '.'); context.visit(node.property); @@ -1444,14 +1616,14 @@ export default (options = {}) => { ObjectExpression(node, context) { context.write('{'); sequence(context, node.properties, node.loc?.end ?? null, true); - context.write('}'); + write_before(context, '}', node.loc?.end); }, ObjectPattern(node, context) { write_parameter_decorators(context, node.decorators); context.write('{'); sequence(context, node.properties, node.loc?.end ?? null, true); - context.write('}'); + write_before(context, '}', node.loc?.end); if (node.typeAnnotation) context.visit(node.typeAnnotation); }, @@ -1496,35 +1668,41 @@ export default (options = {}) => { node.value.type === 'FunctionExpression' && (node.method || node.kind === 'get' || node.kind === 'set') ) { - if (node.kind !== 'init') context.write(node.kind + ' '); - if (node.value.async) context.write('async '); + if (node.kind !== 'init') { + write_keyword(context, node, node.kind); + context.write(' '); + } + if (node.value.async) { + write_keyword(context, node, 'async'); + context.write(' '); + } if (node.value.generator) context.write('*'); - if (node.computed) context.write('['); + if (node.computed) write_at(context, '[', enclosing(node, node.key, '[')); context.visit(node.key); - if (node.computed) context.write(']'); + if (node.computed) write_at(context, ']', enclosing(node, node.key, ']')); if (node.value.typeParameters) context.visit(node.value.typeParameters); track_bindings(node.value.params); - context.write('('); - sequence( + write_params( context, + node, node.value.params, - (node.value.returnType ?? node.value.body).loc?.start ?? null, - false + node.value.typeParameters ?? node.key, + node.value.returnType ?? node.value.body ); - context.write(')'); if (node.value.returnType) context.visit(node.value.returnType); context.write(' '); context.visit(node.value.body); } else { - if (node.computed) context.write('['); + if (node.computed) write_at(context, '[', enclosing(node, node.key, '[')); if (node.kind === 'get' || node.kind === 'set') { - context.write(node.kind + ' '); + write_keyword(context, node, node.kind); + context.write(' '); } context.visit(node.key); if (node.computed) { - context.write(']'); + write_at(context, ']', enclosing(node, node.key, ']')); context.write(': '); } else { context.write(': '); @@ -1567,7 +1745,8 @@ export default (options = {}) => { SpreadElement: shared['RestElement|SpreadElement'], StaticBlock(node, context) { - context.write('static {'); + context.write('static '); + write_at(context, '{', locate(node, '{', node.loc?.start, 'after')); context.indent(); context.newline(); @@ -1575,7 +1754,7 @@ export default (options = {}) => { context.dedent(); context.newline(); - context.write('}'); + write_before(context, '}', node.loc?.end); }, Super(node, context) { @@ -1585,9 +1764,16 @@ export default (options = {}) => { SwitchStatement(node, context) { token(context, 'switch', node); - context.write(' ('); + context.write(' '); + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); context.visit(node.discriminant); - context.write(') {'); + write_at( + context, + ')', + locate(node, ')', node.cases[0]?.loc?.start ?? node.loc?.end, 'before') + ); + context.write(' '); + write_at(context, '{', locate(node, '{', node.discriminant.loc?.end, 'after')); context.indent(); let first = true; @@ -1621,7 +1807,7 @@ export default (options = {}) => { context.dedent(); context.newline(); - context.write('}'); + write_before(context, '}', node.loc?.end); }, TaggedTemplateExpression(node, context) { @@ -1643,9 +1829,10 @@ export default (options = {}) => { for (let i = 0; i < expressions.length; i++) { const raw = quasis[i].value.raw; - context.write(raw + '${'); + context.write(raw); + write_at(context, '${', enclosing(node, expressions[i], '${')); context.visit(expressions[i]); - context.write('}'); + write_at(context, '}', enclosing(node, expressions[i], '}')); if (/\n/.test(raw)) context.multiline = true; } @@ -1688,7 +1875,9 @@ export default (options = {}) => { } if (node.finalizer) { - context.write(' finally '); + context.write(' '); + write_keyword(context, node, 'finally', (node.handler ?? node.block).loc?.end); + context.write(' '); context.visit(node.finalizer); } }, @@ -1724,7 +1913,7 @@ export default (options = {}) => { }, VariableDeclaration(node, context) { - handle_var_declaration(node, context); + handle_var_declaration(node, context, false, write_keyword); context.write(';'); }, @@ -1734,17 +1923,21 @@ export default (options = {}) => { WhileStatement(node, context) { token(context, 'while', node); - context.write(' ('); + context.write(' '); + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); context.visit(node.test); - context.write(') '); + write_at(context, ')', locate(node, ')', node.body.loc?.start, 'before')); + context.write(' '); context.visit(node.body); }, WithStatement(node, context) { token(context, 'with', node); - context.write(' ('); + context.write(' '); + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); context.visit(node.object); - context.write(') '); + write_at(context, ')', locate(node, ')', node.body.loc?.start, 'before')); + context.write(' '); context.visit(node.body); }, @@ -1772,13 +1965,17 @@ export default (options = {}) => { TSDeclareFunction(node, context) { // bodyless functions are either ambient declarations or overload // signatures — only the former are written with `declare` - if (node.declare) context.write('declare '); + if (node.declare) { + write_keyword(context, node, 'declare'); + context.write(' '); + } if (node.async) { - context.write('async '); + write_keyword(context, node, 'async'); + context.write(' '); } - context.write('function'); + write_keyword(context, node, 'function'); if (node.generator) { context.write('*'); @@ -1795,9 +1992,7 @@ export default (options = {}) => { } track_bindings(node.params); - context.write('('); - sequence(context, node.params, node.returnType?.loc?.start ?? node.loc?.end ?? null, false); - context.write(')'); + write_params(context, node, node.params, node.typeParameters ?? node.id, node.returnType); if (node.returnType) { context.visit(node.returnType); @@ -1860,7 +2055,8 @@ export default (options = {}) => { TSArrayType(node, context) { context.visit(node.elementType); - context.write('[]'); + write_at(context, '[', locate(node, '[', node.elementType.loc?.end, 'after')); + write_before(context, ']', node.loc?.end); }, TSTypeAnnotation(node, context) { @@ -1871,14 +2067,15 @@ export default (options = {}) => { TSTypeLiteral(node, context) { context.write('{ '); sequence(context, node.members, node.loc?.end ?? null, false, ';'); - context.write(' }'); + context.write(' '); + write_before(context, '}', node.loc?.end); }, TSPropertySignature(node, context) { if (node.readonly) context.write('readonly '); - if (node.computed) context.write('['); + if (node.computed) write_at(context, '[', enclosing(node, node.key, '[')); context.visit(node.key); - if (node.computed) context.write(']'); + if (node.computed) write_at(context, ']', enclosing(node, node.key, ']')); if (node.optional) context.write('?'); if (node.typeAnnotation) context.visit(node.typeAnnotation); }, @@ -1904,9 +2101,10 @@ export default (options = {}) => { for (let i = 0; i < types.length; i++) { const raw = quasis[i].value.raw; - context.write(raw + '${'); + context.write(raw); + write_at(context, '${', enclosing(node, types[i], '${')); context.visit(types[i]); - context.write('}'); + write_at(context, '}', enclosing(node, types[i], '}')); if (/\n/.test(raw)) context.multiline = true; } @@ -1929,17 +2127,23 @@ export default (options = {}) => { const parameter_decorators = parameter.decorators; write_parameter_decorators(context, node.decorators); write_parameter_decorators(context, parameter_decorators); + const from = + (node.decorators?.length ? node.decorators : parameter_decorators)?.at(-1)?.loc?.end ?? + node.loc?.start; if (node.accessibility) { - context.write(node.accessibility + ' '); + write_keyword(context, node, node.accessibility, from); + context.write(' '); } if (node.override) { - context.write('override '); + write_keyword(context, node, 'override', from); + context.write(' '); } if (node.readonly) { - context.write('readonly '); + write_keyword(context, node, 'readonly', from); + context.write(' '); } if (parameter_decorators?.length) { @@ -2067,12 +2271,14 @@ export default (options = {}) => { TSIndexSignature(node, context) { if (node.readonly) context.write('readonly '); - context.write('['); + const first_parameter = node.parameters[0]; + const last_parameter = node.parameters[node.parameters.length - 1]; + write_at(context, '[', enclosing(node, first_parameter, '[')); track_bindings(node.parameters); // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions sequence(context, node.parameters, node.typeAnnotation?.loc?.start ?? null, false); - context.write(']'); + write_at(context, ']', enclosing(node, last_parameter, ']')); // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions context.visit(node.typeAnnotation); @@ -2083,16 +2289,18 @@ export default (options = {}) => { // `readonly` / `+readonly` / `-readonly` modifier if (node.readonly) { - context.write( - node.readonly === '-' ? '-readonly ' : node.readonly === '+' ? '+readonly ' : 'readonly ' - ); + if (node.readonly === '-' || node.readonly === '+') context.write(node.readonly); + write_keyword(context, node, 'readonly'); + context.write(' '); } - context.write('['); - const legacy_type_parameter = node.typeParameter; const key = node.key ?? legacy_type_parameter?.name; const constraint = node.constraint ?? legacy_type_parameter?.constraint; + const first_bracket_child = key && typeof key === 'object' ? key : legacy_type_parameter; + const last_bracket_child = node.nameType ?? constraint ?? first_bracket_child; + + write_at(context, '[', enclosing(node, first_bracket_child, '[')); if (key && typeof key === 'object') { context.visit(key); @@ -2101,17 +2309,21 @@ export default (options = {}) => { } if (constraint) { - context.write(' in '); + context.write(' '); + write_keyword(context, node, 'in'); + context.write(' '); context.visit(constraint); } // `as` key remapping if (node.nameType) { - context.write(' as '); + context.write(' '); + write_keyword(context, node, 'as'); + context.write(' '); context.visit(node.nameType); } - context.write(']'); + write_at(context, ']', enclosing(node, last_bracket_child, ']')); // `?` / `+?` / `-?` optionality modifier if (node.optional) { @@ -2123,7 +2335,7 @@ export default (options = {}) => { context.visit(node.typeAnnotation); } - context.write('}'); + write_before(context, '}', node.loc?.end); }, TSMethodSignature(node, context) { @@ -2132,9 +2344,9 @@ export default (options = {}) => { context.write(node.kind + ' '); } - if (node.computed) context.write('['); + if (node.computed) write_at(context, '[', enclosing(node, node.key, '[')); context.visit(node.key); - if (node.computed) context.write(']'); + if (node.computed) write_at(context, ']', enclosing(node, node.key, ']')); if (node.optional) context.write('?'); if (node.typeParameters) { @@ -2142,17 +2354,11 @@ export default (options = {}) => { } // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions - track_bindings(node.parameters ?? node.params); - context.write('('); - sequence( - context, - // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions - node.parameters ?? node.params, - // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions - (node.typeAnnotation ?? node.returnType)?.loc?.start ?? node.loc?.end ?? null, - false - ); - context.write(')'); + const parameters = node.parameters ?? node.params; + // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions + const return_type = node.typeAnnotation ?? node.returnType; + track_bindings(parameters); + write_params(context, node, parameters, node.typeParameters ?? node.key, return_type); // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions if (node.typeAnnotation || node.returnType) { @@ -2164,7 +2370,7 @@ export default (options = {}) => { TSTupleType(node, context) { context.write('['); sequence(context, node.elementTypes, node.loc?.end ?? null, false); - context.write(']'); + write_before(context, ']', node.loc?.end); }, TSNamedTupleMember(node, context) { @@ -2213,22 +2419,27 @@ export default (options = {}) => { TSConstructorType: shared['TSFunctionType|TSConstructorType'], TSExternalModuleReference(node, context) { - context.write('require('); + context.write('require'); + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); context.visit(node.expression); - context.write(');'); + write_before(context, ')', node.loc?.end); + context.write(';'); }, TSIndexedAccessType(node, context) { context.visit(node.objectType); - context.write('['); + write_at(context, '[', enclosing(node, node.indexType, '[')); context.visit(node.indexType); - context.write(']'); + write_before(context, ']', node.loc?.end); }, TSImportEqualsDeclaration(node, context) { token(context, 'import', node); context.write(' '); - if (node.importKind === 'type') context.write('type '); + if (node.importKind === 'type') { + write_keyword(context, node, 'type'); + context.write(' '); + } context.visit(node.id); context.write(' = '); context.visit(node.moduleReference); @@ -2236,9 +2447,9 @@ export default (options = {}) => { TSImportType(node, context) { token(context, 'import', node); - context.write('('); + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); context.visit(node.argument); - context.write(')'); + write_at(context, ')', locate(node, ')', node.argument.loc?.end, 'after')); if (node.qualifier) { context.write('.'); @@ -2270,43 +2481,58 @@ export default (options = {}) => { EXPRESSIONS_PRECEDENCE[node.expression.type] < EXPRESSIONS_PRECEDENCE.TSAsExpression; maybe_wrap(context, node.expression, wrap); } - context.write(' as '); + context.write(' '); + write_keyword(context, node, 'as', node.expression.loc?.end); + context.write(' '); context.visit(node.typeAnnotation); }, TSEnumDeclaration(node, context) { - if (node.declare) context.write('declare '); - if (node.const) context.write('const '); - context.write('enum '); + if (node.declare) { + write_keyword(context, node, 'declare'); + context.write(' '); + } + if (node.const) { + write_keyword(context, node, 'const'); + context.write(' '); + } + write_keyword(context, node, 'enum'); + context.write(' '); context.visit(node.id); - context.write(' {'); + context.write(' '); + write_at(context, '{', locate(node, '{', node.id.loc?.end, 'after')); context.indent(); context.newline(); sequence(context, node.members ?? node.body.members, node.loc?.end ?? null, false); context.dedent(); context.newline(); - context.write('}'); + write_before(context, '}', node.loc?.end); }, TSModuleBlock(node, context) { - context.write(' {'); + context.write(' '); + write_at(context, '{', node.loc?.start); context.indent(); context.newline(); body(context, node); context.dedent(); context.newline(); - context.write('}'); + write_before(context, '}', node.loc?.end); }, TSModuleDeclaration(node, context) { - if (node.declare) context.write('declare '); + if (node.declare) { + write_keyword(context, node, 'declare'); + context.write(' '); + } if (node.global) { context.write('global', node.id); } else { // @ts-expect-error `acorn-typescript` and `@typescript-eslint/types` have slightly different type definitions const kind = node.kind ?? (node.id.type === 'Literal' ? 'module' : 'namespace'); - context.write(kind + ' '); + write_keyword(context, node, kind); + context.write(' '); context.visit(node.id); } @@ -2336,17 +2562,24 @@ export default (options = {}) => { }, TSInterfaceDeclaration(node, context) { - if (node.declare) context.write('declare '); - context.write('interface '); + if (node.declare) { + write_keyword(context, node, 'declare'); + context.write(' '); + } + write_keyword(context, node, 'interface'); + context.write(' '); context.visit(node.id); if (node.typeParameters) context.visit(node.typeParameters); if (node.extends && node.extends.length > 0) { - context.write(' extends '); + context.write(' '); + write_keyword(context, node, 'extends', (node.typeParameters ?? node.id).loc?.end); + context.write(' '); sequence(context, node.extends, node.body.loc?.start ?? null, false); } - context.write(' {'); + context.write(' '); + write_at(context, '{', node.body.loc?.start); context.visit(node.body); - context.write('}'); + write_before(context, '}', node.body.loc?.end); }, TSInstantiationExpression(node, context) { @@ -2376,13 +2609,19 @@ export default (options = {}) => { EXPRESSIONS_PRECEDENCE.TSSatisfiesExpression; maybe_wrap(context, node.expression, wrap); } - context.write(' satisfies '); + context.write(' '); + write_keyword(context, node, 'satisfies', node.expression.loc?.end); + context.write(' '); context.visit(node.typeAnnotation); }, TSTypeAliasDeclaration(node, context) { - if (node.declare) context.write('declare '); - context.write('type '); + if (node.declare) { + write_keyword(context, node, 'declare'); + context.write(' '); + } + write_keyword(context, node, 'type'); + context.write(' '); context.visit(node.id); if (node.typeParameters) context.visit(node.typeParameters); context.write(' = '); @@ -2709,16 +2948,23 @@ function handle_var_declarator(node, context, no_in) { /** * @param {TSESTree.VariableDeclaration} node * @param {Context} context - * @param {boolean} [no_in] + * @param {boolean} no_in + * @param {(context: Context, node: TSESTree.Node, word: string) => void} keyword writes a keyword after the node's first token */ -function handle_var_declaration(node, context, no_in = false) { +function handle_var_declaration(node, context, no_in, keyword) { const open = context.new(); const join = context.new(); const child_context = context.new(); context.append(child_context); - token(child_context, node.declare ? `declare ${node.kind}` : node.kind, node); + if (node.declare) { + token(child_context, 'declare', node); + child_context.write(' '); + keyword(child_context, node, node.kind); + } else { + token(child_context, node.kind, node); + } child_context.write(' '); child_context.append(open); diff --git a/src/languages/ts/public.ts b/src/languages/ts/public.ts index 9aa98686..275ef96b 100644 --- a/src/languages/ts/public.ts +++ b/src/languages/ts/public.ts @@ -1,4 +1,4 @@ export type { BaseNode as Node } from '../../types.js'; -export type { BaseComment, Comment } from '../types.js'; +export type { BaseComment, Comment, SourceToken } from '../types.js'; export { default, EXPRESSIONS_PRECEDENCE } from './index.js'; diff --git a/src/languages/ts/tokens.js b/src/languages/ts/tokens.js new file mode 100644 index 00000000..3df8bfc2 --- /dev/null +++ b/src/languages/ts/tokens.js @@ -0,0 +1,175 @@ +/** @import { TSESTree } from '@typescript-eslint/types' */ +/** @import { SourceToken, TSOptions } from '../types.js' */ + +/** @typedef {{ line: number, column: number }} Position */ +/** @typedef {{ start: Position, end: Position }} Location */ + +/** + * The tokens that are looked up: delimiters, and the keywords a printer writes + * after a node's first token (which no node boundary locates) + */ +const WORDS = new Set([ + ...['(', ')', '[', ']', '{', '}', '${'], + ...['function', 'class', 'else', 'finally', 'while', 'default', 'type', 'async', 'await'], + ...['declare', 'abstract', 'static', 'readonly', 'override', 'accessor', 'get', 'set'], + ...['public', 'private', 'protected', 'const', 'enum', 'interface', 'namespace', 'module'], + ...['extends', 'implements', 'in', 'of', 'as', 'satisfies', 'new'] +]); + +/** + * Negative when `a` comes before `b`, positive when after, zero when equal + * @param {Position} a + * @param {Position} b + */ +export function compare_positions(a, b) { + return a.line - b.line || a.column - b.column; +} + +/** + * The punctuator or word a parser token stands for. Acorn and Babel put + * punctuators and reserved words on `type.label` and other words (`async`, + * `type`, `of`) in `value` with the label `name`; ESLint-style tokens (espree, + * typescript-eslint) use `type: 'Punctuator' | 'Keyword' | 'Identifier'` with + * the text in `value`. + * @param {SourceToken} token + */ +function word(token) { + const { type } = token; + if (typeof type === 'object' && type !== null) { + return type.label === 'name' ? token.value : type.label; + } + if (type === 'Punctuator' || type === 'Keyword' || type === 'Identifier') return token.value; + return undefined; +} + +/** + * Locates tokens that sit inside a node — the brackets of a computed key, the + * parentheses of a call or an `if`, the braces of an import list, `function` + * after `async`, `else`, `finally` — in the parser's tokens, since no node + * boundary records where they are. Without `tokens`, every lookup returns + * `undefined` and the token is left unmapped rather than guessed. + * + * @param {TSOptions} options + */ +export function token_locator(options) { + let instance = instances.get(options); + if (!instance) { + instance = create_token_locator(options); + instances.set(options, instance); + } + return instance; +} + +/** One instance per options object, so `tsx` shares the index built for `ts` */ +/** @type {WeakMap>} */ +const instances = new WeakMap(); + +/** @param {TSOptions} options */ +function create_token_locator(options) { + /** + * The tokens of interest from `options.tokens`, in source order, built on + * the first lookup + * @type {{ value: string, loc: Location }[] | undefined} + */ + let entries; + + function get_entries() { + if (entries === undefined) { + entries = []; + let sorted = true; + + for (const token of options.tokens ?? []) { + const value = word(token); + if (typeof value !== 'string' || !WORDS.has(value) || !token.loc) continue; + + const previous = entries[entries.length - 1]; + if (previous && compare_positions(previous.loc.start, token.loc.start) > 0) sorted = false; + entries.push({ value, loc: token.loc }); + } + + // a backtracking parser can re-emit tokens; the binary search needs monotone positions + if (!sorted) { + entries.sort((a, b) => compare_positions(a.loc.start, b.loc.start)); + } + } + + return entries; + } + + /** + * The nearest `value` token on `side` of `pos`, without leaving `node` + * @param {TSESTree.Node} node + * @param {string} value + * @param {Position} pos + * @param {'before' | 'after'} side + * @returns {Location | undefined} + */ + function find(node, value, pos, side) { + if (!node.loc) return undefined; + + const tokens = get_entries(); + let lo = 0; + let hi = tokens.length - 1; + + if (side === 'before') { + // rightmost token ending at or before `pos` + while (lo <= hi) { + const mid = (lo + hi) >> 1; + if (compare_positions(tokens[mid].loc.end, pos) > 0) hi = mid - 1; + else lo = mid + 1; + } + + for (let i = hi; i >= 0; i -= 1) { + const token = tokens[i]; + if (compare_positions(token.loc.start, node.loc.start) < 0) break; + if (token.value === value) return token.loc; + } + } else { + // leftmost token starting at or after `pos` + while (lo <= hi) { + const mid = (lo + hi) >> 1; + if (compare_positions(tokens[mid].loc.start, pos) < 0) lo = mid + 1; + else hi = mid - 1; + } + + for (let i = lo; i < tokens.length; i += 1) { + const token = tokens[i]; + if (compare_positions(token.loc.end, node.loc.end) > 0) break; + if (token.value === value) return token.loc; + } + } + } + + /** + * The location of the `value` token nearest to `pos` on `side`, or + * `undefined` when `tokens` were not supplied or the token is not there in + * the source. + * @param {TSESTree.Node} node + * @param {string} value + * @param {Position | undefined} pos + * @param {'before' | 'after'} side + */ + function locate(node, value, pos, side) { + if (!options.tokens || !pos) return undefined; + return find(node, value, pos, side); + } + + /** + * The location of the delimiter that opens (just before `inner`) or closes + * (just after `inner`) a bracketed part of `node`. + * @param {TSESTree.Node} node + * @param {TSESTree.Node | null | undefined} inner + * @param {'(' | ')' | '[' | ']' | '{' | '}' | '${'} value + */ + function enclosing(node, inner, value) { + const opening = value !== ')' && value !== ']' && value !== '}'; + return locate( + node, + value, + opening ? inner?.loc?.start : inner?.loc?.end, + opening ? 'before' : 'after' + ); + } + + return { locate, enclosing }; +} diff --git a/src/languages/tsx/public.ts b/src/languages/tsx/public.ts index 1181b7b7..02692535 100644 --- a/src/languages/tsx/public.ts +++ b/src/languages/tsx/public.ts @@ -1,4 +1,4 @@ export type { BaseNode as Node } from '../../types.js'; -export type { BaseComment, Comment } from '../types.js'; +export type { BaseComment, Comment, SourceToken } from '../types.js'; export { default } from './index.js'; diff --git a/src/languages/types.ts b/src/languages/types.ts index 70662510..7eceba78 100644 --- a/src/languages/types.ts +++ b/src/languages/types.ts @@ -3,6 +3,14 @@ import type { BaseNode } from '../types.js'; export type TSOptions = { quotes?: 'double' | 'single'; comments?: Comment[]; + /** + * The parser's tokens, with locations — Acorn's `onToken` array, Babel's + * `tokens`, or an ESLint-style `ast.tokens`. Used to map delimiters that + * sit inside a node (the brackets of a computed key, the parentheses of a + * call or an `if`, the braces of an import list), which no node boundary + * locates. Without it those delimiters are left unmapped. + */ + tokens?: readonly SourceToken[]; getLeadingComments?: (node: BaseNode) => BaseComment[] | undefined; getTrailingComments?: (node: BaseNode) => BaseComment[] | undefined; }; @@ -12,6 +20,20 @@ interface Position { column: number; } +/** + * A parser token. The punctuator it stands for is read from `type.label` + * (Acorn, Babel) or, for `type: 'Punctuator'` tokens (espree, + * typescript-eslint), from `value`. + */ +export interface SourceToken { + type?: string | { label?: string }; + value?: unknown; + loc?: null | { + start: Position; + end: Position; + }; +} + // this exists in TSESTree but because of the inanity around enums // it's easier to do this ourselves export interface BaseComment { diff --git a/test/common.js b/test/common.js index 55483eac..33bb1425 100644 --- a/test/common.js +++ b/test/common.js @@ -10,7 +10,7 @@ export const acornTs = acorn.Parser.extend(tsPlugin()); export const acornTsx = acorn.Parser.extend(tsPlugin({ jsx: true })); /** @param {string} input - * @param {{ jsxMode?: boolean, sourceType?: 'module' | 'script', preserveParens?: boolean, fileExtension?: string }} opts + * @param {{ jsxMode?: boolean, sourceType?: 'module' | 'script', preserveParens?: boolean, fileExtension?: string, tokens?: any[] }} opts */ export function acornParse(input, opts = {}) { const jsx = opts.jsxMode ?? false; @@ -24,6 +24,7 @@ export function acornParse(input, opts = {}) { sourceType, locations: true, preserveParens: opts.preserveParens ?? false, + onToken: opts.tokens, onComment: (block, value, start, end, startLoc, endLoc) => { if (block && /\n/.test(value)) { let a = start; diff --git a/test/samples/array-expressions/expected.js.map b/test/samples/array-expressions/expected.js.map index 8df51fc5..3f53b249 100644 --- a/test/samples/array-expressions/expected.js.map +++ b/test/samples/array-expressions/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "a = [1, 2, 3];\n\nb = [\n\t'the quick brown fox jumps over the lazy dog',\n\t'the quick brown fox jumps over the lazy dog',\n\t'the quick brown fox jumps over the lazy dog',\n\t4\n];\n\nsparse = [,,,5];\nsparser = [,,,];\n" ], - "mappings": "AAAA,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;;AAEd,CAAC,GAAG;CACH,6CAA6C;CAC7C,6CAA6C;CAC7C,6CAA6C;CAC7C,CAAC;CACD,CAAC;;AAEF,MAAM,GAAG,KAAI,CAAC,CAAC,CAAC;AAChB,OAAO,GAAG,KAAK,CAAC,AAChB" + "mappings": "AAAA,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;;AAEd,CAAC,GAAG;CACH,6CAA6C;CAC7C,6CAA6C;CAC7C,6CAA6C;CAC7C,CAAC;AACF,CAAC,CAAC;;AAEF,MAAM,GAAG,KAAI,CAAC,CAAC,CAAC;AAChB,OAAO,GAAG,IAAI,CAAC,CAAC,AAChB" } \ No newline at end of file diff --git a/test/samples/arrow-function-needs-braces/expected.js.map b/test/samples/arrow-function-needs-braces/expected.js.map index dedf33da..495235a0 100644 --- a/test/samples/arrow-function-needs-braces/expected.js.map +++ b/test/samples/arrow-function-needs-braces/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "let a = () => ({ x } = { x: 42 });\nlet b = () => ({} || bar);\nlet c = () => ({} ? foo : bar);" ], - "mappings": "AAAA,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AAClC,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC;AAC1B,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC" + "mappings": "AAAA,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAClC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;AAC1B,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC" } \ No newline at end of file diff --git a/test/samples/basic/expected.js.map b/test/samples/basic/expected.js.map index ca876cb3..ccd5652e 100644 --- a/test/samples/basic/expected.js.map +++ b/test/samples/basic/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "foo({ a: 1 });\n" ], - "mappings": "AAAA,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,AACd" + "mappings": "AAAA,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,AACd" } \ No newline at end of file diff --git a/test/samples/call-expressions/expected.js.map b/test/samples/call-expressions/expected.js.map index b7f7b21d..8923b379 100644 --- a/test/samples/call-expressions/expected.js.map +++ b/test/samples/call-expressions/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "x(a, b, c);\n\nx(a, b, () => {\n\tconsole.log('c');\n});\n\nx(\n\ta,\n\t() => {\n\t\tconsole.log('b');\n\t},\n\t() => {\n\t\tconsole.log('c');\n\t}\n);" ], - "mappings": "AAAA,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;;AAEX,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;;AAEH,CAAC;CACA,CAAC;CACD,MAAM,CAAC;EACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAClB,CAAC;CACD,MAAM,CAAC;EACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAClB,CAAC;CACD,CAAC" + "mappings": "AAAA,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;;AAEX,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;;AAEH,CAAC;CACA,CAAC;CACD,MAAM,CAAC;EACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAClB,CAAC;CACD,MAAM,CAAC;EACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAClB,CAAC;AACF,CAAC,CAAC" } \ No newline at end of file diff --git a/test/samples/chain-expressions/expected.js.map b/test/samples/chain-expressions/expected.js.map index 5d2b886c..b0cac3be 100644 --- a/test/samples/chain-expressions/expected.js.map +++ b/test/samples/chain-expressions/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "foo?.bar.baz;\nx?.(a, b, c);\nx()?.();\na?.b.c;\na?.b().c;\na?.b?.c;\n(a?.b)();\n(a?.b).c;\nnew (a?.b)();\ndelete (a?.b).c;\n(a?.b)`x`;\n(a?.())();\n" ], - "mappings": "AAAA,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;AACb,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACb,CAAC,EAAE,IAAI,CAAC;AACR,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACP,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACT,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACR,AAAC,CAAA,CAAC,EAAE,CAAC,GAAG,CAAC;AACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACT,GAAG,CAAE,CAAA,CAAC,EAAE,CAAC,GAAG,CAAC;AACb,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;AACV,AAAC,CAAA,CAAC,IAAI,GAAG,CAAC,AACV" + "mappings": "AAAA,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;AACb,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACb,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACR,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACP,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACT,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACR,AAAC,CAAA,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACT,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACT,GAAG,CAAE,CAAA,CAAC,EAAE,CAAC,GAAG,CAAC;AACb,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAChB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;AACV,AAAC,CAAA,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,AACV" } \ No newline at end of file diff --git a/test/samples/class-extends/expected.js.map b/test/samples/class-extends/expected.js.map index daa3884c..25c2cc8c 100644 --- a/test/samples/class-extends/expected.js.map +++ b/test/samples/class-extends/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "class A extends (B || C) {}\nclass B extends (cond ? B : D) {}\nconst C = class extends (a = b) {};\nclass D extends B.C {}\nclass E extends new B() {}\nclass F extends f() {}\n" ], - "mappings": "AAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3B,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;AACjC,KAAK,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;;AACnC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,AACtB" + "mappings": "AAAA,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3B,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;AACjC,KAAK,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;;AACnC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1B,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,AACtB" } \ No newline at end of file diff --git a/test/samples/class-static-block/expected.js.map b/test/samples/class-static-block/expected.js.map index d19bd948..df68b202 100644 --- a/test/samples/class-static-block/expected.js.map +++ b/test/samples/class-static-block/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "class Foo {\n\tstatic {\n\t\tthis.abc = 1;\n\t}\n}" ], - "mappings": "AAAA,MAAM,GAAG,CAAC,CAAC;CACV;EACC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;EACb;AACF,CAAC" + "mappings": "AAAA,MAAM,GAAG,CAAC,CAAC;CACV;EACC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;CACd,CAAC;AACF,CAAC" } \ No newline at end of file diff --git a/test/samples/comment-after-function-argument/expected.js.map b/test/samples/comment-after-function-argument/expected.js.map index 776224e1..36b7fb1e 100644 --- a/test/samples/comment-after-function-argument/expected.js.map +++ b/test/samples/comment-after-function-argument/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "foo(function bar() {\n\t// logic goes here\n}, true); // trailing comment\n" ], - "mappings": "AAAA,GAAG;CAAC,SAAS,GAAG,GAAG,CAAC;;CAEpB,CAAC;CAAE,IAAI;CAAC,CAAC,oBACT" + "mappings": "AAAA,GAAG;CAAC,SAAS,GAAG,GAAG,CAAC;;CAEpB,CAAC;CAAE,IAAI;AAAA,CAAC,CAAC,oBACT" } \ No newline at end of file diff --git a/test/samples/comment-block/expected.js.map b/test/samples/comment-block/expected.js.map index c03567dc..3b306b6e 100644 --- a/test/samples/comment-block/expected.js.map +++ b/test/samples/comment-block/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "/* comment before a node\n * second line */\nconsole.log(1);\n\nconsole.log(2); /* comment on same line as node */\n\nconst obj = {\n\tfoo: 1, /* comment in middle of object */\n\tbar: 2\n};\n" ], - "mappings": "AAAA;;AAEA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAEf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAEf,KAAK,CAAC,GAAG,GAAG,EACX,GAAG,EAAE,CAAC,oCACN,GAAG,EAAE,CAAC,EACN,CAAC,AACF" + "mappings": "AAAA;;AAEA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAEf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAEf,KAAK,CAAC,GAAG,GAAG,EACX,GAAG,EAAE,CAAC,oCACN,GAAG,EAAE,CAAC,CACP,CAAC,CAAC,AACF" } \ No newline at end of file diff --git a/test/samples/comment-inline/expected.js.map b/test/samples/comment-inline/expected.js.map index a7936dbf..7877306e 100644 --- a/test/samples/comment-inline/expected.js.map +++ b/test/samples/comment-inline/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "// comment before a node\n// second line\nconsole.log(1);\nconsole.log(2); // comment on same line as node\n\nconst obj = {\n\tfoo: 1, // comment in middle of object\n\tbar: 2 // comment in middle of object\n};\n\nfunction bar() {\n\treturn /*result*/ foo;\n}\n" ], - "mappings": "AAAA;;AAEA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AACf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAEf,KAAK,CAAC,GAAG,GAAG;CACX,GAAG,EAAE,CAAC;CACN,GAAG,EAAE,CAAC;CACN,CAAC;;AAEF,SAAS,GAAG,GAAG,CAAC;CACf,MAAM,aAAY,GAAG,EAAC;AACvB,CAAC,AACD" + "mappings": "AAAA;;AAEA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AACf,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;AAEf,KAAK,CAAC,GAAG,GAAG;CACX,GAAG,EAAE,CAAC;CACN,GAAG,EAAE,CAAC;AACP,CAAC,CAAC;;AAEF,SAAS,GAAG,GAAG,CAAC;CACf,MAAM,aAAY,GAAG,EAAC;AACvB,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/comment-jsdoc-type-cast-param-default/expected.js.map b/test/samples/comment-jsdoc-type-cast-param-default/expected.js.map index c9833378..14348eb0 100644 --- a/test/samples/comment-jsdoc-type-cast-param-default/expected.js.map +++ b/test/samples/comment-jsdoc-type-cast-param-default/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const row_template = ($$anchor, row = $.noop) => {\n\trow;\n};\n\nconst f = ({ a } = {}) => a;\n\nfunction g(x = 1) {\n\treturn x;\n}\n\nconst value = /** @type {number} */ (computed);\n" ], - "mappings": "AAAA,KAAK,CAAC,YAAY,GAAG,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;CACjD,GAAG,CAAC;AACL,CAAC,CAAC;;AAEF,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;;AAE5B,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CAClB,MAAM,CAAC,CAAC,CAAC;AACV,CAAC;;AAED,KAAK,CAAC,KAAK,0BAA0B,QAAQ,EAAE,AAC/C" + "mappings": "AAAA,KAAK,CAAC,YAAY,GAAG,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC;CACjD,GAAG,CAAC;AACL,CAAC,CAAC;;AAEF,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;;AAE5B,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CAClB,MAAM,CAAC,CAAC,CAAC;AACV,CAAC;;AAED,KAAK,CAAC,KAAK,0BAA0B,QAAQ,EAAE,AAC/C" } \ No newline at end of file diff --git a/test/samples/comment-within-call-expression/expected.js.map b/test/samples/comment-within-call-expression/expected.js.map index 30c3ef64..813a0edf 100644 --- a/test/samples/comment-within-call-expression/expected.js.map +++ b/test/samples/comment-within-call-expression/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "console.log(null, /* xxx */ new Date(), /** zzz */ a.b.c()); // www\n\nconsole.log(\n\tnull, // foo\n\tnew Date()\n);\n\nconsole.log(\n\tnull, // foo\n\tnew Date()\n);\n\nconsole.log(null, /* xxx */ function (a, b) {\n\t// yyy\n\treturn a + b;\n});\n\nconsole.log(\"1\");\n" ], - "mappings": "AAAA,OAAO,CAAC,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;;AAE5D,OAAO,CAAC,GAAG;CACV,IAAI;CACJ,GAAG,CAAC,IAAI,EAAE;CACV,CAAC;;AAEF,OAAO,CAAC,GAAG;CACV,IAAI;CACJ,GAAG,CAAC,IAAI,EAAE;CACV,CAAC;;AAEF,OAAO,CAAC,GAAG,CAAC,IAAI,YAAY,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5C,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AACd,CAAC,CAAC,CAAC;;AAEH,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,AACjB" + "mappings": "AAAA,OAAO,CAAC,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;AAE5D,OAAO,CAAC,GAAG;CACV,IAAI;CACJ,GAAG,CAAC,IAAI,EAAE;AACX,CAAC,CAAC;;AAEF,OAAO,CAAC,GAAG;CACV,IAAI;CACJ,GAAG,CAAC,IAAI,EAAE;AACX,CAAC,CAAC;;AAEF,OAAO,CAAC,GAAG,CAAC,IAAI,YAAY,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;;CAE5C,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AACd,CAAC,CAAC,CAAC;;AAEH,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,AACjB" } \ No newline at end of file diff --git a/test/samples/computed-getter/expected.js.map b/test/samples/computed-getter/expected.js.map index 434d194c..531ef05c 100644 --- a/test/samples/computed-getter/expected.js.map +++ b/test/samples/computed-getter/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "obj = {\n\tget [foo]() {\n\t\treturn bar;\n\t}\n}\n" ], - "mappings": "AAAA,GAAG,GAAG;CACL,KAAK,GAAG,IAAI,CAAC;EACZ,MAAM,CAAC,GAAG,CAAC;CACZ,CAAC;CACD,CAAA,AACD" + "mappings": "AAAA,GAAG,GAAG;CACL,KAAK,GAAG,IAAI,CAAC;EACZ,MAAM,CAAC,GAAG,CAAC;CACZ,CAAC;AACF,CAAC,CAAA,AACD" } \ No newline at end of file diff --git a/test/samples/deconflict-method/expected.js.map b/test/samples/deconflict-method/expected.js.map index 547716d5..9c0067a1 100644 --- a/test/samples/deconflict-method/expected.js.map +++ b/test/samples/deconflict-method/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "obj = {\n\ta(foo) {\n\n\t}\n};\n" ], - "mappings": "AAAA,GAAG,GAAG,EACL,CAAC,CAAC,GAAG,EAAE,CAAC,AAER,CAAC,EACD,CAAC,AACF" + "mappings": "AAAA,GAAG,GAAG,EACL,CAAC,CAAC,GAAG,EAAE,CAAC,AAER,CAAC,CACF,CAAC,CAAC,AACF" } \ No newline at end of file diff --git a/test/samples/destructured-assignment/expected.js.map b/test/samples/destructured-assignment/expected.js.map index 100921c2..aeb053d3 100644 --- a/test/samples/destructured-assignment/expected.js.map +++ b/test/samples/destructured-assignment/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "({ answer = 42 } = life_the_universe_and_everything);\n" ], - "mappings": "AAAA,CAAC,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,gCAAgC,EAAE,AACrD" + "mappings": "AAAA,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,gCAAgC,EAAE,AACrD" } \ No newline at end of file diff --git a/test/samples/destructured-declaration/expected.js.map b/test/samples/destructured-declaration/expected.js.map index d3753848..9b54347b 100644 --- a/test/samples/destructured-declaration/expected.js.map +++ b/test/samples/destructured-declaration/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const { answer = 42 } = life_the_universe_and_everything;" ], - "mappings": "AAAA,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,EAAE,GAAG,gCAAgC,CAAC" + "mappings": "AAAA,KAAK,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC,GAAG,gCAAgC,CAAC" } \ No newline at end of file diff --git a/test/samples/function-expression/expected.js.map b/test/samples/function-expression/expected.js.map index 50f99571..aa32e677 100644 --- a/test/samples/function-expression/expected.js.map +++ b/test/samples/function-expression/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "(function(){\n\n})\nlet object = {\n foo() {\n \n }\n}" ], - "mappings": "AAAA,CAAC,YAAU,CAAC,AAEZ,CAAC,EAAC;;AACF,GAAG,CAAC,MAAM,GAAG,EACT,GAAG,GAAG,CAAC,AAEP,CAAC,EACJ,CAAA" + "mappings": "AAAA,CAAC,YAAU,CAAC,AAEZ,CAAC,EAAC;;AACF,GAAG,CAAC,MAAM,GAAG,EACT,GAAG,GAAG,CAAC,AAEP,CAAC,CACL,CAAC,CAAA" } \ No newline at end of file diff --git a/test/samples/import-attributes/expected.js.map b/test/samples/import-attributes/expected.js.map index faa2e254..e0076335 100644 --- a/test/samples/import-attributes/expected.js.map +++ b/test/samples/import-attributes/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "import { foo } from 'x' with {type: 'json'};\nimport { bar } from 'y' with { \"blah\": \"true\", baz: \"false\" };\nimport('baz', { with: { stuff: true }}).then(blah);" ], - "mappings": "AAAA,MAAM,GAAG,GAAG,QAAQ,GAAG,QAAO,IAAI,EAAE,MAAM,GAAE;AAC5C,MAAM,GAAG,GAAG,QAAQ,GAAG,QAAQ,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG;;AAC9D,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC" + "mappings": "AAAA,MAAM,GAAG,GAAG,QAAQ,GAAG,QAAO,IAAI,EAAE,MAAM,GAAE;AAC5C,MAAM,GAAG,GAAG,QAAQ,GAAG,QAAQ,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG;;AAC9D,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC" } \ No newline at end of file diff --git a/test/samples/jsx-basic/expected.jsx.map b/test/samples/jsx-basic/expected.jsx.map index 9075a710..43306105 100644 --- a/test/samples/jsx-basic/expected.jsx.map +++ b/test/samples/jsx-basic/expected.jsx.map @@ -7,5 +7,5 @@ "sourcesContent": [ "console.log(\n\t<>\n\t\t
\n\t\t\t{'An\n\t\t\tTime since last cat incident: {'5 days'}\n\t\t
\n\t\n);\n" ], - "mappings": "AAAA,OAAO,CAAC,GAAG,CACV,EAAE;EACD,CAAC,GAAG,CAAC;GACJ,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,0BAA0B,CAAC,GAAG;iCACxB,CAAC,QAAQ,CAAC;EACzC,EAAE,GAAG,CAAC;CACP,GAAG,CACH,CAAC,AACF" + "mappings": "AAAA,OAAO,CAAC,GAAG,CACV,EAAE;EACD,CAAC,GAAG,CAAC;GACJ,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,0BAA0B,CAAC,GAAG;iCACxB,CAAC,QAAQ,CAAC;EACzC,EAAE,GAAG,CAAC;CACP,GAAG,AACJ,CAAC,CAAC,AACF" } \ No newline at end of file diff --git a/test/samples/method/expected.js.map b/test/samples/method/expected.js.map index 3654d228..304dee68 100644 --- a/test/samples/method/expected.js.map +++ b/test/samples/method/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "obj = {\n\tfoo() {\n\t\tconsole.log('foo');\n\t},\n\tasync bar() {\n\t\tconsole.log('bar');\n\t},\n\t*baz() {\n\t\tconsole.log('baz');\n\t}\n};" ], - "mappings": "AAAA,GAAG,GAAG;CACL,GAAG,GAAG,CAAC;EACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;CACpB,CAAC;;CACD,MAAM,GAAG,GAAG,CAAC;EACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;CACpB,CAAC;;CACD,CAAC,GAAG,GAAG,CAAC;EACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;CACpB,CAAC;CACD,CAAC" + "mappings": "AAAA,GAAG,GAAG;CACL,GAAG,GAAG,CAAC;EACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;CACpB,CAAC;;CACD,MAAM,GAAG,GAAG,CAAC;EACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;CACpB,CAAC;;CACD,CAAC,GAAG,GAAG,CAAC;EACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;CACpB,CAAC;AACF,CAAC,CAAC" } \ No newline at end of file diff --git a/test/samples/object-expressions/expected.js.map b/test/samples/object-expressions/expected.js.map index 21271fcc..dd7ac1f3 100644 --- a/test/samples/object-expressions/expected.js.map +++ b/test/samples/object-expressions/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "obj = { foo, bar, baz: qux };\nobj = { \"1\": \"1\" };\nobj = { true: true };\nobj = { foo };\nobj = { [foo]: foo };\nobj = { [foo]: \"foo\" };\nlet blah;\nobj = { blah };\nobj = { blah };\nobj = { a: b };\n({ a: 1, b: 1 });\n\nobj = {\n\tmethod() {\n\t\tconsole.log('hello');\n\t}\n};\n\nempty = {};\nopts = opts || {};\n\nobj = {\n\tget foo() {\n\t\treturn _foo;\n\t},\n\tset foo(value) {\n\t\t_foo = value;\n\t},\n\tget [foo]() {\n\t\treturn _foo;\n\t},\n\tset [foo](value) {\n\t\t_foo = value;\n\t}\n};" ], - "mappings": "AAAA,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAC7B,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACnB,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACrB,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;AACd,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;AACrB,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC;;AACvB,GAAG,CAAC,IAAI,CAAC;;AACT,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;AACf,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;AACf,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACf,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;;AAEjB,GAAG,GAAG;CACL,MAAM,GAAG,CAAC;EACT,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;CACtB,CAAC;CACD,CAAC;;AAEF,KAAK,GAAG,EAAE,CAAC;AACX,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;;AAElB,GAAG,GAAG;CACL,IAAI,GAAG,GAAG,CAAC;EACV,MAAM,CAAC,IAAI,CAAC;CACb,CAAC;;CACD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;EACf,IAAI,GAAG,KAAK,CAAC;CACd,CAAC;;CACD,KAAK,GAAG,IAAI,CAAC;EACZ,MAAM,CAAC,IAAI,CAAC;CACb,CAAC;;CACD,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC;EACjB,IAAI,GAAG,KAAK,CAAC;CACd,CAAC;CACD,CAAC" + "mappings": "AAAA,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7B,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACnB,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACrB,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACd,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AACrB,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;;AACvB,GAAG,CAAC,IAAI,CAAC;;AACT,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AACf,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AACf,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACf,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;;AAEjB,GAAG,GAAG;CACL,MAAM,GAAG,CAAC;EACT,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;CACtB,CAAC;AACF,CAAC,CAAC;;AAEF,KAAK,GAAG,CAAC,CAAC,CAAC;AACX,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;;AAElB,GAAG,GAAG;CACL,IAAI,GAAG,GAAG,CAAC;EACV,MAAM,CAAC,IAAI,CAAC;CACb,CAAC;;CACD,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;EACf,IAAI,GAAG,KAAK,CAAC;CACd,CAAC;;CACD,KAAK,GAAG,IAAI,CAAC;EACZ,MAAM,CAAC,IAAI,CAAC;CACb,CAAC;;CACD,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC;EACjB,IAAI,GAAG,KAAK,CAAC;CACd,CAAC;AACF,CAAC,CAAC" } \ No newline at end of file diff --git a/test/samples/object-format/expected.js.map b/test/samples/object-format/expected.js.map index 67643098..3a10975e 100644 --- a/test/samples/object-format/expected.js.map +++ b/test/samples/object-format/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const obj1 = {\n\tfoo: 'bar',\n\tlevel11: { level12: { hello: 'world' } },\n\tlevel21: { level22: { world: 'hello' } },\n\thello: 'world',\n\tlevel31: { level32: { world: 'hello' } }\n};\n\nconst obj2 = {\n\tbefore: 1,\n\tobject: {\n\t\ta: 'lorem ipsum dolor sit amet',\n\t\tb: 'lorem ipsum dolor sit amet',\n\t\tc: 'lorem ipsum dolor sit amet',\n\t\td: 'lorem ipsum dolor sit amet'\n\t},\n\tarray: [\n\t\t'lorem ipsum dolor sit amet',\n\t\t'lorem ipsum dolor sit amet',\n\t\t'lorem ipsum dolor sit amet',\n\t\t'lorem ipsum dolor sit amet'\n\t],\n\tafter: 2\n};\n" ], - "mappings": "AAAA,KAAK,CAAC,IAAI,GAAG;CACZ,GAAG,EAAE,KAAK;CACV,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;CACxC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;CACxC,KAAK,EAAE,OAAO;CACd,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;CACxC,CAAC;;AAEF,KAAK,CAAC,IAAI,GAAG;CACZ,MAAM,EAAE,CAAC;CACT,MAAM,EAAE;EACP,CAAC,EAAE,4BAA4B;EAC/B,CAAC,EAAE,4BAA4B;EAC/B,CAAC,EAAE,4BAA4B;EAC/B,CAAC,EAAE,4BAA4B;EAC/B;CACD,KAAK,EAAE;EACN,4BAA4B;EAC5B,4BAA4B;EAC5B,4BAA4B;EAC5B,4BAA4B;EAC5B;CACD,KAAK,EAAE,CAAC;CACR,CAAC,AACF" + "mappings": "AAAA,KAAK,CAAC,IAAI,GAAG;CACZ,GAAG,EAAE,KAAK;CACV,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACxC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACxC,KAAK,EAAE,OAAO;CACd,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC;;AAEF,KAAK,CAAC,IAAI,GAAG;CACZ,MAAM,EAAE,CAAC;CACT,MAAM,EAAE;EACP,CAAC,EAAE,4BAA4B;EAC/B,CAAC,EAAE,4BAA4B;EAC/B,CAAC,EAAE,4BAA4B;EAC/B,CAAC,EAAE,4BAA4B;CAChC,CAAC;CACD,KAAK,EAAE;EACN,4BAA4B;EAC5B,4BAA4B;EAC5B,4BAA4B;EAC5B,4BAA4B;CAC7B,CAAC;CACD,KAAK,EAAE,CAAC;AACT,CAAC,CAAC,AACF" } \ No newline at end of file diff --git a/test/samples/parenthesized-expression/expected.js.map b/test/samples/parenthesized-expression/expected.js.map index dfd1e099..2ec0f759 100644 --- a/test/samples/parenthesized-expression/expected.js.map +++ b/test/samples/parenthesized-expression/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "a + b;\n({} + []);\n(class {});\n(class C {});\n({} ? a : b);\n({} && a);\n(function () {})`x`;\n({}).x;\n(function () {})();\nx = {};\n[a] = b;\n(a ? b : c) ? d : e;\n(a ? b : c) ? d : e ? f : g;\na ? b : c ? d : e;\n" ], - "mappings": "AAAA,CAAC,GAAG,CAAC,CAAC;AACN,CAAC,EAAE,GAAG,EAAE,EAAE;AACV,CAAC,MAAM,CAAC,CAAC,EAAE;AACX,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AACb,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE;AACb,CAAC,EAAE,IAAI,CAAC,EAAE;AACV,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;AACpB,CAAC,EAAE,EAAE,CAAC,CAAC;AACP,AAAC,CAAA,YAAY,CAAC,CAAC,GAAG,CAAC;AACnB,CAAC,GAAG,EAAE,CAAC;AACP,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACR,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,AAClB" + "mappings": "AAAA,CAAC,GAAG,CAAC,CAAC;AACN,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;AACV,CAAC,MAAM,CAAC,CAAC,EAAE;AACX,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AACb,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACb,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;AACV,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;AACpB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACP,AAAC,CAAA,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;AACnB,CAAC,GAAG,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACR,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,AAClB" } \ No newline at end of file diff --git a/test/samples/switch/expected.js.map b/test/samples/switch/expected.js.map index e4ffef7f..244a1d11 100644 --- a/test/samples/switch/expected.js.map +++ b/test/samples/switch/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "switch (foo) {\n\tcase 1:\n\t\tblah();\n\t\tbreak;\n\tcase 2:\n\t\tblah();\n\tdefault:\n\t\tblah();\n}" ], - "mappings": "AAAA,MAAM,EAAE,GAAG;MACL,CAAC;EACL,IAAI,EAAE,CAAC;EACP,KAAK,CAAC;;MACF,CAAC;EACL,IAAI,EAAE,CAAC;;;EAEP,IAAI,EAAE,CAAC;CACR" + "mappings": "AAAA,MAAM,EAAE,GAAG;MACL,CAAC;EACL,IAAI,CAAC,CAAC,CAAC;EACP,KAAK,CAAC;;MACF,CAAC;EACL,IAAI,CAAC,CAAC,CAAC;;;EAEP,IAAI,CAAC,CAAC,CAAC;AACT,CAAC" } \ No newline at end of file diff --git a/test/samples/tagged-template/expected.js.map b/test/samples/tagged-template/expected.js.map index 1aa29a00..3ef35c92 100644 --- a/test/samples/tagged-template/expected.js.map +++ b/test/samples/tagged-template/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "foo`bar`;\nconst a = (x || y)`tpl`;\nconst b = a.b`t`;\nconst c = f()`t`;\n" ], - "mappings": "AAAA,GAAG,KAAK,CAAC;;AACT,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;AACxB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACjB,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,AACjB" + "mappings": "AAAA,GAAG,KAAK,CAAC;;AACT,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC;AACxB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACjB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,AACjB" } \ No newline at end of file diff --git a/test/samples/try-catch/expected.js.map b/test/samples/try-catch/expected.js.map index c80cab2a..46248a9d 100644 --- a/test/samples/try-catch/expected.js.map +++ b/test/samples/try-catch/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "try {\n\tfoo();\n} catch {\n\tbar();\n}\n\ntry {\n\tfoo();\n} catch(e) {\n\tbar(e);\n} finally {\n\tbaz();\n}" ], - "mappings": "AAAA,GAAG,CAAC,CAAC;CACJ,GAAG,EAAE,CAAC;AACP,CAAC,MAAM,CAAC,CAAC;CACR,GAAG,EAAE,CAAC;AACP,CAAC;;AAED,GAAG,CAAC,CAAC;CACJ,GAAG,EAAE,CAAC;AACP,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CACX,GAAG,CAAC,CAAC,CAAC,CAAC;AACR,CAAC,SAAS,CAAC;CACV,GAAG,EAAE,CAAC;AACP,CAAC" + "mappings": "AAAA,GAAG,CAAC,CAAC;CACJ,GAAG,CAAC,CAAC,CAAC;AACP,CAAC,MAAM,CAAC,CAAC;CACR,GAAG,CAAC,CAAC,CAAC;AACP,CAAC;;AAED,GAAG,CAAC,CAAC;CACJ,GAAG,CAAC,CAAC,CAAC;AACP,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;CACX,GAAG,CAAC,CAAC,CAAC,CAAC;AACR,CAAC,SAAS,CAAC;CACV,GAAG,CAAC,CAAC,CAAC;AACP,CAAC" } \ No newline at end of file diff --git a/test/samples/ts-array-patterns/expected.ts.map b/test/samples/ts-array-patterns/expected.ts.map index 14ead94f..7f165562 100644 --- a/test/samples/ts-array-patterns/expected.ts.map +++ b/test/samples/ts-array-patterns/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const [a, b]: string[] = ['foo', 'bar'];\n\nfunction fn([first, second]: number[]) {\n\treturn first + second;\n}\n" ], - "mappings": "AAAA,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;;AAExC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CACvC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;AACvB,CAAC,AACD" + "mappings": "AAAA,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,AAAU,CAAT,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;;AAExC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,AAAU,CAAT,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CACvC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;AACvB,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/ts-arrow-as-const-object/expected.ts.map b/test/samples/ts-arrow-as-const-object/expected.ts.map index 7dc204d5..28426645 100644 --- a/test/samples/ts-arrow-as-const-object/expected.ts.map +++ b/test/samples/ts-arrow-as-const-object/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const as_const = [].map(() => ({ baz }) as const);\nconst non_null = [].map(() => ({ baz: 1 })!);\nconst satisfies = [].map(() => ({ x: 1 }) satisfies { x: number });\n" ], - "mappings": "AAAA,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,OAAM,AAAC,EAAE,GAAG,EAAE,IAAK,KAAK,CAAA,CAAC,CAAC;AAClD,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,GAAG,CAAC,OAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA,CAAC,CAAC;AAC7C,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,OAAM,AAAC,EAAE,CAAC,EAAE,CAAC,EAAE,WAAY,EAAE,CAAC,EAAE,MAAM,EAAE,CAAA,CAAC,CAAC,AACnE" + "mappings": "AAAA,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAM,AAAC,EAAE,GAAG,CAAC,CAAC,IAAK,KAAK,CAAA,CAAC,CAAC;AAClD,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA,CAAC,CAAC;AAC7C,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAM,AAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,WAAY,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA,CAAC,CAAC,AACnE" } \ No newline at end of file diff --git a/test/samples/ts-arrow-function-long-return-type/expected.ts.map b/test/samples/ts-arrow-function-long-return-type/expected.ts.map index d2bb4378..7efaa918 100644 --- a/test/samples/ts-arrow-function-long-return-type/expected.ts.map +++ b/test/samples/ts-arrow-function-long-return-type/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const toNode = (\n\tkind: string\n): { kind: 'logical'; value: string } | { kind: 'binary'; value: number } =>\n\tkind === 'and' ? { kind: 'logical', value: kind } : { kind: 'binary', value: 1 };\n" ], - "mappings": "AAAA,KAAK,CAAC,MAAM,GAAG,CACd,IAAY,AAAR,EAAE,MAAM,CACZ,EAAE;CAAA,EAAE,IAAI,EAAE,SAAS,AAAC,EAAC,KAAK,EAAE,MAAM,EAAE;CAAG,EAAE,IAAI,EAAE,QAAQ,AAAC,EAAC,KAAK,EAAE,MAAM,EAAE,IACxE,IAAI,KAAK,KAAK;GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE;GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,AAClF" + "mappings": "AAAA,KAAK,CAAC,MAAM,GAAG,CACd,IAAY,AAAR,EAAE,MAAM,CACZ,EAAE;CAAA,EAAE,IAAI,EAAE,SAAS,AAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC;CAAG,EAAE,IAAI,EAAE,QAAQ,AAAC,EAAC,KAAK,EAAE,MAAM,CAAC,CAAC,IACxE,IAAI,KAAK,KAAK;GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,AAClF" } \ No newline at end of file diff --git a/test/samples/ts-as-expression/expected.ts.map b/test/samples/ts-as-expression/expected.ts.map index 3f16934d..60a27be9 100644 --- a/test/samples/ts-as-expression/expected.ts.map +++ b/test/samples/ts-as-expression/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const a: number = 42;\nconst b = a as unknown as string;\n\ntype C = {\n\tname: string;\n};\n\ntype D = {\n\tfirstName: string;\n};\n\nconst e: C = {\n\tname: 'foo'\n} as unknown as D;\n\nconst f = (Math.random() > 0.5 ? { firstName: 'name1' } : { firstName: 'name2' }) as unknown as D;\n\nconst g = h(e['name']) as (scope: ng.IScope) => b;\n" ], - "mappings": "AAAA,KAAK,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,EAAE,CAAC;AACrB,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,MAAM,CAAC;;AAEjC,KAAK,CAAC,GAAG,EACR,IAAI,EAAE,MAAM,AAAC,EACb,CAAC;AAEF,KAAK,CAAC,GAAG,EACR,SAAS,EAAE,MAAM,AAAC,EAClB,CAAC;;AAEF,KAAK,CAAC,CAAI,AAAH,EAAE,CAAC,GAAG,EACZ,IAAI,EAAE,KAAK,EACX,IAAI,OAAO,IAAI,CAAC,CAAC;AAElB,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC;AAElG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAgB,AAAX,EAAE,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,AAClD" + "mappings": "AAAA,KAAK,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,EAAE,CAAC;AACrB,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,MAAM,CAAC;;AAEjC,KAAK,CAAC,GAAG,EACR,IAAI,EAAE,MAAM,AAAC,CACd,CAAC,CAAC;AAEF,KAAK,CAAC,GAAG,EACR,SAAS,EAAE,MAAM,AAAC,CACnB,CAAC,CAAC;;AAEF,KAAK,CAAC,CAAI,AAAH,EAAE,CAAC,GAAG,EACZ,IAAI,EAAE,KAAK,CACZ,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC;AAElB,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC;AAElG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAgB,AAAX,EAAE,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC,AAClD" } \ No newline at end of file diff --git a/test/samples/ts-comment-signature/expected.ts.map b/test/samples/ts-comment-signature/expected.ts.map index a3d56920..7dde4493 100644 --- a/test/samples/ts-comment-signature/expected.ts.map +++ b/test/samples/ts-comment-signature/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type F = (a: A /* c1 */) /* c2 */ => /* c3 */ T;\n\ntype G = { (a /* c1 */) /* c2 */ };\n\ntype H = { m(a /* c1 */) /* c2 */ };\n\nfunction f(a /* c1 */) /* c2 */ {}\n\nconst g = (a /* c1 */) /* c2 */ => a;\n" ], - "mappings": "AAAA,KAAK,CAAC,GAAG,CAAC,CAAI,AAAH,EAAE,CAAC,gCAAgC,CAAC,CAAC;AAEhD,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,WAAW,CAAC;AAEnC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,WAAW,CAAC;;AAEpC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;;AAElC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAC,CAAC,AACrC" + "mappings": "AAAA,KAAK,CAAC,GAAG,CAAC,CAAI,AAAH,EAAE,CAAC,gCAAgC,CAAC,CAAC;AAEhD,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,UAAU,UAAU,CAAC,CAAC;AAEnC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,UAAU,CAAC,CAAC;;AAEpC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;;AAElC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAC,CAAC,AACrC" } \ No newline at end of file diff --git a/test/samples/ts-declaration-modifiers/expected.ts.map b/test/samples/ts-declaration-modifiers/expected.ts.map index 3e6ddd5d..2a175813 100644 --- a/test/samples/ts-declaration-modifiers/expected.ts.map +++ b/test/samples/ts-declaration-modifiers/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const enum Constant {\n\tvalue\n}\n\ndeclare enum Ambient {\n\tvalue\n}\n\nimport type Imported = require('pkg');\n\ntype Constructor = abstract new (value: T) => T;\n" ], - "mappings": "AAAA,WAAW,QAAQ;CAClB,KAAK;CACL;;AAED,aAAa,OAAO;CACnB,KAAK;CACL;;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,KAAK,EAAC,AAAC;;AAEtC,KAAK,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,CAAC,CAAC,AACnD" + "mappings": "AAAA,WAAW,QAAQ;CAClB,KAAK;AACN,CAAC;;AAED,aAAa,OAAO;CACnB,KAAK;AACN,CAAC;;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,KAAK,EAAC,AAAC;;AAEtC,KAAK,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,CAAC,CAAC,AACnD" } \ No newline at end of file diff --git a/test/samples/ts-declare-interface-type/expected.ts.map b/test/samples/ts-declare-interface-type/expected.ts.map index ae9b870a..199968c6 100644 --- a/test/samples/ts-declare-interface-type/expected.ts.map +++ b/test/samples/ts-declare-interface-type/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "declare interface Ambient {\n\tvalue: string;\n}\n\ndeclare type Alias = string;\n\nexport declare interface Exported extends Ambient {\n\tother: T;\n}\n\ninterface Plain {\n\tvalue: string;\n}\n\ntype PlainAlias = number;\n" ], - "mappings": "AAAA,kBAAkB,OAAO,EAAC,CACzB,KAAK,EAAE,MAAM,AAAC,CACd,CAAA;;AAED,aAAa,KAAK,GAAG,MAAM,CAAC;;AAE5B,MAAM,CAAC,kBAAkB,QAAQ,CAAC,CAAC,CAAC,SAAS,OAAO,EAAC,CACpD,KAAK,EAAE,CAAC,AAAC,CACT,CAAA;;AAED,UAAU,KAAK,EAAC,CACf,KAAK,EAAE,MAAM,AAAC,CACd,CAAA;;AAED,KAAK,UAAU,GAAG,MAAM,CAAC,AACzB" + "mappings": "AAAA,kBAAkB,OAAO,CAAC,CAAA,CACzB,KAAK,EAAE,MAAM,AAAC,CACd,AAAD,CAAC;;AAED,aAAa,KAAK,GAAG,MAAM,CAAC;;AAE5B,MAAM,CAAC,kBAAkB,QAAQ,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,CAAA,CACpD,KAAK,EAAE,CAAC,AAAC,CACT,AAAD,CAAC;;AAED,UAAU,KAAK,CAAC,CAAA,CACf,KAAK,EAAE,MAAM,AAAC,CACd,AAAD,CAAC;;AAED,KAAK,UAAU,GAAG,MAAM,CAAC,AACzB" } \ No newline at end of file diff --git a/test/samples/ts-declare-module/expected.ts.map b/test/samples/ts-declare-module/expected.ts.map index d5f78cb7..9a5c33b4 100644 --- a/test/samples/ts-declare-module/expected.ts.map +++ b/test/samples/ts-declare-module/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "declare module 'svelte' {}\n" ], - "mappings": "AAAA,eAAe,QAAQ,AAAC;CAAE,AAC1B" + "mappings": "AAAA,eAAe,QAAQ,AAAC,CAAA;AAAC,CAAC,AAC1B" } \ No newline at end of file diff --git a/test/samples/ts-declare/expected.ts.map b/test/samples/ts-declare/expected.ts.map index 878dde00..695da4ce 100644 --- a/test/samples/ts-declare/expected.ts.map +++ b/test/samples/ts-declare/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "declare function a(): void;\ndeclare const b: number;\ndeclare class c {}\n\nexport {};\n" ], - "mappings": "AAAA,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC;;AAC3B,aAAa,CAAC,CAAS,AAAR,EAAE,MAAM,CAAC;;AACxB,cAAc,CAAC,CAAC,CAAC,CAAC;;AAElB,MAAM,IAAI,AACV" + "mappings": "AAAA,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC;;AAC3B,OAAO,OAAO,CAAS,AAAR,EAAE,MAAM,CAAC;;AACxB,cAAc,CAAC,CAAC,CAAC,CAAC;;AAElB,MAAM,IAAI,AACV" } \ No newline at end of file diff --git a/test/samples/ts-decorators-class/expected.ts.map b/test/samples/ts-decorators-class/expected.ts.map index 23709b48..839a33dc 100644 --- a/test/samples/ts-decorators-class/expected.ts.map +++ b/test/samples/ts-decorators-class/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "export class Entity {\n\tconstructor(\n\t\tprivate readonly name: string,\n\t\tprivate readonly info: boolean\n\t) {}\n}\n\n@Entity('users', { info: true })\nexport class User {}\n\n@Entity('categories', { info: false })\nclass Category {}\n\n@Entity('tasks', { info: true })\nexport class Task {}\n\nconst u = new User();\nconst c = new Category();\nconst t = new Task();\n" ], - "mappings": "AAAA,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;CACpB,WAAW;EACV,iBAAiB,IAAY,AAAR,EAAE,MAAM;EAC7B,iBAAiB,IAAa,AAAT,EAAE,OAAO;GAC7B,CAAC,CAAC;AACL,CAAC;;AAGD,AADA,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAAA,MAC1B,CADN,MACa,IAAI,CAAC,CAAC,CAAC;;AAEpB,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAAA,MAChC,QAAQ,CAAC,CAAC,CAAC;;AAGjB,AADA,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAAA,MAC1B,CADN,MACa,IAAI,CAAC,CAAC,CAAC;;AAEpB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;AACrB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;AACzB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,AACrB" + "mappings": "AAAA,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;CACpB,WAAW;EACV,iBAAiB,IAAY,AAAR,EAAE,MAAM;EAC7B,iBAAiB,IAAa,AAAT,EAAE,OAAO;GAC7B,CAAC,CAAC;AACL,CAAC;;AAGD,AADA,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,MAC1B,CADN,MACa,IAAI,CAAC,CAAC,CAAC;;AAEpB,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,MAChC,QAAQ,CAAC,CAAC,CAAC;;AAGjB,AADA,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAAA,MAC1B,CADN,MACa,IAAI,CAAC,CAAC,CAAC;;AAEpB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;AACrB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;AACzB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,AACrB" } \ No newline at end of file diff --git a/test/samples/ts-decorators-expression/expected.ts.map b/test/samples/ts-decorators-expression/expected.ts.map index facc728e..d55e234c 100644 --- a/test/samples/ts-decorators-expression/expected.ts.map +++ b/test/samples/ts-decorators-expression/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "class Fields {\n\tstatic uuid() {\n\t\treturn function (target: any, propertyKey: string | symbol) {\n\t\t\tObject.defineProperty(target, propertyKey, { value: 'random uuid...', writable: true });\n\t\t};\n\t}\n}\n\nclass User {\n\t@Fields.uuid()\n\tid: string;\n}\n\n@(a ? b : c)\nclass Conditional {}\n\n@(a || b)\nclass Logical {}\n\n@dec\nclass Identifier {}\n\n@a.b.c\nclass Member {}\n\n@a()\nclass Call {}\n\nconst u = new User();\nconsole.log(u.id); // will print \"random uuid...\"\n" ], - "mappings": "AAAA,MAAM,MAAM,CAAC,CAAC;CACb,OAAO,IAAI,GAAG,CAAC;EACd,MAAM,CAAC,UAAU,MAAW,AAAL,EAAE,GAAG,EAAE,WAA4B,AAAjB,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;GAC5D,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;EACzF,CAAC,CAAC;CACH,CAAC;AACF,CAAC;;AAED,MAAM,IAAI,CAAC,CAAC;CACX,CAAC,MAAM,CAAC,IAAI,EAAE;CAAA,AACd,EAAE,EAAE,MAAM,CAAC;AACZ,CAAC;;AAED,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AAAC,MACN,WAAW,CAAC,CAAC,CAAC;;AAEpB,EAAE,CAAC,IAAI,CAAC;AAAC,MACH,OAAO,CAAC,CAAC,CAAC;;AAEhB,CAAC,GAAG;AAAA,MACE,UAAU,CAAC,CAAC,CAAC;;AAEnB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,MACA,MAAM,CAAC,CAAC,CAAC;;AAEf,CAAC,CAAC,EAAE;AAAA,MACE,IAAI,CAAC,CAAC,CAAC;;AAEb,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;;AACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,+BAClB" + "mappings": "AAAA,MAAM,MAAM,CAAC,CAAC;CACb,OAAO,IAAI,GAAG,CAAC;EACd,MAAM,CAAC,UAAU,MAAW,AAAL,EAAE,GAAG,EAAE,WAA4B,AAAjB,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;GAC5D,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;EACzF,CAAC,CAAC;CACH,CAAC;AACF,CAAC;;AAED,MAAM,IAAI,CAAC,CAAC;CACX,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;CAAA,AACd,EAAE,EAAE,MAAM,CAAC;AACZ,CAAC;;AAED,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AAAC,MACN,WAAW,CAAC,CAAC,CAAC;;AAEpB,EAAE,CAAC,IAAI,CAAC;AAAC,MACH,OAAO,CAAC,CAAC,CAAC;;AAEhB,CAAC,GAAG;AAAA,MACE,UAAU,CAAC,CAAC,CAAC;;AAEnB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,MACA,MAAM,CAAC,CAAC,CAAC;;AAEf,CAAC,CAAC,CAAC,CAAC;AAAA,MACE,IAAI,CAAC,CAAC,CAAC;;AAEb,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;;AACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,+BAClB" } \ No newline at end of file diff --git a/test/samples/ts-decorators/expected.ts.map b/test/samples/ts-decorators/expected.ts.map index 9c54876c..9f9f7a65 100644 --- a/test/samples/ts-decorators/expected.ts.map +++ b/test/samples/ts-decorators/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "function loggedMethod(headMessage = 'LOG:') {\n\treturn function actualDecorator(originalMethod: any, context: ClassMethodDecoratorContext) {\n\t\tconst methodName = String(context.name);\n\n\t\tfunction replacementMethod(this: any, ...args: any[]) {\n\t\t\tconsole.log(`${headMessage} Entering method '${methodName}'.`);\n\t\t\tconst result = originalMethod.call(this, ...args);\n\t\t\tconsole.log(`${headMessage} Exiting method '${methodName}'.`);\n\t\t\treturn result;\n\t\t}\n\n\t\treturn replacementMethod;\n\t};\n}\n\nclass Person {\n\tname: string;\n\tconstructor(name: string) {\n\t\tthis.name = name;\n\t}\n\n\t@loggedMethod('⚠️')\n\tgreet() {\n\t\tconsole.log(`Hello, my name is ${this.name}.`);\n\t}\n}\n\nconst p = new Person('Ron');\np.greet();\n" ], - "mappings": "AAAA,SAAS,YAAY,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC;CAC5C,MAAM,CAAC,SAAS,eAAe,CAAC,cAAmB,AAAL,EAAE,GAAG,EAAE,OAAoC,AAA7B,EAAE,2BAA2B,EAAE,CAAC;EAC3F,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;EAExC,SAAS,iBAAiB,CAAC,IAAS,AAAL,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC;GACtD,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,qBAAqB,UAAU,IAAI,CAAC,CAAC;;GAC/D,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;;GAClD,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,oBAAoB,UAAU,IAAI,CAAC,CAAC;;GAC9D,MAAM,CAAC,MAAM,CAAC;EACf,CAAC;;EAED,MAAM,CAAC,iBAAiB,CAAC;CAC1B,CAAC,CAAC;AACH,CAAC;;AAED,MAAM,MAAM,CAAC,CAAC;CACb,IAAI,EAAE,MAAM,CAAC;;CACb,WAAW,CAAC,IAAY,AAAR,EAAE,MAAM,EAAE,CAAC;EAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC;;CAED,CAAC,YAAY,CAAC,IAAI,CAAC;CAAA,AACnB,KAAK,GAAG,CAAC;EACR,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;CAChD,CAAC;AACF,CAAC;;AAED,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;AAC5B,CAAC,CAAC,KAAK,EAAE,CAAC,AACV" + "mappings": "AAAA,SAAS,YAAY,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC;CAC5C,MAAM,CAAC,SAAS,eAAe,CAAC,cAAmB,AAAL,EAAE,GAAG,EAAE,OAAoC,AAA7B,EAAE,2BAA2B,EAAE,CAAC;EAC3F,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;;EAExC,SAAS,iBAAiB,CAAC,IAAS,AAAL,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;GACtD,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,qBAAqB,UAAU,IAAI,CAAC,CAAC;;GAC/D,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;;GAClD,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,oBAAoB,UAAU,IAAI,CAAC,CAAC;;GAC9D,MAAM,CAAC,MAAM,CAAC;EACf,CAAC;;EAED,MAAM,CAAC,iBAAiB,CAAC;CAC1B,CAAC,CAAC;AACH,CAAC;;AAED,MAAM,MAAM,CAAC,CAAC;CACb,IAAI,EAAE,MAAM,CAAC;;CACb,WAAW,CAAC,IAAY,AAAR,EAAE,MAAM,EAAE,CAAC;EAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;CAClB,CAAC;;CAED,CAAC,YAAY,CAAC,IAAI,CAAC;CAAA,AACnB,KAAK,GAAG,CAAC;EACR,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;CAChD,CAAC;AACF,CAAC;;AAED,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;AAC5B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,AACV" } \ No newline at end of file diff --git a/test/samples/ts-enums/expected.ts.map b/test/samples/ts-enums/expected.ts.map index 13d32556..6da87473 100644 --- a/test/samples/ts-enums/expected.ts.map +++ b/test/samples/ts-enums/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "enum UserResponse {\n\tNo = 0,\n\tYes = 1\n}\n\nfunction respond(recipient: string, message: UserResponse): void {\n\t// ...\n}\n\nrespond('Princess Caroline', UserResponse.Yes);\n" ], - "mappings": "AAAA,KAAK,YAAY;CAChB,EAAE,GAAG,CAAC,EACN,GAAG,GAAG,CAAC;CACP;;AAED,SAAS,OAAO,CAAC,SAAiB,AAAR,EAAE,MAAM,EAAE,OAAqB,AAAd,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;;AAElE,CAAC;;AAED,OAAO,CAAC,mBAAmB,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,AAC/C" + "mappings": "AAAA,KAAK,YAAY;CAChB,EAAE,GAAG,CAAC,EACN,GAAG,GAAG,CAAC;AACR,CAAC;;AAED,SAAS,OAAO,CAAC,SAAiB,AAAR,EAAE,MAAM,EAAE,OAAqB,AAAd,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC;;AAElE,CAAC;;AAED,OAAO,CAAC,mBAAmB,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,AAC/C" } \ No newline at end of file diff --git a/test/samples/ts-generic-references/expected.ts.map b/test/samples/ts-generic-references/expected.ts.map index df3ef2f8..977d580c 100644 --- a/test/samples/ts-generic-references/expected.ts.map +++ b/test/samples/ts-generic-references/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type Imported = import('pkg').Value;\n\ninterface Derived extends Base {}\n\nclass Implementation implements Contract {}\n" ], - "mappings": "AAAA,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;;AAE5C,UAAU,OAAO,SAAS,IAAI,CAAC,MAAM,CAAC,EAAC,AAAE,CAAA;;AAEzC,MAAM,cAAc,YAAY,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,AACnD" + "mappings": "AAAA,KAAK,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;;AAE5C,UAAU,OAAO,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA,AAAE,AAAD,CAAC;;AAEzC,MAAM,cAAc,YAAY,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,AACnD" } \ No newline at end of file diff --git a/test/samples/ts-generic-types/expected.ts.map b/test/samples/ts-generic-types/expected.ts.map index c44dfacf..6061a8ba 100644 --- a/test/samples/ts-generic-types/expected.ts.map +++ b/test/samples/ts-generic-types/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type Generic = {\n\tdata: T;\n};\n\nconst n: Generic = { data: 1 };\nconst s: Generic = { data: 'foo' };\nconst b: Generic = { data: true };\n\nfunction foo(np: Generic) {\n\tconsole.log(np.data);\n}\n\nfunction bar(np: Generic): Generic {\n\treturn { data: true };\n}\n\nfunction barTypeof(np: Generic): Generic {\n\treturn { data: true };\n}\n\ntype DoubleGeneric = {\n\tkey: K;\n\tvalue: V;\n};\n\nfunction foobar(np: DoubleGeneric): DoubleGeneric {\n\treturn { key: true, value: 'foo' };\n}\n" ], - "mappings": "AAAA,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,EACjB,IAAI,EAAE,CAAC,AAAC,EACR,CAAC;;AAEF,KAAK,CAAC,CAAkB,AAAjB,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACvC,KAAK,CAAC,CAAkB,AAAjB,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC3C,KAAK,CAAC,CAAmB,AAAlB,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;;AAE3C,SAAS,GAAG,CAAC,EAAmB,AAAjB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;CAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;;AAED,SAAS,GAAG,CAAC,EAAmB,AAAjB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CACpD,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvB,CAAC;;AAED,SAAS,SAAS,CAAC,EAAqB,AAAnB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAC5D,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvB,CAAC;;AAED,KAAK,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAC1B,GAAG,EAAE,CAAC,AAAC,EACP,KAAK,EAAE,CAAC,AAAC,EACT,CAAC;;AAEF,SAAS,MAAM,CAAC,EAAiC,AAA/B,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;CACnF,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC,AACD" + "mappings": "AAAA,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,EACjB,IAAI,EAAE,CAAC,AAAC,CACT,CAAC,CAAC;;AAEF,KAAK,CAAC,CAAkB,AAAjB,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvC,KAAK,CAAC,CAAkB,AAAjB,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3C,KAAK,CAAC,CAAmB,AAAlB,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;;AAE3C,SAAS,GAAG,CAAC,EAAmB,AAAjB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;CAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;;AAED,SAAS,GAAG,CAAC,EAAmB,AAAjB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CACpD,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACvB,CAAC;;AAED,SAAS,SAAS,CAAC,EAAqB,AAAnB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAC5D,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACvB,CAAC;;AAED,KAAK,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAC1B,GAAG,EAAE,CAAC,AAAC,EACP,KAAK,EAAE,CAAC,AAAC,CACV,CAAC,CAAC;;AAEF,SAAS,MAAM,CAAC,EAAiC,AAA/B,EAAE,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;CACnF,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACpC,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/ts-implements/expected.ts.map b/test/samples/ts-implements/expected.ts.map index ea12ad08..40322c5b 100644 --- a/test/samples/ts-implements/expected.ts.map +++ b/test/samples/ts-implements/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "interface SelectableControl {\n\tselect(): void;\n}\n\ninterface Scrollable {\n\tscroll(): void;\n}\n\nclass Button implements SelectableControl, Scrollable {\n\tselect() {}\n}\n" ], - "mappings": "AAAA,UAAU,iBAAiB,EAAC,CAC3B,MAAM,EAAE,EAAE,IAAI,AAAC,CACf,CAAA;AAED,UAAU,UAAU,EAAC,CACpB,MAAM,EAAE,EAAE,IAAI,AAAC,CACf,CAAA;;AAED,MAAM,MAAM,YAAY,iBAAiB,EAAE,UAAU,CAAC,CAAC;CACtD,MAAM,GAAG,CAAC,CAAC;AACZ,CAAC,AACD" + "mappings": "AAAA,UAAU,iBAAiB,CAAC,CAAA,CAC3B,MAAM,EAAE,EAAE,IAAI,AAAC,CACf,AAAD,CAAC;AAED,UAAU,UAAU,CAAC,CAAA,CACpB,MAAM,EAAE,EAAE,IAAI,AAAC,CACf,AAAD,CAAC;;AAED,MAAM,MAAM,YAAY,iBAAiB,EAAE,UAAU,CAAC,CAAC;CACtD,MAAM,GAAG,CAAC,CAAC;AACZ,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/ts-index-access-type/expected.ts.map b/test/samples/ts-index-access-type/expected.ts.map index 815767d3..71b8430a 100644 --- a/test/samples/ts-index-access-type/expected.ts.map +++ b/test/samples/ts-index-access-type/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type A = { a: string; b: number };\ntype B = A['b'];\n\nconst c: A['b'] = 1;\n" ], - "mappings": "AAAA,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,AAAC,EAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AAClC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;;AAEhB,KAAK,CAAC,CAAS,AAAR,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,AACpB" + "mappings": "AAAA,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,AAAC,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAClC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;;AAEhB,KAAK,CAAC,CAAS,AAAR,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,AACpB" } \ No newline at end of file diff --git a/test/samples/ts-infer-extends/expected.ts.map b/test/samples/ts-infer-extends/expected.ts.map index 5b4256cb..39c5fa4a 100644 --- a/test/samples/ts-infer-extends/expected.ts.map +++ b/test/samples/ts-infer-extends/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type X3 = T extends [infer U extends number] ? MustBeNumber : never;\ntype X4 = T extends [infer U extends number, infer U extends number] ? MustBeNumber : never;\ntype X5 = T extends [infer U extends number, infer U] ? MustBeNumber : never;\ntype X6 = T extends [infer U, infer U extends number] ? MustBeNumber : never;\ntype X7 = T extends [infer U extends string, infer U extends number] ? U : never;\ntype X8 = T extends infer U extends number ? U : T;\ntype X9 = T extends (infer U extends number ? U : T) ? U : T;\ntype X10 = T extends (infer U extends number) | { a: infer U extends number } ? U : never;\ntype X11 = T extends (infer U extends number) & { a: infer U extends number } ? U : never;\n" ], - "mappings": "AAAA,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAC1E,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,EAAE,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAClG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AACnF,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AACnF,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,EAAE,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACpF,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAgB,SAAN,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;AACzD,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAgB,SAAN,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AAC7F,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAgB,SAAN,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,AAC7F" + "mappings": "AAAA,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAC1E,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,EAAE,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAClG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AACnF,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AACnF,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,EAAE,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACpF,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAgB,SAAN,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;AACzD,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnE,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAgB,SAAN,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAC7F,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAgB,SAAN,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAgB,SAAN,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,AAC7F" } \ No newline at end of file diff --git a/test/samples/ts-interfaces/expected.ts.map b/test/samples/ts-interfaces/expected.ts.map index 4263c575..b5651435 100644 --- a/test/samples/ts-interfaces/expected.ts.map +++ b/test/samples/ts-interfaces/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "interface Test {\n\tfunc: (a: string) => Promise;\n\tfunc2: () => Promise;\n\ta: number;\n\tb: boolean;\n}\n\ninterface IndexSignature {\n\t[key: string]: string;\n}\n\nclass Control {\n\tprivate state: any;\n}\n\ninterface SelectableControl extends Control {\n\tselect(): void;\n\tbar();\n}\n\nclass Button extends Control implements SelectableControl {\n\tselect() {}\n}\n\nclass TextBox extends Control {\n\tselect() {}\n}\n" ], - "mappings": "AAAA,UAAU,IAAI,EAAC;CACd,IAAI,EAAE,CAAC,CAAS,AAAR,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,AAAC;CACnC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,AAAC;CAC3B,CAAC,EAAE,MAAM,AAAC;CACV,CAAC,EAAE,OAAO,AAAC;AACX,CAAA;;AAED,UAAU,cAAc,EAAC,CACxB,CAAC,GAAW,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC,CACtB,CAAA;;AAED,MAAM,OAAO,CAAC,CAAC;CACd,QAAQ,KAAK,EAAE,GAAG,CAAC;AACpB,CAAC;;AAED,UAAU,iBAAiB,SAAS,OAAO,EAAC,CAC3C,MAAM,EAAE,EAAE,IAAI,AAAC,EACf,GAAG,EAAG,CACN,CAAA;;AAED,MAAM,MAAM,SAAS,OAAO,YAAY,iBAAiB,CAAC,CAAC;CAC1D,MAAM,GAAG,CAAC,CAAC;AACZ,CAAC;;AAED,MAAM,OAAO,SAAS,OAAO,CAAC,CAAC;CAC9B,MAAM,GAAG,CAAC,CAAC;AACZ,CAAC,AACD" + "mappings": "AAAA,UAAU,IAAI,CAAC,CAAA;CACd,IAAI,EAAE,CAAC,CAAS,AAAR,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,AAAC;CACnC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,AAAC;CAC3B,CAAC,EAAE,MAAM,AAAC;CACV,CAAC,EAAE,OAAO,AAAC;AACX,AAAD,CAAC;;AAED,UAAU,cAAc,CAAC,CAAA,CACxB,CAAC,GAAW,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC,CACtB,AAAD,CAAC;;AAED,MAAM,OAAO,CAAC,CAAC;CACd,QAAQ,KAAK,EAAE,GAAG,CAAC;AACpB,CAAC;;AAED,UAAU,iBAAiB,SAAS,OAAO,CAAC,CAAA,CAC3C,MAAM,EAAE,EAAE,IAAI,AAAC,EACf,GAAG,EAAG,CACN,AAAD,CAAC;;AAED,MAAM,MAAM,SAAS,OAAO,YAAY,iBAAiB,CAAC,CAAC;CAC1D,MAAM,GAAG,CAAC,CAAC;AACZ,CAAC;;AAED,MAAM,OAAO,SAAS,OAAO,CAAC,CAAC;CAC9B,MAAM,GAAG,CAAC,CAAC;AACZ,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/ts-keywords/expected.ts.map b/test/samples/ts-keywords/expected.ts.map index 16fc05bf..2272e6d1 100644 --- a/test/samples/ts-keywords/expected.ts.map +++ b/test/samples/ts-keywords/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "let n: number = 42;\nlet s: string = 'Hello, TypeScript!';\nlet b: boolean = true;\nlet u: unknown = 'whatever';\nlet un: undefined = undefined;\nlet o: object = { name: 'Object' };\nlet bi: bigint = 1234567890123456789012345678901234567890n;\nlet ne: never;\nlet sy: symbol = Symbol('unique');\nlet a: any = { key: 'value' };\nlet v: () => void = () => {};\nlet arr: number[] = [1, 2, 3];\nlet snu: string | null = null;\nlet nun: number | undefined = undefined;\n\n// TODO: commented because acorn doesn't support type assertions but oxc does\n// let ta = true;\n" ], - "mappings": "AAAA,GAAG,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,EAAE,CAAC;AACnB,GAAG,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,oBAAoB,CAAC;AACrC,GAAG,CAAC,CAAU,AAAT,EAAE,OAAO,GAAG,IAAI,CAAC;AACtB,GAAG,CAAC,CAAU,AAAT,EAAE,OAAO,GAAG,UAAU,CAAC;AAC5B,GAAG,CAAC,EAAa,AAAX,EAAE,SAAS,GAAG,SAAS,CAAC;AAC9B,GAAG,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACnC,GAAG,CAAC,EAAU,AAAR,EAAE,MAAM,GAAG,yCAAyC,CAAC;AAC3D,GAAG,CAAC,EAAS,AAAP,EAAE,KAAK,CAAC;AACd,GAAG,CAAC,EAAU,AAAR,EAAE,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAClC,GAAG,CAAC,CAAM,AAAL,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC9B,GAAG,CAAC,CAAa,AAAZ,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;AAC7B,GAAG,CAAC,GAAa,AAAV,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,GAAG,CAAC,GAAkB,AAAf,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9B,GAAG,CAAC,GAAuB,AAApB,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;;;0BAIxC" + "mappings": "AAAA,GAAG,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,EAAE,CAAC;AACnB,GAAG,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,oBAAoB,CAAC;AACrC,GAAG,CAAC,CAAU,AAAT,EAAE,OAAO,GAAG,IAAI,CAAC;AACtB,GAAG,CAAC,CAAU,AAAT,EAAE,OAAO,GAAG,UAAU,CAAC;AAC5B,GAAG,CAAC,EAAa,AAAX,EAAE,SAAS,GAAG,SAAS,CAAC;AAC9B,GAAG,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnC,GAAG,CAAC,EAAU,AAAR,EAAE,MAAM,GAAG,yCAAyC,CAAC;AAC3D,GAAG,CAAC,EAAS,AAAP,EAAE,KAAK,CAAC;AACd,GAAG,CAAC,EAAU,AAAR,EAAE,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAClC,GAAG,CAAC,CAAM,AAAL,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAC9B,GAAG,CAAC,CAAa,AAAZ,EAAE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;AAC7B,GAAG,CAAC,GAAa,AAAV,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9B,GAAG,CAAC,GAAkB,AAAf,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAC9B,GAAG,CAAC,GAAuB,AAApB,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;;;0BAIxC" } \ No newline at end of file diff --git a/test/samples/ts-mapped-type/expected.ts.map b/test/samples/ts-mapped-type/expected.ts.map index 796a1d96..0be6eca7 100644 --- a/test/samples/ts-mapped-type/expected.ts.map +++ b/test/samples/ts-mapped-type/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type M = { [K in keyof JSON]: K };\ntype R = { readonly [K in T]: V };\ntype O = { [K in T]?: V };\ntype Neg = { -readonly [K in T]-?: V };\ntype Pos = { +readonly [K in T]+?: V };\ntype As = { [K in T as `g${K & string}`]: V };\n" ], - "mappings": "AAAA,KAAK,CAAC,GAAG,EAAA,CAAwB,IAAhB,MAAM,IAAI,GAAG,CAAC,CAAE,CAAC;AAClC,KAAK,CAAC,GAAG,WAAA,CAAwB,IAAP,CAAC,GAAG,CAAC,CAAE,CAAC;AAClC,KAAK,CAAC,GAAG,EAAA,CAAgB,IAAR,CAAC,IAAI,CAAC,CAAE,CAAC;AAC1B,KAAK,GAAG,GAAG,YAAA,CAA2B,IAAT,CAAC,KAAK,CAAC,CAAE,CAAC;AACvC,KAAK,GAAG,GAAG,YAAA,CAA2B,IAAT,CAAC,KAAK,CAAC,CAAE,CAAC;AACvC,KAAK,EAAE,GAAG,EAAA,CAAmC,IAA3B,CAAC,IAAI,IAAI,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAE,CAAC,AAC9C" + "mappings": "AAAA,KAAK,CAAC,GAAG,EAAA,CAAwB,IAAhB,MAAM,IAAI,GAAG,CAAC,AAAC,CAAC,CAAC;AAClC,KAAK,CAAC,GAAG,WAAA,CAAwB,IAAP,CAAC,GAAG,CAAC,AAAC,CAAC,CAAC;AAClC,KAAK,CAAC,GAAG,EAAA,CAAgB,IAAR,CAAC,IAAI,CAAC,AAAC,CAAC,CAAC;AAC1B,KAAK,GAAG,GAAG,YAAA,CAA2B,IAAT,CAAC,KAAK,CAAC,AAAC,CAAC,CAAC;AACvC,KAAK,GAAG,GAAG,YAAA,CAA2B,IAAT,CAAC,KAAK,CAAC,AAAC,CAAC,CAAC;AACvC,KAAK,EAAE,GAAG,EAAA,CAAmC,IAA3B,CAAC,IAAI,IAAI,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,AAAC,CAAC,CAAC,AAC9C" } \ No newline at end of file diff --git a/test/samples/ts-method-signature-markers/expected.ts.map b/test/samples/ts-method-signature-markers/expected.ts.map index bb89edde..d157ad4b 100644 --- a/test/samples/ts-method-signature-markers/expected.ts.map +++ b/test/samples/ts-method-signature-markers/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "interface Example {\n\toptional?(value: T): T;\n}\n" ], - "mappings": "AAAA,UAAU,OAAO,EAAC,CACjB,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,CAAC,EAAE,CAAC,AAAC,CAC1B,CAAA,AACD" + "mappings": "AAAA,UAAU,OAAO,CAAC,CAAA,CACjB,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,CAAC,EAAE,CAAC,AAAC,CAC1B,AAAD,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/ts-module-declaration/expected.ts.map b/test/samples/ts-module-declaration/expected.ts.map index 71ffd49c..0cb2628a 100644 --- a/test/samples/ts-module-declaration/expected.ts.map +++ b/test/samples/ts-module-declaration/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "declare global {\n\tnamespace App {\n\t\tinterface Error {\n\t\t\tfoo: string;\n\t\t}\n\t}\n}\n\nnamespace A.B.C {\n\texport const x = 1;\n}\n\nnamespace D {\n\texport const x = 1;\n}\n\nexport {};\n" ], - "mappings": "AAAA,QAAQ,MAAM,AAAC;CACd,UAAU,GAAG,AAAC;EACb,UAAU,KAAK,EAAC,CACf,GAAG,EAAE,MAAM,AAAC,CACZ,CAAA;EACD;CACD;;AAED,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,AAAC;CACf,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;CACnB;;AAED,UAAU,CAAC,AAAC;CACX,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;CACnB;;AAED,MAAM,IAAI,AACV" + "mappings": "AAAA,QAAQ,MAAM,AAAC,CAAA;CACd,UAAU,GAAG,AAAC,CAAA;EACb,UAAU,KAAK,CAAC,CAAA,CACf,GAAG,EAAE,MAAM,AAAC,CACZ,AAAD,CAAC;CACF,CAAC;AACF,CAAC;;AAED,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,AAAC,CAAA;CACf,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC;;AAED,UAAU,CAAC,AAAC,CAAA;CACX,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC;;AAED,MAAM,IAAI,AACV" } \ No newline at end of file diff --git a/test/samples/ts-object-patterns/expected.ts.map b/test/samples/ts-object-patterns/expected.ts.map index a23486c6..f8d79320 100644 --- a/test/samples/ts-object-patterns/expected.ts.map +++ b/test/samples/ts-object-patterns/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type User = {\n\tfirstName: string;\n\tlastName: string;\n};\n\nfunction a({ firstName, lastName }: User) {\n\tconsole.log(firstName, lastName);\n}\n" ], - "mappings": "AAAA,KAAK,IAAI,GAAG,EACX,SAAS,EAAE,MAAM,AAAC,EAClB,QAAQ,EAAE,MAAM,AAAC,EACjB,CAAC;;AAEF,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC;CAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC,AACD" + "mappings": "AAAA,KAAK,IAAI,GAAG,EACX,SAAS,EAAE,MAAM,AAAC,EAClB,QAAQ,EAAE,MAAM,AAAC,CAClB,CAAC,CAAC;;AAEF,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAO,CAAL,EAAE,IAAI,EAAE,CAAC;CAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/ts-optional-parameter/expected.ts.map b/test/samples/ts-optional-parameter/expected.ts.map index 39fa43b5..3ee75ca9 100644 --- a/test/samples/ts-optional-parameter/expected.ts.map +++ b/test/samples/ts-optional-parameter/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "export const atproto = (o?: { A?: string }) => {};\nfunction f(a?: number) {}\nconst g = (a?: number) => a;\nclass C {\n\tm(a?: number) {}\n}\ninterface I {\n\tm(a?: number): void;\n}\ntype F = (a?: number) => void;\n" ], - "mappings": "AAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAkB,CAAhB,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;;AAClD,SAAS,CAAC,CAAC,CAAU,CAAR,EAAE,MAAM,EAAE,CAAC,CAAC;;AACzB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAU,CAAR,EAAE,MAAM,KAAK,CAAC,CAAC;;AAC5B,MAAM,CAAC,CAAC,CAAC;CACR,CAAC,CAAC,CAAU,CAAR,EAAE,MAAM,EAAE,CAAC,CAAC;AACjB,CAAC;;AACD,UAAU,CAAC,EAAC,CACX,CAAC,CAAC,CAAU,CAAR,EAAE,MAAM,CAAC,EAAE,IAAI,AAAC,CACpB,CAAA;;AACD,KAAK,CAAC,GAAG,CAAC,CAAU,CAAR,EAAE,MAAM,KAAK,IAAI,CAAC,AAC9B" + "mappings": "AAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAkB,CAAhB,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;;AAClD,SAAS,CAAC,CAAC,CAAU,CAAR,EAAE,MAAM,EAAE,CAAC,CAAC;;AACzB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAU,CAAR,EAAE,MAAM,KAAK,CAAC,CAAC;;AAC5B,MAAM,CAAC,CAAC,CAAC;CACR,CAAC,CAAC,CAAU,CAAR,EAAE,MAAM,EAAE,CAAC,CAAC;AACjB,CAAC;;AACD,UAAU,CAAC,CAAC,CAAA,CACX,CAAC,CAAC,CAAU,CAAR,EAAE,MAAM,CAAC,EAAE,IAAI,AAAC,CACpB,AAAD,CAAC;;AACD,KAAK,CAAC,GAAG,CAAC,CAAU,CAAR,EAAE,MAAM,KAAK,IAAI,CAAC,AAC9B" } \ No newline at end of file diff --git a/test/samples/ts-parameter-decorators/expected.ts.map b/test/samples/ts-parameter-decorators/expected.ts.map index 4346a0b4..d7201269 100644 --- a/test/samples/ts-parameter-decorators/expected.ts.map +++ b/test/samples/ts-parameter-decorators/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "class Controller {\n\tconstructor(\n\t\t@Inject(CONFIG) private readonly config: Config,\n\t\t@Optional() @Inject(LOGGER) protected logger?: Logger,\n\t\t@Inject(CACHE) public cache = new Map(),\n\t\t@Self() service: Service\n\t) {}\n\n\tfind(@Param('id') id: string, @Query() { limit, offset }: Paging, @Body() [first]: Item[]) {}\n\n\tupdate(\n\t\t@Param('id') id: string,\n\t\t@Body(validation.pipe) body: Item,\n\t\t@(flags ?? defaults) force = false\n\t) {}\n}\n" ], - "mappings": "AAAA,MAAM,UAAU,CAAC,CAAC;CACjB,WAAW;EACM,CAAf,MAAM,CAAC,MAAM,CAAC,kBAAkB,MAAc,AAAR,EAAE,MAAM;EACnB,CAA3B,QAAQ,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,MAAe,CAAR,EAAE,MAAM;EACtC,CAAd,MAAM,CAAC,KAAK,CAAC,QAAC,AAAO,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE;EAC/B,CAAP,IAAI,EAAE,CAAC,OAAgB,AAAT,EAAE,OAAO;GACvB,CAAC,CAAC;;CAEJ,IAAI;EAAc,CAAZ,KAAK,CAAC,IAAI,CAAC,CAAC,EAAU,AAAR,EAAE,MAAM;EAAW,CAAR,KAAK,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM;EAAU,CAAP,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE;GAAE,CAAC,CAAC;;CAE7F,MAAM;EACQ,CAAZ,KAAK,CAAC,IAAI,CAAC,CAAC,EAAU,AAAR,EAAE,MAAM;EACA,CAAtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAU,AAAN,EAAE,IAAI;EACZ,EAAnB,KAAK,IAAI,QAAQ,EAAE,KAAK,GAAG,KAAK;GACjC,CAAC,CAAC;AACL,CAAC,AACD" + "mappings": "AAAA,MAAM,UAAU,CAAC,CAAC;CACjB,WAAW;EACM,CAAf,MAAM,CAAC,MAAM,CAAC,kBAAkB,MAAc,AAAR,EAAE,MAAM;EACnB,CAA3B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,MAAe,CAAR,EAAE,MAAM;EACtC,CAAd,MAAM,CAAC,KAAK,CAAC,QAAC,AAAO,KAAK,GAAG,GAAG,CAAC,GAAG,EAAE;EAC/B,CAAP,IAAI,CAAC,CAAC,CAAC,OAAgB,AAAT,EAAE,OAAO;GACvB,CAAC,CAAC;;CAEJ,IAAI;EAAc,CAAZ,KAAK,CAAC,IAAI,CAAC,CAAC,EAAU,AAAR,EAAE,MAAM;EAAW,CAAR,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,MAAM,CAAS,CAAP,EAAE,MAAM;EAAU,CAAP,IAAI,CAAC,CAAC,EAAE,KAAK,AAAQ,CAAP,EAAE,IAAI,CAAC,CAAC;GAAE,CAAC,CAAC;;CAE7F,MAAM;EACQ,CAAZ,KAAK,CAAC,IAAI,CAAC,CAAC,EAAU,AAAR,EAAE,MAAM;EACA,CAAtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAU,AAAN,EAAE,IAAI;EACZ,EAAnB,KAAK,IAAI,QAAQ,EAAE,KAAK,GAAG,KAAK;GACjC,CAAC,CAAC;AACL,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/ts-readonly-signatures/expected.ts.map b/test/samples/ts-readonly-signatures/expected.ts.map index 56859901..662a9b6f 100644 --- a/test/samples/ts-readonly-signatures/expected.ts.map +++ b/test/samples/ts-readonly-signatures/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "interface Example {\n\treadonly property?: string;\n\treadonly [key: string]: number;\n}\n" ], - "mappings": "AAAA,UAAU,OAAO,EAAC,CACjB,SAAS,QAAQ,CAAC,EAAE,MAAM,AAAC,EAC3B,UAAU,GAAW,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC,CAC/B,CAAA,AACD" + "mappings": "AAAA,UAAU,OAAO,CAAC,CAAA,CACjB,SAAS,QAAQ,CAAC,EAAE,MAAM,AAAC,EAC3B,UAAU,GAAW,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC,CAC/B,AAAD,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/ts-satisfies-expression/expected.ts.map b/test/samples/ts-satisfies-expression/expected.ts.map index bf370c04..ef472ffe 100644 --- a/test/samples/ts-satisfies-expression/expected.ts.map +++ b/test/samples/ts-satisfies-expression/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type A = string;\nconst b: number = 42 satisfies A;\n\ntype C = {\n\tname: string;\n};\n\ntype D = {\n\tname: string;\n\tdescription: string;\n};\n\nconst e: D = {\n\tname: 'foo',\n\tdesciption: 'bar'\n};\n\nconst f = e satisfies D;\n\nconst g = (\n\tMath.random() > 0.5\n\t\t? { name: 'name1', description: 'desc1' }\n\t\t: { name: 'name2', description: 'desc2' }\n) satisfies D;\n" ], - "mappings": "AAAA,KAAK,CAAC,GAAG,MAAM,CAAC;;AAChB,KAAK,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,EAAE,WAAW,CAAC,CAAC;;AAEjC,KAAK,CAAC,GAAG,EACR,IAAI,EAAE,MAAM,AAAC,EACb,CAAC;AAEF,KAAK,CAAC,GAAG,EACR,IAAI,EAAE,MAAM,AAAC,EACb,WAAW,EAAE,MAAM,AAAC,EACpB,CAAC;;AAEF,KAAK,CAAC,CAAI,AAAH,EAAE,CAAC,GAAG,EACZ,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,KAAK,EACjB,CAAC;AAEF,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;;AAExB,KAAK,CAAC,CAAC,GAAG,CACT,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG;GAChB,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE;GACvC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAC/B,CAAC,CAAC,AACd" + "mappings": "AAAA,KAAK,CAAC,GAAG,MAAM,CAAC;;AAChB,KAAK,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,EAAE,WAAW,CAAC,CAAC;;AAEjC,KAAK,CAAC,GAAG,EACR,IAAI,EAAE,MAAM,AAAC,CACd,CAAC,CAAC;AAEF,KAAK,CAAC,GAAG,EACR,IAAI,EAAE,MAAM,AAAC,EACb,WAAW,EAAE,MAAM,AAAC,CACrB,CAAC,CAAC;;AAEF,KAAK,CAAC,CAAI,AAAH,EAAE,CAAC,GAAG,EACZ,IAAI,EAAE,KAAK,EACX,UAAU,EAAE,KAAK,CAClB,CAAC,CAAC;AAEF,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;;AAExB,KAAK,CAAC,CAAC,GAAG,CACT,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG;GAChB,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;GACvC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,YAC/B,CAAC,CAAC,AACd" } \ No newline at end of file diff --git a/test/samples/ts-signatures/expected.ts.map b/test/samples/ts-signatures/expected.ts.map index fd34c62f..7c16931a 100644 --- a/test/samples/ts-signatures/expected.ts.map +++ b/test/samples/ts-signatures/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "interface Constructable {\n\tnew (): any;\n\tnew (value: string): MyClass;\n\tnew (value: T): GenericClass;\n\t(name: string): string;\n}\n\ninterface Signatures {\n\t[Symbol.iterator](): number;\n\tx(): void;\n\t[k: string]: number;\n}\n\ntype Constructor = {\n\tnew (): object;\n\tnew (name: string, age: number): Person;\n};\n\ntype Computed = {\n\t[Symbol.iterator](): number;\n};\n" ], - "mappings": "AAAA,UAAU,aAAa,EAAC;CACvB,KAAM,EAAE,GAAG,AAAC;CACZ,IAAK,KAAa,AAAR,EAAE,MAAM,CAAC,EAAE,OAAO,AAAC;CAC7B,GAAI,CAAC,CAAC,CAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,AAAC;CACnC,CAAC,IAAY,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC;AACvB,CAAA;;AAED,UAAU,UAAU,EAAC,CACpB,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,MAAM,AAAC,EAC5B,CAAC,EAAE,EAAE,IAAI,AAAC,EACV,CAAC,CAAS,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC,CACpB,CAAA;;AAED,KAAK,WAAW,GAAG,EAClB,KAAM,EAAE,MAAM,AAAC,EACf,IAAK,IAAY,AAAR,EAAE,MAAM,EAAE,GAAW,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC,EACxC,CAAC;AAEF,KAAK,QAAQ,GAAG,EACf,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,MAAM,AAAC,EAC5B,CAAC,AACF" + "mappings": "AAAA,UAAU,aAAa,CAAC,CAAA;CACvB,KAAM,EAAE,GAAG,AAAC;CACZ,IAAK,KAAa,AAAR,EAAE,MAAM,CAAC,EAAE,OAAO,AAAC;CAC7B,GAAI,CAAC,CAAC,CAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,AAAC;CACnC,CAAC,IAAY,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC;AACvB,AAAD,CAAC;;AAED,UAAU,UAAU,CAAC,CAAA,CACpB,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,MAAM,AAAC,EAC5B,CAAC,EAAE,EAAE,IAAI,AAAC,EACV,CAAC,CAAS,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC,CACpB,AAAD,CAAC;;AAED,KAAK,WAAW,GAAG,EAClB,KAAM,EAAE,MAAM,AAAC,EACf,IAAK,IAAY,AAAR,EAAE,MAAM,EAAE,GAAW,AAAR,EAAE,MAAM,CAAC,EAAE,MAAM,AAAC,CACzC,CAAC,CAAC;AAEF,KAAK,QAAQ,GAAG,EACf,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,MAAM,AAAC,CAC7B,CAAC,CAAC,AACF" } \ No newline at end of file diff --git a/test/samples/ts-simple-identifier-types/expected.ts.map b/test/samples/ts-simple-identifier-types/expected.ts.map index a7a6159a..fb6f95ba 100644 --- a/test/samples/ts-simple-identifier-types/expected.ts.map +++ b/test/samples/ts-simple-identifier-types/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const n: number = 1;\nconst s: string = 'foo';\nconst b: boolean = true;\nconst a: any = {};\nconst na: number[] = [];\nconst sa: string[] = [];\nconst ba: boolean[] = [];\nconst aa: any[] = [];\n" ], - "mappings": "AAAA,KAAK,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,CAAC,CAAC;AACpB,KAAK,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,KAAK,CAAC;AACxB,KAAK,CAAC,CAAU,AAAT,EAAE,OAAO,GAAG,IAAI,CAAC;AACxB,KAAK,CAAC,CAAM,AAAL,EAAE,GAAG,GAAG,EAAE,CAAC;AAClB,KAAK,CAAC,EAAY,AAAV,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxB,KAAK,CAAC,EAAY,AAAV,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxB,KAAK,CAAC,EAAa,AAAX,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACzB,KAAK,CAAC,EAAS,AAAP,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,AACrB" + "mappings": "AAAA,KAAK,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,CAAC,CAAC;AACpB,KAAK,CAAC,CAAS,AAAR,EAAE,MAAM,GAAG,KAAK,CAAC;AACxB,KAAK,CAAC,CAAU,AAAT,EAAE,OAAO,GAAG,IAAI,CAAC;AACxB,KAAK,CAAC,CAAM,AAAL,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AAClB,KAAK,CAAC,EAAY,AAAV,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxB,KAAK,CAAC,EAAY,AAAV,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACxB,KAAK,CAAC,EAAa,AAAX,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACzB,KAAK,CAAC,EAAS,AAAP,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,AACrB" } \ No newline at end of file diff --git a/test/samples/ts-tagged-template/expected.ts.map b/test/samples/ts-tagged-template/expected.ts.map index 0acfc82a..5f4bb7d2 100644 --- a/test/samples/ts-tagged-template/expected.ts.map +++ b/test/samples/ts-tagged-template/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "sql`SELECT * FROM table`;\nconst res = tag`hello ${world}`;\n" ], - "mappings": "AAAA,GAAG,CAAC,MAAM,EAAE,CAAC,qBAAqB,CAAC;;AACnC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,AACtC" + "mappings": "AAAA,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC;;AACnC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,AACtC" } \ No newline at end of file diff --git a/test/samples/ts-type-level-syntax/expected.ts.map b/test/samples/ts-type-level-syntax/expected.ts.map index 58fc22a1..98950955 100644 --- a/test/samples/ts-type-level-syntax/expected.ts.map +++ b/test/samples/ts-type-level-syntax/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type Tuple = [required: string, optional?: number, ...rest: boolean[]];\n\ninterface Accessors {\n\tget value(): string;\n\tset value(next: string);\n\tmethod(): void;\n}\n\ntype Instantiated = typeof identity;\n" ], - "mappings": "AAAA,KAAK,KAAK,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;;AAEvE,UAAU,SAAS,EAAC,CACnB,IAAI,KAAK,EAAE,EAAE,MAAM,AAAC,EACpB,IAAI,KAAK,CAAC,IAAY,AAAR,EAAE,MAAM,CAAE,EACxB,MAAM,EAAE,EAAE,IAAI,AAAC,CACf,CAAA;;AAED,KAAK,YAAY,GAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,AAC5C" + "mappings": "AAAA,KAAK,KAAK,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;;AAEvE,UAAU,SAAS,CAAC,CAAA,CACnB,IAAI,KAAK,EAAE,EAAE,MAAM,AAAC,EACpB,IAAI,KAAK,CAAC,IAAY,AAAR,EAAE,MAAM,CAAE,EACxB,MAAM,EAAE,EAAE,IAAI,AAAC,CACf,AAAD,CAAC;;AAED,KAAK,YAAY,GAAG,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,AAC5C" } \ No newline at end of file diff --git a/test/samples/ts-types/expected.ts.map b/test/samples/ts-types/expected.ts.map index f3dc41c8..e5a62631 100644 --- a/test/samples/ts-types/expected.ts.map +++ b/test/samples/ts-types/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type A = [x: number, y: string];\ntype B = { a: string; b: number };\n\ntype C = 'foo' | 'bar';\ntype D = C | A | B | 'foobar';\n\ntype E = A & B;\ntype F = C & 'foobar';\n\n// TODO: commented because acorn doesn't support intrinsic but oxc does\n// type G = { [a in C]: string };\n\ntype H = this;\ntype I = `Hello, ${keyof C}`;\ntype J = () => this is string;\ntype P = (x: unknown) => asserts x is string;\n\nfunction assertsString(x): asserts x is string {}\nfunction assertsValue(x): asserts x {}\nfunction assertsThis(x): asserts this is Foo {}\nfunction isString(x): x is string {}\n\ntype Bird = { legs: 2 };\ntype Dog = { legs: 4 };\ntype Wolf = { legs: 4 };\ntype Animals = Bird | Dog | Wolf;\ntype HasFourLegs = Animal extends { legs: 4 } ? Animal : never;\ntype FourLegs = HasFourLegs;\n\ntype T = [('a' | 'b')?];\n\ntype CT = new (tpl: TemplateStringsArray, ...args: Array) => (replacements: B) => A;\n\ntype X = [...number[]];\ntype TupleWithRest = [number, ...(1 extends 2 ? string[] : number[])];\n\n// TODO: commented because acorn doesn't support intrinsic but oxc does\n// type Uppercase = intrinsic;\n" ], - "mappings": "AAAA,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAChC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,AAAC,EAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AAElC,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;AACvB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;AAE9B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACf,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;;;;AAKtB,KAAK,CAAC,GAAG,IAAI,CAAC;;AACd,KAAK,CAAC,GAAG,UAAU,MAAM,CAAC,EAAE,CAAC;AAC7B,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,MAAM,CAAC;AAC9B,KAAK,CAAC,GAAG,CAAC,CAAU,AAAT,EAAE,OAAO,KAAK,QAAQ,CAAC,IAAI,MAAM,CAAC;;AAE7C,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACjD,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtC,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;AAC/C,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;;AAEpC,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxB,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACvB,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AACxB,KAAK,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;AACjC,KAAK,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,GAAG,KAAK,CAAC;AACvE,KAAK,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AAErC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAExB,KAAK,EAAE,GAAG,KAAK,GAAyB,AAAtB,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAe,AAAH,EAAE,CAAC,KAAK,CAAC,CAAC;AAE7F,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;AACvB,KAAK,aAAa,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;;;gDAItE" + "mappings": "AAAA,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AAChC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,AAAC,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAElC,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;AACvB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;AAE9B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACf,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;;;;AAKtB,KAAK,CAAC,GAAG,IAAI,CAAC;;AACd,KAAK,CAAC,GAAG,UAAU,MAAM,CAAC,EAAE,CAAC;AAC7B,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,MAAM,CAAC;AAC9B,KAAK,CAAC,GAAG,CAAC,CAAU,AAAT,EAAE,OAAO,KAAK,QAAQ,CAAC,IAAI,MAAM,CAAC;;AAE7C,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACjD,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AACtC,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;AAC/C,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;;AAEpC,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,KAAK,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvB,KAAK,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,KAAK,OAAO,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;AACjC,KAAK,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC;AACvE,KAAK,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AAErC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAExB,KAAK,EAAE,GAAG,KAAK,GAAyB,AAAtB,EAAE,oBAAoB,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAe,AAAH,EAAE,CAAC,KAAK,CAAC,CAAC;AAE7F,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACvB,KAAK,aAAa,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;;;gDAItE" } \ No newline at end of file diff --git a/test/samples/ts-utility-types/expected.ts.map b/test/samples/ts-utility-types/expected.ts.map index da0e184f..8c842da8 100644 --- a/test/samples/ts-utility-types/expected.ts.map +++ b/test/samples/ts-utility-types/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "type A = Awaited>;\n\ntype Todo = {\n\ttitle: string;\n\tdescription: string;\n};\n\nfunction updateTodo(todo: Todo, fieldsToUpdate: Partial) {\n\treturn { ...todo, ...fieldsToUpdate };\n}\n\nconst todo2: Readonly = {\n\ttitle: 'Delete inactive users',\n\tdescription: 'foo'\n};\n\ntype CatInfo = {\n\tage: number;\n\tbreed: string;\n};\n\nconst cats: Record = {\n\tmiffy: { age: 10, breed: 'Persian' },\n\tboris: { age: 5, breed: 'Maine Coon' },\n\tmordred: { age: 16, breed: 'British Shorthair' }\n};\n" ], - "mappings": "AAAA,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAElC,KAAK,IAAI,GAAG,EACX,KAAK,EAAE,MAAM,AAAC,EACd,WAAW,EAAE,MAAM,AAAC,EACpB,CAAC;;AAEF,SAAS,UAAU,CAAC,IAAU,AAAN,EAAE,IAAI,EAAE,cAA6B,AAAf,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;CAC/D,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;AACvC,CAAC;;AAED,KAAK,CAAC,KAAqB,AAAhB,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAC7B,KAAK,EAAE,uBAAuB,EAC9B,WAAW,EAAE,KAAK,EAClB,CAAC;;AAEF,KAAK,OAAO,GAAG,EACd,GAAG,EAAE,MAAM,AAAC,EACZ,KAAK,EAAE,MAAM,AAAC,EACd,CAAC;;AAEF,KAAK,CAAC,IAA6B,AAAzB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;CACrC,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;CACpC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;CACtC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE;CAChD,CAAC,AACF" + "mappings": "AAAA,KAAK,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAElC,KAAK,IAAI,GAAG,EACX,KAAK,EAAE,MAAM,AAAC,EACd,WAAW,EAAE,MAAM,AAAC,CACrB,CAAC,CAAC;;AAEF,SAAS,UAAU,CAAC,IAAU,AAAN,EAAE,IAAI,EAAE,cAA6B,AAAf,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;CAC/D,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;AACvC,CAAC;;AAED,KAAK,CAAC,KAAqB,AAAhB,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAC7B,KAAK,EAAE,uBAAuB,EAC9B,WAAW,EAAE,KAAK,CACnB,CAAC,CAAC;;AAEF,KAAK,OAAO,GAAG,EACd,GAAG,EAAE,MAAM,AAAC,EACZ,KAAK,EAAE,MAAM,AAAC,CACf,CAAC,CAAC;;AAEF,KAAK,CAAC,IAA6B,AAAzB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;CACrC,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;CACpC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;CACtC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC;AACjD,CAAC,CAAC,AACF" } \ No newline at end of file diff --git a/test/samples/tsx-type-parameters/expected.tsx.map b/test/samples/tsx-type-parameters/expected.tsx.map index 04066e1c..f9849b4e 100644 --- a/test/samples/tsx-type-parameters/expected.tsx.map +++ b/test/samples/tsx-type-parameters/expected.tsx.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const identity = (value: T): T => value;\nconst pair = (a: T, b: U): [T, U] => [a, b];\nconst constant = (value: T) => value;\nconst nested =\n\t(value: T) =>\n\t(other: U) => [value, other];\nconst apply = (fn: (value: U) => U, value: T) => fn(value);\n\nfunction declared(value: T): T {\n\treturn value;\n}\n\nclass Box {}\ninterface Result {\n\tvalue: T;\n}\ntype Identity = (value: T) => T;\n\nconst element =
{identity('x')}
;\nconst component = value={identity('x')} />;\n" ], - "mappings": "AAAA,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,KAAQ,AAAH,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;AAC5C,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAI,AAAH,EAAE,CAAC,EAAE,CAAI,AAAH,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAA,CAAO,EAAE,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,KAAK,CAAC;AAC/C,KAAK,CAAC,MAAM,GACX,CAAC,CAAC,EAAE,CAAC,KAAQ,AAAH,EAAE,CAAC,KACb,CAAC,CAAC,EAAE,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAClC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAsB,AAApB,EAAE,CAAC,CAAC,EAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,CAAC,EAAE,KAAQ,AAAH,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;;AAElE,SAAS,QAAQ,CAAC,CAAC,EAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAClC,MAAM,CAAC,KAAK,CAAC;AACd,CAAC;;AAED,MAAM,GAAG,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;;AACf,UAAU,MAAM,CAAC,CAAC,EAAC,EAAC,CACnB,KAAK,EAAE,CAAC,AAAC,CACT,CAAA;;AACD,KAAK,QAAQ,GAAG,CAAC,CAAC,EAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,CAAC,CAAC;;AAEnC,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,AAC9D" + "mappings": "AAAA,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,KAAQ,AAAH,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC;AAC5C,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAI,AAAH,EAAE,CAAC,EAAE,CAAI,AAAH,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClD,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAA,CAAO,EAAE,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,KAAK,CAAC;AAC/C,KAAK,CAAC,MAAM,GACX,CAAC,CAAC,EAAE,CAAC,KAAQ,AAAH,EAAE,CAAC,KACb,CAAC,CAAC,EAAE,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAClC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,EAAsB,AAApB,EAAE,CAAC,CAAC,EAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,CAAC,EAAE,KAAQ,AAAH,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;;AAElE,SAAS,QAAQ,CAAC,CAAC,EAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAClC,MAAM,CAAC,KAAK,CAAC;AACd,CAAC;;AAED,MAAM,GAAG,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC;;AACf,UAAU,MAAM,CAAC,CAAC,EAAC,CAAC,CAAA,CACnB,KAAK,EAAE,CAAC,AAAC,CACT,AAAD,CAAC;;AACD,KAAK,QAAQ,GAAG,CAAC,CAAC,EAAC,CAAC,KAAQ,AAAH,EAAE,CAAC,KAAK,CAAC,CAAC;;AAEnC,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3C,KAAK,CAAC,SAAS,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,AAC9D" } \ No newline at end of file diff --git a/test/samples/var-declaration/expected.js.map b/test/samples/var-declaration/expected.js.map index 07a6592d..e8b4d298 100644 --- a/test/samples/var-declaration/expected.js.map +++ b/test/samples/var-declaration/expected.js.map @@ -7,5 +7,5 @@ "sourcesContent": [ "const obj = {\n\ta,\n\tb,\n\tc,\n\td,\n\te,\n\tf,\n\tg,\n\th,\n\ti,\n\tj,\n\tk,\n\tl,\n\tm,\n\tn,\n\to,\n\tp,\n\tq,\n\tr,\n\ts,\n\tt,\n\tu,\n\tv,\n\tw,\n\tx,\n\ty,\n\tz\n};\n\nconst obj2 = {\n\t\ta,\n\t\tb,\n\t\tc,\n\t\td,\n\t\te,\n\t\tf,\n\t\tg,\n\t\th,\n\t\ti,\n\t\tj,\n\t\tk,\n\t\tl,\n\t\tm,\n\t\tn,\n\t\to,\n\t\tp,\n\t\tq,\n\t\tr,\n\t\ts,\n\t\tt,\n\t\tu,\n\t\tv,\n\t\tw,\n\t\tx,\n\t\ty,\n\t\tz\n\t},\n\ta = 1,\n\tb = 2;" ], - "mappings": "AAAA,KAAK,CAAC,GAAG,GAAG;CACX,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;;AAEF,KAAK,CAAC,IAAI,GAAG;EACX,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD;CACD,CAAC,GAAG,CAAC;CACL,CAAC,GAAG,CAAC,CAAC" + "mappings": "AAAA,KAAK,CAAC,GAAG,GAAG;CACX,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;CACD,CAAC;AACF,CAAC,CAAC;;AAEF,KAAK,CAAC,IAAI,GAAG;EACX,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;EACD,CAAC;CACF,CAAC;CACD,CAAC,GAAG,CAAC;CACL,CAAC,GAAG,CAAC,CAAC" } \ No newline at end of file diff --git a/test/sourcemap-keywords.test.js b/test/sourcemap-keywords.test.js index 5f650fe6..64b4b9dc 100644 --- a/test/sourcemap-keywords.test.js +++ b/test/sourcemap-keywords.test.js @@ -71,3 +71,376 @@ test.each([ const { gen_line, gen_col } = generatedLineColumn(source, source.indexOf(keyword)); expect(segment.slice(2)).toEqual([gen_line, gen_col]); }); + +/** + * @param {string} code + * @param {number} index + * @param {[number, number, number, number][][]} mappings + */ +function mappingsAtIndex(code, index, mappings) { + const { gen_line, gen_col } = generatedLineColumn(code, index); + const line = mappings[gen_line] ?? []; + return line.filter((segment) => segment[0] === gen_col); +} + +/** + * @param {string} code + * @param {string} needle + * @param {[number, number, number, number][][]} mappings + */ +function mappingsAtSubstring(code, needle, mappings) { + const index = code.indexOf(needle); + expect(index >= 0, `needle not in output: ${JSON.stringify(needle)}`).toBe(true); + return mappingsAtIndex(code, index, mappings); +} + +/** + * Prints `source` with the parser's tokens passed to the printer (or `opts.tokens`) + * @param {string} source + * @param {{ tokens?: boolean | any[], sourceType?: 'module' | 'script' }} [opts] + */ +function mappedWithTokens(source, opts = {}) { + /** @type {any[]} */ + const tokens = []; + const { ast, comments } = acornParse(source, { + sourceType: opts.sourceType ?? 'module', + jsxMode: false, + fileExtension: 'ts', + tokens + }); + const { code, map } = print( + ast, + ts({ comments, tokens: opts.tokens === true ? tokens : opts.tokens || undefined }), + { sourceMapSource: 'input.ts', sourceMapContent: source, sourceMapEncodeMappings: false } + ); + const mappings = /** @type {[number, number, number, number][][]} */ ( + /** @type {unknown} */ (map.mappings) + ); + return { code, mappings, tokens }; +} + +/** + * Every `delimiters` character in the output maps to the matching token in the + * source, and the output is the same as without tokens. + * @param {string} source + * @param {string[]} delimiters + * @param {{ sourceType?: 'module' | 'script' }} [opts] + */ +function expectExactDelimiterMappings(source, delimiters, opts = {}) { + const without = mappedWithTokens(source, { sourceType: opts.sourceType }); + const { code, mappings, tokens } = mappedWithTokens(source, { + tokens: true, + sourceType: opts.sourceType + }); + expect(code).toBe(without.code); + + // a backtracking parser can emit a token twice + const seen = new Set(); + /** @type {{ value: string, start: { line: number, column: number } }[]} */ + const source_delimiters = []; + for (const token of tokens) { + const value = token.type.label; + if (!token.loc || !delimiters.includes(value === '${' ? '{' : value)) continue; + const key = `${value}:${token.loc.start.line}:${token.loc.start.column}`; + if (seen.has(key)) continue; + seen.add(key); + source_delimiters.push({ value, start: token.loc.start }); + } + + /** @type {{ value: string, index: number }[]} */ + const generated_delimiters = []; + for (let i = 0; i < code.length; i += 1) { + if (code[i] === '$' && code[i + 1] === '{' && delimiters.includes('{')) { + generated_delimiters.push({ value: '${', index: i }); + i += 1; + } else if (delimiters.includes(code[i])) { + generated_delimiters.push({ value: code[i], index: i }); + } + } + + expect(generated_delimiters.map((d) => d.value)).toEqual(source_delimiters.map((d) => d.value)); + for (let i = 0; i < generated_delimiters.length; i += 1) { + const { start } = source_delimiters[i]; + expect( + mappingsAtIndex(code, generated_delimiters[i].index, mappings).map((s) => s.slice(2)), + `${generated_delimiters[i].value} at ${start.line}:${start.column}` + ).toContainEqual([start.line - 1, start.column]); + } +} + +test.each([ + ['object property', `const object = { [\nkey\n]: value };`], + ['object method', `const object = { async *[\nmethod\n]() {} };`], + ['object getter', `const object = { get [\nkey\n]() { return 1; } };`], + ['object setter', `const object = { set [\nkey\n](value) {} };`], + ['class method', `class Example { [\nmethod\n]() {} }`], + ['class field', `class Example { [\nfield\n] = 1; }`], + ['type property signature', `type Example = { [\nkey\n]: string }`], + ['type method signature', `type Example = { [\nmethod\n](): void }`], + ['comments inside the brackets', `const object = { [ /* before */\nkey\n/* after */ ]: value };`], + ['array expression', `const values = [ /* before */\nvalue\n/* after */ ];`], + ['array pattern', `const [ /* before */\nvalue\n/* after */ ] = values;`], + ['computed member access', `const value = object[ /* before */\nkey\n/* after */ ];`], + ['array type', `type Values = Item /* before */ [ /* after */ ];`], + ['index signature', `type Dictionary = { [ /* before */ key: string /* after */ ]: number };`], + ['readonly index signature', `type Dictionary = { readonly [ key: string ]: number };`], + [ + 'mapped type', + `type Selected = { [ /* before */ K in Keys as Rename /* after */ ]: string };` + ], + ['tuple type', `type Pair = [ /* before */ First, Second /* after */ ];`], + ['indexed access type', `type Value = Object[ /* before */ Key /* after */ ];`] +])('tokens map square brackets for %s', (_name, source) => { + expectExactDelimiterMappings(source, ['[', ']']); +}); + +test.each([ + ['call', `const result = fn /* before */ ( /* inside */ value /* after */ );`, {}], + [ + 'new expression', + `const result = new Thing /* before */ ( /* inside */ value /* after */ );`, + {} + ], + [ + 'function declaration', + `function example /* before */ ( /* inside */ value /* after */ ) {}`, + {} + ], + ['async arrow function', `const fn = async /* before */ ( value ) => value;`, {}], + ['arrow function', `const callback = ( /* before */ value /* after */ ) => value;`, {}], + ['empty arrow function', `const callback = /* before */ () => value;`, {}], + ['class method', `class Example { method /* before */ ( value /* after */ ) {} }`, {}], + ['object method', `const object = { method /* before */ ( value /* after */ ) {} };`, {}], + ['nested method delimiters', `class Example { [getKey()] /* before */ (value = make()) {} }`, {}], + ['nested parameter delimiters', `function example(value = make(1)) {}`, {}], + [ + 'trailing comma on its own line', + `function example(\n\tfirst: number,\n\tsecond: string,\n) {}`, + {} + ], + ['call signature', `type Example = { ( /* before */ value: string /* after */ ): void };`, {}], + [ + 'construct signature', + `type Example = { new ( /* before */ value: string /* after */ ): object };`, + {} + ], + ['function type', `type Example = ( /* before */ value: string /* after */ ) => void;`, {}], + [ + 'constructor type', + `type Example = new ( /* before */ value: string /* after */ ) => object;`, + {} + ], + [ + 'method signature', + `type Example = { method( /* before */ value: string /* after */ ): void };`, + {} + ], + [ + 'declare function', + `declare function example( /* before */ value: string /* after */ ): void;`, + {} + ], + ['for statement', `for /* before */ (let i = 0; i < 1; i += 1) {}`, {}], + ['for-of statement', `for /* before */ (const value of values) {}`, {}], + ['if statement', `if /* before */ (condition /* after */) {}`, {}], + ['while statement', `while /* before */ (condition /* after */) {}`, {}], + ['do-while statement', `do {} while /* before */ (condition /* after */);`, {}], + ['with statement', `with /* before */ (object /* after */) {}`, { sourceType: 'script' }], + ['switch statement', `switch /* before */ (value /* after */) { default: break; }`, {}], + ['import expression', `const module = import( /* before */ 'module' /* after */ );`, {}], + ['external module reference', `import Alias = require( /* before */ 'module' /* after */ );`, {}], + ['import type', `type Value = import( /* before */ 'module' /* after */ ).Value;`, {}] +])('tokens map parentheses for %s', (_name, source, opts) => { + expectExactDelimiterMappings(source, ['(', ')'], { + sourceType: 'sourceType' in opts && opts.sourceType === 'script' ? 'script' : undefined + }); +}); + +test.each([ + ['named import', `import { /* before */ value /* after */ } from 'module';`], + ['named export', `const value = 1;\nexport { /* before */ value /* after */ };`], + ['empty named export', `export { /* inside */ };`], + ['import attributes', `import value from 'module' with { type: 'json' };`], + ['static block', `class Example { static /* before */ { value; } }`], + ['switch body', `switch (value) /* before */ { default: break; }`], + ['enum body', `enum Example /* before */ { Value }`], + ['interface body', `interface Example /* before */ { value: string }`], + ['namespace body', `namespace Example /* before */ { export const value = 1; }`], + ['template interpolation', 'const result = `before ${ /* before */ value /* after */ } after`;'], + ['template-literal type interpolation', 'type Result = `before ${Value} after`;'] +])('tokens map curly braces for %s', (_name, source) => { + expectExactDelimiterMappings(source, ['{', '}']); +}); + +test('control-flow parentheses are the outer authored ones', () => { + const source = `if /* before */ ((condition)) {}`; + const { code, mappings, tokens } = mappedWithTokens(source, { tokens: true }); + const opens = tokens.filter((token) => token.type.label === '('); + const closes = tokens.filter((token) => token.type.label === ')'); + + expect(mappingsAtSubstring(code, '(', mappings).map((s) => s.slice(2))).toContainEqual([ + opens[0].loc.start.line - 1, + opens[0].loc.start.column + ]); + expect(mappingsAtSubstring(code, ')', mappings).map((s) => s.slice(2))).toContainEqual([ + closes[closes.length - 1].loc.start.line - 1, + closes[closes.length - 1].loc.start.column + ]); +}); + +test('delimiters inside a node are left unmapped without tokens', () => { + const source = `const object = { [ key ]: value };`; + const { code, mappings } = mappedWithTokens(source); + expect(mappingsAtSubstring(code, ']', mappings).map((s) => s.slice(2))).not.toContainEqual([ + 0, + source.indexOf(']') + ]); +}); + +test('closing delimiters at a node end are mapped without tokens', () => { + const source = `const value = object[key];`; + const { code, mappings } = mappedWithTokens(source); + expect(mappingsAtSubstring(code, ']', mappings).map((s) => s.slice(2))).toContainEqual([ + 0, + source.indexOf(']') + ]); +}); + +test('tokens without locations leave mappings unchanged', () => { + const source = `const object = { [key]: fn(value) };`; + const { mappings, tokens } = mappedWithTokens(source); + const bare = tokens.map(({ type, value }) => ({ type, value })); + expect(mappedWithTokens(source, { tokens: bare }).mappings).toEqual(mappings); + expect(mappedWithTokens(source, { tokens: [] }).mappings).toEqual(mappings); +}); + +test('tokens out of source order still locate delimiters', () => { + // acorn-typescript backtracks and re-emits tokens, so its stream is not monotone + const source = `const object = { [ key ]: fn( value ) };`; + const { mappings, tokens } = mappedWithTokens(source, { tokens: true }); + const reversed = [...tokens].reverse(); + expect(mappedWithTokens(source, { tokens: reversed }).mappings).toEqual(mappings); +}); + +test('ESLint-style tokens locate delimiters and keywords', () => { + const source = `const object = { [ key ]: fn( value ) };\nasync /* c */ function f() {}`; + const { mappings, tokens } = mappedWithTokens(source, { tokens: true }); + const eslint_style = tokens.map((token) => ({ + type: token.type.keyword + ? 'Keyword' + : token.type.label === 'name' + ? 'Identifier' + : 'Punctuator', + value: token.type.label === 'name' || token.type.keyword ? token.value : token.type.label, + loc: token.loc + })); + expect(mappedWithTokens(source, { tokens: eslint_style }).mappings).toEqual(mappings); +}); + +/** + * Every `words` keyword in the output maps to the matching token in the source, + * and the output is the same as without tokens. + * @param {string} source + * @param {string[]} words + */ +function expectExactKeywordMappings(source, words) { + const without = mappedWithTokens(source); + const { code, mappings, tokens } = mappedWithTokens(source, { tokens: true }); + expect(code).toBe(without.code); + + const seen = new Set(); + /** @type {{ value: string, start: { line: number, column: number } }[]} */ + const source_words = []; + for (const token of tokens) { + const value = token.type.label === 'name' ? token.value : token.type.label; + if (!token.loc || !words.includes(value)) continue; + const key = `${token.loc.start.line}:${token.loc.start.column}`; + if (seen.has(key)) continue; + seen.add(key); + source_words.push({ value, start: token.loc.start }); + } + + const pattern = new RegExp(`\\b(${words.join('|')})\\b`, 'g'); + const generated_words = [...code.matchAll(pattern)].map((m) => ({ + value: m[0], + index: /** @type {number} */ (m.index) + })); + + expect(generated_words.map((w) => w.value)).toEqual(source_words.map((w) => w.value)); + for (let i = 0; i < generated_words.length; i += 1) { + const { start } = source_words[i]; + expect( + mappingsAtIndex(code, generated_words[i].index, mappings).map((s) => s.slice(2)), + `${generated_words[i].value} at ${start.line}:${start.column}` + ).toContainEqual([start.line - 1, start.column]); + } +} + +test.each([ + ['async function', `async /* c */ function f() {}`, ['async', 'function']], + ['async generator', `async /* c */ function* f() {}`, ['async', 'function']], + ['function expression', `const f = async /* c */ function () {};`, ['async', 'function']], + ['async arrow', `const f = async /* c */ ( x ) => x;`, ['async']], + ['declare function', `declare /* c */ function f(): void;`, ['declare', 'function']], + [ + 'class modifiers', + `declare /* c */ abstract /* c */ class K {}`, + ['declare', 'abstract', 'class'] + ], + ['decorated class', `@dec /* c */ class K {}`, ['class']], + ['export default class', `export /* c */ default /* c */ class {}`, ['default', 'class']], + [ + 'class heritage', + `class K extends /* c */ B implements /* c */ I {}`, + ['extends', 'implements'] + ], + [ + 'member modifiers', + `class K extends B {\n\tstatic /* c */ async /* c */ *m() {}\n\tprivate /* c */ readonly p = 1;\n\tget /* c */ g() { return 1; }\n\t@dec /* c */ override /* c */ n() {}\n}`, + ['static', 'async', 'private', 'readonly', 'get', 'override'] + ], + [ + 'object accessors', + `const o = { get /* c */ p() { return 1; }, async /* c */ m() {} };`, + ['get', 'async'] + ], + ['else', `if (a) {} /* c */ else /* c */ {}`, ['else']], + ['finally', `try {} finally /* c */ {}`, ['finally']], + ['finally after catch', `try {} catch {} /* c */ finally {}`, ['finally']], + ['do-while', `do {} /* c */ while /* c */ (a);`, ['while']], + [ + 'for await of', + `async function f() { for /* c */ await /* c */ (const x of /* c */ y) {} }`, + ['async', 'function', 'await', 'of'] + ], + ['for in', `for (const k /* c */ in o) {}`, ['in']], + ['import type', `import /* c */ type { T } from 'm';`, ['type']], + ['import type specifier', `import { type /* c */ T, a as /* c */ b } from 'm';`, ['type', 'as']], + ['export type', `type T = 1;\nexport /* c */ type { T };`, ['type']], + ['export star as', `export * as /* c */ ns from 'm';`, ['as']], + ['export specifier as', `const b = 1;\nexport { b as /* c */ c };`, ['as']], + ['enum', `declare /* c */ const /* c */ enum E {}`, ['declare', 'const', 'enum']], + ['namespace', `declare /* c */ namespace N {}`, ['declare', 'namespace']], + ['module', `declare /* c */ module 'm' {}`, ['declare', 'module']], + [ + 'interface', + `declare /* c */ interface I extends /* c */ J {}`, + ['declare', 'interface', 'extends'] + ], + ['type alias', `declare /* c */ type T = string;`, ['declare', 'type']], + [ + 'mapped type', + `type M = { -readonly /* c */ [K in /* c */ keyof T as /* c */ R]: T[K] };`, + ['readonly', 'in', 'as'] + ], + ['as expression', `const v = x /* c */ as /* c */ T;`, ['as']], + ['satisfies expression', `const v = x /* c */ satisfies /* c */ T;`, ['satisfies']], + [ + 'parameter properties', + `class P { constructor(private /* c */ readonly x: number) {} }`, + ['private', 'readonly'] + ], + ['constructor type', `type F = abstract /* c */ new () => object;`, ['abstract', 'new']] +])('tokens map keywords after a node start for %s', (_name, source, words) => { + expectExactKeywordMappings(source, words); +}); From 019e60f489a16befda7ceb598a48d103093ea7ac Mon Sep 17 00:00:00 2001 From: Leonidas <329182+leonidaz@users.noreply.github.com> Date: Thu, 24 Sep 2026 23:39:47 -0400 Subject: [PATCH 2/6] fix: map `export` and the keywords of decorated declarations A decorated class's decorators are printed before `export`, so the root visitor cannot map the export node's start where it is written. Emit that start once the decorators are out: the export node begins at `export` with both Acorn and typescript-estree, whichever side of it the decorators were written on. Instead of clearing the declaration's decorators and location while it is printed, remember that its decorators were printed. The root visitor then maps its start when that start is the `class` keyword (typescript-estree, decorators written before `export`) and skips it when it is a decorator (Acorn, see sveltejs/acorn-typescript#117), and the keyword lookup can locate `class`, `abstract` and the rest from the tokens because the node keeps its location. Co-Authored-By: Claude Fable 5.1 --- src/languages/ts/index.js | 45 ++++++++++++------- .../expected.ts.map | 2 +- .../ts-decorators-class/expected.ts.map | 2 +- test/sourcemap-keywords.test.js | 28 ++++++++++++ 4 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/languages/ts/index.js b/src/languages/ts/index.js index c42a5197..a45d5c37 100644 --- a/src/languages/ts/index.js +++ b/src/languages/ts/index.js @@ -1088,7 +1088,11 @@ export default (options = {}) => { node.type in EXPRESSIONS_PRECEDENCE && !BINDINGS.has(node) ); - if (!has_preceding_decorator(node)) { + // the node starts here unless its decorators are printed later (they + // precede `loc.start`) or were printed already and `loc.start` is + // one of them (Acorn ranges a class from decorators written before + // its `export`; typescript-estree from `class`, which then starts here) + if (has_preceding_decorator(node) === printed_decorators.has(node)) { context.location(node.loc.start.line, node.loc.start.column); } } @@ -1316,6 +1320,8 @@ export default (options = {}) => { }); } + // the declaration's decorators came first, so the node's start is written here + if (node.loc) context.location(node.loc.start.line, node.loc.start.column); token(context, 'export', node); context.write(' '); write_keyword(context, node, 'default'); @@ -1345,6 +1351,8 @@ export default (options = {}) => { }); } + // the declaration's decorators came first, so the node's start is written here + if (node.loc) context.location(node.loc.start.line, node.loc.start.column); token(context, 'export', node); context.write(' '); @@ -2767,7 +2775,7 @@ function maybe_wrap(context, node, wrap) { * @param {TSESTree.Node & { decorators: TSESTree.Decorator[] | undefined }} node */ function block_decorators(context, node) { - if (!node.decorators) return; + if (!node.decorators || printed_decorators.has(node)) return; for (const decorator of node.decorators) { context.visit(decorator); @@ -2796,6 +2804,14 @@ function inline_decorators(context, node) { } } +/** + * Declarations whose decorators an export visitor has already printed. Their + * `loc.start` is the first decorator, so the root visitor must not map it where + * the keywords are written; the keywords themselves are located from `tokens`. + * @type {WeakSet} + */ +const printed_decorators = new WeakSet(); + /** * Visit an exported declaration minus its decorators, which have already been printed * @param {Context} context @@ -2803,18 +2819,9 @@ function inline_decorators(context, node) { */ function visit_without_decorators(context, node) { if ('decorators' in node && node.decorators && node.decorators.length > 0) { - const { decorators, loc } = node; - - // Temporarily remove decorators so ClassDeclaration doesn't print them again - node.decorators = []; - // @ts-expect-error - node.loc = null; - + printed_decorators.add(node); context.visit(node); - node.decorators = decorators; - node.loc = loc; - - if (loc) context.location(loc.end.line, loc.end.column); + printed_decorators.delete(node); } else { context.visit(node); } @@ -3033,10 +3040,14 @@ function handle_var_declarator(node, context, no_in) { * @param {TSESTree.Node} node */ function has_preceding_decorator(node) { - let n = - ((node.type === 'ExportNamedDeclaration' || node.type === 'ExportDefaultDeclaration') && - node.declaration) || - node; + if (node.type === 'ExportNamedDeclaration' || node.type === 'ExportDefaultDeclaration') { + // the declaration's decorators are printed before `export`, whichever + // side of it they were written on + const d = node.declaration; + return !!(d && 'decorators' in d && d.decorators && d.decorators.length > 0); + } + + let n = node; if ('parameter' in n && 'decorators' in n.parameter) { n = n.parameter; diff --git a/test/samples/ts-decorator-export-comment/expected.ts.map b/test/samples/ts-decorator-export-comment/expected.ts.map index 91ed8ecb..e0e5d3cf 100644 --- a/test/samples/ts-decorator-export-comment/expected.ts.map +++ b/test/samples/ts-decorator-export-comment/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "@dec\nexport /* c */ declare class X {}\n" ], - "mappings": "AAAA,CAAC,GAAG;MACE,uBAAuB,CAAC,CAAC,CAAC,CAAC,AACjC" + "mappings": "AAAA,CAAC,GAAG;AACJ,MAAM,SAAS,cAAc,CAAC,CAAC,CAAC,CAAC,AACjC" } \ No newline at end of file diff --git a/test/samples/ts-decorators-class/expected.ts.map b/test/samples/ts-decorators-class/expected.ts.map index a8a1e263..896cce9a 100644 --- a/test/samples/ts-decorators-class/expected.ts.map +++ b/test/samples/ts-decorators-class/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "export class Entity {\n\tconstructor(\n\t\tprivate readonly name: string,\n\t\tprivate readonly info: boolean\n\t) {}\n}\n\n@Entity('users', { info: true })\nexport class User {}\n\n@Entity('categories', { info: false })\nclass Category {}\n\n@Entity('tasks', { info: true })\nexport class Task {}\n\n@Entity('default', { info: true })\nexport default class Default {}\n\nconst u = new User();\nconst c = new Category();\nconst t = new Task();\n" ], - "mappings": "AAAA,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;CACpB,WAAW;EACV,iBAAiB,IAAI,EAAE,MAAM;EAC7B,iBAAiB,IAAI,EAAE,OAAO;GAC7B,CAAC,CAAC;AACL,CAAC;;AAED,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;MAC1B,OAAO,IAAI,CAAC,CAAC,CAAC;;AAEpB,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;MAChC,QAAQ,CAAC,CAAC,CAAC;;AAEjB,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;MAC1B,OAAO,IAAI,CAAC,CAAC,CAAC;;AAEpB,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;MAC5B,eAAe,OAAO,CAAC,CAAC,CAAC,CAAA;;AAE/B,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;AACrB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;AACzB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,AACrB" + "mappings": "AAAA,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;CACpB,WAAW;EACV,iBAAiB,IAAI,EAAE,MAAM;EAC7B,iBAAiB,IAAI,EAAE,OAAO;GAC7B,CAAC,CAAC;AACL,CAAC;;AAED,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAChC,MAAM,OAAO,IAAI,CAAC,CAAC,CAAC;;AAEpB,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;MAChC,QAAQ,CAAC,CAAC,CAAC;;AAEjB,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAChC,MAAM,OAAO,IAAI,CAAC,CAAC,CAAC;;AAEpB,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAClC,MAAM,eAAe,OAAO,CAAC,CAAC,CAAC,CAAA;;AAE/B,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;AACrB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;AACzB,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,AACrB" } \ No newline at end of file diff --git a/test/sourcemap-keywords.test.js b/test/sourcemap-keywords.test.js index e8e1e35c..3f24fe73 100644 --- a/test/sourcemap-keywords.test.js +++ b/test/sourcemap-keywords.test.js @@ -496,3 +496,31 @@ test.each([ ])('tokens map keywords after a node start for %s', (_name, source, words) => { expectExactKeywordMappings(source, words); }); + +test.each([ + ['decorator before export', `@dec export class K {}`], + ['decorator after export', `export @dec class K {}`], + ['decorator before export default', `@dec export default class {}`], + ['decorator after export default', `export default @dec class {}`] +])('`export` of a decorated class maps to its source position: %s', (_name, statement) => { + // a leading statement keeps the Program's own start mapping off the tested line + const source = `let a;\n${statement}`; + const { code, mappings } = mapped(source); + const segment = mappingAtSubstring(code, 'export', mappings); + expect(segment.slice(2)).toEqual([1, statement.indexOf('export')]); + // the printed decorator maps to itself, not to `export` + expect(sourcePositionsAt(code, '@dec', mappings)).toEqual([[1, statement.indexOf('@dec')]]); +}); + +test.each([ + ['decorator before export', `@dec /* c */ export /* c */ class K {}`, ['class']], + ['decorator after export', `export /* c */ @dec /* c */ class K {}`, ['class']], + [ + 'decorator before export default', + `@dec export /* c */ default /* c */ class {}`, + ['default', 'class'] + ], + ['decorated member', `class K { @dec /* c */ static /* c */ m() {} }`, ['static']] +])('tokens map the keywords of a decorated declaration: %s', (_name, source, words) => { + expectExactKeywordMappings(source, words); +}); From 6328546af3d50cc345b53fc26f7374c9c788e9c3 Mon Sep 17 00:00:00 2001 From: Leonidas <329182+leonidaz@users.noreply.github.com> Date: Thu, 24 Sep 2026 23:40:00 -0400 Subject: [PATCH 3/6] feat: map the parentheses of a catch clause from the tokens Deferred from the first version of this branch until #212 gave the catch clause its own visitor. Co-Authored-By: Claude Fable 5.1 --- src/languages/ts/index.js | 4 ++-- test/sourcemap-keywords.test.js | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/languages/ts/index.js b/src/languages/ts/index.js index a45d5c37..1e466859 100644 --- a/src/languages/ts/index.js +++ b/src/languages/ts/index.js @@ -1882,10 +1882,10 @@ export default (options = {}) => { token(context, 'catch', node); if (node.param) { - context.write('('); + write_at(context, '(', locate(node, '(', node.loc?.start, 'after')); track_binding(node.param); context.visit(node.param); - context.write(')'); + write_at(context, ')', locate(node, ')', node.body.loc?.start, 'before')); } context.write(' '); diff --git a/test/sourcemap-keywords.test.js b/test/sourcemap-keywords.test.js index 3f24fe73..dfd5cd64 100644 --- a/test/sourcemap-keywords.test.js +++ b/test/sourcemap-keywords.test.js @@ -299,6 +299,7 @@ test.each([ ['do-while statement', `do {} while /* before */ (condition /* after */);`, {}], ['with statement', `with /* before */ (object /* after */) {}`, { sourceType: 'script' }], ['switch statement', `switch /* before */ (value /* after */) { default: break; }`, {}], + ['catch clause', `try {} catch /* before */ (error /* after */) {}`, {}], ['import expression', `const module = import( /* before */ 'module' /* after */ );`, {}], ['external module reference', `import Alias = require( /* before */ 'module' /* after */ );`, {}], ['import type', `type Value = import( /* before */ 'module' /* after */ ).Value;`, {}] From f3c3bafa5cfa0116a49010e6b0bb7d5a48e84f48 Mon Sep 17 00:00:00 2001 From: Leonidas <329182+leonidaz@users.noreply.github.com> Date: Thu, 24 Sep 2026 23:47:16 -0400 Subject: [PATCH 4/6] test: restore the JSDoc detached from mappingsAtSubstring in the merge Co-Authored-By: Claude Fable 5.1 --- test/sourcemap-keywords.test.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/sourcemap-keywords.test.js b/test/sourcemap-keywords.test.js index dfd5cd64..807bd645 100644 --- a/test/sourcemap-keywords.test.js +++ b/test/sourcemap-keywords.test.js @@ -140,6 +140,11 @@ test.each([ } ); +/** + * @param {string} code + * @param {string} needle + * @param {[number, number, number, number][][]} mappings + */ function mappingsAtSubstring(code, needle, mappings) { const index = code.indexOf(needle); expect(index >= 0, `needle not in output: ${JSON.stringify(needle)}`).toBe(true); From 945a630a53332ea96d4df75de71d7e4a9ccfb5c7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 25 Sep 2026 09:33:22 -0400 Subject: [PATCH 5/6] update snapshots --- test/samples/ts-as-precedence/expected.ts.map | 2 +- test/samples/ts-non-null-chain-expressions/expected.ts.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/samples/ts-as-precedence/expected.ts.map b/test/samples/ts-as-precedence/expected.ts.map index 64ed7630..69b61a0d 100644 --- a/test/samples/ts-as-precedence/expected.ts.map +++ b/test/samples/ts-as-precedence/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "!(0 as number);\n-(0 as number);\n~(0 as number);\ntypeof (0 as any);\nvoid (0 as any);\n1 + (0 as number);\n2 * (0 as number);\n1 ** (0n as any);\n1 & (0 as number);\n(0 as number) ** 2;\n(0 as number) & 1;\n(0 as number) | 1;\n(0 as number) + 1;\n(0 as number)!;\na && (b as C);\n(a as C) && b;\n!(0 satisfies number);\n1 ** (0n satisfies any);\n1 + (0 satisfies number);\n(0 satisfies number)!;\n(w as any) = [1];\n(w satisfies any) += 1;\n(w) = 1;\n(Map as any)++;\n++(Map as any);\n(w satisfies any)--;\n--(w satisfies any);\n(w)++;\n++(w);\n((M.g as any))([1]);\n((fn?.method))();\nconst f1 = (M.g satisfies any);\nconst f2 = (M.g);\nconst f3 = (a ? b : c);\nconst f4 = (a || b);\n// prettier-ignore\nconst asserted = (x) ** y;\n\nconst tag = (x as T)`t`;\n\nasync function f() {\n\tawait (0 as any);\n\tawait (0 satisfies number);\n\t(await x)!;\n}\n" ], - "mappings": "AAAA,CAAC,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AACf,CAAC,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AACf,CAAC,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AACf,MAAM,CAAE,CAAA,CAAC,IAAI,GAAG,CAAA,AAAC,CAAC;AAClB,IAAI,CAAE,CAAA,CAAC,IAAI,GAAG,CAAA,AAAC,CAAC;AAChB,CAAC,GAAI,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AAClB,CAAC,GAAI,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AAClB,CAAC,IAAK,CAAA,EAAE,IAAI,GAAG,CAAA,AAAC,CAAC;AACjB,CAAC,GAAI,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AAClB,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,IAAK,CAAC,CAAC;AACnB,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,GAAI,CAAC,CAAC;AAClB,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,GAAI,CAAC,CAAC;AAClB,AAAC,CAAC,IAAI,MAAM,GAAI,CAAC,CAAC;AAClB,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,CAAE,CAAC;AACf,CAAC,IAAK,CAAC,IAAI,CAAC,AAAC,CAAC;AACd,AAAC,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;AACd,CAAC,AAAC,CAAA,CAAC,WAAW,MAAM,CAAA,AAAC,CAAC;AACtB,CAAC,IAAK,CAAA,EAAE,WAAW,GAAG,CAAA,AAAC,CAAC;AACxB,CAAC,GAAI,CAAA,CAAC,WAAW,MAAM,CAAA,AAAC,CAAC;AACzB,AAAC,CAAA,CAAC,WAAW,MAAM,CAAA,CAAE,CAAC;AACtB,AAAC,CAAA,CAAC,IAAI,GAAG,CAAA,GAAI,CAAC,CAAC,CAAC,CAAC;AACjB,AAAC,CAAA,CAAC,WAAW,GAAG,CAAA,IAAK,CAAC,CAAC;AACvB,AAAC,CAAA,CAAC,GAAG,CAAC,CAAC,CAAA,GAAI,CAAC,CAAC;AACb,AAAC,CAAA,GAAG,IAAI,GAAG,CAAA,EAAG,CAAC;AACf,EAAG,CAAA,GAAG,IAAI,GAAG,CAAA,AAAC,CAAC;AACf,AAAC,CAAA,CAAC,WAAW,GAAG,CAAA,EAAG,CAAC;AACpB,EAAG,CAAA,CAAC,WAAW,GAAG,CAAA,AAAC,CAAC;AACpB,AAAC,CAAA,CAAC,GAAG,CAAC,CAAC,CAAA,EAAG,CAAC;AACX,EAAG,CAAA,CAAC,GAAG,CAAC,CAAC,CAAA,AAAC,CAAC;AACX,AAAC,CAAA,AAAC,CAAA,CAAC,CAAC,CAAC,IAAI,GAAG,CAAA,AAAC,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,AAAC,CAAA,AAAC,CAAA,EAAE,EAAE,MAAM,CAAA,AAAC,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC;;AACpB,KAAK,CAAC,EAAE,GAAG,AAAC,CAAA,CAAC,CAAC,CAAC,WAAW,GAAG,CAAA,AAAC,CAAC,GAAG,CAAC,CAAC;AACpC,KAAK,CAAC,EAAE,GAAG,AAAC,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,AAAC,CAAC,GAAG,CAAC,CAAC;AAC3B,KAAK,CAAC,EAAE,GAAG,AAAC,CAAA,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA,AAAC,CAAC,GAAG,CAAC,CAAC;AAC5B,KAAK,CAAC,EAAE,GAAG,AAAC,CAAA,CAAC,IAAI,CAAC,CAAA,AAAC,CAAC,GAAG,CAAC,CAAC;;;AAEzB,KAAK,CAAC,QAAQ,GAAG,AAAC,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,IAAK,CAAC,CAAC;;AAE7B,KAAK,CAAC,GAAG,GAAG,AAAC,CAAA,CAAC,IAAI,CAAC,CAAA,AAAC,GAAG,CAAC;;AAExB,eAAe,CAAC,GAAG,CAAC;CACnB,KAAK,CAAE,CAAA,CAAC,IAAI,GAAG,CAAA,AAAC,CAAC;CACjB,KAAK,CAAE,CAAA,CAAC,WAAW,MAAM,CAAA,AAAC,CAAC;CAC3B,AAAC,CAAA,KAAK,CAAC,CAAC,CAAA,CAAE,CAAC;AACZ,CAAC,AACD" + "mappings": "AAAA,CAAC,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AACf,CAAC,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AACf,CAAC,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AACf,MAAM,CAAE,CAAA,CAAC,IAAI,GAAG,CAAA,AAAC,CAAC;AAClB,IAAI,CAAE,CAAA,CAAC,IAAI,GAAG,CAAA,AAAC,CAAC;AAChB,CAAC,GAAI,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AAClB,CAAC,GAAI,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AAClB,CAAC,IAAK,CAAA,EAAE,IAAI,GAAG,CAAA,AAAC,CAAC;AACjB,CAAC,GAAI,CAAA,CAAC,IAAI,MAAM,CAAA,AAAC,CAAC;AAClB,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,IAAK,CAAC,CAAC;AACnB,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,GAAI,CAAC,CAAC;AAClB,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,GAAI,CAAC,CAAC;AAClB,AAAC,CAAC,IAAI,MAAM,GAAI,CAAC,CAAC;AAClB,AAAC,CAAA,CAAC,IAAI,MAAM,CAAA,CAAE,CAAC;AACf,CAAC,IAAK,CAAC,IAAI,CAAC,AAAC,CAAC;AACd,AAAC,CAAC,IAAI,CAAC,IAAK,CAAC,CAAC;AACd,CAAC,AAAC,CAAA,CAAC,WAAW,MAAM,CAAA,AAAC,CAAC;AACtB,CAAC,IAAK,CAAA,EAAE,WAAW,GAAG,CAAA,AAAC,CAAC;AACxB,CAAC,GAAI,CAAA,CAAC,WAAW,MAAM,CAAA,AAAC,CAAC;AACzB,AAAC,CAAA,CAAC,WAAW,MAAM,CAAA,CAAE,CAAC;AACtB,AAAC,CAAA,CAAC,IAAI,GAAG,CAAA,GAAI,CAAC,CAAC,CAAC,CAAC;AACjB,AAAC,CAAA,CAAC,WAAW,GAAG,CAAA,IAAK,CAAC,CAAC;AACvB,AAAC,CAAA,CAAC,GAAG,CAAC,CAAC,CAAA,GAAI,CAAC,CAAC;AACb,AAAC,CAAA,GAAG,IAAI,GAAG,CAAA,EAAG,CAAC;AACf,EAAG,CAAA,GAAG,IAAI,GAAG,CAAA,AAAC,CAAC;AACf,AAAC,CAAA,CAAC,WAAW,GAAG,CAAA,EAAG,CAAC;AACpB,EAAG,CAAA,CAAC,WAAW,GAAG,CAAA,AAAC,CAAC;AACpB,AAAC,CAAA,CAAC,GAAG,CAAC,CAAC,CAAA,EAAG,CAAC;AACX,EAAG,CAAA,CAAC,GAAG,CAAC,CAAC,CAAA,AAAC,CAAC;AACX,AAAC,CAAA,AAAC,CAAA,CAAC,CAAC,CAAC,IAAI,GAAG,CAAA,AAAC,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,AAAC,CAAA,AAAC,CAAA,EAAE,EAAE,MAAM,CAAA,AAAC,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC,CAAC;;AACpB,KAAK,CAAC,EAAE,GAAG,AAAC,CAAA,CAAC,CAAC,CAAC,WAAW,GAAG,CAAA,AAAC,CAAC,GAAG,CAAC,CAAC;AACpC,KAAK,CAAC,EAAE,GAAG,AAAC,CAAA,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA,AAAC,CAAC,GAAG,CAAC,CAAC;AAC3B,KAAK,CAAC,EAAE,GAAG,AAAC,CAAA,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA,AAAC,CAAC,GAAG,CAAC,CAAC;AAC5B,KAAK,CAAC,EAAE,GAAG,AAAC,CAAA,CAAC,IAAI,CAAC,CAAA,AAAC,CAAC,GAAG,CAAC,CAAC;;;AAEzB,KAAK,CAAC,QAAQ,GAAG,AAAC,CAAA,CAAC,CAAC,CAAC,CAAC,CAAA,IAAK,CAAC,CAAC;;AAE7B,KAAK,CAAC,GAAG,GAAG,AAAC,CAAA,CAAC,IAAI,CAAC,CAAA,AAAC,GAAG,CAAC;;AAExB,eAAe,CAAC,GAAG,CAAC;CACnB,KAAK,CAAE,CAAA,CAAC,IAAI,GAAG,CAAA,AAAC,CAAC;CACjB,KAAK,CAAE,CAAA,CAAC,WAAW,MAAM,CAAA,AAAC,CAAC;CAC3B,AAAC,CAAA,KAAK,CAAC,CAAC,CAAA,CAAE,CAAC;AACZ,CAAC,AACD" } \ No newline at end of file diff --git a/test/samples/ts-non-null-chain-expressions/expected.ts.map b/test/samples/ts-non-null-chain-expressions/expected.ts.map index 961eea47..c595cddf 100644 --- a/test/samples/ts-non-null-chain-expressions/expected.ts.map +++ b/test/samples/ts-non-null-chain-expressions/expected.ts.map @@ -7,5 +7,5 @@ "sourcesContent": [ "x?.a!.b;\n(x?.a)!.b;\nx?.a!();\n(x?.a)!();\nx?.a![key];\n(x?.a)![key];\nx?.a!!.b;\n" ], - "mappings": "AAAA,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACR,AAAC,CAAA,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AACV,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACR,AAAC,CAAA,CAAC,EAAE,CAAC,CAAA,CAAE,EAAE,CAAC;AACV,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACX,AAAC,CAAA,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,CAAC,CAAC;AACb,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,AACT" + "mappings": "AAAA,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACR,AAAC,CAAA,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AACV,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACR,AAAC,CAAA,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,CAAC,CAAC;AACV,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACX,AAAC,CAAA,CAAC,EAAE,CAAC,CAAA,CAAE,CAAC,GAAG,CAAC,CAAC;AACb,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,AACT" } \ No newline at end of file From a4d5642a56f4f4e57fa195e2f002c00ecce7f073 Mon Sep 17 00:00:00 2001 From: Leonidas <329182+leonidaz@users.noreply.github.com> Date: Fri, 25 Sep 2026 18:37:45 -0400 Subject: [PATCH 6/6] feat: map the braces of an empty type-only import from the tokens #219 prints `import type {} from` as one string; route its keyword and braces through the lookups like the non-empty form. Also mention keywords in the `tokens` option's documentation. Co-Authored-By: Claude Fable 5.1 (cherry picked from commit f573c055666c07224f7666c2fb4a157d63d510de) --- src/languages/ts/index.js | 8 +++++++- src/languages/types.ts | 10 ++++++---- test/sourcemap-keywords.test.js | 2 ++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/languages/ts/index.js b/src/languages/ts/index.js index 162604f1..1c60cc7a 100644 --- a/src/languages/ts/index.js +++ b/src/languages/ts/index.js @@ -1488,7 +1488,13 @@ export default (options = {}) => { context.write(' '); if (node.specifiers.length === 0) { - if (node.importKind === 'type') context.write('type {} from '); + if (node.importKind === 'type') { + write_keyword(context, node, 'type'); + context.write(' '); + write_at(context, '{', locate(node, '{', node.loc?.start, 'after')); + write_at(context, '}', locate(node, '}', node.source.loc?.start, 'before')); + context.write(' from '); + } context.visit(node.source); write_import_attributes(context, node); context.write(';'); diff --git a/src/languages/types.ts b/src/languages/types.ts index 7eceba78..1c62f796 100644 --- a/src/languages/types.ts +++ b/src/languages/types.ts @@ -5,10 +5,12 @@ export type TSOptions = { comments?: Comment[]; /** * The parser's tokens, with locations — Acorn's `onToken` array, Babel's - * `tokens`, or an ESLint-style `ast.tokens`. Used to map delimiters that - * sit inside a node (the brackets of a computed key, the parentheses of a - * call or an `if`, the braces of an import list), which no node boundary - * locates. Without it those delimiters are left unmapped. + * `tokens`, or an ESLint-style `ast.tokens`. Used to map what sits inside + * a node and no node boundary locates: the brackets of a computed key, the + * parentheses of a call or an `if`, the braces of an import list, and the + * keywords after a node's first token (`function` after `async`, `else`, + * `finally`, a class member's second modifier). Without it those are left + * unmapped. */ tokens?: readonly SourceToken[]; getLeadingComments?: (node: BaseNode) => BaseComment[] | undefined; diff --git a/test/sourcemap-keywords.test.js b/test/sourcemap-keywords.test.js index 807bd645..eb1a8971 100644 --- a/test/sourcemap-keywords.test.js +++ b/test/sourcemap-keywords.test.js @@ -316,6 +316,7 @@ test.each([ test.each([ ['named import', `import { /* before */ value /* after */ } from 'module';`], + ['empty type-only import', `import type /* before */ { /* inside */ } from 'module';`], ['named export', `const value = 1;\nexport { /* before */ value /* after */ };`], ['empty named export', `export { /* inside */ };`], ['import attributes', `import value from 'module' with { type: 'json' };`], @@ -473,6 +474,7 @@ test.each([ ], ['for in', `for (const k /* c */ in o) {}`, ['in']], ['import type', `import /* c */ type { T } from 'm';`, ['type']], + ['empty import type', `import /* c */ type {} from 'm';`, ['type']], ['import type specifier', `import { type /* c */ T, a as /* c */ b } from 'm';`, ['type', 'as']], ['export type', `type T = 1;\nexport /* c */ type { T };`, ['type']], ['export star as', `export * as /* c */ ns from 'm';`, ['as']],