Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
プラグインで拡張される Context をtype-safe にする難しさと設計判断
Search
kazupon
May 22, 2026
Programming
810
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
プラグインで拡張される Context をtype-safe にする難しさと設計判断
kazupon
May 22, 2026
More Decks by kazupon
See All by kazupon
Oxlint JS plugins
kazupon
1
1.3k
gunshi
kazupon
1
230
Nitro v3
kazupon
2
550
わたしのOSS活動
kazupon
3
620
Vapor Revolution
kazupon
3
4.2k
Vue.js最新動向
kazupon
3
1.6k
Vue 3.4
kazupon
13
4.9k
Vue & Vite Rustify
kazupon
4
2.5k
Vue.jsエコシステム動向2023
kazupon
17
9.2k
Other Decks in Programming
See All in Programming
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
800
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
12
6.1k
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.8k
dRuby over BLE
makicamel
2
390
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
170
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
1
110
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
180
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
300
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
230
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.4k
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
160
Featured
See All Featured
エンジニアに許された特別な時間の終わり
watany
107
250k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
330
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Utilizing Notion as your number one productivity tool
mfonobong
4
330
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
610
Exploring anti-patterns in Rails
aemeredith
3
420
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
140
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
How to train your dragon (web standard)
notwaldorf
97
6.7k
Transcript
ϓϥάΠϯͰ֦ு͞ΕΔ Context Λ type-safe ʹ͢Δ͠͞ͱ ઃܭஅ TSKaigi 2026 2026/05/22 @kazupon
ࣗݾհ
Vue Fes Japan Organizer Vue.js Japan User Group Organizer Vue.js
Core Team Vite+ Team Nuxt Ecosystem Team Vue I18n, Intlify and Gunshi author Plaid, inc. @kazupon kazupon kazupon
͜ͷൃදʹ͍ͭͯ • Gunshi ͱ Context ͱԿ͔ • ίϚϯυఆ͔ٛΒ Context ͕ఏڙ͢Δͷܕ͕Ͳ͏ਪ͞ΕΔͷ͔
• ϓϥάΠϯʹΑͬͯ Context Λ֦ு͢ΔͱԿ͕͍͠ͷ͔ • Gunshi Runtime ʹ֦ு͞ΕͨͱϓϥάΠϯ͕ఏڙ͢Δ Extension ܕΛͲ͏ରԠ͚ͮΔͷ͔ • Gunshi ͕બΜͩઃܭΞϓϩʔνͱͦͷτϨʔυΦϑ Gunshi ͷϓϥάΠϯγεςϜΛࡐʹɺ ʹ͍͍ͭͯͯ͘͠
Gunshi ͱ Context
Gunshi ͱίϚϯυ࣮ߦ࠷খίʔυ • Gunshi: Ϟμϯͳ JavaScript CLI ϥΠϒϥϦ • ໊শ
“Commander” ͔ΒΠϯεύΠΞ • ಛ • એݴϕʔεͳίϚϯυఆٛ • type-safe ͳ ίϚϯυ arguments • ϓϥάΠϯ • … ͳͲͳͲ https://gunshi.dev
Gunshi ͷίϚϯυ࣮ߦϑϩʔ Parse Arguments Resolve Command Start
Gunshi ͷίϚϯυ࣮ߦϑϩʔ Parse Arguments Resolve Command Resolve Arguments Start
Gunshi ͷίϚϯυ࣮ߦϑϩʔ Parse Arguments Resolve Command Resolve Arguments Create CommandContext
Run Command Runner Start End
Context ͱʁ • Context ͱԿ͔ͷॲཧͷ࣮ߦʹඞ ཁͳใΛ·ͱΊͯͨ͢ΊͷϋίΈ ͍ͨͳͷ • ࣮ࡍྫ: •
Hono: ϋϯυϥʹ͞ΕΔ `c` • Express: ϛυϧΣΞؒͰڞ༗͢Δ `res.locals` • Context Λ͏ͱɺ࣮ߦରͷೖྗɺ ڥɺڞ༗ঢ়ଶΛ1ͭͷೖޱ͔Βѻ͑Δ
Gunshi ͷ CommandContext ͱʁ • ࣮ߦͨ͠ίϚϯυ໊ɺίϚϯυ args ఆٛɺͦ ࣮ͯ͠ߦલʹ args
͕ղੳ (parse) ͞Εͯղܾ ͨ͠ values ͳͲͷใΛؚΜͩΦϒδΣΫτ • ίϚϯυ࣮ߦϩδοΫͰ͋Δ CommandRunner ͷϋϯυϥؔͷύϥϝʔ λͱͯ͠͞ΕΔ • CommandContext ʹɺίϚϯυ࣮ߦ͞Εͨ ͱ͖ͷॲཧʹඞཁͳใ͕ू͞ΕΔ
ίϚϯυͰ༻͢Δ Context ͷܕਪ
CommandContext ͷ type-safe • Gunshi ͰɺίϚϯυΛఆٛ͢Δ de fi ne() Λհͯ͠ɺ
CommandContext ͷܕ͕ܾ·Δ • ctx.args ctx.values ɺίϚϯ υͰએݴͨ͠ args ʹج͍ͮͯ type-safe ʹͳΔ
de fi ne ͔Β run(ctx) ·Ͱܕ͕ಧ͘Έ • CommandContext ͷܕɺde fi
ne() ʹͨ͠ίϚϯυఆ͔ٛΒਪ͞ΕΔ • ͜͜Ͱ `A` ɺde fi nition.args ͔Βਪ͞ΕΔ • de fi ne() Ͱਪ͞Εͨ `A` ɺGunshiParams Λ௨ͯ͠ Command ͷܕʹ ͳΔ
de fi ne ͔Β run(ctx) ·Ͱܕ͕ಧ͘Έ • GunshiParams ɺGunshi ͷܕ
API Ͱڞ௨ʹ͏ύϥϝʔλܕ
de fi ne ͔Β run(ctx) ·Ͱܕ͕ಧ͘Έ Command Ҏ߱ɺ Command ->
CommandRunner -> CommandContext -> ExtractArgs, ArgValues ͱ͍͏ܕͷܕύϥϝʔλͷόέπϦϨʔͰ ctx.args ͱ ctx.values ͷܕ͕ਪ͞ΕΔ
ϓϥάΠϯʹΑΔ Context ֦ு
Gunshi Λ։ൃ͍ͯ͘͠͏ͪʹग़͖ͯͨ՝ • Gunshi Λ։ൃ͍ͯ͘͠ͱɺίΞ͚ͩͰ࣋ͭʹॏ͍ػೳ͕૿͖͑ͯͨ • தʹΘͳ͍ػೳΦϓτΞτ͍ͨ͠ͱ͍͏Ͱ͖ͯͨ • global options
• usage renderer • completion • i18n • ͜ΕΒΛͯ͢ίΞʹೖΕΔͱɺϝϯςφϯεର૿͑ଓ͚Δ
ϓϥάΠϯΞʔΩςΫνϟΛ࠾༻ • ίΞΛϕʔεʹඞཁͳػೳ͚ͩΈࠐΊ ΔΑ͏ʹ͢ΔʹɺϓϥάΠϯΞʔΩς Ϋνϟ͕࠷దͩͬͨ • ϓϥάΠϯɺίϚϯυΛ࣮ߦ͢Δલʹ ϓϥάΠϯͷ֦ு͕ Gunshi ʹద༻͞Ε
Δ • ͜ΕʹΑΓɺίΞʹೖΕͣʹػೳΛ ՃͰ͖Δ
ϓϥάΠϯ CommandContext Λ֦ு͢Δ • ۩ମతʹɺCommandRunner ͷύϥϝʔ λͰΔ CommandContext ͷ extensions
(ͭ·Γctx.extensions) ʹϩδοΫΛಈ తʹՃ͢Δ • ͔͠͠ɺJSϨϕϧͰ֦ு͞ΕΔ͕ɺTSͷ ܕγεςϜͱͯ͠ run(ctx) ͷ ctx.extensions ʹܕͷԸܙΛड͚Εͳ͍ • ϓϥάΠϯɺίϚϯυ࣮ߦ࣌ͷ CommandContext ܕΛެ։͢ΔΈ͕ ඞཁ
֦ு͞Εͨ Context Λ ܕ҆શʹ͢Δ͠͞
֦ு͞Εͨ ctx.extensions Λ type-safe ʹ͍ͨ͠ • ͨͩɺϓϥάΠϯʹΑ֦ͬͯு͞Εͨ ctx.extensions ɺطଘͷ argsɺ
values ͷΑ͏ʹ type-safe ʹ͍͍ͯͨ͠ • ཉ͍͠ͷ: • ϓϥάΠϯ ID ʹΑΔิ • ϓϥάΠϯ extension API ͷิ • ଘࡏ͠ͳ͍ϝιουͷܕΤϥʔ
՝: ͕࡞ΒΕΔ࣌ͱܕ͕ඞཁͳ͕࣌ҧ͏ • ctx.extensions ͷதɺCLI Λىಈ ͯ͠ϓϥάΠϯΛద༻ͨ͠ޙʹ࡞Β ΕΔ • ҰํͰɺϓϥάΠϯͷܕɺίϚϯ
υΛఆٛ͢Δ de fi ne() ͷλΠϛϯά ͰඞཁʹͳΔ
՝: ͕࡞ΒΕΔ࣌ͱܕ͕ඞཁͳ͕࣌ҧ͏ • ͜ͷͨΊɺ࣮ߦ࣌ʹϓϥάΠϯ͔Β ctx.extensions ʹೖ͞ΕͨΛɺίϚϯυΛఆ ٛ͢ΔλΠϛϯάͰܕͱͯ͠ݟͤΔඞཁ͕͋Δ • ͦͷͨΊʹɺগͳ͘ͱ࣍ͷ3ͭΛܕͰͭͳ͙ ඞཁ͕͋Δ
• 1. ͲͷϓϥάΠϯIDͷ extension ͔ • 2. ϓϥάΠϯಉ࢜ͰͲͷ extension Λ͑Δ͔ • 3. ίϚϯυଆͰͲͷϓϥάΠϯͷ extension Λ ظ͢Δ͔
͠͞ 1: ϓϥάΠϯID • ctx.extensions ɺϓϥάΠϯIDΛ key ʹͨ͠ΦϒδΣΫτ • ͭ·ΓɺϓϥάΠϯID
Gunshi ͕ϓ ϥάΠϯΛద༻͢Δͱ͖ͷࣝผࢠͰ ͋ΓɺTypeScript ্ͷ property key Ͱ͋Δ • ͜͜ͰϓϥάΠϯ ID ͷܕ͕ `string` ͩͱɺtype-safe ͳ key ͱͯ͠ѻ͑ͳ ͍
͠͞ 1: ϓϥάΠϯID • type-safe ͳ key ͱͯ͠ѻ͏ʹɺliteral type Λอͭඞཁ͕͋Δ
͠͞ 2: ϓϥάΠϯಉ࢜ Context Λ͏ • ίϚϯυ͚ͩͰͳ͘ɺϓϥάΠϯଞ ͷϓϥάΠϯ͕Ճͨ͠ extension Λ
͏͜ͱ͕Ͱ͖Δ • extension(ctx) ϑΝΫτϦͰɺίϚ ϯυ࣮ߦ࣌ͱಉ͡Α͏ʹ ctx.extensions ΛࢀরͰ͖Δ CommandContext Λड͚औΔ • ྫ: auth ϓϥάΠϯͷதͰlogger ϓ ϥάΠϯͷ Extension ܕ͕ඞཁʹͳΔ
͠͞ 2: ϓϥάΠϯಉ࢜ Context Λ͏ • ͜͜ͰͷϙΠϯτɺϓϥάΠϯ ࣮தͷ extension(ctx) ϑΝΫτ
ϦͰɺଞͷϓϥάΠϯ͕ఏڙ͠ ͨ ctx.extensions Λ type-safe ʹ ѻ͍͍ͨ͜ͱ • ͭ·ΓɺContext ֦ுͷܕίϚ ϯυଆ͚ͩͰͳ͘ɺϓϥάΠϯ࡞ ऀଆʹඞཁ
͠͞ 3: ίϚϯυଆ͔ΒొࡁΈϓϥάΠϯ͕ݟ͑ͳ͍ • CommandRunner ଆͰ extension Λ͑Δ Α͏ʹ͢Δඞཁ͕͋Δ •
Gunshi ͰɺίϚϯυఆٛΛผϑΝΠ ϧʹͰ͖ɺίϚϯυϞδϡʔϧԽͰ ͖Δ • ͔͠͠ɺίϚϯυϞδϡʔϧϓϥάΠ ϯΛొ͢Δίʔυͱผͷॴʹ͋Δ • ͦͷͨΊɺίϚϯυଆʹʮͲͷϓϥάΠ ϯ extension ͕͑Δͷ͔ʯΛܕͱͯ͠ ͢ඞཁ͕͋Δ
Context ֦ுͷ ઃܭΞϓϩʔνൺֱ
͜͜·Ͱͨ͠͠͞Λཧ͢Δͱ… 1. Gunshi Runtime ্ͰɺϓϥάΠ ϯ ID Λ key ʹͯ͠
ctx.extensions ͷΛ࡞Δඞཁ͕͋Δ 2. ϓϥάΠϯ࣮ऀͱίϚϯυఆٛ ऀͷ྆ํͰɺ༻͢Δ ctx.extensions ΛϓϥάΠϯ ID ͷ key ͱ Extension ܕͰ type-safe ʹ ͢Δඞཁ͕͋Δ ϓϥάΠϯ࡞ऀ Gunshi Runtime ϓϥάΠϯ࣮ऀ ίϚϯυఆٛऀ
ղ͖ํͷީิΛݕ౼͢Δ • ͜ͷΛղͨ͘Ίʹɺ͍͔ͭ͘ͷઃܭΞϓϩʔν͕͋Δ 1. Module Augmentation 2. Fluent Interface 3.
Explicit Context Type 4. Compositional Type Augmentation ʢҙ: ͜ΕΒͷઃܭΞϓϩʔνͷ໊শɺ໊͕͚͍ࣗͯΔͷ͕͋Γ·͢ʣ
1. Module Augmentation • طଘͷ interface ΛϞδϡʔϧશମͰ֦ ு͢Δ • ͜ͷΞϓϩʔνΛ࠾༻͍ͯ͠ΔϥΠϒϥ
Ϧ/ϑϨʔϜϫʔΫྫ: • h3 / Nitro: `event.context` • Astro: `App.Locals`
1. Module Augmentation • Pros: • ΞϓϦɺϞδϡʔϧશମͰಉ͡ܕΛڞ༗͍͢͠ • ϑϨʔϜϫʔΫ͕ఏڙ͢Δطଘ Context
ͱ૬ੑ͕Α͍ • Cons: • Ұ֦ு͢Δͱɺಉ͡ module ͷܕΛ͏ॴͯ͢ʹө͞ΕΔ • ܕͷείʔϓΞϓϦશମ·ͨϓϩδΣΫτશମʹدΓ͍͢
2. Fluent Interface • ϝιουνΣΠϯΛ௨ͯ͠ɺContext ʹ ܕΛஈ֊తʹੵ͢Δ • ͜ͷΞϓϩʔνΛ࠾༻͍ͯ͠ΔϥΠϒϥ Ϧ/ϑϨʔϜϫʔΫྫ:
• Elysia: `.decorate()` / `.resolve()` • TanStack Router: `beforeLoad` https://martinfowler.com/bliki/FluentInterface.html
2. Fluent Interface • Pros: • API Λͭͳ͙͚ͩͰܕ͕ੵ͞ΕΔ • ิ͕ڧ͍
• ߏஙॱংͱܕͷมԽ͕Ұக͍͢͠ • લஈͰՃͨ͠ܕΛɺޙஈͷϋϯυϥͳͲͷॲཧͰ͑Δ • Cons: • ϝιουνΣΠϯʹΔ API ઃܭ͕લఏʹͳΔ • Ϟδϡʔϧ͕ࢄ͢ΔͱܕΛӡͼʹ͍͘
3. Explicit Context Type • Context ʹೖΔͷ shape Λɺܕύϥ ϝʔλͰ໌ࣔతͳܕͱͯ͢͠
• ͜ͷΞϓϩʔνΛ࠾༻͍ͯ͠ΔϥΠϒϥ Ϧ/ϑϨʔϜϫʔΫྫ: • Hono: `Hono<{ Variables: ... }>` • tRPC: `initTRPC.context<Context>()`
3. Explicit Context Type • Pros: • Context ͷ shape
͕໌ࣔతʹݟ͑Δ • module augmentation ʹཔΒͳͯ͘Α͍ • Ϟδϡʔϧ୯ҐͰܕͷείʔϓΛ͚͍͢ • ܕΛ export ͯ͠ผϞδϡʔϧ͔Β࠶ར༻͍͢͠ • Cons: • Context ʹԿ͕ೖΔ͔Λར༻ऀ͕ܕͱͯ͠ॻ͘ඞཁ͕͋Δ • ΛՃ͢ΔॴͱܕఆٛΛἧ͑Δඞཁ͕͋Δ • ܕύζϧͰෳࡶʹͳΓ͕ͪ
4. Compositional Type Augmentation • খ͞ͳܕ͖ͷ෦Λ߹͠ɺ߹݁Ռ ͔Β࠷ऴతͳܕΛਪ͢Δ • ͜ͷΞϓϩʔνΛ࠾༻͍ͯ͠ΔϥΠϒϥ Ϧ/ϑϨʔϜϫʔΫ:
• Optique `object()` / `merge()` / `or()` …
4. Compositional Type Augmentation • Pros: • ෦Λ࠶ར༻͠ͳ͕ΒܕใΛอͯΔ • ߹݁Ռͷܕ͕࣮ߏ͔Βಋ͚Δ
• ઃఆ parser ͷΑ͏ͳ७ਮͳߏͱ૬ੑ͕Α͍ • Cons: • ߹ର͕ͱͯ͠ಉ͡ॴʹू·Δઃܭ͕ඞཁ • Ϟδϡʔϧ͕ࢄ͢Δ߹ɺ߹ࡁΈͷܕΛͲ͏͔͕͢՝ʹͳΔ
Gunshi ͕࠾༻ͨ͠ ઃܭΞϓϩʔν
Explicit Context Type • Gunshi ͰɺExplicit Context Type Λ ϕʔεΛ࠾༻
• Gunshi ʹ͓͍ͯɺܕͷ໌ࣔ Context શମͰͳ͘ɺctx.extensions ͷܕ • ϓϥάΠϯIDͱ Extension ܕͷϖΞΛ Map ͱͯ͠දݱ͢Δ
࠾༻ཧ༝ • Gunshi ʮએݴϕʔεͷΠϯλʔϑΣʔεʯͰίϚϯυϓϥάΠϯΛఆ ٛ͢Δ • ίϚϯυϞδϡʔϧͱϓϥάΠϯ͕ผʑͷॴʹଘࡏ͢Δ • ϓϥάΠϯ IDͱ
Extension ܕͷରԠΛ ctx.extensions ͷ key/value ͱͯ͠ API ͱͯͤ͠Δ • ϓϥάΠϯ࡞ऀ͕ϓϥάΠϯ IDͱ Extension ܕΛ export ͯ͠ڞ༗Ͱ͖Δ
Explicit Context Type Λ Gunshi ʹΈࠐΉ
ϓϥάΠϯ࡞ऀ͕ export ͨ͠ϞϊΛΈࠐΉ ϓϥάΠϯ͕ެ։͢Δใ extension(ctx) Ͱґଘ͢Δ ϓϥάΠϯextensionΛ༻ ctx.extensions ͷ ࣮ࡍͷΛ࡞Δͷʹ༻
run(ctx) Ͱ ظ͢ΔϓϥάΠϯ exntensionΛ༻ ϓϥάΠϯID Extension ܕ extension ϑΝΫτϦ ϓϥάΠϯID Extension ܕ ϓϥάΠϯID ϓϥάΠϯID Extension ܕ ϓϥάΠϯ࣮ऀ Gunshi Runtime ίϚϯυఆٛऀ extension ϑΝΫτϦ ϓϥάΠϯ࡞ऀ
GunshiParams ʹΑΔܕͷൖ • Gunshi ͰɺܕใΛ GunshiParams ܦ ༝Ͱ CommandContext ·Ͱ͍ͯ͠Δ
• ϓϥάΠϯʹΑΔ Context ֦ுʹରͯ͠ ɺಉ͡ΈͰɺextensions GunshiParams ʹ࣋ͨͤͯղܾ͍ͯ͠Δ • CommandContext ɺܕύϥϝʔλܦ༝ Ͱ ctx.extensions ͷܕऔΓग़͠ɺϓϥ άΠϯͷܕΛͤ͞Δ
ϓϥάΠϯ࡞ऀଆ͕ެ։͢Δใ • ϓϥάΠϯ࡞ऀɺctx.extensions Ͱ key ʹͳΔϓϥάΠϯIDͱɺ extension ϑΝΫτϦ͕ฦ͢ Extension ͷܕΛηοτͰެ։͢
Δ • Logger ϓϥάΠϯͷέʔεྫ: • loggerId ctx.extensions ͷkey • LoggerExtension logger ͕ఏ ڙ͢Δϩάؔ܊
ϓϥάΠϯ࡞ऀଆ͕ެ։͢Δใ • ϓϥάΠϯ͕ఏڙ͢ΔػೳΛ࣮ ͨ͠ extension ϑΝΫτϦΛ ఏڙ͢Δ • ۩ମతʹ pluign()
ʹͦͷϑΝ ΫτϦΛࢦఆͯ͠ɺreturn ͢Δ ॲཧΛ࣋ͬͨϓϥάΠϯఆٛؔ Λ export ͢Δ logger()ͷ ΓͷܕԼهͰਪ
ϓϥάΠϯ࣮ଆͰଞͷϓϥάΠϯΛ͏߹ • ϓϥάΠϯɺଞͷϓϥάΠϯ extension Λ͏͜ͱ͕͋Δ • ϓϥάΠϯIDͱ Extension ܕΛ Map
ͨ͠ͷΛ plugin() ͷܕύϥϝʔλͷ ୈ1Ҿʹࢦఆ͢Δ • ͦΕʹΑΓɺplugin()ଆͰɺextension ϑΝΫτϦʹΔ ctx.extensions ʹґ ଘ͢ΔϓϥάΠϯͷܕ͕ਪ͞ΕΔ ϓϥάΠϯ ID ͱ Extension ܕΛ Map ͨ͠ͷΛࢦఆ͢Δ
extension ϑΝΫτϦͷ ctx.extensions ͷ type-safe ʹͳΔྲྀΕ
͍͔ͭ͘ͷܕΛ ܦͯextention ϑΝΫτϦͷܕ Λղܾ extension ϑΝΫτϦͷ ctx.extensions ͷ type-safe ʹͳΔྲྀΕ
GunshiParams Λհͯ͠ extension ϑΝΫτϦͷୈ1Ҿͷ CommandContext ʹΔ extension ϑΝΫτϦͷ ctx.extensions ͷ
type-safe ʹͳΔྲྀΕ
Gunshi Runtime Ͱ ctx.extensions Λ࡞Δ • Πϯετʔϧ͞ΕͨϓϥάΠϯͷ extension ϑΝΫτϦΛ࣮ߦ͢Δ loggerExtension
LoggerExtension Type authExtension AuthExtension Type apiExtension ApiExtension Type extension() extension() extension() ctx.extensions [loggerId] loggerExtension [authId] authExtension [apiId] apiExtension … … cli() ෦Ͱ ϓϥάΠϯID͝ͱʹू
ίϚϯυఆٛऀ͕ϓϥάΠϯͷܕΛ͢ • ίϚϯυϞδϡʔϧϓϥάΠϯొॴ ͔ΒΕ͍ͯΔ • ϓϥάΠϯIDͱ Extension ܕΛ Map ͨ͠
ͷΛ plugin() ͷܕύϥϝʔλͷୈ1Ҿʹࢦ ఆ͢Δ • ͦΕʹΑΓɺde fi neWithTypes()ଆͰɺ extensionϑΝΫτϦʹΔ ctx.extensions ʹґଘ͢ΔϓϥάΠϯͷܕ͕ਪ͞ΕΔ
de fi neWithTypes() ʹΑΔ ctx.extensions ͕ type-safeʹͳΔྲྀΕ CommandDe fi nitionResultͷܕύϥϝʔλʹ
De fi neWithTypesReturnͷୈ1ҾΛ͢
de fi neWithTypes() ʹΑΔ ctx.extensions ͕ type-safeʹͳΔྲྀΕ CommandDe fi nitionResult
-> Command -> CommanRunner ͱ͍͏ܕͷόέπϦϨʔͰ࠷ऴత ʹ ctx.extensions ͷܕ͕ܾ·Δ
·ͱΊ
ࠓͨ͜͠ͱ 1.Gunshi ͷ CommandContext de fi ne() ͔Βܕਪ͞ΕΔ 2.
ϓϥάΠϯಋೖʹΑΓɺCommandContext ʹ֦ுϙΠϯτ͕ඞཁʹͳͬ ͨ 3. ՝ɺίϚϯυ࣮ߦ࣌ʹ࡞ΒΕΔ ctx.extensions ͷͱɺϓϥάΠϯ࣮ ࣌ɺίϚϯυఆٛ࣌ʹͦΕΛ type-safe ʹ͢Δ͜ͱ 4. ͍͔ͭ͘ͷΞϓϩʔνΛൺֱ͠ɺGunshi Explicit Context Type Λ࠾༻ 5. ϓϥάΠϯ IDͱ Extension ܕΛ export ͠ɺͦΕΒΛ key/value ͷϖΞͱͳ Δ Map Ͱܕύϥϝʔλܦ༝Ͱ ctx.extensions ͷܕ͕ਪ͞ΕΔΑ͏ʹઃܭ
Explicit Context Type ΛબΜͩ͜ͱʹΑΔτϨʔυΦϑ • ಘͨͷ: • ϓϥάΠϯڥքͷ໌ࣔੑ: ϓϥάΠϯ ID
͕ key ʹΓɺͲͷϓϥάΠϯ༝དྷͷ extension ͔͔Δ • ܕܖͷެ։ ֎෦ϓϥάΠϯ͕ϓϥάΠϯ ID ͱ Extension ܕΛ export Ͱ͖Δ • ࢄίϚϯυͰͷܕڞ༗: ϓϥάΠϯొॴ͔ΒΕͨίϚϯυϞδϡʔϧʹܕΛͤΔ
Explicit Context Type ΛબΜͩ͜ͱʹΑΔτϨʔυΦϑ • ҰํͰɺ੍ͱͯ͠ड͚ೖΕͨͷ: • ϓϥάΠϯ࡞ऀͷެ։: ϓϥάΠϯ࡞ऀ ϓϥάΠϯ
IDͱ Extension ܕΛެ։͢Δඞཁ͕͋Δ • ίϚϯυଆͷ໌ࣔࢦఆ: ίϚϯυఆٛଆظ͢ΔϓϥάΠϯͷ extension Λ໌ࣔ͢Δඞཁ͕͋Δ • ొͱܕࢦఆͷ߹ੑ: ϓϥάΠϯొͱίϚϯυ࣮ଆͷܕࢦఆΛἧ͑Δඞཁ͕͋Δ
Ԡ༻Ͱ͖Δݟ • Context ͷΑ͏ͳಈతʹΛՃͰ͖ΔߏΛઃܭ͢Δͱ͖ɺಉ͡؍Ͱ அ͢Δ͜ͱʹͳΔ • Ճ͞Εͨͷ༝དྷΛ API ʹ͔͢ •
ܕΛ global ʹ͛Δ͔ɺscope Λݶఆ͢Δ͔ • ࣗಈਪΛ༏ઌ͢Δ͔ɺ໌ࣔతͳܕܖΛ༏ઌ͢Δ͔ • ར༻ऀͷॻ͖͢͞ͱɺ֦ு͢ΔଆͷΛͲ͏͚Δ͔ • ಈతͳ֦ுΛ type-safe ʹ͢ΔઃܭͰɺܕͷදݱ͚ͩͰͳ͘ɺڥքͱͷ ஔ͖ํ͕ॏཁʹͳΔ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