Slide 1

Slide 1 text

ϓϥάΠϯͰ֦ு͞ΕΔ Context Λ type-safe ʹ͢Δ೉͠͞ͱ ઃܭ൑அ TSKaigi 2026 2026/05/22 @kazupon

Slide 2

Slide 2 text

ࣗݾ঺հ

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

͜ͷൃදʹ͍ͭͯ • Gunshi ͱ Context ͱ͸Կ͔ • ίϚϯυఆ͔ٛΒ Context ͕ఏڙ͢Δ஋ͷܕ͕Ͳ͏ਪ࿦͞ΕΔͷ͔ • ϓϥάΠϯʹΑͬͯ Context Λ֦ு͢ΔͱԿ͕೉͍͠ͷ͔ • Gunshi Runtime ʹ֦ு͞Εͨ஋ͱϓϥάΠϯ͕ఏڙ͢Δ Extension ܕΛͲ͏ରԠ͚ͮΔͷ͔ • Gunshi ͕બΜͩઃܭΞϓϩʔνͱͦͷτϨʔυΦϑ Gunshi ͷϓϥάΠϯγεςϜΛ୊ࡐʹɺ ʹ͍ͭͯ࿩͍ͯ͘͠

Slide 5

Slide 5 text

Gunshi ͱ Context

Slide 6

Slide 6 text

Gunshi ͱίϚϯυ࣮ߦ࠷খίʔυ • Gunshi: Ϟμϯͳ JavaScript CLI ϥΠϒϥϦ • ໊শ͸ “Commander” ͔ΒΠϯεύΠΞ • ಛ௃ • એݴϕʔεͳίϚϯυఆٛ • type-safe ͳ ίϚϯυ arguments • ϓϥάΠϯ • … ͳͲͳͲ https://gunshi.dev

Slide 7

Slide 7 text

Gunshi ͷίϚϯυ࣮ߦϑϩʔ Parse Arguments Resolve Command Start

Slide 8

Slide 8 text

Gunshi ͷίϚϯυ࣮ߦϑϩʔ Parse Arguments Resolve Command Resolve Arguments Start

Slide 9

Slide 9 text

Gunshi ͷίϚϯυ࣮ߦϑϩʔ Parse Arguments Resolve Command Resolve Arguments Create CommandContext Run Command Runner Start End

Slide 10

Slide 10 text

Context ͱ͸ʁ • Context ͱ͸Կ౳͔ͷॲཧͷ࣮ߦʹඞ ཁͳ৘ใΛ·ͱΊͯ౉ͨ͢ΊͷϋίΈ ͍ͨͳ΋ͷ • ࣮ࡍྫ: • Hono: ϋϯυϥʹ౉͞ΕΔ `c` • Express: ϛυϧ΢ΣΞؒͰڞ༗͢Δ `res.locals` • Context Λ࢖͏ͱɺ࣮ߦର৅ͷೖྗɺ ؀ڥɺڞ༗ঢ়ଶΛ1ͭͷೖޱ͔Βѻ͑Δ

Slide 11

Slide 11 text

Gunshi ͷ CommandContext ͱ͸ʁ • ࣮ߦͨ͠ίϚϯυ໊ɺίϚϯυ args ఆٛɺͦ ࣮ͯ͠ߦલʹ args ͕ղੳ (parse) ͞Εͯղܾ ͨ͠ values ͳͲͷ৘ใΛؚΜͩΦϒδΣΫτ • ίϚϯυ࣮ߦϩδοΫͰ͋Δ CommandRunner ͷϋϯυϥؔ਺ͷύϥϝʔ λͱͯ͠౉͞ΕΔ • CommandContext ʹ͸ɺίϚϯυ࣮ߦ͞Εͨ ͱ͖ͷॲཧʹඞཁͳ৘ใ͕ू໿͞ΕΔ

Slide 12

Slide 12 text

ίϚϯυͰ࢖༻͢Δ Context ͷܕਪ࿦

Slide 13

Slide 13 text

CommandContext ͷ type-safe • Gunshi Ͱ͸ɺίϚϯυΛఆٛ͢Δ de fi ne() Λհͯ͠ɺ CommandContext ͷܕ͕ܾ·Δ • ctx.args ΋ ctx.values ΋ɺίϚϯ υͰએݴͨ͠ args ʹج͍ͮͯ type-safe ʹͳΔ

