From fdb5829a606072784f4f95bf2b0b5f30eb12a3dd Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig Date: Thu, 31 Dec 2020 17:22:46 +0100 Subject: [PATCH] Use isIdentifierChar instead of regex for toIdentifier (#12575) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Use isIdentifierChar instead of regex for toIdentifier * Apply suggestions from code review Co-authored-by: Huáng Jùnliàng * Undo dep * Update packages/babel-types/test/converters.js * Add testcase starting with a number * Add test for non-ascii starting character Co-authored-by: Huáng Jùnliàng --- packages/babel-types/src/converters/toIdentifier.ts | 10 +++++++--- packages/babel-types/test/converters.js | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/babel-types/src/converters/toIdentifier.ts b/packages/babel-types/src/converters/toIdentifier.ts index 70a42d97e9..ca14168797 100644 --- a/packages/babel-types/src/converters/toIdentifier.ts +++ b/packages/babel-types/src/converters/toIdentifier.ts @@ -1,10 +1,14 @@ import isValidIdentifier from "../validators/isValidIdentifier"; +import { isIdentifierChar } from "@babel/helper-validator-identifier"; -export default function toIdentifier(name: string): string { - name = name + ""; +export default function toIdentifier(input: string): string { + input = input + ""; // replace all non-valid identifiers with dashes - name = name.replace(/[^a-zA-Z0-9$_]/g, "-"); + let name = ""; + for (const c of input) { + name += isIdentifierChar(c.codePointAt(0)) ? c : "-"; + } // remove all dashes and numbers from start of name name = name.replace(/^[-0-9]+/, ""); diff --git a/packages/babel-types/test/converters.js b/packages/babel-types/test/converters.js index 93075f8585..6f7cd9d9ac 100644 --- a/packages/babel-types/test/converters.js +++ b/packages/babel-types/test/converters.js @@ -14,6 +14,10 @@ function generateCode(node) { describe("converters", function () { it("toIdentifier", function () { expect(t.toIdentifier("swag-lord")).toBe("swagLord"); + expect(t.toIdentifier("ɵ2")).toBe("ɵ2"); + expect(t.toIdentifier("ℬ1")).toBe("ℬ1"); + expect(t.toIdentifier("1bc")).toBe("bc"); + expect(t.toIdentifier("\u0487a")).toBe("_\u0487a"); }); describe("valueToNode", function () {