From 55884c89c8f75f273d7910ea0f1dea570944312b Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Thu, 6 Oct 2022 06:16:01 +0800 Subject: [PATCH] feat --- packages/babel-generator/src/buffer.ts | 12 +++--------- .../babel-generator/src/generators/methods.ts | 19 +++++++++++++++---- .../babel-generator/src/generators/types.ts | 8 +++++++- packages/babel-generator/src/printer.ts | 7 +++++++ .../sourcemaps/call-identifiers/output.js | 2 +- .../real-world-babel-file1/source-map.json | 2 +- .../real-world-babel-file2/source-map.json | 2 +- 7 files changed, 35 insertions(+), 17 deletions(-) diff --git a/packages/babel-generator/src/buffer.ts b/packages/babel-generator/src/buffer.ts index 219a814092c4..319d50b29574 100644 --- a/packages/babel-generator/src/buffer.ts +++ b/packages/babel-generator/src/buffer.ts @@ -8,13 +8,12 @@ export type Pos = { export type Loc = { start?: Pos; end?: Pos; - identifierName?: string; filename?: string; }; type SourcePos = { - identifierName: string | undefined; line: number | undefined; column: number | undefined; + identifierName: string | undefined; filename: string | undefined; }; @@ -23,7 +22,7 @@ type QueueItem = { repeat: number; line: number | undefined; column: number | undefined; - identifierName: string | undefined; + identifierName: undefined; // Not used, it always undefined. filename: string | undefined; }; @@ -73,7 +72,6 @@ export default class Buffer { repeat: number, line: number | undefined, column: number | undefined, - identifierName: string | undefined, filename: string | undefined, ) { const cursor = this._queueCursor; @@ -85,7 +83,6 @@ export default class Buffer { item.repeat = repeat; item.line = line; item.column = column; - item.identifierName = identifierName; item.filename = filename; this._queueCursor++; @@ -173,7 +170,6 @@ export default class Buffer { 1, sourcePosition.line, sourcePosition.column, - sourcePosition.identifierName, sourcePosition.filename, ); } @@ -182,7 +178,7 @@ export default class Buffer { * Same as queue, but this indentation will never have a sourcmap marker. */ queueIndentation(char: number, repeat: number): void { - this._pushQueue(char, repeat, undefined, undefined, undefined, undefined); + this._pushQueue(char, repeat, undefined, undefined, undefined); } _flush(): void { @@ -408,8 +404,6 @@ export default class Buffer { const pos = loc[prop]; const target = this._sourcePosition; - target.identifierName = - (prop === "start" && loc.identifierName) || undefined; if (pos) { target.line = pos.line + lineOffset; target.column = pos.column + columnOffset; diff --git a/packages/babel-generator/src/generators/methods.ts b/packages/babel-generator/src/generators/methods.ts index 51bcdadcfae5..3a310b389233 100644 --- a/packages/babel-generator/src/generators/methods.ts +++ b/packages/babel-generator/src/generators/methods.ts @@ -5,9 +5,18 @@ import type * as t from "@babel/types"; export function _params( this: Printer, node: t.Function | t.TSDeclareMethod | t.TSDeclareFunction, + id: t.Expression | t.PrivateName, ) { this.print(node.typeParameters, node); - this.token("("); + if (isIdentifier(id)) { + // @ts-expect-error Undocumented property identifierName + this.withIdentifierName(id.loc?.identifierName || id.name, () => { + this.token("("); + }); + } else { + this.token("("); + } + this._parameters(node.params, node); this.token(")"); @@ -104,7 +113,7 @@ export function _methodHead(this: Printer, node: t.Method | t.TSDeclareMethod) { this.token("?"); } - this._params(node); + this._params(node, key); } export function _predicate( @@ -138,9 +147,11 @@ export function _functionHead( this.space(); if (node.id) { this.print(node.id, node); + this._params(node, node.id); + } else { + this._params(node, undefined); } - this._params(node); if (node.type !== "TSDeclareFunction") { this._predicate(node); } @@ -178,7 +189,7 @@ export function ArrowFunctionExpression( ) { this.print(firstParam, node); } else { - this._params(node); + this._params(node, undefined); } this._predicate(node); diff --git a/packages/babel-generator/src/generators/types.ts b/packages/babel-generator/src/generators/types.ts index 54f0418292d4..3b7eb8963cbb 100644 --- a/packages/babel-generator/src/generators/types.ts +++ b/packages/babel-generator/src/generators/types.ts @@ -4,7 +4,13 @@ import type * as t from "@babel/types"; import jsesc from "jsesc"; export function Identifier(this: Printer, node: t.Identifier) { - this.word(node.name); + this.withIdentifierName( + // @ts-expect-error Undocumented property identifierName + node.loc?.identifierName || node.name, + () => { + this.word(node.name); + }, + ); } export function ArgumentPlaceholder(this: Printer) { diff --git a/packages/babel-generator/src/printer.ts b/packages/babel-generator/src/printer.ts index c7fff0844ce6..96f8643eb504 100644 --- a/packages/babel-generator/src/printer.ts +++ b/packages/babel-generator/src/printer.ts @@ -323,6 +323,13 @@ class Printer { this._buf.withSource(prop, loc, cb); } + withIdentifierName(identifierName: string, cb: () => void): void { + const pos = this._buf._sourcePosition; + pos.identifierName = identifierName; + cb(); + pos.identifierName = undefined; + } + _space(): void { this._queue(charCodes.space); } diff --git a/packages/babel-generator/test/fixtures/sourcemaps/call-identifiers/output.js b/packages/babel-generator/test/fixtures/sourcemaps/call-identifiers/output.js index 2aa2d3b2b022..f913bd9810df 100644 --- a/packages/babel-generator/test/fixtures/sourcemaps/call-identifiers/output.js +++ b/packages/babel-generator/test/fixtures/sourcemaps/call-identifiers/output.js @@ -13,4 +13,4 @@ obj.foo().bar; obj.foo(); obj.foo.bar; obj.foo().bar; -} +} \ No newline at end of file diff --git a/packages/babel-generator/test/fixtures/sourcemaps/real-world-babel-file1/source-map.json b/packages/babel-generator/test/fixtures/sourcemaps/real-world-babel-file1/source-map.json index 541ebd4329e8..31b88ee43ecd 100644 --- a/packages/babel-generator/test/fixtures/sourcemaps/real-world-babel-file1/source-map.json +++ b/packages/babel-generator/test/fixtures/sourcemaps/real-world-babel-file1/source-map.json @@ -74,5 +74,5 @@ "sourcesContent": [ "// From packages\\babel-cli\\src\\babel\\watcher.ts\n\nimport { createRequire } from \"module\";\nimport path from \"path\";\nimport type { WatchOptions, FSWatcher } from \"chokidar\";\n\nconst fileToDeps = new Map>();\nconst depToFiles = new Map>();\n\nlet isWatchMode = false;\nlet watcher: FSWatcher;\nconst watchQueue = new Set();\nlet hasStarted = false;\n\nexport function enable({ enableGlobbing }: { enableGlobbing: boolean }) {\n isWatchMode = true;\n\n const { FSWatcher } = requireChokidar();\n\n const options: WatchOptions = {\n disableGlobbing: !enableGlobbing,\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 50,\n pollInterval: 10,\n },\n };\n watcher = new FSWatcher(options);\n\n watcher.on(\"unlink\", unwatchFile);\n}\n\nexport function startWatcher() {\n hasStarted = true;\n\n for (const dep of watchQueue) {\n watcher.add(dep);\n }\n watchQueue.clear();\n\n watcher.on(\"ready\", () => {\n console.log(\"The watcher is ready.\");\n });\n}\n\nexport function watch(filename: string): void {\n if (!isWatchMode) {\n throw new Error(\n \"Internal Babel error: .watch called when not in watch mode.\",\n );\n }\n\n if (!hasStarted) {\n watchQueue.add(path.resolve(filename));\n } else {\n watcher.add(path.resolve(filename));\n }\n}\n\n/**\n * Call @param callback whenever a dependency (source file)/\n * external dependency (non-source file) changes.\n *\n * Handles mapping external dependencies to their corresponding\n * dependencies.\n */\nexport function onFilesChange(\n callback: (filenames: string[], event: string, cause: string) => void,\n): void {\n if (!isWatchMode) {\n throw new Error(\n \"Internal Babel error: .onFilesChange called when not in watch mode.\",\n );\n }\n\n watcher.on(\"all\", (event, filename) => {\n if (event !== \"change\" && event !== \"add\") return;\n\n const absoluteFile = path.resolve(filename);\n callback(\n [absoluteFile, ...(depToFiles.get(absoluteFile) ?? [])],\n event,\n absoluteFile,\n );\n });\n}\n\nexport function updateExternalDependencies(\n filename: string,\n dependencies: Set,\n) {\n if (!isWatchMode) return;\n\n // Use absolute paths\n const absFilename = path.resolve(filename);\n const absDependencies = new Set(\n Array.from(dependencies, dep => path.resolve(dep)),\n );\n\n const deps = fileToDeps.get(absFilename);\n if (deps) {\n for (const dep of deps) {\n if (!absDependencies.has(dep)) {\n removeFileDependency(absFilename, dep);\n }\n }\n }\n for (const dep of absDependencies) {\n let deps = depToFiles.get(dep);\n if (!deps) {\n depToFiles.set(dep, (deps = new Set()));\n\n if (!hasStarted) {\n watchQueue.add(dep);\n } else {\n watcher.add(dep);\n }\n }\n\n deps.add(absFilename);\n }\n\n fileToDeps.set(absFilename, absDependencies);\n}\n\nfunction removeFileDependency(filename: string, dep: string) {\n const deps = depToFiles.get(dep) as Set;\n deps.delete(filename);\n\n if (deps.size === 0) {\n depToFiles.delete(dep);\n\n if (!hasStarted) {\n watchQueue.delete(dep);\n } else {\n watcher.unwatch(dep);\n }\n }\n}\n\nfunction unwatchFile(filename: string) {\n const deps = fileToDeps.get(filename);\n if (!deps) return;\n\n for (const dep of deps) {\n removeFileDependency(filename, dep);\n }\n fileToDeps.delete(filename);\n}\n\nfunction requireChokidar(): any {\n const require = createRequire(import.meta.url);\n\n try {\n return process.env.BABEL_8_BREAKING\n ? require(\"chokidar\")\n : parseInt(process.versions.node) >= 8\n ? require(\"chokidar\")\n : require(\"@nicolo-ribaudo/chokidar-2\");\n } catch (err) {\n console.error(\n \"The optional dependency chokidar failed to install and is required for \" +\n \"--watch. Chokidar is likely not supported on your platform.\",\n );\n throw err;\n }\n}" ], - "mappings": "AAAA;AAEA,SAASA,aAAa,QAAQ,QAAQ;AACtC,OAAOC,IAAI,MAAM,MAAM;AACvB,cAAcC,YAAY,EAAEC,SAAS,QAAQ,UAAU;AAEvD,MAAMC,UAAU,GAAG,IAAIC,GAAG,CAAC,MAAM,EAAEC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE;AACjD,MAAMC,UAAU,GAAG,IAAIF,GAAG,CAAC,MAAM,EAAEC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE;AAEjD,IAAIE,WAAW,GAAG,KAAK;AACvB,IAAIC,OAAO,EAAEN,SAAS;AACtB,MAAMO,UAAU,GAAG,IAAIJ,GAAG,CAAC,MAAM,CAAC,EAAE;AACpC,IAAIK,UAAU,GAAG,KAAK;AAEtB,OAAO,SAASC,MAAM,CAAC;EAAEC;AAA4C,CAA5B,EAAE;EAAEA,cAAc,EAAE,OAAO;AAAC,CAAC,EAAE;EACtEL,WAAW,GAAG,IAAI;EAElB,MAAM;IAAEL;EAAU,CAAC,GAAGW,eAAe,EAAE;EAEvC,MAAMC,OAAO,EAAEb,YAAY,GAAG;IAC5Bc,eAAe,EAAE,CAACH,cAAc;IAChCI,UAAU,EAAE,IAAI;IAChBC,aAAa,EAAE,IAAI;IACnBC,gBAAgB,EAAE;MAChBC,kBAAkB,EAAE,EAAE;MACtBC,YAAY,EAAE;IAChB;EACF,CAAC;EACDZ,OAAO,GAAG,IAAIN,SAAS,CAACY,OAAO,CAAC;EAEhCN,OAAO,CAACa,EAAE,CAAC,QAAQ,EAAEC,WAAW,CAAC;AACnC;AAEA,OAAO,SAASC,YAAY,GAAG;EAC7Bb,UAAU,GAAG,IAAI;;EAEjB,KAAK,MAAMc,GAAG,IAAIf,UAAU,EAAE;IAC5BD,OAAO,CAACiB,GAAG,CAACD,GAAG,CAAC;EAClB;;EACAf,UAAU,CAACiB,KAAK,EAAE;EAElBlB,OAAO,CAACa,EAAE,CAAC,OAAO,EAAE,MAAM;IACxBM,OAAO,CAACC,GAAG,CAAC,uBAAuB,CAAC;EACtC,CAAC,CAAC;AACJ;AAEA,OAAO,SAASC,KAAK,CAACC,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC;EAC5C,IAAI,CAACvB,WAAW,EAAE;IAChB,MAAM,IAAIwB,KAAK,CACb,6DAA6D,CAC9D;EACH;;EAEA,IAAI,CAACrB,UAAU,EAAE;IACfD,UAAU,CAACgB,GAAG,CAACzB,IAAI,CAACgC,OAAO,CAACF,QAAQ,CAAC,CAAC;EACxC,CAAC,MAAM;IACLtB,OAAO,CAACiB,GAAG,CAACzB,IAAI,CAACgC,OAAO,CAACF,QAAQ,CAAC,CAAC;EACrC;AACF;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASG,aAAa,CAC3BC,QAAQ,EAAE,CAACC,SAAS,EAAE,MAAM,EAAE,EAAEC,KAAK,EAAE,MAAM,EAAEC,KAAK,EAAE,MAAM,KAAK,IAAI,CACtE,EAAE,IAAI,CAAC;EACN,IAAI,CAAC9B,WAAW,EAAE;IAChB,MAAM,IAAIwB,KAAK,CACb,qEAAqE,CACtE;EACH;;EAEAvB,OAAO,CAACa,EAAE,CAAC,KAAK,EAAE,CAACe,KAAK,EAAEN,QAAQ,KAAK;IACrC,IAAIM,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,KAAK,EAAE;IAE3C,MAAME,YAAY,GAAGtC,IAAI,CAACgC,OAAO,CAACF,QAAQ,CAAC;IAC3CI,QAAQ,CACN,CAACI,YAAY,EAAE,IAAIhC,UAAU,CAACiC,GAAG,CAACD,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EACvDF,KAAK,EACLE,YAAY,CACb;EACH,CAAC,CAAC;AACJ;AAEA,OAAO,SAASE,0BAA0B,CACxCV,QAAQ,EAAE,MAAM,EAChBW,YAAY,EAAEpC,GAAG,CAAC,MAAM,CAAC,EACzB;EACA,IAAI,CAACE,WAAW,EAAE,OAAO,CAEzB;;EACA,MAAMmC,WAAW,GAAG1C,IAAI,CAACgC,OAAO,CAACF,QAAQ,CAAC;EAC1C,MAAMa,eAAe,GAAG,IAAItC,GAAG,CAC7BuC,KAAK,CAACC,IAAI,CAACJ,YAAY,EAAEjB,GAAG,IAAIxB,IAAI,CAACgC,OAAO,CAACR,GAAG,CAAC,CAAC,CACnD;EAED,MAAMsB,IAAI,GAAG3C,UAAU,CAACoC,GAAG,CAACG,WAAW,CAAC;;EACxC,IAAII,IAAI,EAAE;IACR,KAAK,MAAMtB,GAAG,IAAIsB,IAAI,EAAE;MACtB,IAAI,CAACH,eAAe,CAACI,GAAG,CAACvB,GAAG,CAAC,EAAE;QAC7BwB,oBAAoB,CAACN,WAAW,EAAElB,GAAG,CAAC;MACxC;IACF;EACF;;EACA,KAAK,MAAMA,GAAG,IAAImB,eAAe,EAAE;IACjC,IAAIG,IAAI,GAAGxC,UAAU,CAACiC,GAAG,CAACf,GAAG,CAAC;;IAC9B,IAAI,CAACsB,IAAI,EAAE;MACTxC,UAAU,CAAC2C,GAAG,CAACzB,GAAG,EAAGsB,IAAI,GAAG,IAAIzC,GAAG,EAAE,CAAE;;MAEvC,IAAI,CAACK,UAAU,EAAE;QACfD,UAAU,CAACgB,GAAG,CAACD,GAAG,CAAC;MACrB,CAAC,MAAM;QACLhB,OAAO,CAACiB,GAAG,CAACD,GAAG,CAAC;MAClB;IACF;;IAEAsB,IAAI,CAACrB,GAAG,CAACiB,WAAW,CAAC;EACvB;;EAEAvC,UAAU,CAAC8C,GAAG,CAACP,WAAW,EAAEC,eAAe,CAAC;AAC9C;;AAEA,SAASK,oBAAoB,CAAClB,QAAQ,EAAE,MAAM,EAAEN,GAAG,EAAE,MAAM,EAAE;EAC3D,MAAMsB,IAAI,IAAGxC,UAAU,CAACiC,GAAG,CAACf,GAAG,CAAC,IAAInB,GAAG,CAAC,MAAM,CAAC;EAC/CyC,IAAI,CAACI,MAAM,CAACpB,QAAQ,CAAC;;EAErB,IAAIgB,IAAI,CAACK,IAAI,KAAK,CAAC,EAAE;IACnB7C,UAAU,CAAC4C,MAAM,CAAC1B,GAAG,CAAC;;IAEtB,IAAI,CAACd,UAAU,EAAE;MACfD,UAAU,CAACyC,MAAM,CAAC1B,GAAG,CAAC;IACxB,CAAC,MAAM;MACLhB,OAAO,CAAC4C,OAAO,CAAC5B,GAAG,CAAC;IACtB;EACF;AACF;;AAEA,SAASF,WAAW,CAACQ,QAAQ,EAAE,MAAM,EAAE;EACrC,MAAMgB,IAAI,GAAG3C,UAAU,CAACoC,GAAG,CAACT,QAAQ,CAAC;EACrC,IAAI,CAACgB,IAAI,EAAE;;EAEX,KAAK,MAAMtB,GAAG,IAAIsB,IAAI,EAAE;IACtBE,oBAAoB,CAAClB,QAAQ,EAAEN,GAAG,CAAC;EACrC;;EACArB,UAAU,CAAC+C,MAAM,CAACpB,QAAQ,CAAC;AAC7B;;AAEA,SAASjB,eAAe,EAAE,EAAE,GAAG,CAAC;EAC9B,MAAMwC,OAAO,GAAGtD,aAAa,CAACuD,MAAM,CAACC,IAAI,CAACC,GAAG,CAAC;;EAE9C,IAAI;IACF,OAAOC,OAAO,CAACC,GAAG,CAACC,gBAAgB,GAC/BN,OAAO,CAAC,UAAU,CAAC,GACnBO,QAAQ,CAACH,OAAO,CAACI,QAAQ,CAACC,IAAI,CAAC,IAAI,CAAC,GACpCT,OAAO,CAAC,UAAU,CAAC,GACnBA,OAAO,CAAC,4BAA4B,CAAC;EAC3C,CAAC,CAAC,OAAOU,GAAG,EAAE;IACZpC,OAAO,CAACqC,KAAK,CACX,yEAAyE,GACvE,6DAA6D,CAChE;IACD,MAAMD,GAAG;EACX;AACF" + "mappings": "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" } \ No newline at end of file diff --git a/packages/babel-generator/test/fixtures/sourcemaps/real-world-babel-file2/source-map.json b/packages/babel-generator/test/fixtures/sourcemaps/real-world-babel-file2/source-map.json index 7922c3144eaa..88bca4ef8ebb 100644 --- a/packages/babel-generator/test/fixtures/sourcemaps/real-world-babel-file2/source-map.json +++ b/packages/babel-generator/test/fixtures/sourcemaps/real-world-babel-file2/source-map.json @@ -253,5 +253,5 @@ "sourcesContent": [ "// From packages\\babel-generator\\src\\printer.ts\n\nimport Buffer from \"./buffer\";\nimport type { Loc } from \"./buffer\";\nimport * as n from \"./node\";\nimport type * as t from \"@babel/types\";\nimport type {\n RecordAndTuplePluginOptions,\n PipelineOperatorPluginOptions,\n} from \"@babel/parser\";\nimport type { Opts as jsescOptions } from \"jsesc\";\n\nimport * as generatorFunctions from \"./generators\";\nimport type SourceMap from \"./source-map\";\nimport * as charCodes from \"charcodes\";\n\nconst SCIENTIFIC_NOTATION = /e/i;\nconst ZERO_DECIMAL_INTEGER = /\\.0+$/;\nconst NON_DECIMAL_LITERAL = /^0[box]/;\nconst PURE_ANNOTATION_RE = /^\\s*[@#]__PURE__\\s*$/;\n\nconst { needsParens, needsWhitespaceAfter, needsWhitespaceBefore } = n;\n\nexport type Format = {\n shouldPrintComment: (comment: string) => boolean;\n retainLines: boolean;\n retainFunctionParens: boolean;\n comments: boolean;\n auxiliaryCommentBefore: string;\n auxiliaryCommentAfter: string;\n compact: boolean | \"auto\";\n minified: boolean;\n concise: boolean;\n indent: {\n adjustMultilineComment: boolean;\n style: string;\n };\n recordAndTupleSyntaxType: RecordAndTuplePluginOptions[\"syntaxType\"];\n jsescOption: jsescOptions;\n jsonCompatibleStrings?: boolean;\n /**\n * For use with the Hack-style pipe operator.\n * Changes what token is used for pipe bodies’ topic references.\n */\n topicToken?: PipelineOperatorPluginOptions[\"topicToken\"];\n /**\n * @deprecated Removed in Babel 8\n */\n decoratorsBeforeExport?: boolean;\n};\n\ninterface AddNewlinesOptions {\n addNewlines(leading: boolean, node: t.Node): number;\n}\n\ninterface PrintSequenceOptions extends Partial {\n statement?: boolean;\n indent?: boolean;\n}\n\ninterface PrintListOptions {\n separator?: (this: Printer) => void;\n statement?: boolean;\n indent?: boolean;\n}\n\ntype PrintJoinOptions = PrintListOptions &\n PrintSequenceOptions & {\n iterator?: (node: t.Node, index: number) => void;\n };\nclass Printer {\n constructor(format: Format, map: SourceMap) {\n this.format = format;\n this._buf = new Buffer(map);\n\n this._indentChar = format.indent.style.charCodeAt(0);\n this._indentRepeat = format.indent.style.length;\n }\n\n declare format: Format;\n inForStatementInitCounter: number = 0;\n\n declare _buf: Buffer;\n _printStack: Array = [];\n _indent: number = 0;\n _indentChar: number = 0;\n _indentRepeat: number = 0;\n _insideAux: boolean = false;\n _parenPushNewlineState: { printed: boolean } | null = null;\n _noLineTerminator: boolean = false;\n _printAuxAfterOnNextUserNode: boolean = false;\n _printedComments = new Set();\n _endsWithInteger = false;\n _endsWithWord = false;\n\n generate(ast: t.Node) {\n this.print(ast);\n this._maybeAddAuxComment();\n\n return this._buf.get();\n }\n\n /**\n * Increment indent size.\n */\n\n indent(): void {\n if (this.format.compact || this.format.concise) return;\n\n this._indent++;\n }\n\n /**\n * Decrement indent size.\n */\n\n dedent(): void {\n if (this.format.compact || this.format.concise) return;\n\n this._indent--;\n }\n\n /**\n * Add a semicolon to the buffer.\n */\n\n semicolon(force: boolean = false): void {\n this._maybeAddAuxComment();\n if (force) {\n this._appendChar(charCodes.semicolon);\n } else {\n this._queue(charCodes.semicolon);\n }\n }\n\n /**\n * Add a right brace to the buffer.\n */\n\n rightBrace(): void {\n if (this.format.minified) {\n this._buf.removeLastSemicolon();\n }\n this.token(\"}\");\n }\n\n /**\n * Add a space to the buffer unless it is compact.\n */\n\n space(force: boolean = false): void {\n if (this.format.compact) return;\n\n if (force) {\n this._space();\n } else if (this._buf.hasContent()) {\n const lastCp = this.getLastChar();\n if (lastCp !== charCodes.space && lastCp !== charCodes.lineFeed) {\n this._space();\n }\n }\n }\n\n /**\n * Writes a token that can't be safely parsed without taking whitespace into account.\n */\n\n word(str: string): void {\n // prevent concatenating words and creating // comment out of division and regex\n if (\n this._endsWithWord ||\n (str.charCodeAt(0) === charCodes.slash && this.endsWith(charCodes.slash))\n ) {\n this._space();\n }\n\n this._maybeAddAuxComment();\n this._append(str, false);\n\n this._endsWithWord = true;\n }\n\n /**\n * Writes a number token so that we can validate if it is an integer.\n */\n\n number(str: string): void {\n this.word(str);\n\n // Integer tokens need special handling because they cannot have '.'s inserted\n // immediately after them.\n this._endsWithInteger =\n Number.isInteger(+str) &&\n !NON_DECIMAL_LITERAL.test(str) &&\n !SCIENTIFIC_NOTATION.test(str) &&\n !ZERO_DECIMAL_INTEGER.test(str) &&\n str.charCodeAt(str.length - 1) !== charCodes.dot;\n }\n\n /**\n * Writes a simple token.\n */\n\n token(str: string, maybeNewline = false): void {\n // space is mandatory to avoid outputting