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 () {