Properly handle negative error codes in typescript diagnostic identifiers for tsc_wrapped diagnostics extensions

Since diagnostic identifier code's are of type `number`, both positive and negative numbers should be valid.

PiperOrigin-RevId: 282587002
diff --git a/internal/tsc_wrapped/diagnostics.ts b/internal/tsc_wrapped/diagnostics.ts
index 89c2680..32fbfe0 100644
--- a/internal/tsc_wrapped/diagnostics.ts
+++ b/internal/tsc_wrapped/diagnostics.ts
@@ -22,7 +22,7 @@
   // 2. Required TS error: 'TS2000: message text.'
   // Need triple escapes because the expected diagnostics that we're matching
   // here are regexes, too.
-  const ERROR_RE = /^(?:\\\((\d*),(\d*)\\\).*)?TS(\d+):(.*)/;
+  const ERROR_RE = /^(?:\\\((\d*),(\d*)\\\).*)?TS(-?\d+):(.*)/;
   const incorrectErrors =
       bazelOpts.expectedDiagnostics.filter(e => !e.match(ERROR_RE));
   if (incorrectErrors.length) {
@@ -52,7 +52,7 @@
 
   const expectedDiags: ExpectedDiagnostics[] =
       bazelOpts.expectedDiagnostics.map(expected => {
-        const m = expected.match(/^(?:\\\((\d*),(\d*)\\\).*)?TS(\d+):(.*)$/);
+        const m = expected.match(/^(?:\\\((\d*),(\d*)\\\).*)?TS(-?\d+):(.*)$/);
         if (!m) {
           throw new Error(
               'Incorrect expected error, did you forget character escapes in ' +
diff --git a/internal/tsc_wrapped/diagnostics_test.ts b/internal/tsc_wrapped/diagnostics_test.ts
index fceece4..8acf212 100644
--- a/internal/tsc_wrapped/diagnostics_test.ts
+++ b/internal/tsc_wrapped/diagnostics_test.ts
@@ -58,5 +58,10 @@
               'Incorrect expected error, did you forget character escapes in ' +
               'TS1234:unescaped \n newline');
     });
+
+    it('handle negative diagnostic codes', () => {
+      expect(filter(['TS-999:custom error'], [diag(-999, 'custom error')]))
+          .toEqual([]);
+    });
   });
 });