Slide 14

Slide 14 text

de fi ne ͔Β run(ctx) ·Ͱܕ͕ಧ͘࢓૊Έ • CommandContext ͷܕ͸ɺde fi ne() ʹ౉ͨ͠ίϚϯυఆ͔ٛΒਪ࿦͞ΕΔ • ͜͜Ͱ `A` ͸ɺde fi nition.args ͔Βਪ࿦͞ΕΔ • de fi ne() Ͱਪ࿦͞Εͨ `A` ͸ɺGunshiParams Λ௨ͯ͠ Command ͷܕʹ ͳΔ

Slide 15

Slide 15 text

de fi ne ͔Β run(ctx) ·Ͱܕ͕ಧ͘࢓૊Έ • GunshiParams ͸ɺGunshi ͷܕ API Ͱڞ௨ʹ࢖͏ύϥϝʔλܕ

Slide 16

Slide 16 text

de fi ne ͔Β run(ctx) ·Ͱܕ͕ಧ͘࢓૊Έ Command Ҏ߱͸ɺ Command -> CommandRunner -> CommandContext -> ExtractArgs, ArgValues ͱ͍͏ܕͷܕύϥϝʔλͷόέπϦϨʔͰ ctx.args ͱ ctx.values ͷܕ͕ਪ࿦͞ΕΔ

Slide 17

Slide 17 text

ϓϥάΠϯʹΑΔ Context ֦ு

Slide 18

Slide 18 text

Gunshi Λ։ൃ͍ͯ͘͠͏ͪʹग़͖ͯͨ՝୊ • Gunshi Λ։ൃ͍ͯ͘͠ͱɺίΞ͚ͩͰ࣋ͭʹ͸ॏ͍ػೳ͕૿͖͑ͯͨ • தʹ͸࢖Θͳ͍ػೳ͸ΦϓτΞ΢τ͍ͨ͠ͱ͍͏੠΋Ͱ͖ͯͨ • global options • usage renderer • completion • i18n • ͜ΕΒΛ͢΂ͯίΞʹೖΕΔͱɺ੹຿΋ϝϯςφϯεର৅΋૿͑ଓ͚Δ

Slide 19

Slide 19 text

ϓϥάΠϯΞʔΩςΫνϟΛ࠾༻ • ίΞΛϕʔεʹඞཁͳػೳ͚ͩ૊ΈࠐΊ ΔΑ͏ʹ͢Δʹ͸ɺϓϥάΠϯΞʔΩς Ϋνϟ͕࠷దͩͬͨ • ϓϥάΠϯ͸ɺίϚϯυΛ࣮ߦ͢Δલʹ ϓϥάΠϯͷ֦ு͕ Gunshi ʹద༻͞Ε Δ • ͜ΕʹΑΓɺίΞʹ௚઀ೖΕͣʹػೳΛ ௥ՃͰ͖Δ

Slide 20

Slide 20 text

ϓϥάΠϯ͸ CommandContext Λ֦ு͢Δ • ۩ମతʹ͸ɺCommandRunner ͷύϥϝʔ λͰ౉Δ CommandContext ͷ extensions (ͭ·Γctx.extensions) ʹ஋΍ϩδοΫΛಈ తʹ௥Ճ͢Δ • ͔͠͠ɺJSϨϕϧͰ͸֦ு͞ΕΔ͕ɺTSͷ ܕγεςϜͱͯ͠͸ run(ctx) ͷ ctx.extensions ʹܕͷԸܙΛड͚Εͳ͍ • ϓϥάΠϯ͸ɺίϚϯυ࣮ߦ࣌ͷ CommandContext ΁ܕΛެ։͢Δ࢓૊Έ͕ ඞཁ

Slide 21

Slide 21 text

֦ு͞Εͨ Context Λ ܕ҆શʹ͢Δ೉͠͞

Slide 22

Slide 22 text

֦ு͞Εͨ ctx.extensions Λ type-safe ʹ͍ͨ͠ • ͨͩɺϓϥάΠϯʹΑ֦ͬͯு͞Εͨ ctx.extensions ΋ɺطଘͷ argsɺ values ͷΑ͏ʹ type-safe ʹͯ͠࢖͍͍ͨ • ཉ͍͠΋ͷ: • ϓϥάΠϯ ID ʹΑΔิ׬ • ϓϥάΠϯ extension API ͷิ׬ • ଘࡏ͠ͳ͍ϝιουͷܕΤϥʔ

