diff --git a/.github/workflows/test-node.yml b/.github/workflows/test-node.yml new file mode 100644 index 0000000..247b408 --- /dev/null +++ b/.github/workflows/test-node.yml @@ -0,0 +1,24 @@ +name: Test (Node) + +on: + push: + branches: + - main + pull_request: + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22.x + - name: Install deps + run: | + npx jsr install + - name: Test + run: | + npx --yes tsx --test *_test.ts + timeout-minutes: 5 diff --git a/.gitignore b/.gitignore index f1eb3c6..1973f0f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /npm deno.lock .coverage +node_modules diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..41583e3 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +@jsr:registry=https://npm.jsr.io diff --git a/deno.jsonc b/deno.jsonc index e45bcbb..27fab66 100644 --- a/deno.jsonc +++ b/deno.jsonc @@ -25,7 +25,6 @@ ] }, "imports": { - "@core/unknownutil": "jsr:@core/unknownutil@^4.0.0", "@core/errorutil": "./mod.ts", "@core/errorutil/error-object": "./error_object.ts", "@core/errorutil/raise": "./raise.ts", @@ -33,6 +32,8 @@ "@core/errorutil/try-or-else": "./try_or_else.ts", "@core/errorutil/unimplemented": "./unimplemented.ts", "@core/errorutil/unreachable": "./unreachable.ts", + "@core/unknownutil": "jsr:@core/unknownutil@^4.0.0", + "@cross/test": "jsr:@cross/test@^0.0.9", "@std/assert": "jsr:@std/assert@^1.0.0" }, "tasks": { diff --git a/error_object_test.ts b/error_object_test.ts index 34404f7..2939e81 100644 --- a/error_object_test.ts +++ b/error_object_test.ts @@ -1,3 +1,4 @@ +import { test } from "@cross/test"; import { assertEquals, assertInstanceOf } from "@std/assert"; import { fromErrorObject, toErrorObject } from "./error_object.ts"; @@ -12,57 +13,53 @@ class CustomError extends Error { } } -Deno.test("toErrorObject", async (t) => { - await t.step("Error", () => { - const err = new Error("error"); - err.stack = "stack..."; - const obj = toErrorObject(err); - assertEquals(obj, { - proto: "Error", - name: "Error", - message: "error", - stack: "stack...", - attributes: {}, - }); +await test("toErrorObject with Error", () => { + const err = new Error("error"); + err.stack = "stack..."; + const obj = toErrorObject(err); + assertEquals(obj, { + proto: "Error", + name: "Error", + message: "error", + stack: "stack...", + attributes: {}, }); +}); - await t.step("CustomError", () => { - const err = new CustomError("error", "foo", 10); - err.stack = "stack..."; - const obj = toErrorObject(err); - assertEquals(obj, { - proto: "CustomError", - name: "ThisIsCustomError", - message: "error", - stack: "stack...", - attributes: { - foo: "foo", - bar: 10, - }, - }); +await test("toErrorObject with CustomError", () => { + const err = new CustomError("error", "foo", 10); + err.stack = "stack..."; + const obj = toErrorObject(err); + assertEquals(obj, { + proto: "CustomError", + name: "ThisIsCustomError", + message: "error", + stack: "stack...", + attributes: { + foo: "foo", + bar: 10, + }, }); }); -Deno.test("fromErrorObject", async (t) => { - await t.step("Error", () => { - const obj = toErrorObject(new Error("error")); - obj.stack = "stack..."; - const err = fromErrorObject(obj); - assertInstanceOf(err, Error); - assertEquals(err.name, "Error"); - assertEquals(err.message, "error"); - assertEquals(err.stack, "stack..."); - }); +await test("fromErrorObject with Error", () => { + const obj = toErrorObject(new Error("error")); + obj.stack = "stack..."; + const err = fromErrorObject(obj); + assertInstanceOf(err, Error); + assertEquals(err.name, "Error"); + assertEquals(err.message, "error"); + assertEquals(err.stack, "stack..."); +}); - await t.step("CustomError", () => { - const obj = toErrorObject(new CustomError("error", "foo", 10)); - obj.stack = "stack..."; - const err = fromErrorObject(obj); - assertInstanceOf(err, Error); - assertEquals(err.name, "ThisIsCustomError"); - assertEquals(err.message, "error"); - assertEquals(err.stack, "stack..."); - assertEquals((err as CustomError).foo, "foo"); - assertEquals((err as CustomError).bar, 10); - }); +await test("fromErrorObject with CustomError", () => { + const obj = toErrorObject(new CustomError("error", "foo", 10)); + obj.stack = "stack..."; + const err = fromErrorObject(obj); + assertInstanceOf(err, Error); + assertEquals(err.name, "ThisIsCustomError"); + assertEquals(err.message, "error"); + assertEquals(err.stack, "stack..."); + assertEquals((err as CustomError).foo, "foo"); + assertEquals((err as CustomError).bar, 10); }); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..47876ba --- /dev/null +++ b/package-lock.json @@ -0,0 +1,48 @@ +{ + "name": "errorutil", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@core/unknownutil": "npm:@jsr/core__unknownutil@^4.2.0", + "@cross/test": "npm:@jsr/cross__test@^0.0.9", + "@std/assert": "npm:@jsr/std__assert@^1.0.2" + } + }, + "node_modules/@core/unknownutil": { + "name": "@jsr/core__unknownutil", + "version": "4.2.0", + "resolved": "https://npm.jsr.io/~/11/@jsr/core__unknownutil/4.2.0.tgz", + "integrity": "sha512-HA5TxLa7E1mSNwiG1oRPfeq09SSrr6OH9TIeM5ECy14Vzv3hnsxxQO4il6Nt24HwMwFt2NkJ/RUqWD07Kbyg4g==" + }, + "node_modules/@cross/test": { + "name": "@jsr/cross__test", + "version": "0.0.9", + "resolved": "https://npm.jsr.io/~/11/@jsr/cross__test/0.0.9.tgz", + "integrity": "sha512-zwDSXQHw8n6k/gBj1Q67Td34Lb1PfkzLTggXnNZzcRO9SxcdAlzyOKFCF62kTFM7ZjVPqYvqu2gHzMLtj6cayw==", + "dependencies": { + "@jsr/cross__runtime": "^1.0.0" + } + }, + "node_modules/@jsr/cross__runtime": { + "version": "1.0.0", + "resolved": "https://npm.jsr.io/~/11/@jsr/cross__runtime/1.0.0.tgz", + "integrity": "sha512-wUtjVBTk65ae4AKQRnxD5x3h4vVmopdKAYie/uS01Qolii2XQ81bKtRTvJ4kx133GYYgIAgyl3ihQ0OK8LcPmQ==" + }, + "node_modules/@jsr/std__internal": { + "version": "1.0.1", + "resolved": "https://npm.jsr.io/~/11/@jsr/std__internal/1.0.1.tgz", + "integrity": "sha512-ssI1kvluIero6cCfiWNmYItqCR8QpQB+STBJoe/xQVZ79SDpoqjK5VF2Eq/2M+Dz8WbqHVmrXRCaGN162x+Ebw==" + }, + "node_modules/@std/assert": { + "name": "@jsr/std__assert", + "version": "1.0.2", + "resolved": "https://npm.jsr.io/~/11/@jsr/std__assert/1.0.2.tgz", + "integrity": "sha512-xujHXXeT3zvMNZeCXiDyfiITaqP4rgH8wqHNUD0Iyr4c2R0Ea//zJ4pASA1utIEIxeVu1jpeSlHU4+pagscqgQ==", + "dependencies": { + "@jsr/std__internal": "^1.0.1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..33c1844 --- /dev/null +++ b/package.json @@ -0,0 +1,8 @@ +{ + "type": "module", + "dependencies": { + "@core/unknownutil": "npm:@jsr/core__unknownutil@^4.2.0", + "@cross/test": "npm:@jsr/cross__test@^0.0.9", + "@std/assert": "npm:@jsr/std__assert@^1.0.2" + } +} diff --git a/raise_test.ts b/raise_test.ts index 86844ee..533b542 100644 --- a/raise_test.ts +++ b/raise_test.ts @@ -1,6 +1,7 @@ +import { test } from "@cross/test"; import { assertThrows } from "@std/assert"; import { raise } from "./raise.ts"; -Deno.test("raise", () => { +test("raise", () => { assertThrows(() => raise(new Error("error")), Error, "error"); }); diff --git a/try_or_else_test.ts b/try_or_else_test.ts index 79c95df..5aadb2e 100644 --- a/try_or_else_test.ts +++ b/try_or_else_test.ts @@ -1,58 +1,57 @@ +import { test } from "@cross/test"; import { assertEquals, assertRejects, assertThrows } from "@std/assert"; import { raise } from "./raise.ts"; import { tryOrElse } from "./try_or_else.ts"; -Deno.test("tryOrElse", async (t) => { - const err = new Error("error"); - const resolve = Promise.resolve.bind(Promise); - const reject = Promise.reject.bind(Promise); +const err = new Error("error"); +const resolve = Promise.resolve.bind(Promise); +const reject = Promise.reject.bind(Promise); - await t.step("sync", () => { - type T = number; - assertEquals(tryOrElse((): T => 1, () => 2), 1); - assertEquals(tryOrElse((): T => raise(err), () => 2), 2); - }); +await test("tryOrElse (sync)", () => { + type T = number; + assertEquals(tryOrElse((): T => 1, () => 2), 1); + assertEquals(tryOrElse((): T => raise(err), () => 2), 2); +}); - await t.step("sync (error)", () => { - type T = number; - assertThrows( - () => tryOrElse((): T => raise(err), () => raise(err)), - Error, - "error", - ); - }); +await test("tryOrElse with Error (sync)", () => { + type T = number; + assertThrows( + () => tryOrElse((): T => raise(err), () => raise(err)), + Error, + "error", + ); +}); - await t.step("async", async () => { - type T = Promise; - assertEquals(await tryOrElse((): T => resolve(1), () => 2), 1); - assertEquals(await tryOrElse((): T => resolve(1), () => resolve(2)), 1); - assertEquals(await tryOrElse((): T => reject(err), () => 2), 2); - assertEquals(await tryOrElse((): T => reject(err), () => resolve(2)), 2); - assertEquals(await tryOrElse((): T => raise(err), () => 2), 2); - assertEquals(await tryOrElse((): T => raise(err), () => resolve(2)), 2); - }); +await test("tryOrElse (async)", async () => { + type T = Promise; + assertEquals(await tryOrElse((): T => resolve(1), () => 2), 1); + assertEquals(await tryOrElse((): T => resolve(1), () => resolve(2)), 1); + assertEquals(await tryOrElse((): T => reject(err), () => 2), 2); + assertEquals(await tryOrElse((): T => reject(err), () => resolve(2)), 2); + assertEquals(await tryOrElse((): T => raise(err), () => 2), 2); + assertEquals(await tryOrElse((): T => raise(err), () => resolve(2)), 2); +}); - await t.step("async (error)", async () => { - type T = Promise; - await assertRejects( - () => tryOrElse((): T => reject(err), () => reject(err)), - Error, - "error", - ); - await assertRejects( - () => tryOrElse((): T => reject(err), () => raise(err)), - Error, - "error", - ); - await assertRejects( - () => tryOrElse((): T => raise(err), () => reject(err)), - Error, - "error", - ); - assertThrows( - () => tryOrElse((): T => raise(err), () => raise(err)), - Error, - "error", - ); - }); +await test("tryOrElse with Error (async)", async () => { + type T = Promise; + await assertRejects( + () => tryOrElse((): T => reject(err), () => reject(err)), + Error, + "error", + ); + await assertRejects( + () => tryOrElse((): T => reject(err), () => raise(err)), + Error, + "error", + ); + await assertRejects( + () => tryOrElse((): T => raise(err), () => reject(err)), + Error, + "error", + ); + assertThrows( + () => tryOrElse((): T => raise(err), () => raise(err)), + Error, + "error", + ); }); diff --git a/try_or_test.ts b/try_or_test.ts index 0da63fe..4d22668 100644 --- a/try_or_test.ts +++ b/try_or_test.ts @@ -1,25 +1,24 @@ +import { test } from "@cross/test"; import { assertEquals } from "@std/assert"; import { raise } from "./raise.ts"; import { tryOr } from "./try_or.ts"; -Deno.test("tryOr", async (t) => { - const err = new Error("error"); - const resolve = Promise.resolve.bind(Promise); - const reject = Promise.reject.bind(Promise); +const err = new Error("error"); +const resolve = Promise.resolve.bind(Promise); +const reject = Promise.reject.bind(Promise); - await t.step("sync", () => { - type T = number; - assertEquals(tryOr((): T => 1, 2), 1); - assertEquals(tryOr((): T => raise(err), 2), 2); - }); +await test("tryOr (sync)", () => { + type T = number; + assertEquals(tryOr((): T => 1, 2), 1); + assertEquals(tryOr((): T => raise(err), 2), 2); +}); - await t.step("async", async () => { - type T = Promise; - assertEquals(await tryOr((): T => resolve(1), 2), 1); - assertEquals(await tryOr((): T => resolve(1), resolve(2)), 1); - assertEquals(await tryOr((): T => reject(err), 2), 2); - assertEquals(await tryOr((): T => reject(err), resolve(2)), 2); - assertEquals(await tryOr((): T => raise(err), 2), 2); - assertEquals(await tryOr((): T => raise(err), resolve(2)), 2); - }); +await test("tryOr (async)", async () => { + type T = Promise; + assertEquals(await tryOr((): T => resolve(1), 2), 1); + assertEquals(await tryOr((): T => resolve(1), resolve(2)), 1); + assertEquals(await tryOr((): T => reject(err), 2), 2); + assertEquals(await tryOr((): T => reject(err), resolve(2)), 2); + assertEquals(await tryOr((): T => raise(err), 2), 2); + assertEquals(await tryOr((): T => raise(err), resolve(2)), 2); }); diff --git a/unimplemented_test.ts b/unimplemented_test.ts new file mode 100644 index 0000000..112c086 --- /dev/null +++ b/unimplemented_test.ts @@ -0,0 +1,7 @@ +import { test } from "@cross/test"; +import { assertThrows } from "@std/assert"; +import { unimplemented, UnimplementedError } from "./unimplemented.ts"; + +test("unimplemented", () => { + assertThrows(() => unimplemented(), UnimplementedError); +}); diff --git a/unreachable_test.ts b/unreachable_test.ts new file mode 100644 index 0000000..404e9c5 --- /dev/null +++ b/unreachable_test.ts @@ -0,0 +1,7 @@ +import { test } from "@cross/test"; +import { assertThrows } from "@std/assert"; +import { unreachable, UnreachableError } from "./unreachable.ts"; + +test("unreachable", () => { + assertThrows(() => unreachable(), UnreachableError); +});