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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
kazupon
May 22, 2026
Programming
3k
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
280
Nitro v3
kazupon
2
630
わたしのOSS活動
kazupon
3
660
Vapor Revolution
kazupon
3
4.4k
Vue.js最新動向
kazupon
3
1.7k
Vue 3.4
kazupon
13
5k
Vue & Vite Rustify
kazupon
4
2.5k
Vue.jsエコシステム動向2023
kazupon
17
9.5k
Other Decks in Programming
See All in Programming
複数ドメインを一つのアプリに統合するFlutterの設計と運用_FlutterKaigi2026登壇資料(須永高弘)
takahirosunaga
0
150
AmebaブログはKMPから卒業します
kmars0605
0
320
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
340
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.4k
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
200
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
150
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
320
AI時代のIaC入門 〜なぜインフラをコードで管理したいのか?〜 / Introduction to IaC in the AI Era
akihisaikeda
6
1.4k
Spec-driven Development with AI
simas
PRO
0
2.2k
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
giljongyu
0
710
SODA - FACT BOOK(JP)
sodainc
1
40k
Kotlinの15年とServer-Side Kotlin
n_takehata
1
200
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1.1k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
The Curious Case for Waylosing
cassininazir
1
610
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Code Review Best Practice
trishagee
74
20k
How GitHub (no longer) Works
holman
316
150k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
670
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.9k
Everyday Curiosity
cassininazir
0
390
Believing is Seeing
oripsolob
1
270
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 ʹ͢ΔઃܭͰɺܕͷදݱ͚ͩͰͳ͘ɺڥքͱͷ ஔ͖ํ͕ॏཁʹͳΔ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