Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provide Syntax Checking for Regular Expressions #55600

Merged
merged 14 commits into from
Apr 19, 2024

Conversation

graphemecluster
Copy link
Contributor

@graphemecluster graphemecluster commented Sep 1, 2023

This PR provides syntax checks to regular expressions. It can also be considered a follow-up of #51837 where escapes in RegExp are still not being addressed.
It introduces 36 new diagnostic messages for errors not previously covered.
Although this comment suggested that errors are better thrown regardless of flags to avoid rescanning, the parsing behavior of the new Unicode Sets (v) mode in character class is totally different from that of the non-v modes. So I just reuse the old code to quickly skip to the end of the regex for recording the flags beforehand.

Besides the Set Notation support, the PR also includes the following Stage 3 (at the time of writing) proposals:

Additionally, some test cases from test262 are added to make up both this PR and #51837.
Reverted due to excessive amount of files.

Fixes #3432 (Fixes #54744)


Follow-up Proposal

Proposed changes to be implemented in upcoming PRs

This PR provides a basis for making further changes to achieve additional type safety for the RegExp interface.
A part of them is given below:

// types.ts

export interface RegularExpressionLiteral extends LiteralExpression {
    readonly kind: SyntaxKind.RegularExpressionLiteral;
    readonly regExpBody: string;
    readonly regExpFlags: RegularExpressionFlags;
    readonly regExpFlagsText: string;
    readonly capturingGroups: RegularExpressionCapturingGroup[]; // capturingGroups[0] is the whole pattern
    readonly capturingGroupSpecifiers: Map<string, RegularExpressionCapturingGroup[]>; // Duplicate groups with the same name are allowed as long as they are mutually exclusive, thus an array
}

export interface RegularExpressionCapturingGroup extends ReadonlyTextRange {
    readonly pattern: string[]; // format similar to the first argument of a template tag function
    readonly isPossiblyUndefined: boolean;
}

// es5.d.ts

type CapturingGroupsArray = [string, ...(string | undefined)[]];
type NamedCapturingGroupsObject = { [name: string]: string | undefined } | undefined;

interface RegExp<
    CapturingGroups extends CapturingGroupsArray = CapturingGroupsArray,
    NamedCapturingGroups extends NamedCapturingGroupsObject = undefined
> {
    exec(string: string): RegExpExecArray<NamedCapturingGroups> & CapturingGroups | null;
    // ...
}

interface String {
    // ...

    match<
        CapturingGroups extends CapturingGroupsArray = CapturingGroupsArray,
        NamedCapturingGroups extends NamedCapturingGroupsObject = undefined
    >(regexp: string | RegExp<CapturingGroups, NamedCapturingGroups>): RegExpMatchArray | RegExpExecArray<NamedCapturingGroups> & CapturingGroups | null;

    replace(searchValue: string | RegExp, replaceValue: string): string; // untouched

    replace<
        CapturingGroups extends CapturingGroupsArray = CapturingGroupsArray,
        NamedCapturingGroups extends NamedCapturingGroupsObject = undefined
    >(
        searchValue: string | RegExp<CapturingGroups, NamedCapturingGroups>,
        replacer: (...capturingGroups: CapturingGroups, offset: number, input: string, groups: NamedCapturingGroups) => string
    ): string;

    // Buggy until GH#45972 is fixed
    // Seems like we should have a es2018.string.d.ts for the additional `groups` argument? But another overload is confusing to both the type checker and the users

    // Same for `replaceAll` in es2021.string.d.ts

    // ...
}

type RegExpMatchArray = [string, ...string[]];

interface RegExpExecArray<NamedCapturingGroups extends NamedCapturingGroupsObject = undefined> {
    index: number;
    input: string;
}

// es2018.regexp.d.ts

interface RegExpExecArray<NamedCapturingGroups extends NamedCapturingGroupsObject = undefined> {
    groups: NamedCapturingGroups;
}

Usage

/^(?<date>\d{4}-\d{2}-\d{2})[Tt ](?<time>\d{2}:\d{2}:\d{2})$/u.exec("2024-01-01T00:00:00")
// Produces
{
    kind: SyntaxKind.RegularExpressionLiteral,
    regExpBody: "^(?<date>\\d{4}-\\d{2}-\\d{2})[Tt ](?<time>\\d{2}:\\d{2}:\\d{2})$",
    regExpFlags: RegularExpressionFlags.Unicode,
    regExpFlagsText: "u",
    capturingGroups: [
        { pos: 1, end: 60, pattern: ["", "-", "-", ":", ":", ""], isPossiblyUndefined: false },
        { pos: 2, end: 28, pattern: ["", "-", "-", ""], isPossiblyUndefined: false },
        { pos: 33, end: 59, pattern: ["", ":", ":", ""], isPossiblyUndefined: false },
    ],
    capturingGroupSpecifiers: Map {
        date: [{ pos: 2, end: 28, pattern: ["", "-", "-", ""], isPossiblyUndefined: false }],
        time: [{ pos: 33, end: 59, pattern: ["", ":", ":", ""], isPossiblyUndefined: false }],
    },
}
// Which is transformed to types in checker.ts, thus:
RegExp<
    /*CapturingGroups*/ [`${string}-${string}-${string}:${string}:${string}`, `${string}-${string}-${string}`, `${string}:${string}:${string}`],
    /*NamedCapturingGroups*/ {
        date: `${string}-${string}-${string}`;
        time: `${string}:${string}:${string}`;
    }
>.exec(string: string): {
    index: number;
    input: string;
    groups: {
        date: `${string}-${string}-${string}`;
        time: `${string}:${string}:${string}`;
    };
} & [`${string}-${string}-${string}:${string}:${string}`, `${string}-${string}-${string}`, `${string}:${string}:${string}`] | null;

No more runtime errors on match.groups.foo.length and match[3].length!

@typescript-bot
Copy link
Collaborator

Looks like you're introducing a change to the public API surface area. If this includes breaking changes, please document them on our wiki's API Breaking Changes page.

Also, please make sure @DanielRosenwasser and @RyanCavanaugh are aware of the changes, just as a heads up.

@graphemecluster
Copy link
Contributor Author

I am not sure if there are conflicts between the licenses of each test262 test file and this repo. If that's the case, I will remove that commit.

@jakebailey
Copy link
Member

I am not sure if there are conflicts between the licenses of each test262 test file and this repo. If that's the case, I will remove that commit.

You just have to include the license, we have it in other places pretty sure. We don't distribute the tests so it's theoretically not a problem.

@jakebailey
Copy link
Member

@typescript-bot test top100
@typescript-bot user test this
@typescript-bot user test tsserver
@typescript-bot test tsserver top100
@typescript-bot run dt
@typescript-bot perf test this
@typescript-bot pack this

@typescript-bot
Copy link
Collaborator

typescript-bot commented Sep 1, 2023

Heya @jakebailey, I've started to run the parallelized Definitely Typed test suite on this PR at 13ef487. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

typescript-bot commented Sep 1, 2023

Heya @jakebailey, I've started to run the tarball bundle task on this PR at 13ef487. You can monitor the build here.

@typescript-bot
Copy link
Collaborator

typescript-bot commented Sep 1, 2023

Heya @jakebailey, I've started to run the regular perf test suite on this PR at 13ef487. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

typescript-bot commented Sep 1, 2023

Heya @jakebailey, I've started to run the diff-based top-repos suite on this PR at 13ef487. You can monitor the build here.

Update: The results are in! Part 1, Part 2

@typescript-bot
Copy link
Collaborator

typescript-bot commented Sep 1, 2023

Heya @jakebailey, I've started to run the diff-based user code test suite (tsserver) on this PR at 13ef487. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

typescript-bot commented Sep 1, 2023

Heya @jakebailey, I've started to run the diff-based top-repos suite (tsserver) on this PR at 13ef487. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

typescript-bot commented Sep 1, 2023

Heya @jakebailey, I've started to run the diff-based user code test suite on this PR at 13ef487. You can monitor the build here.

Update: The results are in!

@typescript-bot
Copy link
Collaborator

Hey @jakebailey, I've packed this into an installable tgz. You can install it for testing by referencing it in your package.json like so:

{
    "devDependencies": {
        "typescript": "https://typescript.visualstudio.com/cf7ac146-d525-443c-b23c-0d58337efebc/_apis/build/builds/157237/artifacts?artifactName=tgz&fileId=166119100EA9BEF546528DD07B6C823F08B2738E56E8E1B6A942167807DC901A02&fileName=/typescript-5.3.0-insiders.20230901.tgz"
    }
}

and then running npm install.

@typescript-bot
Copy link
Collaborator

@jakebailey Here are the results of running the user test suite comparing main and refs/pull/55600/merge:

