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
1.5k
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.4k
gunshi
kazupon
1
250
Nitro v3
kazupon
2
590
わたしのOSS活動
kazupon
3
640
Vapor Revolution
kazupon
3
4.3k
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.4k
Other Decks in Programming
See All in Programming
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
400
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
360
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
480
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
200
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
100
自分的「カンファレンスの楽しみ方」
syumai
0
160
FDEとは、何者なのか?
masapyon1212
0
110
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
570
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
170
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
570
ALB ログから Trace を気合で繋げる技術
fohte
7
840
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
260
Featured
See All Featured
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
440
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
360
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Bash Introduction
62gerente
615
220k
Typedesign – Prime Four
hannesfritz
42
3.2k
Ruling the World: When Life Gets Gamed
codingconduct
0
320
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
880
Building AI with AI
inesmontani
PRO
1
1.2k
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 ʹ͢ΔઃܭͰɺܕͷදݱ͚ͩͰͳ͘ɺڥքͱͷ ஔ͖ํ͕ॏཁʹͳΔ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