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.1k
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
240
Nitro v3
kazupon
2
570
わたしのOSS活動
kazupon
3
630
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.3k
Other Decks in Programming
See All in Programming
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.7k
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
150
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
890
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
680
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
420
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
150
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
510
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.2k
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1k
Featured
See All Featured
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
The Cult of Friendly URLs
andyhume
79
7k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
How Software Deployment tools have changed in the past 20 years
geshan
0
34k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
230
From π to Pie charts
rasagy
0
240
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
510
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 ʹ͢ΔઃܭͰɺܕͷදݱ͚ͩͰͳ͘ɺڥքͱͷ ஔ͖ํ͕ॏཁʹͳΔ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