Slide 23

Slide 23 text

՝୊: ஋͕࡞ΒΕΔ࣌఺ͱܕ͕ඞཁͳ࣌఺͕ҧ͏ • ctx.extensions ͷத਎͸ɺCLI Λىಈ ͯ͠ϓϥάΠϯΛద༻ͨ͠ޙʹ࡞Β ΕΔ • ҰํͰɺϓϥάΠϯͷܕ͸ɺίϚϯ υΛఆٛ͢Δ de fi ne() ͷλΠϛϯά ͰඞཁʹͳΔ

Slide 24

Slide 24 text

՝୊: ஋͕࡞ΒΕΔ࣌఺ͱܕ͕ඞཁͳ࣌఺͕ҧ͏ • ͜ͷͨΊɺ࣮ߦ࣌ʹϓϥάΠϯ͔Β ctx.extensions ʹ஫ೖ͞Εͨ஋ΛɺίϚϯυΛఆ ٛ͢ΔλΠϛϯάͰܕͱͯ͠ݟͤΔඞཁ͕͋Δ • ͦͷͨΊʹ͸ɺগͳ͘ͱ΋࣍ͷ3ͭΛܕͰͭͳ͙ ඞཁ͕͋Δ • 1. ͲͷϓϥάΠϯIDͷ extension ͔ • 2. ϓϥάΠϯಉ࢜ͰͲͷ extension Λ࢖͑Δ͔ • 3. ίϚϯυଆͰͲͷϓϥάΠϯͷ extension Λ ظ଴͢Δ͔

Slide 25

Slide 25 text

೉͠͞ 1: ϓϥάΠϯID • ctx.extensions ͸ɺϓϥάΠϯIDΛ key ʹͨ͠ΦϒδΣΫτ • ͭ·ΓɺϓϥάΠϯID͸ Gunshi ͕ϓ ϥάΠϯΛద༻͢Δͱ͖ͷࣝผࢠͰ ͋ΓɺTypeScript ্ͷ property key Ͱ΋͋Δ • ͜͜ͰϓϥάΠϯ ID ͷܕ͕ `string` ͩͱɺtype-safe ͳ key ͱͯ͠ѻ͑ͳ ͍

Slide 26

Slide 26 text

೉͠͞ 1: ϓϥάΠϯID • type-safe ͳ key ͱͯ͠ѻ͏ʹ͸ɺliteral type Λอͭඞཁ͕͋Δ

Slide 27

Slide 27 text

೉͠͞ 2: ϓϥάΠϯಉ࢜΋ Context Λ࢖͏ • ίϚϯυ͚ͩͰͳ͘ɺϓϥάΠϯ΋ଞ ͷϓϥάΠϯ͕௥Ճͨ͠ extension Λ ࢖͏͜ͱ͕Ͱ͖Δ • extension(ctx) ϑΝΫτϦͰ͸ɺίϚ ϯυ࣮ߦ࣌ͱಉ͡Α͏ʹ ctx.extensions ΛࢀরͰ͖Δ CommandContext Λड͚औΔ • ྫ: auth ϓϥάΠϯͷதͰ΋logger ϓ ϥάΠϯͷ Extension ܕ͕ඞཁʹͳΔ

Slide 28

Slide 28 text

೉͠͞ 2: ϓϥάΠϯಉ࢜΋ Context Λ࢖͏ • ͜͜ͰͷϙΠϯτ͸ɺϓϥάΠϯ ࣮૷தͷ extension(ctx) ϑΝΫτ ϦͰ΋ɺଞͷϓϥάΠϯ͕ఏڙ͠ ͨ ctx.extensions Λ type-safe ʹ ѻ͍͍ͨ͜ͱ • ͭ·ΓɺContext ֦ுͷܕ͸ίϚ ϯυଆ͚ͩͰͳ͘ɺϓϥάΠϯ࡞ ੒ऀଆʹ΋ඞཁ

Slide 29

Slide 29 text

