Slide 1

Slide 1 text

Prettier Plugins ϑϩϯτΤϯυ ೥ӽ͠ LT๨೥ձ 2019 #frontkansai Masashi Hirano(@shisama)

Slide 2

Slide 2 text

ฏ໺ ণ࢜ / Masashi Hirano @shisama_ Node.js Core Collaborator ؔ੢NodeֶԂ & W3K Organizer

Slide 3

Slide 3 text

https://prettier.io/

Slide 4

Slide 4 text

Prettier • ίʔυϑΥʔϚολʔ • JavaScriptɺTypeScriptɺJSONɺCSSɺLessɺMarkdownͳͲ Λඪ४Ͱαϙʔτ͍ͯ͠Δ • ઃఆϑΝΠϧͰϑΥʔϚοτϧʔϧΛఆٛͰ͖Δ

Slide 5

Slide 5 text

https://prettier.io/docs/en/plugins.html

Slide 6

Slide 6 text

Prettier Plugins • PluginΛࣗ෼Ͱ࡞࣮ͬͯߦ͢Δ͜ͱ͕Ͱ͖Δ • ·ͩbetaͳػೳ • ඪ४Ͱαϙʔτ͞Ε͍ͯͳ͍ݴޠͰ΋PrettierΛ࣮ߦ͢Δ͜ͱ͕ Ͱ͖Δ

Slide 7

Slide 7 text

https://prettier.io/docs/en/plugins.html

Slide 8

Slide 8 text

https://prettier.io/docs/en/plugins.html

Slide 9

Slide 9 text

JavaScript/TypeScript༻ͷPlugin΋͋Δ https://github.com/ggascoigne/prettier-plugin-import-sort

Slide 10

Slide 10 text

How to use npm install prettier prettier-plugin-java Javaͷ৔߹ yarn add prettier prettier-plugin-java

Slide 11

Slide 11 text

How to use prettier —-write Main.java —-plugin=./node_modules/prettier-plugin-java Javaͷ৔߹ QMVHJOΛࢦఆ͢Δ ࣗલͰ࡞ͬͨQMVHJOͷஔ͖৔͸೚ҙ

Slide 12

Slide 12 text

How to use prettier —-write Main.java —-plugin-search-dir=./my-prettier-plugins Javaͷ৔߹ σΟϨΫτϦ಺ͷQMVHJOͷ୳ࡧ΋Մೳ

Slide 13

Slide 13 text

How to use package jp.com.test; public class Main { public static void main(String[] args) { System.out.println("Hello, world"); } } Javaͷ৔߹ Πϯσϯτ͕ἧ͍ͬͯͳ͔ͬͨΓɺ ແବͳۭനߦ͕͋Δ৔߹

Slide 14

Slide 14 text

How to use package jp.com.test; public class Main { public static void main(String[] args) { System.out.println("Hello, world"); } } Javaͷ৔߹ 1SFUUJFSʹΑΓϑΥʔϚοτ͞ΕΔ

Slide 15

Slide 15 text

How to develop Prettier Plugin

Slide 16

Slide 16 text

How to develop Prettier Plugin • languagesɺparsersɺprintersɺoptionsɺdefaultOptionsΛ༻ҙ͠ ͯnamed export͢Δ • ࠷௿ݶˢͷ੺ࣈ͸ඞཁ • ίʔυ͔ΒASTʹม׵͢ΔParser͸npm͔ΒΠϯετʔϧͯ͠࢖͏͜ ͱ͕Մೳ
 e.g. toml_nodeɺjava-parserɺpug-lexerɺ…etc

Slide 17

Slide 17 text

How to develop Prettier Plugin • languages: Ͳͷ֦ுࢠΛର৅ʹ͢Δ͔ͳͲΛࢦఆ͢Δ • parsers: AST΁ͷύʔαʔΛ࣮૷͢Δ • printers: ग़ྗํ๏Λ࣮૷͢Δ

Slide 18

Slide 18 text

languages (TOMLͷ৔߹) const languages = [ { extensions: ['.toml'], name: 'TOML', parsers: ['toml-parse'] } ] ֦ுࢠɺ໊લɺQBSTFST ޙड़ ͷ໊લΛࢦఆ

Slide 19

Slide 19 text

parsers (TOMLͷ৔߹) const parser = require('toml/lib/parser') const parsers = { 'toml-parse': { parse: text => parser.parse(text), astFormat: 'toml-ast' } } UPNM@OPEFͷQBSTFSΛ࢖ͬͯ"45ʹม׵͢Δ BTU'PSNBU͸ޙड़ͷQSJOUFSTͰ࢖͍·͢

