@d1g1tal/tsbuild 1.6.5 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,83 @@
1
+ ## [1.7.0](https://github.com/D1g1talEntr0py/tsbuild/compare/v1.6.5...v1.7.0) (2026-03-27)
2
+
3
+ ### Features
4
+
5
+ * **build:** add support for ES2025 ScriptTarget (2aecca9dc4ac67cd3e27021e34054a7c7552ebe9)
6
+ - Add `ES2025` targeting map for TS `ScriptTarget.ES2025` so newly produced esbuild configurations will honor it.
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **dts:** infer reference types for node protocols and correct module mapping (03c4ec5859b3741b7f30d590b38ea9c729128eea)
12
+ - Add logic in the `DeclarationBundler` to automatically infer `/// <reference types="node" />` when `node:` protocol imports are merged in, so the generated `.d.ts` file remains self-contained.
13
+ - Stop stripping inline `type` keywords from import statements in the `DeclarationProcessor`, preserving them for `.d.ts` output correctness.
14
+ - Remove unused `inlineTypePattern` import due to removing the stripping logic.
15
+ - Fix minor property initialization order formatting in `DeclarationBundler`.
16
+ - Add testing specific to these fixes in `declaration-bundler.test.ts` and `declaration-processor.test.ts`.
17
+
18
+ * **env:** support dynamic process.env extraction in config values (9469b5963d9ac5c1473bf500e96baa841b04b586)
19
+ - Expand `process.env` references dynamically in ESBuild `define` objects to support runtime-bound values instead of just static strings.
20
+
21
+ * **release:** manually update the workspace file since pnpm can't seem to get it right (8795a7497ab9cc26991001ef09145f8d92097841)
22
+
23
+ ### Code Refactoring
24
+
25
+ * **core:** simplify promise handling in TypeScript build configuration (e7b154ad9cf38347bf93cb3a48301753cead58e0)
26
+ - Remove intermediate `entryPointsPromise` variable and `.catch()` swallowing since rejection is natively handled when awaited later in the `build()` process.
27
+ - Improve the `tsbuildOptions` setup.
28
+
29
+ * **style:** remove explicit return types and clean up syntax (c306735aefb8ff4d4227f5bdaae21e7d0ed53f32)
30
+ - Remove redundant explicit return types from internal utility functions across several files (`constants`, `decorators`, `dts`, `file-manager`, `files`, `json`, `logger`, `paths`, etc.).
31
+ - Allow TypeScript to infer these return types automatically, reducing visual noise.
32
+ - Simplify closures to arrow functions or shortened arrow syntax where applicable.
33
+
34
+
35
+ ### Documentation
36
+
37
+ * **EADDRINUSE:** add issue draft for WSL2 network issue (5f5ea0d31f6df8e85a4e586c5f8018a56e5b2702)
38
+ - Add a detailed bug report draft describing the `EADDRINUSE` issue that occurs on every single activation attempt when running under WSL2 with `networkingMode=Mirrored`.
39
+ - Include a minimal reproduction case that demonstrates the underlying Node.js `net.createServer().listen()` race condition in WSL2 mirrored networking.
40
+ - Provide expected behavior and output logs for the VS Code extension failure.
41
+ - Suggest a direct bind and instance retention fix instead of the current close-and-reopen approach.
42
+
43
+ * **README:** update isolatedModules and TS strict requirements (c4a491791b8ad9d90c909ce9a2f8d03e1aeb0521)
44
+ - Update the minimum supported TypeScript badge to `>=5.6.3`.
45
+ - Clarify that `isolatedModules` is strictly required due to the reliance on esbuild for transpilation.
46
+ - Remove the `strict` option note for newer TS versions since it is enabled by default in TypeScript 6.0+.
47
+ - Add an "Advanced Features" section explicitly explaining *why* `isolatedModules` is necessary for esbuild.
48
+
49
+
50
+ ### Miscellaneous Chores
51
+
52
+ * **deps:** update package and lockfile dependencies (5a9f0623ffc63b42ddcdd7d2bc1882510f0a7d60)
53
+ - Update various devDependencies, including `typescript` to `^6.0.2` and related `@typescript-eslint` packages.
54
+ - Update `vitest` and coverage plugins to `^4.1.2`.
55
+ - Remove `@babel/plugin-proposal-decorators` and `@rolldown/plugin-babel` and replace Babel decorator handling in vitest config with a custom `esbuild` transformer.
56
+ - Add a `test:compat` script entry to test against 5 minor versions of TypeScript.
57
+ - Specify a peer dependency requirement for `typescript: >=5.6.3`.
58
+ - Modify `package.json` `types` field.
59
+ - Refresh and resolve `pnpm-lock.yaml` according to the new dependency state.
60
+
61
+ * **vscode:** set TS SDK path in settings (6e6622483d6648ba6cf283b362622665bd1dbede)
62
+ - Configure `.vscode/settings.json` to use the workspace `node_modules/typescript/lib` for the TypeScript language server.
63
+
64
+
65
+ ### Tests
66
+
67
+ * **compat:** introduce multi-version TypeScript testing script (3ad98b8cc914d6e7c37237713b11568e97ef1bbf)
68
+ - Add a new compatibility test script `test-ts-compat.ts` that iterates through minor TypeScript versions dynamically.
69
+ - Conditionally add support for testing `ES2024` and `ES2025` script targets only if the installed version of TS contains them.
70
+ - Implement a comprehensive type-guard/API compatibility test in `typescript-compatibility.test.ts` to guarantee runtime API availability.
71
+ - Update `tsconfig.json` for tests with required strict compatibility changes.
72
+
73
+
74
+ ### Continuous Integration
75
+
76
+ * **github:** add workflow for testing TypeScript compatibility (0c9bbbf8301ad66c4321fa9878169d66bbb1eda7)
77
+ - Create a new GitHub Actions workflow to run the test suite against multiple versions of TypeScript (5.6.3 to 6.0).
78
+ - Ensure backwards compatibility of the tools when run with older minimal supported TypeScript versions.
79
+ - Set up basic jobs utilizing `pnpm` and Node.js 24.
80
+
1
81
  ## [1.6.5](https://github.com/D1g1talEntr0py/tsbuild/compare/v1.6.4...v1.6.5) (2026-03-21)
