Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
プラグインで拡張される Context をtype-safe にする難しさと設計判断
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
kazupon
May 22, 2026
Programming
1.7k
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
600
わたしのOSS活動
kazupon
3
650
Vapor Revolution
kazupon
3
4.3k
Vue.js最新動向
kazupon
3
1.7k
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
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
3
360
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
850
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
530
wkhtmltopdfの次どうするか問題2026
willnet
2
1.6k
Java 27新機能 / Java 27 new features
kishida
2
150
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
250
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
7
3.1k
Family mrubyの進捗
kishima
1
130
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
140
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.4k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
500
Workers Cache を知る
syumai
0
140
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
500
Why Our Code Smells
bkeepers
PRO
340
58k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
240
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
65k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Between Models and Reality
mayunak
4
460
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
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 ʹ͢ΔઃܭͰɺܕͷදݱ͚ͩͰͳ͘ɺڥքͱͷ ஔ͖ํ͕ॏཁʹͳΔ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