Everything looks good!

@typescript-bot
Copy link
Collaborator

@jakebailey Here are the results of running the user test suite comparing main and refs/pull/55600/merge:

There were infrastructure failures potentially unrelated to your change:

  • 1 instance of "Unknown failure"
  • 2 instances of "Package install failed"

Otherwise...

Something interesting changed - please have a look.

Details

pyright

/mnt/ts_downloads/pyright/build.sh

  • [NEW] error TS1514: A character class range must not be bounded by another character class.
    • /mnt/ts_downloads/pyright/pyright: ../pyright-internal/src/parser/tokenizer.ts(1283,86)
    • /mnt/ts_downloads/pyright/pyright: ../pyright-internal/src/parser/tokenizer.ts(1302,92)
    • /mnt/ts_downloads/pyright/pyright-internal: src/parser/tokenizer.ts(1283,86)
    • /mnt/ts_downloads/pyright/pyright-internal: src/parser/tokenizer.ts(1302,92)
    • /mnt/ts_downloads/pyright/vscode-pyright: ../pyright-internal/src/parser/tokenizer.ts(1283,86)
    • /mnt/ts_downloads/pyright/vscode-pyright: ../pyright-internal/src/parser/tokenizer.ts(1302,92)
  • [MISSING] error TS2322: Type 'number' is not assignable to type 'never'.
    • /mnt/ts_downloads/pyright/pyright: ../pyright-internal/src/analyzer/codeFlowUtils.ts(348,50)
    • /mnt/ts_downloads/pyright/pyright: ../pyright-internal/src/analyzer/codeFlowUtils.ts(349,50)
    • /mnt/ts_downloads/pyright/pyright-internal: src/analyzer/codeFlowUtils.ts(348,50)
    • /mnt/ts_downloads/pyright/pyright-internal: src/analyzer/codeFlowUtils.ts(349,50)
    • /mnt/ts_downloads/pyright/vscode-pyright: ../pyright-internal/src/analyzer/codeFlowUtils.ts(348,50)
    • /mnt/ts_downloads/pyright/vscode-pyright: ../pyright-internal/src/analyzer/codeFlowUtils.ts(349,50)
  • [MISSING] error TS2322: Type '(readonly T[] | NonNullable<T>)[]' is not assignable to type 'T[]'.
    • /mnt/ts_downloads/pyright/pyright: ../pyright-internal/src/common/collectionUtils.ts(305,5)
    • /mnt/ts_downloads/pyright/pyright-internal: src/common/collectionUtils.ts(305,5)
    • /mnt/ts_downloads/pyright/vscode-pyright: ../pyright-internal/src/common/collectionUtils.ts(305,5)

uglify-js

