Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Compiler APIを利用して TypeScriptのAPI型定義ファイルからOpenAP...

Compiler APIを利用して TypeScriptのAPI型定義ファイルからOpenAPI.jsonを作成する/Create OpenAPI.json from a TypeScript API type definition file using the Compiler API

Avatar for Musashi Tsunoda

Musashi Tsunoda

May 08, 2024
Tweet

More Decks by Musashi Tsunoda

Other Decks in Technology

Transcript

  1. AGENDA 1. ࣗݾ঺հ 2. Communeͷٕज़ελοΫ 3. Communeʹ͓͚ΔAPIͷܕఆٛ 4. ࠷ۙͷ՝୊ 5.

    APIܕఆٛϑΝΠϧ͔ΒOpenAPI.jsonΛ࡞੒ 6. ࠓޙͷ՝୊ 7. ·ͱΊ
  2. © Commune Inc. All rights reserved ֯ా෢ଂ (a.k.a. Buzo) Tech

    & Platform Software engineer Musashi Tsunoda ڈ೥ͷ8݄ʹίϛϡʔϯגࣜձࣾʹೖࣾɻ TypeScriptʹΑΔόοΫΤϯυɾϑϩϯτΤϯυ྆ ํͷ։ൃΛߦ͏ɻ ུ֓ SNS X: @buzou_muzou ࣗݾ঺հ ޷͖ͳ͜ͱ ݸਓ։ൃͱϘΫγϯά
  3. © Commune Inc. All rights reserved • Web͸TypeScriptͰ౷Ұ ◦ ֶशίετ͕௿͍

    ◦ ࠾༻ͷ໘ͰͷΤϯδχΞͷ֬อͷ༏Ґੑ ◦ ܕఆٛϑΝΠϧͷڞ༗ʹΑΔ։ൃͷޮ཰Խ • ϞόΠϧ͸Flutter ◦ ΫϩεϓϥοτϑΥʔϜͳ։ൃ Communeͷٕज़ελοΫ
  4. © Commune Inc. All rights reserved • APIͷฦ٫஋ͷϥϯλΠϜͰͷܕͷෆҰக ◦ booleanͷ͸͕ͣ

    0 or 1ʹͳ͍ͬͯΔ ◦ numberͷ͸͕ͣstringʹͳ͍ͬͯΔ ◦ etc • ϞόΠϧνʔϜͱͷ࿈ܞ ◦ APIΤϯυϙΠϯτͷ
 ৽ن࡞੒ɾ࢓༷มߋ࣌ͷೝࣝͣΕ ࠷ۙͷ՝୊
  5. © Commune Inc. All rights reserved • Compiler APIͰAPIܕఆ͔ٛΒOpenAPI.jsonΛ࡞੒͢Δ ◦

    εΩʔϚۦಈͷAPI։ൃʹγϑτ ◦ ϞόΠϧνʔϜͱͷ࿈ܞʹ࢖༻ • OpenAPI.jsonΛݩʹೖग़ྗͷܕνΣοΫΛಋೖ ◦ ϥϯλΠϜͷϦΫΤετͱϨεϙϯεͷܕΛอূ ํ਑
  6. © Commune Inc. All rights reserved Compilier APIͱ͸ • TypeScriptͷτϥϯεύΠϧ࣌ʹߦ͍ͬͯΔΑ͏ͳॲཧΛ


    ݺͼग़͢͜ͱ͕Ͱ͖ΔAPI • ίʔυΛந৅ߏจ໦(AST)ͱͯ͠ղੳ͕Ͱ͖Δ • ίʔυͷม׵΍ࣗಈੜ੒ͳͲʹར༻͢Δ͜ͱ͕Ͱ͖Δ • Web APIͰ͸ͳ͍ • TypeScriptͷ։ൃݩ͕ެ։͍ͯ͠Δ
 https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API
  7. © Commune Inc. All rights reserved OpenAPI.jsonΛ࡞੒ Tsunagger *ʮͭͳ͙ +

    Swaggerʯ͔Β໋໊ *Tsunoda(ࢲͷ໊લ)ͱ͸Ұ੾ؔ܎ͳ͍ OpenAPI.json͕ੜ੒Ͱ͖ΔεΫϦϓτΛ࡞੒ npm run tsunagger Ͱ
  8. © Commune Inc. All rights reserved OpenAPI.jsonΛ࡞੒ CommuneͷAPIܕఆٛϑΝΠϧ • Type͕HTTPϝιου໊

    ◦ ΤϯυϙΠϯτύε໊ ▪ ϦΫΤετͷܕఆٛ ▪ Ϩεϙϯεͷܕఆٛ
  9. © Commune Inc. All rights reserved OpenAPI.jsonΛ࡞੒ • ΤϯυϙΠϯτͷύε໊͝ͱ ◦

    HTTPϝιου໊ ▪ ϦΫΤετͷܕఆٛ ▪ Ϩεϙϯεͷܕఆٛ OpenAPIʹΑΔAPIεΩʔϚఆٛ
  10. © Commune Inc. All rights reserved OpenAPI.jsonΛ࡞੒ foo: string “foo”:

    {“type”:”string”}, bar: number “bar”: {“type”:“number”} baz: { foo: string, bar: number } “baz”: { “type”: “object”, "properties": { “foo”: {“type”:”string”}, “bar”: {“type”:“number”} } } TypeScript OpenAPI.json
  11. © Commune Inc. All rights reserved 1. TSϑΝΠϧͷಡΈࠐΈ 2. ts.SourceFileϑΝΠϧΦϒδΣΫτͷੜ੒

    3. ֤ϊʔυͰܕͷγϯϘϧΛऔಘ a. Object΍Arrayܕͷ৔߹͸
 ͞ΒʹͦͷࢠϊʔυͷܕͷγϯϘϧΛऔಘ 4. OpenAPI.jsonͷܗࣜʹͯ͠ϑΝΠϧʹग़ྗ OpenAPI.jsonΛ࡞੒ TsunaggerͷॲཧͷྲྀΕ
  12. © Commune Inc. All rights reserved OpenAPI.jsonΛ࡞੒ OpenAPI.jsonͷ࡞੒ͷࣗಈԽʹ੒ޭ! ͦΕʹΑΓҎԼ͕࣮ݱͨ͠ •

    Swagger UIͰOpenAPI.jsonΛݩʹAPI࢓༷ॻͷڞ༗ • openapi-request-validatorΛ༻͍ͨ
 APIͷres/reqόϦσʔγϣϯ
  13. © Commune Inc. All rights reserved ม׵ॲཧͰ٧·ͬͨՕॴ • Class •

    ϢχΦϯܕ • ॥؀ࢀরʹͳ͍ͬͯΔܕ • τϦοΩʔͳܕఆٛ ݸผʹରԠ͸Մೳ͕ͩɺͦͷ෼ίʔυ͸ෳࡶʹͳ͍ͬͯ͘ɻɻɻ APIͷreq/resͷఆٛఆ͕ٛҎԼͷΑ͏ͳ৔߹
  14. © Commune Inc. All rights reserved ࠓޙͷ՝୊ • Tsunaggerͷอक •

    ୯७ͳΦϒδΣΫτ΍
 ϓϦϛςΟϒͳܕఆٛͰ͸ͳ͍৔߹ͷରॲ • ผͷํ๏ͷݕ౼ ◦ APIܕఆٛΛzodͰߦ͍ɺzod-to-openapi౳
 ֎෦ϥΠϒϥϦͰOpenAPI.jsonΛ࡞੒ ◦ zod΁ͷҠߦظؒத͸TsunaggerʹΑΔOpenAPI.jsonΛ
 ར༻͢Δ༧ఆ
  15. © Commune Inc. All rights reserved • ϑϩϯτΤϯυͱόοΫΤϯυͰ͸
 APIͷܕఆٛϑΝΠϧΛڞ༗͍ͯ͠Δ ·ͱΊ

    • ϞόΠϧͱͷ࿈ܞͷͨΊʹOpenAPI.json͕ඞཁʹͳͬͨ • Compiler APIΛར༻͠ɺ
 TSͷܕఆٛϑΝΠϧ͔ΒOpenAPI.json͕࡞੒Ͱ͖ͨ • ୯७Ͱͳ͍ܕఆٛͷม׵͸ՄೳͰ͋Δ͕ίʔυ͕ෳࡶʹͳΔ
  16. © Commune Inc. All rights reserved 31 ίϛϡʔϯ͸͋ͳͨͷΩϟϦΞΛ࣮ݱ͢ΔϏʔΫϧͰ͢ʂ XΞΧ΢ϯτ @CommuneDev

    ϑΥϩʔ͓ئ͍͠·͢! ΤϯδχΞ޲͚ձࣾ৘ใ https://commmune.notion.site/ver- 0b895a0187ef4954a2d5182afd82082d