Slide 20

Slide 20 text

printers (TOMLͷ৔߹) const printers = { 'toml-ast': { print: printToml } } QBSTFSTͷBTU'PSNBUͰࢦఆͨ͠UPNMBTUͷ QSJOUʹؔ਺Λࢦఆ͢Δ

Slide 21

Slide 21 text

printers༻ͷؔ਺ (TOMLͷ৔߹) function printToml(path, options, print) { const node = path.getValue() if (Array.isArray(node)) { return concat(path.map(print)) } switch (node.type) { case 'Assign': return concat([node.key, ' = ', path.call(print, 'value'), hardline]) case 'String': // return concat(['"', node.value, '"']) return `"${node.value}"` // ... default: return '' } } "45Λ࢖ͬͯίʔυ΁ͷग़ྗ಺༰Λ࣮૷͢Δɻ ม਺એݴͳͷ͔จࣈྻͳͷ͔ͳͲ͕UZQFͰ൑ఆՄ ೳɺUZQF͝ͱʹग़ྗ಺༰Λม͑Δ

Slide 22

Slide 22 text

Prettier PluginͷνϡʔτϦΞϧ (TOML) https://medium.com/@fvictorio/how-to-write-a-plugin-for-prettier-a0d98c845e70

Slide 23

Slide 23 text

ASTͱ͸ • Abstract Syntax Tree(ந৅ߏจ໦) • ίʔυΛߏจղੳͯ݁͠ՌΛπϦʔͱͯ͠දݱ • ESLintɺBabelɺTypeScriptͳͲίʔυΛղੳɾม׵͢Δܥͷπʔϧ͸ ASTΛ࢖͍ͬͯΔ • acornɺbabylonɺespreeɺesprimaͳͲJavaScript͚ͩͰ΋༷ʑͳAST ύʔαʔ͕͋Δ

Slide 24

Slide 24 text

const a = 1; { "type": "Program", "start": 0, "end": 12, "body": [ { "type": "VariableDeclaration", "start": 0, "end": 12, "declarations": [ { "type": "VariableDeclarator", "start": 6, "end": 11, "id": { "type": "Identifier", "start": 6, "end": 7, "name": "a" }, "init": { "type": "Literal", "start": 10, "end": 11, "value": 1, "raw": "1" } } ], "kind": "const" } ], "sourceType": "module" } ASTม׵

Slide 25

Slide 25 text

"type": "VariableDeclaration", "start": 0, "end": 12, "declarations": [ // … "kind": "const" const a = 1;

Slide 26

Slide 26 text

"id": { "type": "Identifier", "start": 6, "end": 7, "name": "a" } const a = 1;

Slide 27

Slide 27 text

"init": { "type": "Literal", "start": 10, "end": 11, "value": 1, "raw": "1" } const a = 1;

Slide 28

Slide 28 text

΋ͬͱ஌Γ͍ͨਓ͸ astexplorer.net ΁

Slide 29

Slide 29 text

༷ʑͳparserΛࢼ͢͜ͱ͕Ͱ͖·͢

Slide 30

Slide 30 text

• Babel PluginΛ࡞Γͳ͕ΒASTͱBabelΛֶͿ (@__sakito__) • JavaScriptͷϦϑΝΫλϦϯάπʔϧʮjscodeshiftʯͷ࢖͍ํ (@toshi__toma) • ESLintͷϧʔϧΛࣗ࡞͠Α͏ʂ(@pirosikick) PrettierҎ֎ͷASTΛ࢖ͬͨπʔϧʹ͍ͭͯࢀߟهࣄ

Slide 31

Slide 31 text

·ͱΊ • PluginΛ࢖͑͹ඪ४Ͱ͸αϙʔτ͍ͯ͠ͳ͍ϓϩάϥϛϯάݴ ޠͷPrettierΛ͔͚ΒΕΔΑ͏ʹͳΔ • Parser͸طଘͷnpmύοέʔδͷ࢖͏͜ͱ͕Ͱ͖Δ • ASTΛ࢖͑͹ίʔυͷม׵͕ՄೳʹͳΔ
 astexplorer.netͰASTͷม׵݁ՌΛ֬ೝՄೳ

Slide 32

Slide 32 text

Thanks @shisama_ shisama