From 615259b7f0dce64be37f9c7abbaadc7226288109 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Fri, 20 Feb 2026 03:27:03 +0900 Subject: [PATCH 1/4] Upgrade Optique to 0.10.6 --- deno.json | 6 +-- deno.lock | 29 ++++++++------ pnpm-lock.yaml | 97 ++++++++++++++++++++++++++------------------- pnpm-workspace.yaml | 6 +-- 4 files changed, 78 insertions(+), 60 deletions(-) diff --git a/deno.json b/deno.json index 4d8d06bd..136ea415 100644 --- a/deno.json +++ b/deno.json @@ -41,9 +41,9 @@ "@opentelemetry/core": "npm:@opentelemetry/core@^2.5.0", "@opentelemetry/sdk-trace-base": "npm:@opentelemetry/sdk-trace-base@^2.5.0", "@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.39.0", - "@optique/config": "jsr:@optique/config@^0.10.4", - "@optique/core": "jsr:@optique/core@^0.10.4", - "@optique/run": "jsr:@optique/run@^0.10.4", + "@optique/config": "jsr:@optique/config@^0.10.6", + "@optique/core": "jsr:@optique/core@^0.10.6", + "@optique/run": "jsr:@optique/run@^0.10.6", "@std/assert": "jsr:@std/assert@^1.0.13", "@std/async": "jsr:@std/async@^1.0.13", "@std/encoding": "jsr:@std/encoding@^1.0.10", diff --git a/deno.lock b/deno.lock index 87a4f070..1b19467d 100644 --- a/deno.lock +++ b/deno.lock @@ -16,14 +16,14 @@ "jsr:@fresh/plugin-vite@^1.0.7": "1.0.8", "jsr:@hongminhee/localtunnel@0.3": "0.3.0", "jsr:@hono/hono@^4.7.1": "4.11.9", - "jsr:@hono/hono@^4.8.3": "4.11.10", + "jsr:@hono/hono@^4.8.3": "4.12.0", "jsr:@logtape/file@2": "2.0.2", "jsr:@logtape/logtape@2": "2.0.2", "jsr:@logtape/logtape@^1.0.4": "1.3.7", "jsr:@logtape/logtape@^2.0.2": "2.0.2", - "jsr:@optique/config@~0.10.4": "0.10.4", - "jsr:@optique/core@~0.10.4": "0.10.4", - "jsr:@optique/run@~0.10.4": "0.10.4", + "jsr:@optique/config@~0.10.6": "0.10.6", + "jsr:@optique/core@~0.10.6": "0.10.6", + "jsr:@optique/run@~0.10.6": "0.10.6", "jsr:@std/assert@0.224": "0.224.0", "jsr:@std/assert@0.226": "0.226.0", "jsr:@std/assert@^1.0.13": "1.0.18", @@ -261,6 +261,9 @@ "@hono/hono@4.11.10": { "integrity": "a5a6dac87ab5a8bcf3f92aeaca22417128d584c2732860c20bbf6fdb3cafbcc5" }, + "@hono/hono@4.12.0": { + "integrity": "a09c74c4a15539f159ea386b5804fd88d984805aa74e4d847a136ba42487412b" + }, "@logtape/file@2.0.2": { "integrity": "a912459fe0d27213e05c95e6fadf716000f27eafa27e67c2737820ba24097fdc", "dependencies": [ @@ -280,8 +283,8 @@ "@logtape/logtape@2.0.2": { "integrity": "546fcd514e66f2b841c6f261fa3a3d905b52d876dc1bba8ffe1a087d9275c4c9" }, - "@optique/config@0.10.4": { - "integrity": "108c1c77c98bb22fbd4675d9410531adcd212a19ec510bb4461173252ba490f3", + "@optique/config@0.10.6": { + "integrity": "ac216f6fc6ebe124fc17baa7a0a7cde13a6565942e6a2ec0c34d947299c7577d", "dependencies": [ "jsr:@optique/core", "npm:@standard-schema/spec" @@ -290,11 +293,11 @@ "@optique/core@0.10.0-dev.333+076fceae": { "integrity": "1ebe1782740f08d568ae0c5258786933a8502d1e137feb49b2d8ab06d204b11a" }, - "@optique/core@0.10.4": { - "integrity": "fa750a168ad5743128e4dcc50c8f63ce3c0ad6e753f99ddf1b34f8a9cece6602" + "@optique/core@0.10.6": { + "integrity": "a3ba44f15f9512856f4716362ef3731b711285ed2327c372ce6cc575be9d3072" }, - "@optique/run@0.10.4": { - "integrity": "39a4bf4258b82291594fb86be20e42b1768b403610d8977d1521b46a2526578f", + "@optique/run@0.10.6": { + "integrity": "6c045917057b9657baae320c2e80bcc46f05572a8698d80e233da1e34915db1a", "dependencies": [ "jsr:@optique/core" ] @@ -5877,9 +5880,9 @@ "jsr:@hono/hono@^4.8.3", "jsr:@logtape/file@2", "jsr:@logtape/logtape@2", - "jsr:@optique/config@~0.10.4", - "jsr:@optique/core@~0.10.4", - "jsr:@optique/run@~0.10.4", + "jsr:@optique/config@~0.10.6", + "jsr:@optique/core@~0.10.6", + "jsr:@optique/run@~0.10.6", "jsr:@std/assert@^1.0.13", "jsr:@std/async@^1.0.13", "jsr:@std/encoding@^1.0.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3ed9383e..aad4f399 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,14 +49,14 @@ catalogs: specifier: ^1.39.0 version: 1.39.0 '@optique/config': - specifier: ^0.10.4 - version: 0.10.4 + specifier: ^0.10.6 + version: 0.10.6 '@optique/core': - specifier: ^0.10.4 - version: 0.10.4 + specifier: ^0.10.6 + version: 0.10.6 '@optique/run': - specifier: ^0.10.4 - version: 0.10.4 + specifier: ^0.10.6 + version: 0.10.6 '@std/assert': specifier: jsr:^1.0.13 version: 1.0.13 @@ -797,13 +797,13 @@ importers: version: 2.0.0 '@optique/config': specifier: 'catalog:' - version: 0.10.4(@standard-schema/spec@1.0.0) + version: 0.10.6(@standard-schema/spec@1.0.0) '@optique/core': specifier: 'catalog:' - version: 0.10.4 + version: 0.10.6 '@optique/run': specifier: 'catalog:' - version: 0.10.4 + version: 0.10.6 '@poppanator/http-constants': specifier: ^1.1.1 version: 1.1.1 @@ -879,10 +879,10 @@ importers: version: link:../init '@optique/core': specifier: 'catalog:' - version: 0.10.4 + version: 0.10.6 '@optique/run': specifier: 'catalog:' - version: 0.10.4 + version: 0.10.6 es-toolkit: specifier: 'catalog:' version: 1.43.0 @@ -1158,10 +1158,10 @@ importers: version: 2.0.0 '@optique/core': specifier: 'catalog:' - version: 0.10.4 + version: 0.10.6 '@optique/run': specifier: 'catalog:' - version: 0.10.4 + version: 0.10.6 chalk: specifier: 'catalog:' version: 5.6.2 @@ -3668,18 +3668,18 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 - '@optique/config@0.10.4': - resolution: {integrity: sha512-bcMxvSPXhdGJWOmhO/97HCDGCGOUk55YoG/EZeUqNLigkOn4thYIb12KUkZ7sJSOh5/prES19iPX02g8T5RIwQ==} + '@optique/config@0.10.6': + resolution: {integrity: sha512-qfeTO9HL6hmQ40h+DXufoALX8GNBPdbM6Cb0Khm9NqjJY0/jORZz5NIKbg1SFtqdAmWsSH2CAflr7E3Rtw06Kg==} engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} peerDependencies: '@standard-schema/spec': ^1.1.0 - '@optique/core@0.10.4': - resolution: {integrity: sha512-wvnm7xJ5cwuQ4fx5OZOhyljscFFJYY4VGwAqa7XUlRpoYroZaX/yPMMSWUJg1WdKcSwTyf0hJOWza8EEUZN6qw==} + '@optique/core@0.10.6': + resolution: {integrity: sha512-H/E0oqLm1FVFoAp4a4LH1w0P7hG1LSXRC2kpYqxmHy1rv8pypTjs0il8joK+/GFXRIFCyoEw3Cj0YClw7mZ7RQ==} engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} - '@optique/run@0.10.4': - resolution: {integrity: sha512-IXsQ0NRq8VA18g6TC0/uBxgUnB92gCaaTXFq7qjhd68UjqnTe/uHMHpjEVdOcQ9otu1wSCnZlISGE8gEgdJvwg==} + '@optique/run@0.10.6': + resolution: {integrity: sha512-MWnB2iOUtahzGXkWZDqvJJR5mt0WtE0ut9A3zUpwB25MjKK2e7MgiLjfTSmCYpWYUxE2Pw2YEvbqUbd64M6Gnw==} engines: {bun: '>=1.2.0', deno: '>=2.3.0', node: '>=20.0.0'} '@oxc-project/runtime@0.75.0': @@ -11216,16 +11216,16 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) - '@optique/config@0.10.4(@standard-schema/spec@1.0.0)': + '@optique/config@0.10.6(@standard-schema/spec@1.0.0)': dependencies: - '@optique/core': 0.10.4 + '@optique/core': 0.10.6 '@standard-schema/spec': 1.0.0 - '@optique/core@0.10.4': {} + '@optique/core@0.10.6': {} - '@optique/run@0.10.4': + '@optique/run@0.10.6': dependencies: - '@optique/core': 0.10.4 + '@optique/core': 0.10.6 '@oxc-project/runtime@0.75.0': {} @@ -13890,8 +13890,8 @@ snapshots: '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3) eslint: 9.32.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.5.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.32.0(jiti@2.5.1)) eslint-plugin-react: 7.37.5(eslint@9.32.0(jiti@2.5.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.32.0(jiti@2.5.1)) @@ -13910,8 +13910,8 @@ snapshots: '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.32.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.5.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.32.0(jiti@2.5.1)) eslint-plugin-react: 7.37.5(eslint@9.32.0(jiti@2.5.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.32.0(jiti@2.5.1)) @@ -13934,22 +13934,22 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 - eslint: 8.57.1 + eslint: 9.32.0(jiti@2.5.1) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.5.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 @@ -13960,7 +13960,22 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.1 + eslint: 8.57.1 + get-tsconfig: 4.10.1 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -13975,25 +13990,25 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.32.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3) eslint: 9.32.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.32.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color @@ -14026,7 +14041,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14037,7 +14052,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.32.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14055,7 +14070,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14066,7 +14081,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.32.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.32.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.9.3))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)))(eslint@9.32.0(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a3142566..f6ed203a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -51,9 +51,9 @@ catalog: "@opentelemetry/sdk-node": ^0.211.0 "@opentelemetry/sdk-trace-base": ^2.5.0 "@opentelemetry/semantic-conventions": ^1.39.0 - "@optique/config": ^0.10.4 - "@optique/core": ^0.10.4 - "@optique/run": ^0.10.4 + "@optique/config": ^0.10.6 + "@optique/core": ^0.10.6 + "@optique/run": ^0.10.6 "@std/assert": "jsr:^1.0.13" "@std/async": "jsr:^1.0.13" "@std/path": "jsr:^1.0.6" From 83defd5a9fa3fd9cc72e6570244d375bd2da2de8 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Fri, 20 Feb 2026 03:32:00 +0900 Subject: [PATCH 2/4] Remove redundant choices list from tunnel service description Since showChoices: true is set in the runner configuration, the choice() value parser automatically appends the list of valid tunnel service options to the help text. Manually listing them via valueSet() in the description was redundant. --- packages/cli/src/options.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/cli/src/options.ts b/packages/cli/src/options.ts index 42ba0e59..6c9847d1 100644 --- a/packages/cli/src/options.ts +++ b/packages/cli/src/options.ts @@ -12,7 +12,6 @@ import { option, or, string, - valueSet, withDefault, } from "@optique/core"; import { type Config, configContext } from "./config.ts"; @@ -39,11 +38,7 @@ export const tunnelServiceOption = bindConfig( option( "--tunnel-service", choice(TUNNEL_SERVICES, { metavar: "SERVICE" }), - { - description: message`The tunneling service to use: ${ - valueSet(TUNNEL_SERVICES) - }.`, - }, + { description: message`The tunneling service to use.` }, ), { context: configContext, From f00b22d231e4d8d51b2f76bc542062bcb3acb539 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Fri, 20 Feb 2026 03:43:12 +0900 Subject: [PATCH 3/4] Refactor tunnel service option as factory function The `tunnelServiceOption` constant in `options.ts` has been replaced with a `createTunnelServiceOption()` factory function that accepts an optional list of option names. This allows the tunnel command to reuse the shared option configuration while adding its own short aliases (`-s`, `--service`) without duplicating the option logic. The hardcoded default value of `"localhost.run"` has also been removed from the config binding, delegating the fallback behavior to the tunneling implementation, which can randomly select a service when none is specified. --- packages/cli/src/lookup.test.ts | 18 ++++++++++---- packages/cli/src/lookup.ts | 4 ++-- packages/cli/src/options.ts | 42 +++++++++++++++++++++------------ packages/cli/src/tunnel.ts | 25 ++++---------------- 4 files changed, 48 insertions(+), 41 deletions(-) diff --git a/packages/cli/src/lookup.test.ts b/packages/cli/src/lookup.test.ts index 13fd3268..dc69cb49 100644 --- a/packages/cli/src/lookup.test.ts +++ b/packages/cli/src/lookup.test.ts @@ -192,9 +192,19 @@ test("authorizedFetchOption - parses successfully without -a flag", async () => args: [], }); assert.strictEqual(result.authorizedFetch, false); - // When authorizedFetch is false, firstKnock and tunnelService still get defaults + // When authorizedFetch is false, firstKnock still gets a default. + // tunnelService stays undefined and is picked later by tunnel setup. assert.strictEqual(result.firstKnock, "draft-cavage-http-signatures-12"); - assert.strictEqual(result.tunnelService, "localhost.run"); + assert.strictEqual(result.tunnelService, undefined); +}); + +test("authorizedFetchOption - parses with -a without tunnelService config", async () => { + const result = await runWithConfig(authorizedFetchOption, configContext, { + load: () => ({}), + args: ["-a"], + }); + assert.strictEqual(result.authorizedFetch, true); + assert.strictEqual(result.tunnelService, undefined); }); test("authorizedFetchOption - parses successfully with -a flag", () => { @@ -208,7 +218,7 @@ test("authorizedFetchOption - parses successfully with -a flag", () => { result.value.firstKnock, "draft-cavage-http-signatures-12", ); - assert.strictEqual(result.value.tunnelService, "localhost.run"); + assert.strictEqual(result.value.tunnelService, undefined); } }); @@ -224,7 +234,7 @@ test("authorizedFetchOption - parses with -a and --first-knock", () => { if (result.success) { assert.strictEqual(result.value.authorizedFetch, true); assert.strictEqual(result.value.firstKnock, "rfc9421"); - assert.strictEqual(result.value.tunnelService, "localhost.run"); + assert.strictEqual(result.value.tunnelService, undefined); } }); diff --git a/packages/cli/src/lookup.ts b/packages/cli/src/lookup.ts index 1854e6ef..8b8d3653 100644 --- a/packages/cli/src/lookup.ts +++ b/packages/cli/src/lookup.ts @@ -44,8 +44,8 @@ import { getContextLoader, getDocumentLoader } from "./docloader.ts"; import { renderImages } from "./imagerenderer.ts"; import { configureLogging } from "./log.ts"; import { + createTunnelServiceOption, type GlobalOptions, - tunnelServiceOption, userAgentOption, } from "./options.ts"; import { spawnTemporaryServer, type TemporaryServer } from "./tempserver.ts"; @@ -84,7 +84,7 @@ export const authorizedFetchOption = object("Authorized fetch options", { default: "draft-cavage-http-signatures-12" as const, }, ), - tunnelService: tunnelServiceOption, + tunnelService: createTunnelServiceOption(), }); const traverseOption = object("Traverse options", { diff --git a/packages/cli/src/options.ts b/packages/cli/src/options.ts index 6c9847d1..50bb3597 100644 --- a/packages/cli/src/options.ts +++ b/packages/cli/src/options.ts @@ -10,6 +10,7 @@ import { message, object, option, + type OptionName, or, string, withDefault, @@ -31,21 +32,32 @@ export const TUNNEL_SERVICES = [ export type TunnelService = typeof TUNNEL_SERVICES[number]; /** - * Option for selecting a tunneling service. - * Uses the global `tunnelService` config setting. + * Creates a tunnel service option with customizable option names. */ -export const tunnelServiceOption = bindConfig( - option( - "--tunnel-service", - choice(TUNNEL_SERVICES, { metavar: "SERVICE" }), - { description: message`The tunneling service to use.` }, - ), - { - context: configContext, - key: (config) => config.tunnelService ?? "localhost.run", - default: "localhost.run" as const, - }, -); +export function createTunnelServiceOption( + optionNames: OptionName[] = ["--tunnel-service"], +) { + // Note that we don't provide a default value here, since the tunneling + // implementation will randomly select a service if none is specified. + return withDefault( + bindConfig( + option( + ...optionNames, + choice(TUNNEL_SERVICES, { metavar: "SERVICE" }), + { + description: message`The tunneling service to use. +By default, any of the supported tunneling services will be used +(randomly selected for each tunnel).`, + }, + ), + { + context: configContext, + key: (config) => config.tunnelService, + }, + ), + undefined, + ); +} /** * Config sections that support the noTunnel option. @@ -78,7 +90,7 @@ export function createTunnelOption(section: S) { default: true, }, ), - tunnelService: tunnelServiceOption, + tunnelService: createTunnelServiceOption(), }); } diff --git a/packages/cli/src/tunnel.ts b/packages/cli/src/tunnel.ts index 264be248..a3e8e1ea 100644 --- a/packages/cli/src/tunnel.ts +++ b/packages/cli/src/tunnel.ts @@ -8,16 +8,12 @@ import { merge, message, object, - option, - optional, - valueSet, } from "@optique/core"; -import { choice } from "@optique/core/valueparser"; import { print, printError } from "@optique/run"; import process from "node:process"; import ora from "ora"; import { configureLogging } from "./log.ts"; -import { type GlobalOptions, TUNNEL_SERVICES } from "./options.ts"; +import { createTunnelServiceOption, type GlobalOptions } from "./options.ts"; export const tunnelCommand = command( "tunnel", @@ -30,21 +26,10 @@ export const tunnelCommand = command( port: argument(integer({ metavar: "PORT", min: 0, max: 65535 }), { description: message`The local port number to expose.`, }), - service: optional( - option( - "-s", - "--service", - "--tunnel-service", - choice(TUNNEL_SERVICES, { - metavar: "SERVICE", - }), - { - description: message`The tunneling service to use: ${ - valueSet(TUNNEL_SERVICES) - }.`, - }, - ), - ), + service: createTunnelServiceOption([ + "-s", + "--service", + ]), }), ), { From 92cf0d5ddd25d1d7b9f979c3fa9e9afbeb526746 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Fri, 20 Feb 2026 07:30:43 +0900 Subject: [PATCH 4/4] Refactor authorizedFetchOption to use withDefault Wrap the `authorizedFetchOption` object parser with Optique's `withDefault()` instead of supplying fallback values through `bindConfig`'s `default` parameter. As a result, `--first-knock` and `--tunnel-service` are now rejected when provided without the `-a`/`--authorized-fetch` flag, giving clearer validation errors on misuse. The test suite is expanded to cover additional scenarios: - Parsing without `-a` using `setActiveConfig` directly (without the async config-loading path) - Config-driven authorized fetch enablement - Reading `firstKnock` value from config - Rejection of `--first-knock` without `-a` - Rejection of `--tunnel-service` without `-a` Co-Authored-By: Codex --- packages/cli/src/lookup.test.ts | 61 +++++++++++++++++++++++++++---- packages/cli/src/lookup.ts | 65 ++++++++++++++++++--------------- 2 files changed, 90 insertions(+), 36 deletions(-) diff --git a/packages/cli/src/lookup.test.ts b/packages/cli/src/lookup.test.ts index dc69cb49..9b86a5b1 100644 --- a/packages/cli/src/lookup.test.ts +++ b/packages/cli/src/lookup.test.ts @@ -186,27 +186,74 @@ test("clearTimeoutSignal - cleans up timer properly", async () => { assert.ok(!signal.aborted); }); -test("authorizedFetchOption - parses successfully without -a flag", async () => { +test("authorizedFetchOption - parses successfully without -a flag", () => { + setActiveConfig(configContext.id, {}); + const result = parse(authorizedFetchOption, []); + clearActiveConfig(configContext.id); + assert.ok(result.success); + if (result.success) { + assert.strictEqual(result.value.authorizedFetch, false); + assert.strictEqual(result.value.firstKnock, undefined); + assert.strictEqual(result.value.tunnelService, undefined); + } +}); + +test("authorizedFetchOption - parses with -a without tunnelService config", async () => { const result = await runWithConfig(authorizedFetchOption, configContext, { load: () => ({}), + args: ["-a"], + }); + assert.strictEqual(result.authorizedFetch, true); + assert.strictEqual(result.firstKnock, "draft-cavage-http-signatures-12"); + assert.strictEqual(result.tunnelService, undefined); +}); + +test("authorizedFetchOption - uses config to enable authorized fetch", async () => { + const result = await runWithConfig(authorizedFetchOption, configContext, { + load: () => ({ lookup: { authorizedFetch: true } }), args: [], }); - assert.strictEqual(result.authorizedFetch, false); - // When authorizedFetch is false, firstKnock still gets a default. - // tunnelService stays undefined and is picked later by tunnel setup. + assert.strictEqual(result.authorizedFetch, true); assert.strictEqual(result.firstKnock, "draft-cavage-http-signatures-12"); assert.strictEqual(result.tunnelService, undefined); }); -test("authorizedFetchOption - parses with -a without tunnelService config", async () => { +test("authorizedFetchOption - reads firstKnock from config", async () => { const result = await runWithConfig(authorizedFetchOption, configContext, { - load: () => ({}), - args: ["-a"], + load: () => ({ + lookup: { + authorizedFetch: true, + firstKnock: "rfc9421", + }, + tunnelService: "serveo.net", + }), + args: [], }); assert.strictEqual(result.authorizedFetch, true); + assert.strictEqual(result.firstKnock, "rfc9421"); assert.strictEqual(result.tunnelService, undefined); }); +test("authorizedFetchOption - invalid when --first-knock is used without -a", () => { + setActiveConfig(configContext.id, {}); + const result = parse(authorizedFetchOption, [ + "--first-knock", + "rfc9421", + ]); + clearActiveConfig(configContext.id); + assert.ok(!result.success); +}); + +test("authorizedFetchOption - invalid when --tunnel-service is used without -a", () => { + setActiveConfig(configContext.id, {}); + const result = parse(authorizedFetchOption, [ + "--tunnel-service", + "serveo.net", + ]); + clearActiveConfig(configContext.id); + assert.ok(!result.success); +}); + test("authorizedFetchOption - parses successfully with -a flag", () => { setActiveConfig(configContext.id, {}); const result = parse(authorizedFetchOption, ["-a"]); diff --git a/packages/cli/src/lookup.ts b/packages/cli/src/lookup.ts index 8b8d3653..bfc784df 100644 --- a/packages/cli/src/lookup.ts +++ b/packages/cli/src/lookup.ts @@ -34,6 +34,7 @@ import { optionNames, or, string, + withDefault, } from "@optique/core"; import { path, print, printError } from "@optique/run"; import { createWriteStream, type WriteStream } from "node:fs"; @@ -53,39 +54,45 @@ import { colorEnabled, colors, formatObject } from "./utils.ts"; const logger = getLogger(["fedify", "cli", "lookup"]); -export const authorizedFetchOption = object("Authorized fetch options", { - authorizedFetch: bindConfig( - map( - flag("-a", "--authorized-fetch", { - description: message`Sign the request with an one-time key.`, - }), - () => true as const, +export const authorizedFetchOption = withDefault( + object("Authorized fetch options", { + authorizedFetch: bindConfig( + map( + flag("-a", "--authorized-fetch", { + description: message`Sign the request with an one-time key.`, + }), + () => true as const, + ), + { + context: configContext, + key: (config) => config.lookup?.authorizedFetch ? true : undefined, + }, ), - { - context: configContext, - key: (config) => config.lookup?.authorizedFetch ?? false, - default: false, - }, - ), - firstKnock: bindConfig( - option( - "--first-knock", - choice(["draft-cavage-http-signatures-12", "rfc9421"]), + firstKnock: bindConfig( + option( + "--first-knock", + choice(["draft-cavage-http-signatures-12", "rfc9421"]), + { + description: message`The first-knock spec for ${ + optionNames(["-a", "--authorized-fetch"]) + }. It is used for the double-knocking technique.`, + }, + ), { - description: message`The first-knock spec for ${ - optionNames(["-a", "--authorized-fetch"]) - }. It is used for the double-knocking technique.`, + context: configContext, + key: (config) => + config.lookup?.firstKnock ?? "draft-cavage-http-signatures-12", + default: "draft-cavage-http-signatures-12" as const, }, ), - { - context: configContext, - key: (config) => - config.lookup?.firstKnock ?? "draft-cavage-http-signatures-12", - default: "draft-cavage-http-signatures-12" as const, - }, - ), - tunnelService: createTunnelServiceOption(), -}); + tunnelService: createTunnelServiceOption(), + }), + { + authorizedFetch: false as const, + firstKnock: undefined, + tunnelService: undefined, + } as const, +); const traverseOption = object("Traverse options", { traverse: bindConfig(