೉͠͞ 3: ίϚϯυଆ͔Βొ࿥ࡁΈϓϥάΠϯ͕ݟ͑ͳ͍ • CommandRunner ଆͰ extension Λ࢖͑Δ Α͏ʹ͢Δඞཁ͕͋Δ • Gunshi Ͱ͸ɺίϚϯυఆٛΛผϑΝΠ ϧʹ෼཭Ͱ͖ɺίϚϯυϞδϡʔϧԽͰ ͖Δ • ͔͠͠ɺίϚϯυϞδϡʔϧ͸ϓϥάΠ ϯΛొ࿥͢Δίʔυͱ͸ผͷ৔ॴʹ͋Δ • ͦͷͨΊɺίϚϯυଆʹ͸ʮͲͷϓϥάΠ ϯ extension ͕࢖͑Δͷ͔ʯΛܕͱͯ͠౉ ͢ඞཁ͕͋Δ

Slide 30

Slide 30 text

Context ֦ுͷ ઃܭΞϓϩʔνൺֱ

Slide 31

Slide 31 text

͜͜·Ͱ࿩ͨ͠೉͠͞Λ੔ཧ͢Δͱ… 1. Gunshi Runtime ্Ͱ͸ɺϓϥάΠ ϯ ID Λ key ʹͯ͠ ctx.extensions ͷ஋Λ࡞Δඞཁ͕͋Δ 2. ϓϥάΠϯ࣮૷ऀͱίϚϯυఆٛ ऀͷ྆ํͰ͸ɺ࢖༻͢Δ ctx.extensions ΛϓϥάΠϯ ID ͷ key ͱ Extension ܕͰ type-safe ʹ ͢Δඞཁ͕͋Δ ϓϥάΠϯ࡞ऀ Gunshi Runtime ϓϥάΠϯ࣮૷ऀ ίϚϯυఆٛऀ

Slide 32

Slide 32 text

ղ͖ํͷީิΛݕ౼͢Δ • ͜ͷ໰୊Λղͨ͘Ίʹ͸ɺ͍͔ͭ͘ͷઃܭΞϓϩʔν͕͋Δ 1. Module Augmentation 2. Fluent Interface 3. Explicit Context Type 4. Compositional Type Augmentation ʢ஫ҙ: ͜ΕΒͷઃܭΞϓϩʔνͷ໊শ͸ɺࣗ෼໊͕෇͚͍ͯΔ΋ͷ͕͋Γ·͢ʣ

Slide 33

Slide 33 text

1. Module Augmentation • طଘͷ interface ΛϞδϡʔϧશମͰ֦ ு͢Δ • ͜ͷΞϓϩʔνΛ࠾༻͍ͯ͠ΔϥΠϒϥ Ϧ/ϑϨʔϜϫʔΫྫ: • h3 / Nitro: `event.context` • Astro: `App.Locals`

Slide 34

Slide 34 text

1. Module Augmentation • Pros: • ΞϓϦɺϞδϡʔϧશମͰಉ͡ܕΛڞ༗͠΍͍͢ • ϑϨʔϜϫʔΫ͕ఏڙ͢Δطଘ Context ͱ૬ੑ͕Α͍ • Cons: • Ұ౓֦ு͢Δͱɺಉ͡ module ͷܕΛ࢖͏৔ॴ͢΂ͯʹ൓ө͞ΕΔ • ܕͷείʔϓ͸ΞϓϦશମ·ͨ͸ϓϩδΣΫτશମʹدΓ΍͍͢

Slide 35

Slide 35 text

2. Fluent Interface • ϝιουνΣΠϯΛ௨ͯ͠ɺContext ʹ ܕΛஈ֊తʹ஝ੵ͢Δ • ͜ͷΞϓϩʔνΛ࠾༻͍ͯ͠ΔϥΠϒϥ Ϧ/ϑϨʔϜϫʔΫྫ: • Elysia: `.decorate()` / `.resolve()` • TanStack Router: `beforeLoad` https://martinfowler.com/bliki/FluentInterface.html

Slide 36

Slide 36 text

2. Fluent Interface • Pros: • API Λͭͳ͙͚ͩͰܕ͕஝ੵ͞ΕΔ • ิ׬͕ڧ͍ • ߏஙॱংͱܕͷมԽ͕Ұக͠΍͍͢ • લஈͰ௥Ճͨ͠ܕΛɺޙஈͷϋϯυϥͳͲͷॲཧͰ࢖͑Δ • Cons: • ϝιουνΣΠϯʹ৐Δ API ઃܭ͕લఏʹͳΔ • Ϟδϡʔϧ͕෼ࢄ͢ΔͱܕΛӡͼʹ͍͘

Slide 37

Slide 37 text

