From 6f4721adbe8e444d69c04d9fa3845de11ff4b0c3 Mon Sep 17 00:00:00 2001 From: Tommy Nguyen <4123478+tido64@users.noreply.github.com> Date: Tue, 4 Jun 2024 08:40:25 +0200 Subject: [PATCH] test: support Node test runner (#3163) --- .changeset/angry-moons-know.md | 2 + packages/tools-language/package.json | 5 - .../tools-language/test/properties.test.ts | 90 ++++---- packages/tools-node/package.json | 5 - packages/tools-node/test/module.test.ts | 82 ++++---- packages/tools-node/test/package.test.ts | 194 +++++++++--------- packages/tools-node/test/path.test.ts | 10 +- scripts/package.json | 7 + scripts/src/commands/test.js | 25 ++- yarn.lock | 52 ++++- 10 files changed, 268 insertions(+), 204 deletions(-) create mode 100644 .changeset/angry-moons-know.md diff --git a/.changeset/angry-moons-know.md b/.changeset/angry-moons-know.md new file mode 100644 index 000000000..a845151cc --- /dev/null +++ b/.changeset/angry-moons-know.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/packages/tools-language/package.json b/packages/tools-language/package.json index b3f31e99d..af04daf15 100644 --- a/packages/tools-language/package.json +++ b/packages/tools-language/package.json @@ -44,16 +44,11 @@ }, "devDependencies": { "@rnx-kit/eslint-config": "*", - "@rnx-kit/jest-preset": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^20.0.0", "eslint": "^8.56.0", - "jest": "^29.2.1", "prettier": "^3.0.0", "typescript": "^5.0.0" - }, - "jest": { - "preset": "@rnx-kit/jest-preset/private" } } diff --git a/packages/tools-language/test/properties.test.ts b/packages/tools-language/test/properties.test.ts index 52da1e935..cdd7715b5 100644 --- a/packages/tools-language/test/properties.test.ts +++ b/packages/tools-language/test/properties.test.ts @@ -1,51 +1,52 @@ +import { deepEqual, equal } from "node:assert/strict"; +import { describe, it } from "node:test"; import { hasProperty, pickValues } from "../src/properties"; describe("Language > Props > pickValues", () => { - test("returns undefined when no keys are found", () => { - expect(pickValues({} as { x?: string }, ["x"])).toBeUndefined(); + it("returns undefined when no keys are found", () => { + equal(pickValues({} as { x?: string }, ["x"]), undefined); }); - test("returns undefined when no keys are given", () => { - expect(pickValues({ x: 123 }, [])).toBeUndefined(); + it("returns undefined when no keys are given", () => { + equal(pickValues({ x: 123 }, []), undefined); }); - test("picks a single value", () => { - expect(pickValues({ x: 123 }, ["x"])).toEqual({ x: 123 }); + it("picks a single value", () => { + deepEqual(pickValues({ x: 123 }, ["x"]), { x: 123 }); }); - test("picks a single value from an object with multiple values", () => { - expect(pickValues({ x: 123, y: "test", z: true }, ["y"])).toEqual({ + it("picks a single value from an object with multiple values", () => { + deepEqual(pickValues({ x: 123, y: "test", z: true }, ["y"]), { y: "test", }); }); - test("picks a single value using the given name", () => { - expect( - pickValues({ x: 123, y: "test", z: true }, ["y"], ["picked"]) - ).toEqual({ picked: "test" }); + it("picks a single value using the given name", () => { + deepEqual(pickValues({ x: 123, y: "test", z: true }, ["y"], ["picked"]), { + picked: "test", + }); + }); + + it("picks all keys", () => { + deepEqual(pickValues({ x: 123, y: "test", z: true }, ["x", "y", "z"]), { + x: 123, + y: "test", + z: true, + }); }); - test("picks all keys", () => { - expect(pickValues({ x: 123, y: "test", z: true }, ["x", "y", "z"])).toEqual( + it("picks some keys using different names", () => { + deepEqual( + pickValues({ x: 123, y: "test", z: true }, ["x", "z"], ["a", "b-b"]), { - x: 123, - y: "test", - z: true, + a: 123, + "b-b": true, } ); }); - test("picks some keys using different names", () => { - expect( - pickValues({ x: 123, y: "test", z: true }, ["x", "z"], ["a", "b-b"]) - ).toEqual({ - a: 123, - "b-b": true, - }); - }); - - test("picks some keys", () => { - expect( + it("picks some keys", () => { + deepEqual( pickValues( { x: 123, y: "test", z: true } as { x: number; @@ -54,32 +55,33 @@ describe("Language > Props > pickValues", () => { foo?: string; }, ["x", "y", "foo"] - ) - ).toEqual({ x: 123, y: "test" }); + ), + { x: 123, y: "test" } + ); }); }); describe("Language > Props > hasProperty", () => { - test("returns false for primitives", () => { - expect(hasProperty("string", "0")).toBe(false); - expect(hasProperty(0, "0")).toBe(false); - expect(hasProperty(true, "0")).toBe(false); - expect(hasProperty(null, "0")).toBe(false); - expect(hasProperty(undefined, "0")).toBe(false); + it("returns false for primitives", () => { + equal(hasProperty("string", "0"), false); + equal(hasProperty(0, "0"), false); + equal(hasProperty(true, "0"), false); + equal(hasProperty(null, "0"), false); + equal(hasProperty(undefined, "0"), false); }); - test("returns true for objects with specified property", () => { + it("returns true for objects with specified property", () => { const testObj = { message: "code", code: 0 }; - expect(hasProperty(testObj, "code")).toBe(true); - expect(hasProperty(testObj, "message")).toBe(true); - expect(hasProperty(testObj, "stack")).toBe(false); + equal(hasProperty(testObj, "code"), true); + equal(hasProperty(testObj, "message"), true); + equal(hasProperty(testObj, "stack"), false); }); - test("returns true for objects with inherited property", () => { + it("returns true for objects with inherited property", () => { const testProto = { message: "code", code: 0 }; const testObj = Object.create(testProto); - expect(hasProperty(testObj, "code")).toBe(true); - expect(hasProperty(testObj, "message")).toBe(true); - expect(hasProperty(testObj, "stack")).toBe(false); + equal(hasProperty(testObj, "code"), true); + equal(hasProperty(testObj, "message"), true); + equal(hasProperty(testObj, "stack"), false); }); }); diff --git a/packages/tools-node/package.json b/packages/tools-node/package.json index 89ebdfa0e..da7233644 100644 --- a/packages/tools-node/package.json +++ b/packages/tools-node/package.json @@ -58,16 +58,11 @@ }, "devDependencies": { "@rnx-kit/eslint-config": "*", - "@rnx-kit/jest-preset": "*", "@rnx-kit/scripts": "*", "@rnx-kit/tsconfig": "*", "@types/node": "^20.0.0", "eslint": "^8.56.0", - "jest": "^29.2.1", "prettier": "^3.0.0", "typescript": "^5.0.0" - }, - "jest": { - "preset": "@rnx-kit/jest-preset/private" } } diff --git a/packages/tools-node/test/module.test.ts b/packages/tools-node/test/module.test.ts index bff3aefb3..9ac1e477b 100644 --- a/packages/tools-node/test/module.test.ts +++ b/packages/tools-node/test/module.test.ts @@ -1,6 +1,9 @@ -import fs from "fs"; -import os from "os"; -import path from "path"; +import { deepEqual, equal } from "node:assert/strict"; +import * as fs from "node:fs"; +import * as os from "node:os"; +import * as path from "node:path"; +import { before, describe, it } from "node:test"; +import { URL, fileURLToPath } from "node:url"; import { getPackageModuleRefFromModulePath, isFileModuleRef, @@ -9,65 +12,65 @@ import { } from "../src/module"; describe("Node > Module", () => { - const fixtureDir = path.resolve(__dirname, "__fixtures__"); + const fixtureDir = fileURLToPath(new URL("__fixtures__", import.meta.url)); - beforeAll(() => { - expect(fs.existsSync(fixtureDir)).toBe(true); + before(() => { + equal(fs.existsSync(fixtureDir), true); }); - test("parseModuleRef('react-native')", () => { - expect(parseModuleRef("react-native")).toEqual({ + it("parseModuleRef('react-native')", () => { + deepEqual(parseModuleRef("react-native"), { name: "react-native", }); }); - test("parseModuleRef('react-native/Libraries/Promise')", () => { - expect(parseModuleRef("react-native/Libraries/Promise")).toEqual({ + it("parseModuleRef('react-native/Libraries/Promise')", () => { + deepEqual(parseModuleRef("react-native/Libraries/Promise"), { name: "react-native", path: "Libraries/Promise", }); }); - test("parseModuleRef('@babel/core')", () => { - expect(parseModuleRef("@babel/core")).toEqual({ + it("parseModuleRef('@babel/core')", () => { + deepEqual(parseModuleRef("@babel/core"), { scope: "@babel", name: "core", }); }); - test("parseModuleRef('@babel/core/parse')", () => { - expect(parseModuleRef("@babel/core/parse")).toEqual({ + it("parseModuleRef('@babel/core/parse')", () => { + deepEqual(parseModuleRef("@babel/core/parse"), { scope: "@babel", name: "core", path: "parse", }); }); - test("parseModuleRef('@types/babel__core')", () => { - expect(parseModuleRef("@types/babel__core")).toEqual({ + it("parseModuleRef('@types/babel__core')", () => { + deepEqual(parseModuleRef("@types/babel__core"), { scope: "@types", name: "babel__core", }); }); - test("parseModuleRef('./parser')", () => { - expect(parseModuleRef("./parser")).toEqual({ + it("parseModuleRef('./parser')", () => { + deepEqual(parseModuleRef("./parser"), { path: "./parser", }); }); - test("parseModuleRef('../../src/parser')", () => { - expect(parseModuleRef("../../src/parser")).toEqual({ + it("parseModuleRef('../../src/parser')", () => { + deepEqual(parseModuleRef("../../src/parser"), { path: "../../src/parser", }); }); - test("parseModuleRef('/absolute/path/src/parser')", () => { - expect(parseModuleRef("/absolute/path/src/parser")).toEqual({ + it("parseModuleRef('/absolute/path/src/parser')", () => { + deepEqual(parseModuleRef("/absolute/path/src/parser"), { path: "/absolute/path/src/parser", }); if (os.platform() === "win32") { - expect(parseModuleRef("C:/absolute/path/src/parser")).toEqual({ + deepEqual(parseModuleRef("C:/absolute/path/src/parser"), { path: "C:/absolute/path/src/parser", }); } @@ -86,39 +89,40 @@ describe("Node > Module", () => { "/repos/rnx-kit/package/tools/parser", ]; - test("isPackageModuleRef() returns true for package-based refs", () => { + it("isPackageModuleRef() returns true for package-based refs", () => { for (const r of packageModuleRefs) { - expect(isPackageModuleRef(parseModuleRef(r))).toBe(true); + equal(isPackageModuleRef(parseModuleRef(r)), true); } }); - test("isPackageModuleRef() returns false for file-based refs", () => { + it("isPackageModuleRef() returns false for file-based refs", () => { for (const r of fileModuleRefs) { - expect(isPackageModuleRef(parseModuleRef(r))).toBe(false); + equal(isPackageModuleRef(parseModuleRef(r)), false); } }); - test("isFileModuleRef() returns true for file-based refs", () => { + it("isFileModuleRef() returns true for file-based refs", () => { for (const r of fileModuleRefs) { - expect(isFileModuleRef(parseModuleRef(r))).toBe(true); + equal(isFileModuleRef(parseModuleRef(r)), true); } }); - test("isFileModuleRef() returns false for package-based refs", () => { + it("isFileModuleRef() returns false for package-based refs", () => { for (const r of packageModuleRefs) { - expect(isFileModuleRef(parseModuleRef(r))).toBe(false); + equal(isFileModuleRef(parseModuleRef(r)), false); } }); - test("getPackageModuleRefFromModulePath() returns a valid ref when given a path to a scoped module", () => { - expect( + it("getPackageModuleRefFromModulePath() returns a valid ref when given a path to a scoped module", () => { + deepEqual( getPackageModuleRefFromModulePath( path.join(fixtureDir, "node_modules", "@babel", "core", "foo") - ) - ).toEqual({ - scope: "@babel", - name: "core", - path: "foo", - }); + ), + { + scope: "@babel", + name: "core", + path: "foo", + } + ); }); }); diff --git a/packages/tools-node/test/package.test.ts b/packages/tools-node/test/package.test.ts index 23910736e..3b68e83e4 100644 --- a/packages/tools-node/test/package.test.ts +++ b/packages/tools-node/test/package.test.ts @@ -1,6 +1,9 @@ +import { deepEqual, equal, throws } from "node:assert/strict"; import * as fs from "node:fs"; import * as os from "node:os"; import * as path from "node:path"; +import { afterEach, before, beforeEach, describe, it } from "node:test"; +import { fileURLToPath } from "node:url"; import type { PackageManifest } from "../src/package"; import { findPackage, @@ -12,12 +15,12 @@ import { } from "../src/package"; describe("Node > Package", () => { - const fixtureDir = path.resolve(__dirname, "__fixtures__"); + const fixtureDir = fileURLToPath(new URL("__fixtures__", import.meta.url)); const tempDir = fs.realpathSync(os.tmpdir()); - beforeAll(() => { - expect(fs.existsSync(fixtureDir)).toBe(true); - expect(fs.existsSync(tempDir)).toBe(true); + before(() => { + equal(fs.existsSync(fixtureDir), true); + equal(fs.existsSync(tempDir), true); }); let testTempDir: string; @@ -32,89 +35,89 @@ describe("Node > Package", () => { fs.rmSync(testTempDir, { maxRetries: 5, recursive: true }); }); - test("parsePackageRef(react-native) returns an unscoped reference", () => { - expect(parsePackageRef("react-native")).toEqual({ name: "react-native" }); + it("parsePackageRef(react-native) returns an unscoped reference", () => { + deepEqual(parsePackageRef("react-native"), { name: "react-native" }); }); - test("parsePackageRef(@babel/core) returns a scoped reference", () => { - expect(parsePackageRef("@babel/core")).toEqual({ + it("parsePackageRef(@babel/core) returns a scoped reference", () => { + deepEqual(parsePackageRef("@babel/core"), { scope: "@babel", name: "core", }); }); - test("parsePackageRef(@alias) is allowed", () => { - expect(parsePackageRef("@alias")).toEqual({ name: "@alias" }); + it("parsePackageRef(@alias) is allowed", () => { + deepEqual(parsePackageRef("@alias"), { name: "@alias" }); }); - test("parsePackageRef(undefined) throws an Error", () => { + it("parsePackageRef(undefined) throws an Error", () => { // @ts-expect-error Argument of type 'undefined' is not assignable to parameter of type 'string' - expect(() => parsePackageRef(undefined)).toThrow(); + throws(() => parsePackageRef(undefined)); }); - test("parsePackageRef(@babel/) throws an Error", () => { - expect(() => parsePackageRef("@babel/")).toThrow(); + it("parsePackageRef(@babel/) throws an Error", () => { + throws(() => parsePackageRef("@babel/")); }); - test("parsePackageRef(@/core) throws an Error", () => { - expect(() => parsePackageRef("@/core")).toThrow(); + it("parsePackageRef(@/core) throws an Error", () => { + throws(() => parsePackageRef("@/core")); }); - test("readPackage() loads package.json when given its containing directory", () => { + it("readPackage() loads package.json when given its containing directory", () => { const manifest = readPackage(fixtureDir); - expect(manifest.name).toEqual("test-package"); - expect(manifest.version).toEqual("4.5.1"); + equal(manifest.name, "test-package"); + equal(manifest.version, "4.5.1"); }); - test("readPackage() loads package.json when given a full path to it", () => { + it("readPackage() loads package.json when given a full path to it", () => { const manifest = readPackage(path.join(fixtureDir, "package.json")); - expect(manifest.name).toEqual("test-package"); - expect(manifest.version).toEqual("4.5.1"); + equal(manifest.name, "test-package"); + equal(manifest.version, "4.5.1"); }); - test("writePackage() writes package.json when given a containing directory", () => { + it("writePackage() writes package.json when given a containing directory", () => { const pkgPath = path.join(testTempDir, "package.json"); const manifest: PackageManifest = { name: "package name", version: "1.0.0", }; - expect(fs.existsSync(pkgPath)).toBe(false); + equal(fs.existsSync(pkgPath), false); writePackage(testTempDir, manifest); - expect(fs.existsSync(pkgPath)).toBe(true); + equal(fs.existsSync(pkgPath), true); }); - test("writePackage() writes package.json when given a full path to it", () => { + it("writePackage() writes package.json when given a full path to it", () => { const pkgPath = path.join(testTempDir, "package.json"); const manifest: PackageManifest = { name: "package name", version: "1.0.0", }; - expect(fs.existsSync(pkgPath)).toBe(false); + equal(fs.existsSync(pkgPath), false); writePackage(pkgPath, manifest); - expect(fs.existsSync(pkgPath)).toBe(true); + equal(fs.existsSync(pkgPath), true); }); - test("findPackage() returns the nearest package.json file", () => { + it("findPackage() returns the nearest package.json file", () => { const pkgFile = findPackage(fixtureDir); - expect(pkgFile).toEqual(path.join(fixtureDir, "package.json")); + equal(pkgFile, path.join(fixtureDir, "package.json")); }); - test("findPackage() return undefined when it does not find anything", () => { + it("findPackage() return undefined when it does not find anything", () => { const pkgFile = findPackage(testTempDir); - expect(pkgFile).toBeUndefined(); + equal(pkgFile, undefined); }); - test("findPackageDir() returns the parent directory of the nearest package.json file", () => { + it("findPackageDir() returns the parent directory of the nearest package.json file", () => { const pkgDir = findPackageDir(fixtureDir); - expect(pkgDir).toEqual(fixtureDir); + equal(pkgDir, fixtureDir); }); - test("findPackageDir() returns undefined when it does not find anything", () => { + it("findPackageDir() returns undefined when it does not find anything", () => { const pkgDir = findPackageDir(testTempDir); - expect(pkgDir).toBeUndefined(); + equal(pkgDir, undefined); }); - test("findPackageDependencyDir() returns the package directory", () => { + it("findPackageDependencyDir() returns the package directory", () => { const pkgDir = findPackageDependencyDir( { scope: "@babel", @@ -124,66 +127,71 @@ describe("Node > Package", () => { startDir: fixtureDir, } ); - expect(pkgDir).toEqual( - path.join(fixtureDir, "node_modules", "@babel", "core") - ); + equal(pkgDir, path.join(fixtureDir, "node_modules", "@babel", "core")); }); - test("findPackageDependencyDir() accepts strings", () => { + it("findPackageDependencyDir() accepts strings", () => { const pkgDir = findPackageDependencyDir("@babel/core", { startDir: fixtureDir, }); - expect(pkgDir).toEqual( - path.join(fixtureDir, "node_modules", "@babel/core") - ); - }); - - test("findPackageDependencyDir() finds a symlink package dir by default", () => { - const coreLinkedPath = path.join( - fixtureDir, - "node_modules", - "@babel", - "core-linked" - ); - expect(fs.lstatSync(coreLinkedPath).isSymbolicLink()).toBeTruthy(); - - const pkgDir = findPackageDependencyDir( - { - scope: "@babel", - name: "core-linked", - }, - { - startDir: fixtureDir, - } - ); - expect(pkgDir).toEqual( - path.join(fixtureDir, "node_modules", "@babel", "core-linked") - ); - }); - - test("findPackageDependencyDir() finds nothing when a symlink is the only valid result but allowSymlinks is false", () => { - const coreLinkedPath = path.join( - fixtureDir, - "node_modules", - "@babel", - "core-linked" - ); - expect(fs.lstatSync(coreLinkedPath).isSymbolicLink()).toBeTruthy(); - - const pkgDir = findPackageDependencyDir( - { - scope: "@babel", - name: "core-linked", - }, - { - startDir: fixtureDir, - allowSymlinks: false, - } - ); - expect(pkgDir).toBeUndefined(); - }); - - test("findPackageDependencyDir() returns undefined when it does not find anything", () => { + equal(pkgDir, path.join(fixtureDir, "node_modules", "@babel/core")); + }); + + it( + "findPackageDependencyDir() finds a symlink package dir by default", + { skip: process.platform === "win32" }, + () => { + const coreLinkedPath = path.join( + fixtureDir, + "node_modules", + "@babel", + "core-linked" + ); + equal(fs.lstatSync(coreLinkedPath).isSymbolicLink(), true); + + const pkgDir = findPackageDependencyDir( + { + scope: "@babel", + name: "core-linked", + }, + { + startDir: fixtureDir, + } + ); + equal( + pkgDir, + path.join(fixtureDir, "node_modules", "@babel", "core-linked") + ); + } + ); + + it( + "findPackageDependencyDir() finds nothing when a symlink is the only valid result but allowSymlinks is false", + { skip: process.platform === "win32" }, + () => { + const coreLinkedPath = path.join( + fixtureDir, + "node_modules", + "@babel", + "core-linked" + ); + equal(fs.lstatSync(coreLinkedPath).isSymbolicLink(), true); + + const pkgDir = findPackageDependencyDir( + { + scope: "@babel", + name: "core-linked", + }, + { + startDir: fixtureDir, + allowSymlinks: false, + } + ); + equal(pkgDir, undefined); + } + ); + + it("findPackageDependencyDir() returns undefined when it does not find anything", () => { const pkgDir = findPackageDependencyDir( { name: "does-not-exist", @@ -192,6 +200,6 @@ describe("Node > Package", () => { startDir: fixtureDir, } ); - expect(pkgDir).toBeUndefined(); + equal(pkgDir, undefined); }); }); diff --git a/packages/tools-node/test/path.test.ts b/packages/tools-node/test/path.test.ts index 87971fa1b..4569f594b 100644 --- a/packages/tools-node/test/path.test.ts +++ b/packages/tools-node/test/path.test.ts @@ -1,11 +1,13 @@ +import { equal } from "node:assert/strict"; +import { describe, it } from "node:test"; import { normalizePath } from "../src/path"; describe("Node > Path", () => { - test("normalizePath() changes all backslashes to forward slashes", () => { - expect(normalizePath(String.raw`\\hello\test`)).toEqual("//hello/test"); + it("normalizePath() changes all backslashes to forward slashes", () => { + equal(normalizePath(String.raw`\\hello\test`), "//hello/test"); }); - test("normalizePath() changes nothing when the input string has no backslashes", () => { - expect(normalizePath("hello/test")).toEqual("hello/test"); + it("normalizePath() changes nothing when the input string has no backslashes", () => { + equal(normalizePath("hello/test"), "hello/test"); }); }); diff --git a/scripts/package.json b/scripts/package.json index 55a62ecc0..5bf556375 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -17,10 +17,12 @@ "depcheck": "^1.0.0", "esbuild": "^0.20.0", "eslint": "^8.56.0", + "fast-glob": "^3.2.7", "jest": "^29.2.1", "js-yaml": "^4.1.0", "markdown-table": "^3.0.0", "prettier": "^3.0.0", + "tsx": "^4.11.0", "typedoc": "^0.25.0", "typescript": "^5.0.0", "yargs": "^16.0.0" @@ -32,5 +34,10 @@ "@types/js-yaml": "^4.0.5", "@types/node": "^20.0.0", "@types/yargs": "^16.0.0" + }, + "depcheck": { + "ignoreMatches": [ + "tsx" + ] } } diff --git a/scripts/src/commands/test.js b/scripts/src/commands/test.js index e2d5c7c09..7248d7a62 100644 --- a/scripts/src/commands/test.js +++ b/scripts/src/commands/test.js @@ -1,8 +1,27 @@ // @ts-check - -import { runScript } from "../process.js"; +import * as fs from "node:fs/promises"; +import { execute, runScript } from "../process.js"; /** @type {import("../process.js").Command} */ export async function test(_args, rawArgs = []) { - await runScript("jest", "--passWithNoTests", ...rawArgs); + const manifest = await fs.readFile(process.cwd() + "/package.json", { + encoding: "utf-8", + }); + if (manifest.includes('"jest"')) { + await runScript("jest", "--passWithNoTests", ...rawArgs); + } else { + const tests = + rawArgs.length > 0 + ? rawArgs + : await import("fast-glob").then(({ default: fg }) => + fg.async("test/**/*.test.ts", { followSymbolicLinks: false }) + ); + await execute( + process.argv0, + "--import", + import.meta.resolve("tsx"), + "--test", + ...tests + ); + } } diff --git a/yarn.lock b/yarn.lock index c021b1087..807b114da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4382,10 +4382,12 @@ __metadata: depcheck: "npm:^1.0.0" esbuild: "npm:^0.20.0" eslint: "npm:^8.56.0" + fast-glob: "npm:^3.2.7" jest: "npm:^29.2.1" js-yaml: "npm:^4.1.0" markdown-table: "npm:^3.0.0" prettier: "npm:^3.0.0" + tsx: "npm:^4.11.0" typedoc: "npm:^0.25.0" typescript: "npm:^5.0.0" yargs: "npm:^16.0.0" @@ -4516,12 +4518,10 @@ __metadata: resolution: "@rnx-kit/tools-language@workspace:packages/tools-language" dependencies: "@rnx-kit/eslint-config": "npm:*" - "@rnx-kit/jest-preset": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^20.0.0" eslint: "npm:^8.56.0" - jest: "npm:^29.2.1" prettier: "npm:^3.0.0" typescript: "npm:^5.0.0" languageName: unknown @@ -4532,12 +4532,10 @@ __metadata: resolution: "@rnx-kit/tools-node@workspace:packages/tools-node" dependencies: "@rnx-kit/eslint-config": "npm:*" - "@rnx-kit/jest-preset": "npm:*" "@rnx-kit/scripts": "npm:*" "@rnx-kit/tsconfig": "npm:*" "@types/node": "npm:^20.0.0" eslint: "npm:^8.56.0" - jest: "npm:^29.2.1" prettier: "npm:^3.0.0" typescript: "npm:^5.0.0" languageName: unknown @@ -7371,7 +7369,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.20.0": +"esbuild@npm:^0.20.0, esbuild@npm:~0.20.2": version: 0.20.2 resolution: "esbuild@npm:0.20.2" dependencies: @@ -8178,9 +8176,9 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" dependencies: node-gyp: "npm:latest" conditions: os=darwin @@ -8316,6 +8314,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.7.5": + version: 4.7.5 + resolution: "get-tsconfig@npm:4.7.5" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/a917dff2ba9ee187c41945736bf9bbab65de31ce5bc1effd76267be483a7340915cff232199406379f26517d2d0a4edcdbcda8cca599c2480a0f2cf1e1de3efa + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -11807,9 +11814,9 @@ __metadata: linkType: hard "pirates@npm:^4.0.4, pirates@npm:^4.0.5": - version: 4.0.5 - resolution: "pirates@npm:4.0.5" - checksum: 10c0/58b6ff0f137a3d70ff34ac4802fd19819cdc19b53e9c95adecae6c7cfc77719a11f561ad85d46e79e520ef57c31145a564c8bc3bee8cfee75d441fab2928a51d + version: 4.0.6 + resolution: "pirates@npm:4.0.6" + checksum: 10c0/00d5fa51f8dded94d7429700fb91a0c1ead00ae2c7fd27089f0c5b63e6eca36197fe46384631872690a66f390c5e27198e99006ab77ae472692ab9c2ca903f36 languageName: node linkType: hard @@ -12677,6 +12684,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + languageName: node + linkType: hard + "resolve.exports@npm:^2.0.0": version: 2.0.2 resolution: "resolve.exports@npm:2.0.2" @@ -13848,6 +13862,22 @@ __metadata: languageName: node linkType: hard +"tsx@npm:^4.11.0": + version: 4.11.0 + resolution: "tsx@npm:4.11.0" + dependencies: + esbuild: "npm:~0.20.2" + fsevents: "npm:~2.3.3" + get-tsconfig: "npm:^4.7.5" + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.mjs + checksum: 10c0/f8a714cd81c55c25c16b2fc4e879d517d37bedce8b74dee06c767d19b7e1a8b60e1eff3066b9fe8f66539eb8350dd4d16b51be4d1dd83af75bd8ddc8efcd0991 + languageName: node + linkType: hard + "tty-table@npm:^4.1.5": version: 4.1.6 resolution: "tty-table@npm:4.1.6"