/mnt/ts_downloads/uglify-js/tsconfig.json

  • [NEW] error TS1503: Incomplete quantifier. Digit expected.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(12620,44)
  • [MISSING] error TS2554: Expected 0 arguments, but got 1.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/ast.js(129,34)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/ast.js(425,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/ast.js(661,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(250,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(824,42)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(919,36)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1603,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1681,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1709,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1845,34)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1855,64)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1935,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2259,61)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2736,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2980,35)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3092,35)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3205,45)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3226,42)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3262,43)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3285,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4038,59)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4382,34)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5128,44)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5392,48)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5518,54)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6109,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6362,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6714,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6949,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7083,42)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7095,29)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8251,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8334,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8708,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9153,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9224,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9403,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10038,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10342,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10631,45)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10733,49)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10936,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11290,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(12218,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(12426,47)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(12527,39)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(12686,39)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(12690,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13466,34)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13484,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13724,34)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13878,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13907,46)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13920,54)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13925,46)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/mozilla-ast.js(1240,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/output.js(506,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/output.js(1437,45)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/propmangle.js(126,29)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/propmangle.js(201,29)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/propmangle.js(235,29)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(148,29)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(258,29)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(370,46)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(625,29)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(737,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(761,30)
  • [MISSING] error TS2353: Object literal may only specify known properties, and 'visit' does not exist in type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/ast.js(2256,5)
  • [MISSING] error TS2339: Property 'directives' does not exist on type 'this & TreeTransformer'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(134,38)
  • [MISSING] error TS2339: Property 'option' does not exist on type 'TreeTransformer'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(221,22)
  • [MISSING] error TS2339: Property 'exposed' does not exist on type 'TreeTransformer'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(224,22)
  • [MISSING] error TS18048: 'toplevel' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(230,16)
  • [MISSING] error TS2339: Property 'compress' does not exist on type 'TreeTransformer'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(233,22)
  • [MISSING] error TS2339: Property 'walk' does not exist on type 'reduce_iife'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(919,16)
  • [MISSING] error TS2339: Property 'uses_arguments' does not exist on type 'reduce_iife'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(929,28)
  • [MISSING] error TS2339: Property 'argnames' does not exist on type 'reduce_iife'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(930,16)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(933,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(943,58)
  • [MISSING] error TS2339: Property 'rest' does not exist on type 'reduce_iife'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(939,27)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(941,24)
  • [MISSING] error TS2454: Variable 'lazy' is used before being assigned.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1009,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1011,21)
  • [MISSING] error TS2454: Variable 'drop' is used before being assigned.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1128,32)
  • [MISSING] error TS2339: Property 'name' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1325,20)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1325,46)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1325,72)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1330,26)
  • [MISSING] error TS2339: Property 'definition' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1381,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4604,28)
  • [MISSING] error TS2339: Property 'scope' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1407,55)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1427,48)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1440,41)
  • [MISSING] error TS2339: Property 'in_arg' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1417,25)
  • [MISSING] error TS2339: Property 'fixed_value' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1418,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4474,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4525,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4608,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4664,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4710,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4797,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4858,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5403,30)
  • [MISSING] error TS2339: Property 'fn_scanning' does not exist on type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1608,12)
  • [MISSING] error TS2339: Property 'fn_visited' does not exist on type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1609,12)
  • [MISSING] error TS2339: Property 'in_loop' does not exist on type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1611,12)
  • [MISSING] error TS2339: Property 'loop_ids' does not exist on type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1612,12)
  • [MISSING] error TS2339: Property 'safe_ids' does not exist on type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1617,12)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(1618,12)
  • [MISSING] error TS2339: Property 'parent' does not exist on type 'TreeTransformer'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2142,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2315,53)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2335,53)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2921,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2951,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2977,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3023,39)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3057,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3072,39)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7182,29)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7665,80)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7700,49)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8275,28)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8284,28)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8541,33)
  • [MISSING] error TS2349: This expression is not callable.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2189,51)
  • [MISSING] error TS2454: Variable 'args' is used before being assigned.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2414,77)
  • [MISSING] error TS18048: 'args' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2415,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2415,42)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5537,40)
  • [MISSING] error TS18048: 'remaining' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2423,42)
  • [MISSING] error TS2365: Operator ' ' cannot be applied to types 'number' and 'boolean'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2423,54)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/utils.js(205,16)
  • [MISSING] error TS2322: Type 'boolean' is not assignable to type 'number'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2436,25)
  • [MISSING] error TS2322: Type 'boolean' is not assignable to type 'never'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2440,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2441,25)
  • [MISSING] error TS2339: Property 'find_parent' does not exist on type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2731,65)
  • [MISSING] error TS2339: Property 'stack' does not exist on type 'TreeTransformer'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2962,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2963,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(2965,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8534,55)
  • [MISSING] error TS2339: Property 'parent' does not exist on type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3295,75)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3305,79)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6580,105)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6968,35)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7000,28)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8710,24)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10952,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(12694,45)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/output.js(507,53)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(151,27)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(164,27)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(171,27)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(224,51)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(308,62)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(332,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(343,33)
  • [MISSING] error TS2345: Argument of type 'number[]' is not assignable to parameter of type '[start: number, deleteCount: number, ...items: never[]]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3514,53)
  • [MISSING] error TS2345: Argument of type 'any[]' is not assignable to parameter of type 'never[]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(3816,60)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4412,43)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7578,56)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9622,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9623,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9636,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9637,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11216,34)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11217,40)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11218,40)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11219,40)
  • [MISSING] error TS2345: Argument of type 'any[]' is not assignable to parameter of type '[start: number, deleteCount: number, ...items: never[]]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4076,53)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11234,41)
  • [MISSING] error TS2403: Subsequent variable declarations must have the same type. Variable 'i' must be of type 'number', but here has type 'any'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4130,26)
  • [MISSING] error TS2339: Property 'required' does not exist on type 'any[]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4409,27)
  • [MISSING] error TS2790: The operand of a 'delete' operator must be optional.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4478,20)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4529,20)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4668,20)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4714,20)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4807,20)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4862,20)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5411,24)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5987,20)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6060,20)
  • [MISSING] error TS2339: Property 'is_undefined' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4600,22)
  • [MISSING] error TS2339: Property 'is_declared' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4602,49)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4662,49)
  • [MISSING] error TS2339: Property 'is_immutable' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4603,22)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4663,22)
  • [MISSING] error TS2551: Property 'is_undefined' does not exist on type '(Anonymous function)'. Did you mean 'is_defined'?
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(4661,22)
  • [MISSING] error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5374,58)
  • [MISSING] error TS18047: 'match' is possibly 'null'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5375,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5375,56)
  • [MISSING] error TS2363: The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5375,55)
  • [MISSING] error TS2339: Property 'tag' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5599,22)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5600,50)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6057,23)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6059,43)
  • [MISSING] error TS2630: Cannot assign to 'decode' because it is a function.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5601,17)
  • [MISSING] error TS2339: Property 'expressions' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5605,39)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6055,26)
  • [MISSING] error TS2339: Property 'strings' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5608,35)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5610,47)
  • [MISSING] error TS2339: Property 'args' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5983,26)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8860,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8865,34)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8890,42)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8898,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8898,42)
  • [MISSING] error TS2339: Property 'is_expr_pure' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5984,22)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6056,22)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8858,22)
  • [MISSING] error TS2339: Property 'expression' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(5986,43)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8863,28)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8881,22)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8883,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8897,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8897,48)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9112,28)
  • [MISSING] error TS2322: Type 'string' is not assignable to type 'boolean'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6129,29)
  • [MISSING] error TS2339: Property 'loopcontrol_target' does not exist on type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6393,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6433,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9155,44)
  • [MISSING] error TS2551: Property 'has_directive' does not exist on type 'TreeWalker'. Did you mean 'directives'?
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6488,61)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6950,74)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(653,49)
  • [MISSING] error TS18048: 'ldef' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6753,56)
  • [MISSING] error TS18048: 'seg' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6821,56)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(6822,54)
  • [MISSING] error TS2339: Property 'assign' does not exist on type 'any[]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7195,35)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7196,48)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7832,36)
  • [MISSING] error TS18048: 'spread' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7290,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7333,42)
  • [MISSING] error TS2403: Subsequent variable declarations must have the same type. Variable 'trimmed' must be of type 'any', but here has type '{ name: any; value: any; }'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7293,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7336,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7624,21)
  • [MISSING] error TS2339: Property 'has_directive' does not exist on type 'TreeTransformer'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7363,72)
  • [MISSING] error TS2339: Property 'push' does not exist on type 'TreeTransformer'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7703,12)
  • [MISSING] error TS2339: Property 'directives' does not exist on type 'TreeTransformer'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(7704,12)
  • [MISSING] error TS2339: Property 'walk' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8251,18)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(253,10)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(367,10)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(370,26)
  • [MISSING] error TS2339: Property 'find_variable' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8290,33)
  • [MISSING] error TS2339: Property 'transform' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8311,14)
  • [MISSING] error TS2339: Property 'each_argname' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8315,50)
  • [MISSING] error TS2322: Type 'Dictionary' is not assignable to type 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8462,31)
  • [MISSING] error TS2339: Property 'enclosed' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8463,18)
  • [MISSING] error TS18048: 'var_names' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8464,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8467,17)
  • [MISSING] error TS2339: Property 'variables' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8466,18)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(417,38)
  • [MISSING] error TS2551: Property 'value' does not exist on type 'Dictionary'. Did you mean 'values'?
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8532,22)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8559,22)
  • [MISSING] error TS2339: Property 'left' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8784,29)
  • [MISSING] error TS2339: Property 'operator' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8791,30)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9113,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9117,22)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9122,42)
  • [MISSING] error TS2339: Property 'right' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8794,25)
  • [MISSING] error TS2339: Property 'pure' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8859,26)
  • [MISSING] error TS2339: Property 'is_call_pure' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8864,22)
  • [MISSING] error TS2339: Property 'clone' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8871,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(8880,29)
  • [MISSING] error TS2339: Property 'push' does not exist on type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9159,56)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9160,12)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10044,16)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/output.js(511,16)
  • [MISSING] error TS2403: Subsequent variable declarations must have the same type. Variable 'body' must be of type 'any[]', but here has type 'any'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9274,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9289,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9738,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10085,21)
  • [MISSING] error TS18048: 'save' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9429,21)
  • [MISSING] error TS2322: Type 'number | undefined' is not assignable to type 'number'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9429,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(675,88)
  • [MISSING] error TS2403: Subsequent variable declarations must have the same type. Variable 'save' must be of type 'any', but here has type 'number'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9433,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9440,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(9449,21)
  • [MISSING] error TS2345: Argument of type 'any[]' is not assignable to parameter of type '[pattern: string | RegExp, flags?: string | undefined]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10453,53)
  • [MISSING] error TS2403: Subsequent variable declarations must have the same type. Variable 'code' must be of type 'string', but here has type '{ get: () => string; reset: () => any; indent: (half: any) => void; should_break: () => boolean; has_parens: () => boolean; newline: () => void; print: (str: any) => void; space: () => void; comma: () => void; colon: () => void; ... 16 more ...; parent: (n: any) => any; }'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10638,25)
  • [MISSING] error TS18048: 'fun' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10642,36)
  • [MISSING] error TS2339: Property 'get' does not exist on type 'string'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10647,41)
  • [MISSING] error TS2322: Type 'null' is not assignable to type 'any[]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10940,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10948,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10957,25)
  • [MISSING] error TS18048: 'begin' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10982,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(10985,27)
  • [MISSING] error TS2454: Variable 'is_strict_comparison' is used before being assigned.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11710,18)
  • [MISSING] error TS2454: Variable 'nullish' is used before being assigned.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11899,60)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11900,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11903,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11910,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11916,22)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(11927,22)
  • [MISSING] error TS2358: The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13359,26)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14063,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14076,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14095,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14114,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14189,17)
  • [MISSING] error TS18048: 'fn_parent' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13360,36)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13361,32)
  • [MISSING] error TS2454: Variable 'property' is used before being assigned.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13396,43)
  • [MISSING] error TS2403: Subsequent variable declarations must have the same type. Variable 'value' must be of type 'number', but here has type 'any'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13417,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13425,25)
  • [MISSING] error TS2339: Property 'has_side_effects' does not exist on type 'number'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(13420,46)
  • [MISSING] error TS2532: Object is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14056,24)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14073,24)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14087,24)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14106,24)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14112,24)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14186,24)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/node.js(33,6)
  • [MISSING] error TS2339: Property 'try_inline' does not exist on type 'never'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14060,35)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14091,27)
  • [MISSING] error TS2339: Property 'body' does not exist on type 'never'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14064,33)
  • [MISSING] error TS18048: 'obj' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14079,35)
  • [MISSING] error TS18048: 'cond' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14098,38)
  • [MISSING] error TS18048: 'exp' is possibly 'undefined'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/compress.js(14192,39)
  • [MISSING] error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/output.js(1886,58)
  • [MISSING] error TS2322: Type 'string | boolean' is not assignable to type 'boolean'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(323,9)
  • [MISSING] error TS2345: Argument of type 'number | undefined' is not assignable to parameter of type 'number'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(392,19)
  • [MISSING] error TS2345: Argument of type 'any' is not assignable to parameter of type 'never'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(458,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(469,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1015,23)
  • [MISSING] error TS2339: Property 'raw_source' does not exist on type 'RegExp'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(519,20)
  • [MISSING] error TS18046: 'e' is of type 'unknown'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(522,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/utils.js(66,24)
  • [MISSING] error TS18047: 'S.token' is possibly 'null'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(729,13)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(762,69)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(762,83)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(806,31)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(812,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(835,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(875,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(895,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1094,56)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1122,52)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1162,58)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1433,67)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1540,43)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1553,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1565,43)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1881,38)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1950,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2137,20)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2364,60)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2383,48)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2409,35)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2512,52)
  • [MISSING] error TS2322: Type 'any[]' is not assignable to type 'never[]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1354,9)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1403,9)
  • [MISSING] error TS2339: Property 'rest' does not exist on type 'any[]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1409,28)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1974,19)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1975,23)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1975,71)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2193,32)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2535,23)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2543,44)
  • [MISSING] error TS2454: Variable 'cur' is used before being assigned.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1682,17)
  • [MISSING] error TS18047: 'tok' is possibly 'null'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1804,41)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1805,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1818,57)
  • [MISSING] error TS18047: 'start' is possibly 'null'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1852,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1862,27)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1863,60)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1864,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1865,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1866,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1867,33)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1868,35)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1870,39)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1871,25)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1874,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1895,36)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2031,26)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2046,26)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2076,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2374,44)
  • [MISSING] error TS18047: 'end' is possibly 'null'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1878,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1879,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1883,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(1884,17)
  • [MISSING] error TS18047: 'tmp' is possibly 'null'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2116,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2118,27)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2125,25)
  • [MISSING] error TS18047: 'key_start' is possibly 'null'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/parse.js(2233,26)
  • [MISSING] error TS2630: Cannot assign to 'get_builtins' because it is a function.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/propmangle.js(116,13)
  • [MISSING] error TS2304: Cannot find name 'domprops'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/propmangle.js(170,37)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/propmangle.js(170,63)
  • [MISSING] error TS2339: Property 'global' does not exist on type 'SymbolDef'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(68,26)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(107,39)
  • [MISSING] error TS2339: Property 'exported' does not exist on type 'SymbolDef'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(96,18)
  • [MISSING] error TS2339: Property 'undeclared' does not exist on type 'SymbolDef'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(97,18)
  • [MISSING] error TS18047: 's' is possibly 'null'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(199,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(200,21)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(201,17)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(202,26)
  • [MISSING] error TS18047: 'scope' is possibly 'null'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(218,13)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(220,23)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(232,23)
  • [MISSING] error TS2339: Property 'def_global' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(330,28)
  • [MISSING] error TS2339: Property 'uses_eval' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(352,26)
  • [MISSING] error TS2339: Property 'def_variable' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(472,10)
  • [MISSING] error TS2339: Property 'start' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(475,21)
  • [MISSING] error TS2339: Property 'end' does not exist on type '(Anonymous function)'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(476,19)
  • [MISSING] error TS2345: Argument of type 'string' is not assignable to parameter of type 'object'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/scope.js(734,31)
  • [MISSING] error TS2551: Property 'index' does not exist on type 'any[]'. Did you mean 'indexOf'?
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/sourcemap.js(82,11)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/sourcemap.js(182,31)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/sourcemap.js(190,34)
  • [MISSING] error TS2345: Argument of type 'this' is not assignable to parameter of type 'TreeWalker'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/transform.js(47,21)
  • [MISSING] error TS2339: Property 'proto_value' does not exist on type 'Dictionary'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/utils.js(164,18)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/utils.js(180,42)
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/lib/utils.js(184,25)
  • [MISSING] error TS2303: Circular definition of import alias '"Dictionary"'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/exports.js(1,1)
  • [MISSING] error TS2303: Circular definition of import alias '"is_statement"'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/exports.js(2,1)
  • [MISSING] error TS2303: Circular definition of import alias '"List"'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/exports.js(3,1)
  • [MISSING] error TS2303: Circular definition of import alias '"minify"'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/exports.js(4,1)
  • [MISSING] error TS2303: Circular definition of import alias '"parse"'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/exports.js(5,1)
  • [MISSING] error TS2303: Circular definition of import alias '"push_uniq"'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/exports.js(6,1)
  • [MISSING] error TS2303: Circular definition of import alias '"TreeTransformer"'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/exports.js(7,1)
  • [MISSING] error TS2303: Circular definition of import alias '"TreeWalker"'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/exports.js(8,1)
  • [MISSING] error TS2732: Cannot find module './domprops.json'. Consider using '--resolveJsonModule' to import module with '.json' extension.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/node.js(24,14)
  • [MISSING] error TS2339: Property '_handle' does not exist on type 'WriteStream & { fd: 1; }'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/tty.js(4,20)
  • [MISSING] error TS2339: Property '_handle' does not exist on type 'WriteStream & { fd: 2; }'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/tty.js(5,20)
  • [MISSING] error TS2345: Argument of type 'any[]' is not assignable to parameter of type '[code?: number | undefined]'.
    • /mnt/ts_downloads/uglify-js/node_modules/uglify-js/tools/tty.js(16,41)

@typescript-bot
Copy link
Collaborator

@jakebailey
The results of the perf run you requested are in!

Here they are:

Compiler

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Angular - node (v16.17.1, x64)
Memory used 300,275k (± 0.01%) 305,103k (± 0.00%) 4,828k ( 1.61%) 305,090k 305,123k p=0.005 n=6
Parse Time 3.01s (± 0.18%) 3.04s (± 0.34%) 0.04s ( 1.33%) 3.03s 3.06s p=0.004 n=6
Bind Time 0.93s (± 0.00%) 0.93s (± 0.44%) ~ 0.92s 0.93s p=0.405 n=6
Check Time 9.32s (± 0.26%) 9.35s (± 0.18%) ~ 9.33s 9.37s p=0.061 n=6
Emit Time 7.63s (± 0.25%) 7.62s (± 0.29%) ~ 7.60s 7.66s p=0.289 n=6
Total Time 20.88s (± 0.18%) 20.94s (± 0.18%) 0.06s ( 0.29%) 20.89s 21.01s p=0.019 n=6
Compiler-Unions - node (v16.17.1, x64)
Memory used 193,915k (± 0.03%) 194,043k (± 0.01%) 128k ( 0.07%) 194,018k 194,066k p=0.005 n=6
Parse Time 1.58s (± 0.00%) 1.59s (± 0.47%) 0.01s ( 0.53%) 1.58s 1.60s p=0.027 n=6
Bind Time 0.80s (± 0.69%) 0.82s (± 0.00%) 0.02s ( 3.14%) 0.82s 0.82s p=0.002 n=6
Check Time 9.94s (± 0.51%) 9.91s (± 0.23%) ~ 9.87s 9.93s p=0.422 n=6
Emit Time 2.74s (± 0.27%) 2.76s (± 0.19%) 0.02s ( 0.79%) 2.76s 2.77s p=0.004 n=6
Total Time 15.06s (± 0.37%) 15.09s (± 0.11%) ~ 15.06s 15.11s p=0.376 n=6
Monaco - node (v16.17.1, x64)
Memory used 347,176k (± 0.01%) 347,220k (± 0.00%) 44k ( 0.01%) 347,210k 347,233k p=0.045 n=6
Parse Time 2.69s (± 0.37%) 2.70s (± 0.36%) ~ 2.69s 2.71s p=0.136 n=6
Bind Time 0.99s (± 0.00%) 1.00s (± 0.41%) 0.01s ( 0.84%) 0.99s 1.00s p=0.007 n=6
Check Time 7.94s (± 0.32%) 7.90s (± 0.15%) -0.04s (- 0.52%) 7.88s 7.91s p=0.015 n=6
Emit Time 4.26s (± 0.32%) 4.26s (± 0.32%) ~ 4.24s 4.28s p=1.000 n=6
Total Time 15.88s (± 0.25%) 15.86s (± 0.07%) ~ 15.84s 15.87s p=0.334 n=6
TFS - node (v16.17.1, x64)
Memory used 301,167k (± 0.01%) 301,346k (± 0.00%) 179k ( 0.06%) 301,324k 301,364k p=0.005 n=6
Parse Time 2.18s (± 0.73%) 2.20s (± 0.23%) 0.02s ( 0.84%) 2.19s 2.20s p=0.036 n=6
Bind Time 1.11s (± 0.00%) 1.11s (± 0.74%) ~ 1.09s 1.11s p=0.405 n=6
Check Time 7.22s (± 0.22%) 7.22s (± 0.27%) ~ 7.19s 7.24s p=1.000 n=6
Emit Time 3.99s (± 0.45%) 3.97s (± 0.40%) ~ 3.95s 3.99s p=0.105 n=6
Total Time 14.50s (± 0.26%) 14.49s (± 0.23%) ~ 14.45s 14.53s p=0.809 n=6
material-ui - node (v16.17.1, x64)
Memory used 479,471k (± 0.00%) 479,582k (± 0.00%) 112k ( 0.02%) 479,575k 479,590k p=0.005 n=6
Parse Time 3.15s (± 0.13%) 3.02s (± 0.18%) 🟩-0.12s (- 3.92%) 3.02s 3.03s p=0.003 n=6
Bind Time 0.91s (± 0.00%) 1.07s (± 0.76%) 0.16s ( 17.22%) 1.05s 1.07s p=0.002 n=6
Check Time 17.75s (± 0.20%) 17.79s (± 0.31%) ~ 17.68s 17.83s p=0.062 n=6
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) ~ 0.00s 0.00s p=1.000 n=6
Total Time 21.80s (± 0.17%) 21.88s (± 0.25%) 0.08s ( 0.38%) 21.77s 21.91s p=0.042 n=6
xstate - node (v16.17.1, x64)
Memory used 542,818k (± 0.01%) 543,207k (± 0.01%) 390k ( 0.07%) 543,120k 543,281k p=0.005 n=6
Parse Time 3.69s (± 0.27%) 3.70s (± 0.27%) ~ 3.69s 3.71s p=0.136 n=6
Bind Time 1.42s (± 4.13%) 1.45s (± 0.52%) ~ 1.44s 1.46s p=0.740 n=6
Check Time 3.20s (± 2.53%) 3.17s (± 0.55%) ~ 3.15s 3.20s p=0.935 n=6
Emit Time 0.08s (± 6.19%) 0.08s (± 0.00%) ~ 0.08s 0.08s p=0.174 n=6
Total Time 8.40s (± 0.41%) 8.40s (± 0.18%) ~ 8.38s 8.42s p=0.686 n=6
System info unknown
Hosts
  • node (v16.17.1, x64)
