diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 0f88272..57200e3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -69,7 +69,7 @@ jobs: - name: Record release tags before semantic-release run: | git fetch --tags - git tag -l 'v*' --sort=version:refname > /tmp/release-tags-before.txt + git tag -l 'v*' > /tmp/release-tags-before.txt - name: Install semantic-release run: | @@ -97,8 +97,8 @@ jobs: fi NEW_TAG=$(comm -13 \ - <(sort "$BEFORE_FILE") \ - <(git tag -l 'v*' --sort=version:refname) | tail -n 1) + <(sort -V "$BEFORE_FILE") \ + <(git tag -l 'v*' | sort -V) | tail -n 1) if [ -n "$NEW_TAG" ]; then echo "released=true" >> "$GITHUB_OUTPUT" diff --git a/bench/events_bench.ts b/bench/events_bench.ts index 46df732..fc065d5 100644 --- a/bench/events_bench.ts +++ b/bench/events_bench.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix /** * Event system benchmarks. * diff --git a/bench/latency_bench.ts b/bench/latency_bench.ts index d27ad68..b0ffbf8 100644 --- a/bench/latency_bench.ts +++ b/bench/latency_bench.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix /** * Low-latency benchmarks for primitive operations. * diff --git a/bench/memory_bench.ts b/bench/memory_bench.ts index 5452b61..0e0412a 100644 --- a/bench/memory_bench.ts +++ b/bench/memory_bench.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix /** * Memory allocation and GC pressure benchmarks. * diff --git a/bench/observable_bench.ts b/bench/observable_bench.ts index cc82366..383a50d 100644 --- a/bench/observable_bench.ts +++ b/bench/observable_bench.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix /** * Observable creation and subscription benchmarks. * diff --git a/bench/operators_bench.ts b/bench/operators_bench.ts index 78335b9..6542c37 100644 --- a/bench/operators_bench.ts +++ b/bench/operators_bench.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix /** * Operator pipeline benchmarks. * diff --git a/bench/queue_bench.ts b/bench/queue_bench.ts index 15d10ed..04e3fdb 100644 --- a/bench/queue_bench.ts +++ b/bench/queue_bench.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix /** * Queue operations benchmarks focusing on O(1) performance claims. * diff --git a/scripts/build_npm.ts b/scripts/build_npm.ts index 746953e..80bad27 100644 --- a/scripts/build_npm.ts +++ b/scripts/build_npm.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix /** * Builds the npm package from the Deno source using `@deno/dnt`. * diff --git a/scripts/update_release_version.ts b/scripts/update_release_version.ts index 794f1eb..1012806 100644 --- a/scripts/update_release_version.ts +++ b/scripts/update_release_version.ts @@ -8,12 +8,12 @@ * deno.jsonc untouched. */ const semverPattern = - /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/; + /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:0|[1-9]\d*|\d*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/; const versionFieldPattern = /("version"\s*:\s*")[^"]*(")/; /** - * Returns true when the provided string follows SemVer's `x.y.z` structure, - * optionally with pre-release or build metadata. + * Returns true when the provided string is a valid SemVer version, including + * optional pre-release or build metadata segments. */ export function isSemVerVersion(version: string): boolean { return semverPattern.test(version); diff --git a/scripts/update_release_version_test.ts b/scripts/update_release_version_test.ts index 282c3f4..cff98c1 100644 --- a/scripts/update_release_version_test.ts +++ b/scripts/update_release_version_test.ts @@ -1,88 +1,58 @@ +import { describe, it } from "jsr:@std/testing@^1/bdd"; +import { expect } from "jsr:@std/expect@^1"; + import { isSemVerVersion, updateReleaseVersion, } from "./update_release_version.ts"; -function assert(condition: boolean, message: string): void { - if (!condition) { - throw new Error(message); - } -} - -Deno.test("accepts release and prerelease semver strings", () => { - assert(isSemVerVersion("1.2.3"), "expected 1.2.3 to be valid semver"); - assert( - isSemVerVersion("1.2.3-beta.1+build.5"), - "expected prerelease with metadata to be valid semver", - ); +describe("isSemVerVersion()", () => { + it("accepts release and prerelease semver strings", () => { + expect(isSemVerVersion("1.2.3")).toBe(true); + expect(isSemVerVersion("1.2.3-beta.1+build.5")).toBe(true); + }); + + it("rejects non-semver version strings", () => { + expect(isSemVerVersion("1.2")).toBe(false); + expect(isSemVerVersion("release-next")).toBe(false); + }); + + it("rejects leading zero numeric identifiers", () => { + expect(isSemVerVersion("01.2.3")).toBe(false); + expect(isSemVerVersion("1.2.3-01")).toBe(false); + }); }); -Deno.test("rejects non-semver version strings", () => { - assert(!isSemVerVersion("1.2"), "expected 1.2 to be rejected"); - assert( - !isSemVerVersion("release-next"), - "expected release-next to be rejected", - ); -}); - -Deno.test("rewrites only the version field", () => { - const configText = [ - "{", - ' "name": "@okikio/observables",', - ' "version": "0.0.0",', - ' "description": "Observables"', - "}", - ].join("\n"); +describe("updateReleaseVersion()", () => { + it("rewrites only the version field", () => { + const configText = [ + "{", + ' "name": "@okikio/observables",', + ' "version": "0.0.0",', + ' "description": "Observables"', + "}", + ].join("\n"); - const nextConfigText = updateReleaseVersion(configText, "1.4.0"); + const nextConfigText = updateReleaseVersion(configText, "1.4.0"); - assert( - nextConfigText === [ + expect(nextConfigText).toBe([ "{", ' "name": "@okikio/observables",', ' "version": "1.4.0",', ' "description": "Observables"', "}", - ].join("\n"), - "expected only the version field to change", - ); -}); + ].join("\n")); + }); -Deno.test("throws when the new version is invalid", () => { - let thrownError: unknown; - - try { - updateReleaseVersion('{"version":"0.0.0"}', "next"); - } catch (error) { - thrownError = error; - } - - if (!(thrownError instanceof Error)) { - throw new Error("expected an Error to be thrown"); - } - - assert( - thrownError.message === + it("throws when the new version is invalid", () => { + expect(() => updateReleaseVersion('{"version":"0.0.0"}', "next")).toThrow( 'Expected a SemVer-compatible version, received "next".', - "expected the invalid version error message", - ); -}); - -Deno.test("throws when the version field is missing", () => { - let thrownError: unknown; - - try { - updateReleaseVersion('{"name":"@okikio/observables"}', "1.0.0"); - } catch (error) { - thrownError = error; - } - - if (!(thrownError instanceof Error)) { - throw new Error("expected an Error to be thrown"); - } - - assert( - thrownError.message === 'Expected deno.jsonc to contain a "version" field.', - "expected the missing version field error message", - ); + ); + }); + + it("throws when the version field is missing", () => { + expect(() => + updateReleaseVersion('{"name":"@okikio/observables"}', "1.0.0") + ).toThrow('Expected deno.jsonc to contain a "version" field.'); + }); }); diff --git a/tests/_utils/_assert.ts b/tests/_utils/_assert.ts index f72e2ae..721c9e2 100644 --- a/tests/_utils/_assert.ts +++ b/tests/_utils/_assert.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import { AssertionError } from "jsr:@std/assert@^1/assertion-error"; /** diff --git a/tests/events/events_test.ts b/tests/events/events_test.ts index f7d5183..f306e03 100644 --- a/tests/events/events_test.ts +++ b/tests/events/events_test.ts @@ -12,7 +12,6 @@ * @module */ -// deno-lint-ignore-file no-import-prefix import type { Subscription } from "../../_types.ts"; import type { EventMap } from "../../events.ts"; diff --git a/tests/events_bdd_test.ts b/tests/events_bdd_test.ts index 6fc846f..7ac20fd 100644 --- a/tests/events_bdd_test.ts +++ b/tests/events_bdd_test.ts @@ -10,7 +10,6 @@ * on event (supports AbortSignal cancellation). */ -// deno-lint-ignore-file no-import-prefix import { describe, it } from "jsr:@std/testing@^1/bdd"; import { expect } from "jsr:@std/expect@^1"; diff --git a/tests/helpers/operations/batch_test.ts b/tests/helpers/operations/batch_test.ts index 71e68db..4891f8f 100644 --- a/tests/helpers/operations/batch_test.ts +++ b/tests/helpers/operations/batch_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import { expect, test } from "jsr:@libs/testing@^5"; import { Observable } from "../../../observable.ts"; diff --git a/tests/helpers/operations/conditional_test.ts b/tests/helpers/operations/conditional_test.ts index 1f270e6..9c0be8c 100644 --- a/tests/helpers/operations/conditional_test.ts +++ b/tests/helpers/operations/conditional_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import { expect, test } from "jsr:@libs/testing@^5"; import { Observable } from "../../../observable.ts"; diff --git a/tests/helpers/operations/core_test.ts b/tests/helpers/operations/core_test.ts index 8e927fb..ab5bade 100644 --- a/tests/helpers/operations/core_test.ts +++ b/tests/helpers/operations/core_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import { expect, test } from "jsr:@libs/testing@^5"; import { Observable } from "../../../observable.ts"; diff --git a/tests/helpers/operations/errors_test.ts b/tests/helpers/operations/errors_test.ts index 01bd094..1a301a4 100644 --- a/tests/helpers/operations/errors_test.ts +++ b/tests/helpers/operations/errors_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import { expect, test } from "jsr:@libs/testing@^5"; import { Observable } from "../../../observable.ts"; diff --git a/tests/helpers/operations/timing_test.ts b/tests/helpers/operations/timing_test.ts index 33ab829..d5dcb68 100644 --- a/tests/helpers/operations/timing_test.ts +++ b/tests/helpers/operations/timing_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import type { ObservableError } from "../../../error.ts"; import { expect, test } from "jsr:@libs/testing@^5"; import { delay as stdDelay } from "jsr:@std/async@^1"; diff --git a/tests/helpers/operators_bdd_test.ts b/tests/helpers/operators_bdd_test.ts index 52d1217..8bf28e4 100644 --- a/tests/helpers/operators_bdd_test.ts +++ b/tests/helpers/operators_bdd_test.ts @@ -16,7 +16,6 @@ * fast producers), chunk-by-chunk processing (memory efficient), and cross-platform compatibility. */ -// deno-lint-ignore-file no-import-prefix import { describe, it } from "jsr:@std/testing@^1/bdd"; import { expect } from "jsr:@std/expect@^1"; diff --git a/tests/helpers/operators_test.ts b/tests/helpers/operators_test.ts index 8265354..a9718a4 100644 --- a/tests/helpers/operators_test.ts +++ b/tests/helpers/operators_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import { expect, test } from "jsr:@libs/testing@^5"; import { Observable } from "../../observable.ts"; diff --git a/tests/helpers/utils_bdd_test.ts b/tests/helpers/utils_bdd_test.ts index ec4547c..a5c56a0 100644 --- a/tests/helpers/utils_bdd_test.ts +++ b/tests/helpers/utils_bdd_test.ts @@ -10,7 +10,6 @@ * for cross-platform compatibility without low-level boilerplate. */ -// deno-lint-ignore-file no-import-prefix import { describe, it } from "jsr:@std/testing@^1/bdd"; import { expect } from "jsr:@std/expect@^1"; diff --git a/tests/helpers/utils_test.ts b/tests/helpers/utils_test.ts index 5156a79..52d2553 100644 --- a/tests/helpers/utils_test.ts +++ b/tests/helpers/utils_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import { expect, test } from "jsr:@libs/testing@^5"; import { diff --git a/tests/integration_bdd_test.ts b/tests/integration_bdd_test.ts index 1e78ca0..388b076 100644 --- a/tests/integration_bdd_test.ts +++ b/tests/integration_bdd_test.ts @@ -9,7 +9,6 @@ * (mergeMap for parallelism, concatMap for ordering). */ -// deno-lint-ignore-file no-import-prefix import { describe, it } from "jsr:@std/testing@^1/bdd"; import { expect } from "jsr:@std/expect@^1"; diff --git a/tests/observable/dom_events_test.ts b/tests/observable/dom_events_test.ts index e36ca4c..9268503 100644 --- a/tests/observable/dom_events_test.ts +++ b/tests/observable/dom_events_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import type { Subscription } from "../../_types.ts"; import { expect, fn, test } from "jsr:@libs/testing@^5"; import { Observable } from "../../observable.ts"; diff --git a/tests/observable/multiple_subscribers_test.ts b/tests/observable/multiple_subscribers_test.ts index 8e2e72a..de346b0 100644 --- a/tests/observable/multiple_subscribers_test.ts +++ b/tests/observable/multiple_subscribers_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import type { SpecObservable, SpecObserver, diff --git a/tests/observable/real_world_test.ts b/tests/observable/real_world_test.ts index e320013..f5b4132 100644 --- a/tests/observable/real_world_test.ts +++ b/tests/observable/real_world_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import { expect, test } from "jsr:@libs/testing@^5"; import { Observable } from "../../observable.ts"; diff --git a/tests/observable/resource_cleanup_test.ts b/tests/observable/resource_cleanup_test.ts index 6b1f279..72e155a 100644 --- a/tests/observable/resource_cleanup_test.ts +++ b/tests/observable/resource_cleanup_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import type { SubscriptionObserver } from "../../observable.ts"; import { expect, test } from "jsr:@libs/testing@^5"; diff --git a/tests/observable/simple_observable_test.ts b/tests/observable/simple_observable_test.ts index a2ffa5c..a31f8a6 100644 --- a/tests/observable/simple_observable_test.ts +++ b/tests/observable/simple_observable_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import type { Subscription } from "../../_types.ts"; import { expect, test } from "jsr:@libs/testing@^5"; import { Observable } from "../../observable.ts"; diff --git a/tests/publishing_setup_test.ts b/tests/publishing_setup_test.ts index dc64b3f..4e88b2d 100644 --- a/tests/publishing_setup_test.ts +++ b/tests/publishing_setup_test.ts @@ -1,4 +1,3 @@ -// deno-lint-ignore-file no-import-prefix import { describe, it } from "jsr:@std/testing@^1/bdd"; import { expect } from "jsr:@std/expect@^1"; diff --git a/tests/queue_bdd_test.ts b/tests/queue_bdd_test.ts index 0530a23..9fcadd9 100644 --- a/tests/queue_bdd_test.ts +++ b/tests/queue_bdd_test.ts @@ -13,7 +13,6 @@ * buffers, rate limiting). */ -// deno-lint-ignore-file no-import-prefix import { describe, it } from "jsr:@std/testing@^1/bdd"; import { expect } from "jsr:@std/expect@^1";