3. Explicit Context Type • Context ʹೖΔ஋ͷ shape Λɺܕύϥ ϝʔλͰ໌ࣔతͳܕͱͯ͠౉͢ • ͜ͷΞϓϩʔνΛ࠾༻͍ͯ͠ΔϥΠϒϥ Ϧ/ϑϨʔϜϫʔΫྫ: • Hono: `Hono<{ Variables: ... }>` • tRPC: `initTRPC.context()`

Slide 38

Slide 38 text

3. Explicit Context Type • Pros: • Context ͷ shape ͕໌ࣔతʹݟ͑Δ • module augmentation ʹཔΒͳͯ͘Α͍ • Ϟδϡʔϧ୯ҐͰܕͷείʔϓΛ෼͚΍͍͢ • ܕΛ export ͯ͠ผϞδϡʔϧ͔Β࠶ར༻͠΍͍͢ • Cons: • Context ʹԿ͕ೖΔ͔Λར༻ऀ͕ܕͱͯ͠ॻ͘ඞཁ͕͋Δ • ஋Λ௥Ճ͢Δ৔ॴͱܕఆٛΛἧ͑Δඞཁ͕͋Δ • ܕύζϧͰෳࡶʹͳΓ͕ͪ

Slide 39

Slide 39 text

4. Compositional Type Augmentation • খ͞ͳܕ෇͖ͷ෦඼Λ߹੒͠ɺ߹੒݁Ռ ͔Β࠷ऴతͳܕΛਪ࿦͢Δ • ͜ͷΞϓϩʔνΛ࠾༻͍ͯ͠ΔϥΠϒϥ Ϧ/ϑϨʔϜϫʔΫ: • Optique `object()` / `merge()` / `or()` …

Slide 40

Slide 40 text

4. Compositional Type Augmentation • Pros: • ෦඼Λ࠶ར༻͠ͳ͕Βܕ৘ใΛอͯΔ • ߹੒݁Ռͷܕ͕࣮૷ߏ଄͔Βಋ͚Δ • ઃఆ΍ parser ͷΑ͏ͳ७ਮͳߏ଄ͱ૬ੑ͕Α͍ • Cons: • ߹੒ର৅͕஋ͱͯ͠ಉ͡৔ॴʹू·Δઃܭ͕ඞཁ • Ϟδϡʔϧ͕෼ࢄ͢Δ৔߹ɺ߹੒ࡁΈͷܕΛͲ͏౉͔͕͢՝୊ʹͳΔ

Slide 41

Slide 41 text

Gunshi ͕࠾༻ͨ͠ ઃܭΞϓϩʔν

Slide 42

Slide 42 text

Explicit Context Type • Gunshi Ͱ͸ɺExplicit Context Type Λ ϕʔεΛ࠾༻ • Gunshi ʹ͓͍ͯɺܕͷ໌ࣔ͸ Context શମͰ͸ͳ͘ɺctx.extensions ͷܕ • ϓϥάΠϯIDͱ Extension ܕͷϖΞΛ Map ͱͯ͠දݱ͢Δ

Slide 43

Slide 43 text

࠾༻ཧ༝ • Gunshi ͸ʮએݴϕʔεͷΠϯλʔϑΣʔεʯͰίϚϯυ΍ϓϥάΠϯΛఆ ٛ͢Δ • ίϚϯυϞδϡʔϧͱϓϥάΠϯ͕ผʑͷ৔ॴʹଘࡏ͢Δ • ϓϥάΠϯ IDͱ Extension ܕͷରԠΛ ctx.extensions ͷ key/value ͱͯ͠ API ͱͯ͠࢒ͤΔ • ϓϥάΠϯ࡞ऀ͕ϓϥάΠϯ IDͱ Extension ܕΛ export ͯ͠ڞ༗Ͱ͖Δ

Slide 44

Slide 44 text

Explicit Context Type Λ Gunshi ʹ૊ΈࠐΉ

Slide 45

Slide 45 text