Scenarios
  • Angular - node (v16.17.1, x64)
  • Compiler-Unions - node (v16.17.1, x64)
  • Monaco - node (v16.17.1, x64)
  • TFS - node (v16.17.1, x64)
  • material-ui - node (v16.17.1, x64)
  • xstate - node (v16.17.1, x64)
Benchmark Name Iterations
Current pr 6
Baseline baseline 6

tsserver

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-UnionsTSServer - node (v16.17.1, x64)
Req 1 - updateOpen 2,487ms (± 0.12%) 2,524ms (± 0.17%) 38ms ( 1.51%) 2,519ms 2,532ms p=0.005 n=6
Req 2 - geterr 5,948ms (± 0.37%) 5,924ms (± 0.32%) ~ 5,896ms 5,950ms p=0.066 n=6
Req 3 - references 343ms (± 0.45%) 344ms (± 0.40%) ~ 342ms 346ms p=0.351 n=6
Req 4 - navto 280ms (± 0.84%) 276ms (± 0.15%) -4ms (- 1.31%) 275ms 276ms p=0.004 n=6
Req 5 - completionInfo count 1,356 (± 0.00%) 1,356 (± 0.00%) ~ 1,356 1,356 p=1.000 n=6
Req 5 - completionInfo 82ms (± 7.20%) 84ms (± 5.58%) ~ 77ms 88ms p=0.466 n=6
CompilerTSServer - node (v16.17.1, x64)
Req 1 - updateOpen 2,632ms (± 0.89%) 2,654ms (± 0.55%) ~ 2,639ms 2,676ms p=0.066 n=6
Req 2 - geterr 4,768ms (± 0.24%) 4,760ms (± 0.18%) ~ 4,752ms 4,770ms p=0.229 n=6
Req 3 - references 350ms (± 0.29%) 351ms (± 0.35%) ~ 349ms 352ms p=0.675 n=6
Req 4 - navto 269ms (± 0.46%) 269ms (± 0.45%) ~ 267ms 270ms p=0.172 n=6
Req 5 - completionInfo count 1,518 (± 0.00%) 1,518 (± 0.00%) ~ 1,518 1,518 p=1.000 n=6
Req 5 - completionInfo 77ms (± 3.79%) 79ms (± 3.49%) ~ 73ms 80ms p=0.280 n=6
xstateTSServer - node (v16.17.1, x64)
Req 1 - updateOpen 2,708ms (± 0.10%) 2,724ms (± 0.16%) 15ms ( 0.56%) 2,720ms 2,729ms p=0.005 n=6
Req 2 - geterr 1,957ms (± 1.85%) 1,947ms (± 2.33%) ~ 1,878ms 1,988ms p=0.936 n=6
Req 3 - references 139ms (± 1.93%) 128ms (± 9.58%) ~ 111ms 141ms p=0.061 n=6
Req 4 - navto 353ms (± 0.49%) 353ms (± 0.34%) ~ 351ms 354ms p=0.621 n=6
Req 5 - completionInfo count 2,071 (± 0.00%) 2,071 (± 0.00%) ~ 2,071 2,071 p=1.000 n=6
Req 5 - completionInfo 321ms (± 2.07%) 315ms (± 1.56%) ~ 312ms 325ms p=0.196 n=6
System info unknown
Hosts
  • node (v16.17.1, x64)