2
82
 
3
83
  ### Code Refactoring
package/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![codecov](https://codecov.io/gh/D1g1talEntr0py/tsbuild/graph/badge.svg)](https://codecov.io/gh/D1g1talEntr0py/tsbuild)
7
7
  [![License: MIT](https://img.shields.io/github/license/D1g1talEntr0py/tsbuild)](https://github.com/D1g1talEntr0py/tsbuild/blob/main/LICENSE)
8
8
  [![Node.js](https://img.shields.io/node/v/@d1g1tal/tsbuild)](https://nodejs.org)
9
- [![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
9
+ [![TypeScript](https://img.shields.io/badge/TypeScript->=5.6.3-blue?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
10
10
 
11
11
  A TypeScript build tool that combines three tools into one workflow: **TypeScript's type system** for correctness, **esbuild** for speed, and **SWC** for legacy decorator metadata (optional, not installed by default). Built for modern ESM-only projects on Node.js 22+.
12
12
 
@@ -125,8 +125,7 @@ By default, bare specifiers (e.g. `lodash-es`) are kept as external imports. Use
125
125
  "outDir": "./dist",
126
126
  "declaration": true,
127
127
  "incremental": true, // redundant — tsbuild enables this by default, but explicit is clear
128
- "isolatedDeclarations": true, // recommended: enables faster parallel declaration emit
129
- "isolatedModules": true,
128
+ "isolatedModules": true, // required flags constructs esbuild can't safely transpile
130
129
  "verbatimModuleSyntax": true,
131
130
  "strict": true,
132
131
  "target": "ESNext",
@@ -149,11 +148,10 @@ Set `incremental: false` to opt out of the `.tsbuildinfo` cache entirely. Every
149
148
  "compilerOptions": {
150
149
  "outDir": "./dist",
151
150
  "declaration": true,
152
- "incremental": false, // disables TypeScript's .tsbuildinfo cache and tsbuild's DTS cache
153
- "isolatedDeclarations": true,
154
- "isolatedModules": true,
151
+ "incremental": false, // disables TypeScript's .tsbuildinfo cache and tsbuild's DTS cache
152
+ "isolatedModules": true, // required — flags constructs esbuild can't safely transpile
155
153
  "verbatimModuleSyntax": true,
156
- "strict": true,
154
+ "strict": true, // Not needed with TypeScript 6 and above, since strict mode is enabled by default
157
155
  "target": "ESNext",
158
156
  "module": "ESNext",
159
157
  "moduleResolution": "Bundler", // recommended for library builds processed by a bundler
@@ -429,6 +427,24 @@ By default, bare specifiers (e.g., `lodash`) are treated as external when `platf
429
427
 
430
428
  ## Advanced Features
431
429
 
430
+ ### Isolated Modules
431
+
432
+ Because tsbuild uses esbuild for transpilation, and esbuild processes each file independently without a full type graph, you should set `isolatedModules: true` in your `tsconfig.json`:
433
+
434
+ ```jsonc
435
+ {
436
+ "compilerOptions": {
437
+ "isolatedModules": true
438
+ }
439
+ }
440
+ ```
441
+
442
+ This tells TypeScript to flag any construct that requires cross-file knowledge to transpile correctly — things like `const enum`, ambient module augmentation, or re-exporting a type without the `type` keyword. Without this, esbuild may encounter one of these patterns and silently emit incorrect code, since it has no way to identify the problem at transpile time.
443
+
444
+ With `isolatedModules: true`, TypeScript catches these issues during the type-check phase, before esbuild runs, so you get a clear error instead of a subtle runtime bug.
445
+
446
+ **`verbatimModuleSyntax` implies `isolatedModules`:** If you have `verbatimModuleSyntax: true` in your config, it already enforces all of `isolatedModules` and goes further by requiring `import type` for all type-only imports. If you're using `verbatimModuleSyntax`, adding `isolatedModules` is redundant but harmless.
447
+
432
448
  ### Decorator Metadata
433
449
 
434
450
  #### TC39 Standard Decorators (recommended)
@@ -3,7 +3,7 @@ import {
3
3
  Json,
4
4
  Paths,
5
5
  typeScriptExtensionExpression
6
- } from "./7FPDHUPW.js";
6
+ } from "./YC2FB45E.js";
7
7
 
8
8
  // src/plugins/decorator-metadata.ts
9
9
  import { dirname } from "node:path";
@@ -22,14 +22,13 @@ import {
22
22
  dtsCacheFile,
23
23
  dtsCacheVersion,
24
24
  format,
25
- inlineTypePattern,
26
25
  newLine,
27
26
  processEnvExpansionPattern,
28
27
  sourceScriptExtensionExpression,
29
28
  toEsTarget,
30
29
  toJsxRenderingMode,
31
30
  typeMatcher
32
- } from "./7FPDHUPW.js";
31
+ } from "./YC2FB45E.js";
33
32
 
34
33
  // src/errors.ts
35
34
  import { SyntaxKind } from "typescript";
@@ -614,29 +613,7 @@ var DeclarationProcessor = class _DeclarationProcessor {
614
613
  return length;
615
614
  }
616
615
  for (const node of sourceFile.statements) {
617
- if (isImportDeclaration(node)) {
618
- if (node.importClause?.phaseModifier === SyntaxKind2.TypeKeyword) {
619
- const importKeywordEnd = node.getStart() + "import".length;
620
- const typeMatch = code.slice(importKeywordEnd, node.getEnd()).match(typeMatcher);
621
- if (typeMatch?.index !== void 0) {
622
- const typeKeywordStart = importKeywordEnd + typeMatch.index;
623
- const typeKeywordEnd = typeKeywordStart + "type".length;
624
- code.remove(typeKeywordStart, typeKeywordEnd + getTrailingWhitespaceLength(typeKeywordEnd, node.getEnd()));
625
- }
626
- } else {
627
- inlineTypePattern.lastIndex = 0;
628
- let match;
629
- const replacements = [];
630
- while ((match = inlineTypePattern.exec(code.slice(node.getStart(), node.getEnd()))) !== null) {
631
- const typeKeywordStart = node.getStart() + match.index + match[1].length;
632
- const typeKeywordEnd = typeKeywordStart + "type".length;
633
- replacements.push({ start: typeKeywordStart, end: typeKeywordEnd + getTrailingWhitespaceLength(typeKeywordEnd, node.getEnd()) });
634
- }
635
- for (let i = replacements.length - 1; i >= 0; i--) {
636
- code.remove(replacements[i].start, replacements[i].end);
637
- }
638
- }
639
- } else if (isExportDeclaration(node)) {
616
+ if (isExportDeclaration(node)) {
640
617
  if (node.exportClause && isNamedExports(node.exportClause) && node.exportClause.elements.length === 0 && !node.moduleSpecifier) {
641
618
  code.remove(getStart(node), getEnd(node));
642
619
  } else if (node.isTypeOnly) {
@@ -1295,9 +1272,15 @@ var DeclarationBundler = class {
1295
1272
  codeBlocks.push(strippedCode.trim());
1296
1273
  }
1297
1274
  }
1298
- const uniqueTypeReferences = [...new Set(allTypeReferences)];
1275
+ const typeReferencesSet = new Set(allTypeReferences);
1299
1276
  const uniqueFileReferences = [...new Set(allFileReferences)];
1300
1277
  const mergedExternalImports = mergeImports(allExternalImports);
1278
+ for (const imp of mergedExternalImports) {
1279
+ if (imp.includes('"node:') || imp.includes("'node:")) {
1280
+ typeReferencesSet.add("node");
1281
+ }
1282
+ }
1283
+ const uniqueTypeReferences = [...typeReferencesSet];
1301
1284
  const finalValueExports = [...new Set(allValueExports)];
1302
1285
  const finalValueExportsSet = new Set(finalValueExports);
1303
1286
  const finalTypeExports = [...new Set(allTypeExports.filter((typeExport) => !finalValueExportsSet.has(typeExport)))];
@@ -2100,6 +2083,7 @@ import { performance as performance2 } from "node:perf_hooks";
2100
2083
  import { sys as sys2, createIncrementalProgram, formatDiagnostics, formatDiagnosticsWithColorAndContext, parseJsonConfigFileContent, readConfigFile, findConfigFile } from "typescript";
2101
2084
  var globCharacters = /[*?\\[\]!].*$/;
2102
2085
  var domPredicate = (lib) => lib.toUpperCase() === "DOM";
2086
+ var tsLogo = TextFormat.bgBlue(TextFormat.bold(TextFormat.whiteBright(" TS ")));
2103
2087
  var diagnosticsHost = { getNewLine: () => sys2.newLine, getCurrentDirectory: sys2.getCurrentDirectory, getCanonicalFileName: (fileName) => fileName };
2104
2088
  var _triggerRebuild_dec, _processDeclarations_dec, _transpile_dec, _typeCheck_dec, _build_dec, _TypeScriptProject_decorators, _init3;
2105
2089
  _TypeScriptProject_decorators = [closeOnExit], _build_dec = [measure("Build")], _typeCheck_dec = [measure("Type-checking")], _transpile_dec = [measure("Transpile", true)], _processDeclarations_dec = [measure("Bundle Declarations", true)], _triggerRebuild_dec = [debounce(100)];
@@ -2128,10 +2112,7 @@ var _TypeScriptProject = class _TypeScriptProject {
2128
2112
  }
2129
2113
  this.fileManager = new FileManager(buildCache);
2130
2114
  this.builderProgram = createIncrementalProgram({ rootNames, options: this.configuration.compilerOptions, projectReferences, configFileParsingDiagnostics });
2131
- const entryPointsPromise = this.getEntryPoints(entryPoints);
2132
- entryPointsPromise.catch(() => {
2133
- });
2134
- this.buildConfiguration = { entryPoints: entryPointsPromise, target: toEsTarget(target), outDir, ...tsbuildOptions };
2115
+ this.buildConfiguration = { entryPoints: this.getEntryPoints(entryPoints), target: toEsTarget(target), outDir, ...tsbuildOptions };
2135
2116
  }
2136
2117
  /**
2137
2118
  * Cleans the output directory
@@ -2141,8 +2122,7 @@ var _TypeScriptProject = class _TypeScriptProject {
2141
2122
  return Files.empty(this.buildConfiguration.outDir);
2142
2123
  }
2143
2124
  async build() {
2144
- const tsLogo = TextFormat.bgBlue(TextFormat.bold(TextFormat.whiteBright(" TS ")));
2145
- Logger.header(`${tsLogo} tsbuild v${"1.6.5"}${this.configuration.compilerOptions.incremental && this.configuration.buildCache?.isValid() ? " [incremental]" : ""}`);
2125
+ Logger.header(`${tsLogo} tsbuild v${"1.7.0"}${this.configuration.compilerOptions.incremental && this.configuration.buildCache?.isValid() ? " [incremental]" : ""}`);
2146
2126
  try {
2147
2127
  const processes = [];
2148
2128
  const filesWereEmitted = await this.typeCheck();
@@ -2201,7 +2181,7 @@ var _TypeScriptProject = class _TypeScriptProject {
2201
2181
  }
2202
2182
  if (this.configuration.compilerOptions.emitDecoratorMetadata) {
2203
2183
  try {
2204
- const { swcDecoratorMetadataPlugin } = await import("./GQLOAEUW.js");
2184
+ const { swcDecoratorMetadataPlugin } = await import("./GNBUFD72.js");
2205
2185
  plugins.push(swcDecoratorMetadataPlugin);
2206
2186
  } catch {
2207
2187
  throw new ConfigurationError("emitDecoratorMetadata is enabled but @swc/core is not installed. Install it with: pnpm add -D @swc/core");
@@ -2533,10 +2513,10 @@ var _TypeScriptProject = class _TypeScriptProject {
2533
2513
  * @returns Elapsed time in milliseconds
2534
2514
  */
2535
2515
  static elapsed(markName) {
2536
- const endMark = performance2.mark(`${markName}:end`);
2537
- const ms = ~~(endMark.startTime - performance2.getEntriesByName(markName, "mark")[0].startTime);
2516
+ const { name, startTime } = performance2.mark(`${markName}:end`);
2517
+ const ms = ~~(startTime - performance2.getEntriesByName(markName, "mark")[0].startTime);
2538
2518
  performance2.clearMarks(markName);
2539
- performance2.clearMarks(endMark.name);
2519
+ performance2.clearMarks(name);
2540
2520
  return ms;
2541
2521
  }
2542
2522
  };
@@ -81,6 +81,7 @@ var scriptTargetToEsTarget = {
81
81
  [ScriptTarget.ES2022]: "ES2022",
82
82
  [ScriptTarget.ES2023]: "ES2023",
83
83
  [ScriptTarget.ES2024]: "ES2024",
84
+ [ScriptTarget.ES2025]: "ES2025",
84
85
  [ScriptTarget.ESNext]: "ESNext",
85
86
  [ScriptTarget.JSON]: "ESNext"
86
87
  };
@@ -119,7 +120,6 @@ var typeMatcher = /\btype\b/;
119
120
  var sourceScriptExtensionExpression = /(?<!\.d)\.[jt]sx?$/;
120
121
  var typeScriptExtensionExpression = /(\.tsx?)$/;
121
122
  var processEnvExpansionPattern = /\$\{process\.env\.([^}]+)\}/g;
122
- var inlineTypePattern = /([{,]\s+)type\s+/g;
123
123
 
124
124
  // src/paths.ts
125
125
  import { lstat } from "node:fs/promises";
@@ -279,7 +279,6 @@ export {
279
279
  sourceScriptExtensionExpression,
280
280
  typeScriptExtensionExpression,
281
281
  processEnvExpansionPattern,
282
- inlineTypePattern,
283
282
  Paths,
284
283
  Json
285
284
  };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,9 @@
1
- import { Plugin, TsconfigRaw } from "esbuild";
2
- import { FileSystemEvent, WatchrOptions } from "@d1g1tal/watchr";
3
- import { CompilerOptions, Diagnostic, ProjectReference, ScriptTarget } from "typescript";
4
- import { PerformanceEntry, PerformanceMeasureOptions } from "node:perf_hooks";
1
+ /// <reference types="node" />
2
+
3
+ import type { Plugin, TsconfigRaw } from "esbuild";
4
+ import type { FileSystemEvent, WatchrOptions } from "@d1g1tal/watchr";
5
+ import type { CompilerOptions, Diagnostic, ProjectReference, ScriptTarget } from "typescript";
6
+ import type { PerformanceEntry, PerformanceMeasureOptions } from "node:perf_hooks";
5
7
 
6
8
  declare global {
7
9
  interface ImportMeta {
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TypeScriptProject
3
- } from "./SFYLP6W7.js";
4
- import "./7FPDHUPW.js";
3
+ } from "./QNWF5BZL.js";
4
+ import "./YC2FB45E.js";
5
5
  export {
6
6
  TypeScriptProject
7
7
  };
package/dist/tsbuild.js CHANGED
@@ -2,8 +2,8 @@
2
2
  import {
3
3
  BuildError,
4
4
  TypeScriptProject
5
- } from "./SFYLP6W7.js";
6
- import "./7FPDHUPW.js";
5
+ } from "./QNWF5BZL.js";
6
+ import "./YC2FB45E.js";
7
7
 
8
8
  // src/tsbuild.ts
9
9
  import { sys } from "typescript";
@@ -30,7 +30,7 @@ if (help) {
30
30
  process.exit(0);
31
31
  }
32
32
  if (version) {
33
- console.log("1.6.5");
33
+ console.log("1.7.0");
34
34
  process.exit(0);
35
35
  }
36
36
  var typeScriptOptions = {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@d1g1tal/tsbuild",
3
3
  "author": "D1g1talEntr0py",
4
- "version": "1.6.5",
4
+ "version": "1.7.0",
5
5
  "license": "MIT",
6
6
  "description": "A fast, ESM-only TypeScript build tool combining the TypeScript API for type checking and declaration generation, esbuild for bundling, and SWC for decorator metadata.",
7
7
  "homepage": "https://github.com/D1g1talEntr0py/tsbuild#readme",
@@ -26,6 +26,7 @@
26
26
  "access": "public"
27
27
  },
28
28
  "type": "module",
29
+ "types": "./dist/index.d.ts",
29
30
  "exports": {
30
31
  ".": {
31
32
  "types": "./dist/index.d.ts",
@@ -43,26 +44,27 @@
43
44
  "tsbuild": "./dist/tsbuild.js"
44
45
  },
45
46
  "dependencies": {
46
- "@d1g1tal/watchr": "^1.0.4",
47
+ "@d1g1tal/watchr": "^1.0.5",
47
48
  "esbuild": "^0.27.4",
48
49
  "magic-string": "^0.30.21"
49
50
  },
50
51
  "devDependencies": {
51
- "@babel/plugin-proposal-decorators": "^7.29.0",
52
52
  "@eslint/js": "^10.0.1",
53
- "@rolldown/plugin-babel": "^0.2.2",
54
53
  "@types/node": "^25.5.0",
55
- "@typescript-eslint/eslint-plugin": "^8.57.1",
56
- "@typescript-eslint/parser": "^8.57.1",
57
- "@vitest/coverage-v8": "^4.1.0",
54
+ "@typescript-eslint/eslint-plugin": "^8.57.2",
55
+ "@typescript-eslint/parser": "^8.57.2",
56
+ "@vitest/coverage-v8": "^4.1.2",
58
57
  "eslint": "^10.1.0",
59
- "eslint-plugin-jsdoc": "^62.8.0",
58
+ "eslint-plugin-jsdoc": "^62.8.1",
60
59
  "fs-monkey": "^1.1.0",
61
- "memfs": "^4.56.11",
60
+ "memfs": "^4.57.1",
62
61
  "tsx": "^4.21.0",
63
- "typescript": "^5.9.3",
64
- "typescript-eslint": "^8.57.1",
65
- "vitest": "^4.1.0"
62
+ "typescript": "^6.0.2",
63
+ "typescript-eslint": "^8.57.2",
64
+ "vitest": "^4.1.2"
65
+ },
66
+ "peerDependencies": {
67
+ "typescript": ">=5.6.3"
66
68
  },
67
69
  "keywords": [
68
70
  "typescript",
@@ -83,6 +85,7 @@
83
85
  "lint": "eslint ./src",
84
86
  "test": "vitest run",
85
87
  "test:coverage": "vitest run --coverage",
86
- "test:watch": "vitest"
88
+ "test:watch": "vitest",
89
+ "test:compat": "tsx tests/scripts/test-ts-compat.ts --versions 5"
87
90
  }
88
91
  }