ϓϥάΠϯ࡞ऀ͕ export ͨ͠ϞϊΛ૊ΈࠐΉ ϓϥάΠϯ͕ެ։͢Δ৘ใ extension(ctx) Ͱґଘ͢Δ ϓϥάΠϯextensionΛ࢖༻ ctx.extensions ͷ ࣮ࡍͷ஋Λ࡞Δͷʹ࢖༻ run(ctx) Ͱ ظ଴͢ΔϓϥάΠϯ exntensionΛ࢖༻ ϓϥάΠϯID Extension ܕ extension ϑΝΫτϦ ϓϥάΠϯID Extension ܕ ϓϥάΠϯID ϓϥάΠϯID Extension ܕ ϓϥάΠϯ࣮૷ऀ Gunshi Runtime ίϚϯυఆٛऀ extension ϑΝΫτϦ ϓϥάΠϯ࡞ऀ

Slide 46

Slide 46 text

GunshiParams ʹΑΔܕͷ఻ൖ • Gunshi Ͱ͸ɺܕ৘ใΛ GunshiParams ܦ ༝Ͱ CommandContext ·Ͱ౉͍ͯ͠Δ • ϓϥάΠϯʹΑΔ Context ֦ுʹରͯ͠ ΋ɺಉ͡࢓૊ΈͰɺextensions ΋ GunshiParams ʹ࣋ͨͤͯղܾ͍ͯ͠Δ • CommandContext ͸ɺܕύϥϝʔλܦ༝ Ͱ ctx.extensions ͷܕ΋औΓग़͠ɺϓϥ άΠϯͷܕΛ఻೻ͤ͞Δ

Slide 47

Slide 47 text

ϓϥάΠϯ࡞ऀଆ͕ެ։͢Δ৘ใ • ϓϥάΠϯ࡞ऀ͸ɺctx.extensions Ͱ key ʹͳΔϓϥάΠϯIDͱɺ extension ϑΝΫτϦ͕ฦ͢ Extension ͷܕΛηοτͰެ։͢ Δ • Logger ϓϥάΠϯͷέʔεྫ: • loggerId ͸ ctx.extensions ͷkey • LoggerExtension ͸ logger ͕ఏ ڙ͢Δϩάؔ਺܊

Slide 48

Slide 48 text

ϓϥάΠϯ࡞ऀଆ͕ެ։͢Δ৘ใ • ϓϥάΠϯ͕ఏڙ͢ΔػೳΛ࣮ ૷ͨ͠ extension ϑΝΫτϦΛ ఏڙ͢Δ • ۩ମతʹ͸ pluign() ʹͦͷϑΝ ΫτϦΛࢦఆͯ͠ɺreturn ͢Δ ॲཧΛ࣋ͬͨϓϥάΠϯఆٛؔ ਺Λ export ͢Δ logger()ͷ ໭Γ஋ͷܕ͸ԼهͰਪ࿦

Slide 49

Slide 49 text

ϓϥάΠϯ࣮૷ଆͰଞͷϓϥάΠϯΛ࢖͏৔߹ • ϓϥάΠϯ͸ɺଞͷϓϥάΠϯ extension Λ࢖͏͜ͱ͕͋Δ • ϓϥάΠϯIDͱ Extension ܕΛ Map ͨ͠΋ͷΛ plugin() ͷܕύϥϝʔλͷ ୈ1Ҿ਺ʹࢦఆ͢Δ • ͦΕʹΑΓɺplugin()ଆͰɺextension ϑΝΫτϦʹ౉Δ ctx.extensions ʹґ ଘ͢ΔϓϥάΠϯͷܕ͕ਪ࿦͞ΕΔ ϓϥάΠϯ ID ͱ Extension ܕΛ Map ͨ͠΋ͷΛࢦఆ͢Δ

Slide 50

Slide 50 text

extension ϑΝΫτϦͷ ctx.extensions ͷ type-safe ʹͳΔྲྀΕ

Slide 51

Slide 51 text

͍͔ͭ͘ͷܕΛ ܦͯextention ϑΝΫτϦͷܕ Λղܾ extension ϑΝΫτϦͷ ctx.extensions ͷ type-safe ʹͳΔྲྀΕ

Slide 52

Slide 52 text

GunshiParams Λհͯ͠ extension ϑΝΫτϦͷୈ1Ҿ਺ͷ CommandContext ʹ౉Δ extension ϑΝΫτϦͷ ctx.extensions ͷ type-safe ʹͳΔྲྀΕ

Slide 53

Slide 53 text

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͝ͱʹू໿

Slide 54

Slide 54 text