Scenarios
  • CompilerTSServer - node (v16.17.1, x64)
  • Compiler-UnionsTSServer - node (v16.17.1, x64)
  • xstateTSServer - node (v16.17.1, x64)
Benchmark Name Iterations
Current pr 6
Baseline baseline 6

Startup

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
tsc-startup - node (v16.17.1, x64)
Execution time 156.26ms (± 0.16%) 157.42ms (± 0.16%) 1.16ms ( 0.74%) 156.15ms 160.50ms p=0.000 n=600
tsserver-startup - node (v16.17.1, x64)
Execution time 230.29ms (± 0.13%) 231.79ms (± 0.15%) 1.50ms ( 0.65%) 230.12ms 240.17ms p=0.000 n=600
tsserverlibrary-startup - node (v16.17.1, x64)
Execution time 235.11ms (± 0.12%) 236.71ms (± 0.10%) 1.60ms ( 0.68%) 235.63ms 239.43ms p=0.000 n=600
typescript-startup - node (v16.17.1, x64)
Execution time 236.02ms (± 0.17%) 236.26ms (± 0.13%) 0.24ms ( 0.10%) 234.96ms 240.99ms p=0.000 n=600
System info unknown
Hosts
  • node (v16.17.1, x64)
Scenarios
  • tsc-startup - node (v16.17.1, x64)
  • tsserver-startup - node (v16.17.1, x64)
  • tsserverlibrary-startup - node (v16.17.1, x64)
  • typescript-startup - node (v16.17.1, x64)
Benchmark Name Iterations
Current pr 6
Baseline baseline 6

Developer Information:

Download Benchmarks

Copy link
Member

@jakebailey jakebailey left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no idea if this is something we actually want, but just leaving a couple of comments before I forget...

src/compiler/diagnosticMessages.json Outdated Show resolved Hide resolved
src/compiler/types.ts Outdated Show resolved Hide resolved
src/compiler/utilities.ts Outdated Show resolved Hide resolved
src/compiler/utilities.ts Outdated Show resolved Hide resolved
src/harness/fourslashImpl.ts Outdated Show resolved Hide resolved
@typescript-bot
Copy link
Collaborator

@jakebailey Here are the results of running the top-repos suite comparing main and refs/pull/55600/merge:

Something interesting changed - please have a look.

Details

angular/angular-cli

4 of 19 projects failed to build with the old tsc and were ignored

tests/legacy-cli/tsconfig.json

ant-design/ant-design

1 of 2 projects failed to build with the old tsc and were ignored

tsconfig.json

cheeriojs/cheerio

1 of 3 projects failed to build with the old tsc and were ignored

tsconfig.json

immutable-js/immutable-js

1 of 4 projects failed to build with the old tsc and were ignored

website/tsconfig.json

marmelab/react-admin

24 of 25 projects failed to build with the old tsc and were ignored

packages/ra-core/tsconfig.json

microsoft/vscode

4 of 54 projects failed to build with the old tsc and were ignored

build/tsconfig.build.json

extensions/git/tsconfig.json

extensions/markdown-language-features/tsconfig.browser.json

extensions/markdown-language-features/tsconfig.json

src/tsconfig.monaco.json

src/tsconfig.tsec.json

neoclide/coc.nvim

tsconfig.json

prisma/prisma

64 of 89 projects failed to build with the old tsc and were ignored

packages/internals/tsconfig.json

packages/instrumentation/tsconfig.json

packages/client/tsconfig.build.json

packages/cli/tsconfig.build.json

shadcn-ui/ui

4 of 6 projects failed to build with the old tsc and were ignored

apps/www/tsconfig.scripts.json

@typescript-bot
Copy link
Collaborator

@jakebailey Here are some more interesting changes from running the top-repos suite

Details

vuejs/core

1 of 3 projects failed to build with the old tsc and were ignored

tsconfig.build.json

tsconfig.json

withfig/autocomplete

tsconfig.json

@typescript-bot
Copy link
Collaborator

@jakebailey Here are the results of running the top-repos suite comparing main and refs/pull/55600/merge:

Everything looks good!

@typescript-bot
Copy link
Collaborator

Hey @jakebailey, the results of running the DT tests are ready.
There were interesting changes:

Branch only errors:

Package: ember__component
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/ember__component/test/helper.ts:105:28
ERROR: 105:28  expect  TypeScript@local compile error: 
'\_' is not a valid character escape.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: semantic-ui-dropdown
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/semantic-ui-dropdown/semantic-ui-dropdown-tests.ts:155:28
ERROR: 155:28  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 155:29  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 155:41  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?
ERROR: 156:28  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 156:29  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 156:43  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: semantic-ui-search
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/semantic-ui-search/semantic-ui-search-tests.ts:122:28
ERROR: 122:28  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 122:29  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 122:41  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?
ERROR: 123:28  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 123:29  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 123:43  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: twig
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/twig/twig-tests.ts:76:31
ERROR: 76:31  expect  TypeScript@local compile error: 
This regular expression flag is only available when targeting 'ES2015' or later.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: ember__component/v3
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/ember__component/v3/test/helper.ts:24:28
ERROR: 24:28  expect  TypeScript@local compile error: 
'\_' is not a valid character escape.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: html-replace-webpack-plugin
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/html-replace-webpack-plugin/html-replace-webpack-plugin-tests.ts:38:54
ERROR: 38:54  expect  TypeScript@local compile error: 
A character class range must not be bounded by another character class.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: layui-src
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/layui-src/layui-src-tests.ts:574:24
ERROR: 574:24  expect  TypeScript@local compile error: 
'\_' is not a valid character escape.
ERROR: 574:29  expect  TypeScript@local compile error: 
'\_' is not a valid character escape.
ERROR: 574:35  expect  TypeScript@local compile error: 
'\_' is not a valid character escape.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: mocha
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/mocha/mocha-tests.ts:929:19
ERROR: 929:19  expect  TypeScript@local compile error: 
This regular expression flag is only available when targeting 'ES2015' or later.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: prismjs
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/prismjs/prismjs-tests.ts:52:26
ERROR: 52:26  expect  TypeScript@local compile error: 
This regular expression flag is only available when targeting 'ES2015' or later.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: semantic-ui-api
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/semantic-ui-api/semantic-ui-api-tests.ts:106:24
ERROR: 106:24  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 106:25  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 106:37  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?
ERROR: 107:24  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 107:25  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 107:39  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: semantic-ui-tab
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/semantic-ui-tab/semantic-ui-tab-tests.ts:115:28
ERROR: 115:28  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 115:29  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 115:41  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?
ERROR: 116:28  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 116:29  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 116:43  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: webpack-manifest-plugin
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/webpack-manifest-plugin/webpack-manifest-plugin-tests.ts:18:22
ERROR: 18:22  expect  TypeScript@local compile error: 
Range out of order in character class.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: ali-app
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/ali-app/ali-app-tests.ts:1065:76
ERROR: 1065:76  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 1065:77  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 1065:79  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: semantic-ui-progress
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/semantic-ui-progress/semantic-ui-progress-tests.ts:104:24
ERROR: 104:24  expect  TypeScript@local compile error: 
There is nothing available for repetition.
ERROR: 104:25  expect  TypeScript@local compile error: 
Incomplete quantifier. Digit expected.
ERROR: 104:37  expect  TypeScript@local compile error: 
Unexpected '}'. Did you mean to escape it with backslash?

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: connect-livereload
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/connect-livereload/connect-livereload-tests.ts:39:22
ERROR: 39:22  expect  TypeScript@local compile error: 
A character class range must not be bounded by another character class.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

Package: director
Error:

Error: /home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/DefinitelyTyped/types/director/director-tests.ts:105:14
ERROR: 105:14  expect  TypeScript@local compile error: 
A character class range must not be bounded by another character class.

    at testTypesVersion (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:194:15)
    at async runTests (/home/vsts/work/1/s/DefinitelyTyped-tools/packages/dtslint-runner/node_modules/@definitelytyped/dtslint/dist/index.js:151:9)

You can check the log here.

@graphemecluster
Copy link
Contributor Author

@jakebailey I just removed all the unwanted changes (including the unnecessary refactoring). Please ignore what you have previously reviewed since they are all reverted.