ίϚϯυఆٛऀ͕ϓϥάΠϯͷܕΛ౉͢ • ίϚϯυϞδϡʔϧ͸ϓϥάΠϯొ࿥৔ॴ ͔Β཭Ε͍ͯΔ • ϓϥάΠϯIDͱ Extension ܕΛ Map ͨ͠΋ ͷΛ plugin() ͷܕύϥϝʔλͷୈ1Ҿ਺ʹࢦ ఆ͢Δ • ͦΕʹΑΓɺde fi neWithTypes()ଆͰɺ extensionϑΝΫτϦʹ౉Δ ctx.extensions ʹґଘ͢ΔϓϥάΠϯͷܕ͕ਪ࿦͞ΕΔ

Slide 55

Slide 55 text

de fi neWithTypes() ʹΑΔ ctx.extensions ͕ type-safeʹͳΔྲྀΕ CommandDe fi nitionResultͷܕύϥϝʔλʹ De fi neWithTypesReturnͷୈ1Ҿ਺Λ౉͢

Slide 56

Slide 56 text

de fi neWithTypes() ʹΑΔ ctx.extensions ͕ type-safeʹͳΔྲྀΕ CommandDe fi nitionResult -> Command -> CommanRunner ͱ͍͏ܕͷόέπϦϨʔͰ࠷ऴత ʹ ctx.extensions ͷܕ͕ܾ·Δ

Slide 57

Slide 57 text

·ͱΊ

Slide 58

Slide 58 text

ࠓ೔࿩ͨ͜͠ͱ 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 ͷܕ͕ਪ࿦͞ΕΔΑ͏ʹઃܭ

Slide 59

Slide 59 text

Explicit Context Type ΛબΜͩ͜ͱʹΑΔτϨʔυΦϑ • ಘͨ΋ͷ: • ϓϥάΠϯڥքͷ໌ࣔੑ: ϓϥάΠϯ ID ͕ key ʹ࢒ΓɺͲͷϓϥάΠϯ༝དྷͷ extension ͔෼͔Δ • ܕܖ໿ͷެ։ ֎෦ϓϥάΠϯ͕ϓϥάΠϯ ID ͱ Extension ܕΛ export Ͱ͖Δ • ෼ࢄίϚϯυͰͷܕڞ༗: ϓϥάΠϯొ࿥৔ॴ͔Β཭ΕͨίϚϯυϞδϡʔϧʹ΋ܕΛ౉ͤΔ

Slide 60

Slide 60 text

Explicit Context Type ΛબΜͩ͜ͱʹΑΔτϨʔυΦϑ • ҰํͰɺ੍໿ͱͯ͠ड͚ೖΕͨ΋ͷ: • ϓϥάΠϯ࡞ऀͷެ։੹຿: ϓϥάΠϯ࡞ऀ͸ ϓϥάΠϯ IDͱ Extension ܕΛެ։͢Δඞཁ͕͋Δ • ίϚϯυଆͷ໌ࣔࢦఆ: ίϚϯυఆٛଆ͸ظ଴͢ΔϓϥάΠϯͷ extension Λ໌ࣔ͢Δඞཁ͕͋Δ • ొ࿥ͱܕࢦఆͷ੔߹ੑ: ϓϥάΠϯొ࿥ͱίϚϯυ࣮૷ଆͷܕࢦఆΛἧ͑Δඞཁ͕͋Δ

Slide 61

Slide 61 text

Ԡ༻Ͱ͖Δ஌ݟ • Context ͷΑ͏ͳಈతʹ஋Λ௥ՃͰ͖Δߏ଄Λઃܭ͢Δͱ͖΋ɺಉ͡؍఺Ͱ ൑அ͢Δ͜ͱʹͳΔ • ௥Ճ͞Εͨ஋ͷ༝དྷΛ API ʹ࢒͔͢ • ܕΛ global ʹ޿͛Δ͔ɺscope Λݶఆ͢Δ͔ • ࣗಈਪ࿦Λ༏ઌ͢Δ͔ɺ໌ࣔతͳܕܖ໿Λ༏ઌ͢Δ͔ • ར༻ऀͷॻ͖΍͢͞ͱɺ֦ு͢Δଆͷ੹຿ΛͲ͏෼͚Δ͔ • ಈతͳ֦ுΛ type-safe ʹ͢ΔઃܭͰ͸ɺܕͷදݱ͚ͩͰͳ͘ɺڥքͱ੹຿ͷ ஔ͖ํ͕ॏཁʹͳΔ

Slide 62

Slide 62 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