@@ -7350,7 7366,7 @@ export const enum ScriptKind {
// NOTE: We must reevaluate the target for upcoming features when each successive TC39 edition is ratified in
// June of each year. This includes changes to `LanguageFeatureMinimumTarget`, `ScriptTarget`,
// transformers/esnext.ts, commandLineParser.ts, and the contents of each lib/esnext.*.d.ts file.
export const enum ScriptTarget {
export enum ScriptTarget {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is unrelated and should be reverted; the const enum here is a perf optimization when using tsc emit.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is required to get the name of the target for ts1501. Perhaps there’s a better way to do so?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, you definitely do not want to use the reverse mapping for anything except debugging in the TS repo. I'm not sure what we typically use to do this sort of message. I think we just hardcode them in the diagnostics but that doesn't sound fun. But we shouldn't use the reverse mapping.

Copy link
Member

@jakebailey jakebailey Apr 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per @sheetalkamat, it looks like the thing to do is:

forEachEntry(targetOptionDeclaration.type, (value, key) => value === getEmitScriptTarget(options) ? key : undefined)

It would be nice to pull that code out into a utility function as we have copied that in at least two places. (Though, I wouldn't actually accept the options, but rather the target value itself; I assume that's what you need.)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’ve done the refactor for you. (Better use reverse mapping though, I think)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But then all the target names have become lowercase and ES2015 is now es6. Are they desirable?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’ve done the refactor for you. (Better use reverse mapping though, I think)

The reverse mapping isn't guaranteed to be stable if two enum values end up with the same value, but maybe that's alright. In any case, we just can't turn this into a non-const enum without consequence. It may be possible to extract formatEnum out of ts.Debug, but that would require other changes and I think can come later.

But then all the target names have become lowercase and ES2015 is now es6. Are they desirable?

I don't feel strongly, but @DanielRosenwasser might. This does theoretically match other diagnostics (e.g. see the Parse empty options of --target.js baseline). But, we're definitely inconsistent.

The es6 thing is the worst bit, and that comes down to the order of the array. We don't ever refer to to it as es6 in any diagnostic, only es2015, so that's not great. Perhaps we need to iterate the list in reverse. Or, just hardcode a switch case like getDefaultLibFileName.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh sorry, what I just meant to say was the makeReverseMap method in the scanner (I just realized this is a local function, perhaps we should move it to utilities)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If by makeReverseMap, you mean that something that reads the enum object itself to build the mapping, I wouldn't want to do that. We have ts.Debug.formatEnum which does that, but we don't use it for anything other than debugging or debug failures because it's not guaranteed to be human readable or consistent, just "good enough" for us to read when debugging or viewing stack traces.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, I mean that on targetOptionDeclaration.type

Comment on lines 2405 to 2407
// Although nested character class is allowed in Unicode Sets mode,
// an unescaped slash is nevertheless invalid even in character class in Unicode mode.
// Thus we can simply ignore nested character class in the first pass.
Copy link
Member

@DanielRosenwasser DanielRosenwasser Apr 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess what's happening is you're giving up the opportunity for a better error in cases like this:

var x = /[[\x00-\xff]&&/]/v;

Could you at least add an example into the comment?

Copy link
Member

@DanielRosenwasser DanielRosenwasser Apr 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be relatively easy to recover better if you just swapped inCharacterClass to be a stack counter. But maybe others would prefer you did that in a follow-up PR.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I once tried it but I can’t remember the rationale as to why I didn’t adopt it. I just tried it again and it really seems to give better error messages.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know why now. /[[]/ is a totally valid regex. If we did that it would break all expressions like /[[]/.test("[")

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the example you gave, [/[[\x00-\xff]&&/]/v is already a valid JavaScript expression if v is defined.

@@ -553,8 597,13 @@ function isHexDigit(ch: number): boolean {
return isDigit(ch) || ch >= CharacterCodes.A && ch <= CharacterCodes.F || ch >= CharacterCodes.a && ch <= CharacterCodes.f;
}

function isCodePoint(code: number): boolean {
return code <= 0x10FFFF;
function isASCIILetter(ch: number): boolean {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: isAsciiCharacter or isASCIICharacter

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But this really just cover letters

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isASCIIAlpha is maybe less ambiguous?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, OK. This is essentially /[\p{ASCII}&&\p{Letter}]/v though

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P.S. IMO isDigit should be renamed to isASCIIDigit too

Copy link
Member

@rbuckton rbuckton left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have some concerns about how the code is structured. It seems to put the responsibilities for parsing the regular expression grammar in the scanner, rather than in the parser where it belongs.

If you're goal is to extend this capability further in the future, then we're eventually going to want to use AST nodes rather than a bespoke API associated with RegularExpressionLiteral so that we can eventually leverage other language service features, e.g., for renaming groups, etc. Keeping the actual parsing logic in the parser would facilitate that change.

Also, since createScanner is part of our public API, it's entirely likely that someone is using it purely to scan portions of a source file. Performing a full parse of a RegExp during scan seems like unnecessary overhead for those scenarios.

src/compiler/parser.ts Show resolved Hide resolved
@@ -553,8 597,13 @@ function isHexDigit(ch: number): boolean {
return isDigit(ch) || ch >= CharacterCodes.A && ch <= CharacterCodes.F || ch >= CharacterCodes.a && ch <= CharacterCodes.f;
}

function isCodePoint(code: number): boolean {
return code <= 0x10FFFF;
function isASCIILetter(ch: number): boolean {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isASCIIAlpha is maybe less ambiguous?

src/compiler/scanner.ts Outdated Show resolved Hide resolved
src/compiler/scanner.ts Outdated Show resolved Hide resolved
src/compiler/scanner.ts Outdated Show resolved Hide resolved
src/compiler/scanner.ts Outdated Show resolved Hide resolved
src/compiler/scanner.ts Show resolved Hide resolved
}
}

// Alternative ::= Term*
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd suggest that if we're going to include the grammar in a comment that we use the grammarkdown-format grammar from the spec itself as it makes it easier to compare against the spec.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I actually did some sort of “elaboration” of the spec such as inlining intermediate productions instead of merely copying, aiming to make it more easily understandable at a glance
Both have their own advantages I believe

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't mind BNF per se, it's more to keep things consistent and to be able to more easily eyeball spec changes as the RegExp grammar evolves over time.

const namedCapturingGroups: Set<string>[] = [];

// Disjunction ::= Alternative ('|' Alternative)*
function scanDisjunction(isInGroup: boolean) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to nest these functions? All of these nested functions inside scanRegularExpressionWorker are closures and thus are essentially new objects allocated every time this function is called. These, along with scanRegularExpressionWorker itself should be lifted out of reScanSlashToken() if possible as it's a lot of unnecessary overhead.

Copy link
Contributor Author

@graphemecluster graphemecluster Apr 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was just aiming to group the functions logically, otherwise we will need to prefix all functions with scanRegExp or move them to a new file instead. I’ll lift them out right before the PR is ready to ship for easier reviewing.
Edit: I’ll lift them out in a follow-up PR.

src/compiler/parser.ts Show resolved Hide resolved
@DanielRosenwasser
Copy link
Member

@typescript-bot perf test this

@typescript-bot
Copy link
Collaborator

typescript-bot commented Apr 19, 2024

Starting jobs; this comment will be updated as builds start and complete.

Command Status Results
perf test this ✅ Started 👀 Results

@typescript-bot
Copy link
Collaborator

@DanielRosenwasser
The results of the perf run you requested are in!

Here they are:

tsc

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Angular - node (v18.15.0, x64)
Memory used 297,147k (± 0.01%) 297,329k (± 0.00%) 182k ( 0.06%) 297,322k 297,341k p=0.005 n=6
Parse Time 3.25s (± 0.64%) 3.30s (± 0.33%) 0.05s ( 1.54%) 3.28s 3.31s p=0.006 n=6
Bind Time 0.96s (± 0.57%) 0.97s (± 0.56%) 0.01s ( 1.04%) 0.97s 0.98s p=0.024 n=6
Check Time 9.81s (± 0.47%) 9.83s (± 0.40%) ~ 9.79s 9.90s p=0.468 n=6
Emit Time 8.40s (± 0.37%) 8.42s (± 0.23%) ~ 8.39s 8.45s p=0.462 n=6
Total Time 22.43s (± 0.25%) 22.52s (± 0.21%) 0.09s ( 0.42%) 22.48s 22.60s p=0.013 n=6
Compiler-Unions - node (v18.15.0, x64)
Memory used 192,406k (± 0.77%) 192,583k (± 0.74%) 176k ( 0.09%) 191,949k 195,496k p=0.045 n=6
Parse Time 2.02s (± 0.60%) 2.02s (± 1.75%) ~ 1.99s 2.08s p=0.746 n=6
Bind Time 1.07s (± 1.37%) 1.07s (± 1.64%) ~ 1.04s 1.08s p=0.677 n=6
Check Time 14.03s (± 0.36%) 14.07s (± 0.20%) ~ 14.05s 14.13s p=0.134 n=6
Emit Time 3.85s (± 0.67%) 3.88s (± 0.55%) ~ 3.86s 3.91s p=0.169 n=6
Total Time 20.98s (± 0.30%) 21.04s (± 0.30%) ~ 20.96s 21.10s p=0.227 n=6
mui-docs - node (v18.15.0, x64)
Memory used 1,752,902k (± 0.00%) 1,753,085k (± 0.00%) 183k ( 0.01%) 1,753,017k 1,753,120k p=0.005 n=6
Parse Time 9.95s (± 0.61%) 9.97s (± 0.37%) ~ 9.93s 10.03s p=0.374 n=6
Bind Time 3.37s (± 0.74%) 3.34s (± 0.85%) ~ 3.29s 3.37s p=0.168 n=6
Check Time 82.02s (± 0.56%) 82.01s (± 0.37%) ~ 81.58s 82.46s p=1.000 n=6
Emit Time 0.20s (± 0.00%) 0.20s (± 4.01%) ~ 0.20s 0.22s p=0.405 n=6
Total Time 95.54s (± 0.45%) 95.53s (± 0.33%) ~ 95.11s 96.00s p=0.936 n=6
self-build-src - node (v18.15.0, x64)
Memory used 2,309,018k (± 0.03%) 2,313,678k (± 0.04%) 4,660k ( 0.20%) 2,312,338k 2,315,022k p=0.005 n=6
Parse Time 7.41s (± 1.16%) 7.46s (± 1.09%) ~ 7.39s 7.58s p=0.298 n=6
Bind Time 2.73s (± 0.40%) 2.72s (± 0.91%) ~ 2.69s 2.74s p=1.000 n=6
Check Time 49.36s (± 1.01%) 49.19s (± 0.28%) ~ 49.02s 49.35s p=0.810 n=6
Emit Time 3.93s (± 1.76%) 4.00s (± 0.84%) 0.08s ( 1.91%) 3.98s 4.07s p=0.029 n=6
Total Time 63.42s (± 0.91%) 63.38s (± 0.34%) ~ 63.18s 63.75s p=1.000 n=6
self-build-src-public-api - node (v18.15.0, x64)
Memory used 2,382,229k (± 0.02%) 2,388,091k (± 0.03%) 5,862k ( 0.25%) 2,387,252k 2,388,842k p=0.005 n=6
Parse Time 5.18s (± 0.45%) 5.18s (± 1.01%) ~ 5.09s 5.22s p=0.520 n=6
Bind Time 1.71s (± 1.13%) 1.69s (± 1.15%) ~ 1.66s 1.71s p=0.255 n=6
Check Time 34.34s (± 0.31%) 34.45s (± 0.27%) ~ 34.36s 34.63s p=0.230 n=6
Emit Time 2.67s (± 2.01%) 2.68s (± 3.08%) ~ 2.56s 2.77s p=0.810 n=6
Total Time 43.91s (± 0.33%) 44.02s (± 0.17%) ~ 43.93s 44.12s p=0.128 n=6
self-compiler - node (v18.15.0, x64)
Memory used 419,262k (± 0.01%) 421,749k (± 0.01%) 2,487k ( 0.59%) 421,693k 421,825k p=0.005 n=6
Parse Time 4.21s (± 0.39%) 4.27s (± 0.94%) 0.07s ( 1.55%) 4.21s 4.33s p=0.019 n=6
Bind Time 1.58s (± 0.67%) 1.61s (± 1.16%) 0.04s ( 2.54%) 1.59s 1.64s p=0.006 n=6
Check Time 22.28s (± 0.41%) 22.36s (± 0.17%) ~ 22.32s 22.42s p=0.065 n=6
Emit Time 1.71s (± 1.52%) 1.71s (± 1.25%) ~ 1.68s 1.74s p=0.870 n=6
Total Time 29.76s (± 0.37%) 29.96s (± 0.24%) 0.19s ( 0.65%) 29.87s 30.07s p=0.014 n=6
ts-pre-modules - node (v18.15.0, x64)
Memory used 369,008k (± 0.02%) 369,215k (± 0.05%) 208k ( 0.06%) 369,092k 369,602k p=0.031 n=6
Parse Time 3.66s (± 0.49%) 3.67s (± 0.93%) ~ 3.64s 3.72s p=1.000 n=6
Bind Time 1.91s (± 0.90%) 1.94s (± 1.25%) 0.03s ( 1.83%) 1.90s 1.97s p=0.036 n=6
Check Time 19.41s (± 0.30%) 19.37s (± 0.29%) ~ 19.29s 19.43s p=0.296 n=6
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) ~ 0.00s 0.00s p=1.000 n=6
Total Time 24.97s (± 0.25%) 24.98s (± 0.30%) ~ 24.91s 25.10s p=1.000 n=6
vscode - node (v18.15.0, x64)
Memory used 2,920,548k (± 0.00%) 2,920,533k (± 0.02%) ~ 2,920,125k 2,921,524k p=0.128 n=6
Parse Time 13.39s (± 0.39%) 13.54s (± 0.55%) 0.15s ( 1.10%) 13.46s 13.65s p=0.006 n=6
Bind Time 4.06s (± 0.57%) 4.05s (± 0.20%) ~ 4.03s 4.05s p=0.655 n=6
Check Time 72.11s (± 0.34%) 72.09s (± 0.36%) ~ 71.78s 72.45s p=1.000 n=6
Emit Time 21.25s (± 9.71%) 20.95s (± 7.97%) ~ 19.37s 23.03s p=0.575 n=6
Total Time 110.81s (± 1.71%) 110.63s (± 1.64%) ~ 108.69s 112.88s p=1.000 n=6
webpack - node (v18.15.0, x64)
Memory used 409,598k (± 0.02%) 409,780k (± 0.02%) 183k ( 0.04%) 409,645k 409,901k p=0.008 n=6
Parse Time 4.84s (± 0.94%) 4.88s (± 0.85%) ~ 4.83s 4.94s p=0.123 n=6
Bind Time 2.02s (± 0.31%) 2.03s (± 0.72%) ~ 2.01s 2.04s p=0.320 n=6
Check Time 21.00s (± 0.37%) 21.03s (± 0.40%) ~ 20.90s 21.16s p=0.630 n=6
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) ~ 0.00s 0.00s p=1.000 n=6
Total Time 27.87s (± 0.41%) 27.94s (± 0.31%) ~ 27.79s 28.05s p=0.261 n=6
xstate-main - node (v18.15.0, x64)
Memory used 459,147k (± 0.01%) 459,275k (± 0.01%) 128k ( 0.03%) 459,215k 459,355k p=0.005 n=6
Parse Time 4.01s (± 0.48%) 4.01s (± 0.58%) ~ 3.98s 4.04s p=0.626 n=6
Bind Time 1.48s (± 0.66%) 1.46s (± 1.20%) ~ 1.44s 1.49s p=0.059 n=6
Check Time 22.34s (± 0.73%) 22.40s (± 0.58%) ~ 22.23s 22.59s p=0.574 n=6
Emit Time 0.00s (± 0.00%) 0.00s (± 0.00%) ~ 0.00s 0.00s p=1.000 n=6
Total Time 27.83s (± 0.60%) 27.88s (± 0.42%) ~ 27.71s 28.01s p=0.630 n=6
System info unknown
Hosts
  • node (v18.15.0, x64)
Scenarios
  • Angular - node (v18.15.0, x64)
  • Compiler-Unions - node (v18.15.0, x64)
  • mui-docs - node (v18.15.0, x64)
  • self-build-src - node (v18.15.0, x64)
  • self-build-src-public-api - node (v18.15.0, x64)
  • self-compiler - node (v18.15.0, x64)
  • ts-pre-modules - node (v18.15.0, x64)
  • vscode - node (v18.15.0, x64)
  • webpack - node (v18.15.0, x64)
  • xstate-main - node (v18.15.0, x64)
Benchmark Name Iterations
Current pr 6
Baseline baseline 6

tsserver

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
Compiler-UnionsTSServer - node (v18.15.0, x64)
Req 1 - updateOpen 3,494ms (± 0.41%) 3,499ms (± 0.75%) ~ 3,461ms 3,531ms p=0.810 n=6
Req 2 - geterr 7,670ms (± 2.01%) 7,608ms (± 1.97%) ~ 7,464ms 7,889ms p=0.689 n=6
Req 3 - references 432ms (± 2.45%) 432ms (± 1.93%) ~ 423ms 444ms p=1.000 n=6
Req 4 - navto 337ms (± 1.30%) 338ms (± 1.45%) ~ 330ms 345ms p=0.685 n=6
Req 5 - completionInfo count 1,357 (± 0.00%) 1,357 (± 0.00%) ~ 1,357 1,357 p=1.000 n=6
Req 5 - completionInfo 118ms (± 7.34%) 114ms (± 3.93%) ~ 111ms 122ms p=0.244 n=6
CompilerTSServer - node (v18.15.0, x64)
Req 1 - updateOpen 2,492ms (± 1.54%) 2,516ms (± 0.99%) ~ 2,485ms 2,543ms p=0.297 n=6
Req 2 - geterr 3,900ms (± 2.12%) 3,849ms (± 1.58%) ~ 3,807ms 3,971ms p=0.333 n=6
Req 3 - references 304ms (± 1.76%) 303ms (± 1.96%) ~ 298ms 312ms p=0.936 n=6
Req 4 - navto 228ms (± 0.77%) 228ms (± 0.62%) ~ 226ms 230ms p=0.677 n=6
Req 5 - completionInfo count 1,519 (± 0.00%) 1,519 (± 0.00%) ~ 1,519 1,519 p=1.000 n=6
Req 5 - completionInfo 81ms (± 5.33%) 78ms (± 8.76%) ~ 70ms 85ms p=0.513 n=6
xstate-main-1-tsserver - node (v18.15.0, x64)
Req 1 - updateOpen 7,763ms (± 0.24%) 7,793ms (± 0.42%) ~ 7,751ms 7,834ms p=0.109 n=6
Req 2 - geterr 1,686ms (± 1.15%) 1,682ms (± 0.93%) ~ 1,668ms 1,710ms p=0.575 n=6
Req 3 - references 135ms (± 1.01%) 133ms (± 2.72%) ~ 126ms 137ms p=0.059 n=6
Req 4 - navto 603ms (± 1.34%) 598ms (± 2.24%) ~ 574ms 608ms p=0.574 n=6
Req 5 - completionInfo count 3,413 (± 0.00%) 3,413 (± 0.00%) ~ 3,413 3,413 p=1.000 n=6
Req 5 - completionInfo 1,294ms (± 1.12%) 1,294ms (± 1.74%) ~ 1,248ms 1,307ms p=0.810 n=6
System info unknown
Hosts
  • node (v18.15.0, x64)
Scenarios
  • CompilerTSServer - node (v18.15.0, x64)
  • Compiler-UnionsTSServer - node (v18.15.0, x64)
  • xstate-main-1-tsserver - node (v18.15.0, x64)
Benchmark Name Iterations
Current pr 6
Baseline baseline 6

startup

Comparison Report - baseline..pr
Metric baseline pr Delta Best Worst p-value
tsc-startup - node (v18.15.0, x64)
Execution time 224.24ms (± 0.15%) 225.64ms (± 0.17%) 1.39ms ( 0.62%) 223.65ms 229.27ms p=0.000 n=600
tsserver-startup - node (v18.15.0, x64)
Execution time 342.14ms (± 0.31%) 343.80ms (± 0.33%) 1.66ms ( 0.49%) 335.41ms 355.84ms p=0.000 n=600
tsserverlibrary-startup - node (v18.15.0, x64)
Execution time 332.97ms (± 0.32%) 334.03ms (± 0.31%) 1.06ms ( 0.32%) 325.82ms 340.32ms p=0.000 n=600
typescript-startup - node (v18.15.0, x64)
Execution time 331.38ms (± 0.30%) 332.99ms (± 0.25%) 1.61ms ( 0.48%) 324.47ms 337.71ms p=0.000 n=600
System info unknown
Hosts
  • node (v18.15.0, x64)
Scenarios
  • tsc-startup - node (v18.15.0, x64)
  • tsserver-startup - node (v18.15.0, x64)
  • tsserverlibrary-startup - node (v18.15.0, x64)
  • typescript-startup - node (v18.15.0, x64)
Benchmark Name Iterations
Current pr 6
Baseline baseline 6

Developer Information:

Download Benchmarks

src/compiler/types.ts Outdated Show resolved Hide resolved
@DanielRosenwasser
Copy link
Member

So talking to a few people on our team, we still want to do some refactoring here and possibly move the logic to the parser or another component. On top of that, there may be a noticeable perf impact from this PR; however, we want this in for TypeScript 5.5 beta, and we're going to try to optimize after merging. If there is a considerable overhead, we will have to evaluate if this feature justifies the cost; but for now we are eager to push ahead on this and will merge.

Thank you for the contribution and all the work you've put into this PR!

@DanielRosenwasser DanielRosenwasser merged commit 42f238b into microsoft:main Apr 19, 2024
25 checks passed
@graphemecluster
Copy link
Contributor Author

I have resolved some of the conversations since this is merged.
And a big thank you for recognizing my efforts on the PR. It really means a lot to me!
I am pleased to work on it further during my free time.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
For Backlog Bug PRs that fix a backlog bug
Projects
None yet
7 participants