koffing 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/Makefile +21 -0
  2. package/README.md +75 -26
  3. package/build/asset-manifest.json +22 -0
  4. package/build/favicon.png +0 -0
  5. package/build/index.html +1 -0
  6. package/build/precache-manifest.5382b78dea2866c8a94cee003da35d84.js +26 -0
  7. package/build/robots.txt +3 -0
  8. package/build/service-worker.js +39 -0
  9. package/build/static/css/main.102b9840.chunk.css +2 -0
  10. package/build/static/css/main.102b9840.chunk.css.map +1 -0
  11. package/build/static/js/2.4b3dd85a.chunk.js +3 -0
  12. package/build/static/js/2.4b3dd85a.chunk.js.LICENSE.txt +67 -0
  13. package/build/static/js/2.4b3dd85a.chunk.js.map +1 -0
  14. package/build/static/js/main.07f66bec.chunk.js +2 -0
  15. package/build/static/js/main.07f66bec.chunk.js.map +1 -0
  16. package/build/static/js/runtime-main.525bb0ff.js +2 -0
  17. package/build/static/js/runtime-main.525bb0ff.js.map +1 -0
  18. package/package.json +42 -31
  19. package/public/favicon.png +0 -0
  20. package/public/index.html +30 -0
  21. package/public/robots.txt +3 -0
  22. package/src/App.test.js +9 -0
  23. package/src/components/App.js +18 -0
  24. package/src/components/AppFooter/AppFooter.css.js +12 -0
  25. package/src/components/AppFooter/AppFooter.js +31 -0
  26. package/src/components/AppFooter/index.js +3 -0
  27. package/src/components/AppHeader/AppHeader.css.js +21 -0
  28. package/src/components/AppHeader/AppHeader.js +34 -0
  29. package/src/components/AppHeader/index.js +3 -0
  30. package/src/components/Board/Board.css.js +21 -0
  31. package/src/components/Board/Board.js +110 -0
  32. package/src/components/Board/index.js +3 -0
  33. package/src/components/BoardInput/BoardInput.css.js +14 -0
  34. package/src/components/BoardInput/BoardInput.js +36 -0
  35. package/src/components/BoardInput/index.js +3 -0
  36. package/src/components/BoardOutput/BoardOutput.css.js +17 -0
  37. package/src/components/BoardOutput/BoardOutput.js +36 -0
  38. package/src/components/BoardOutput/index.js +3 -0
  39. package/src/components/Code/Code.css.js +10 -0
  40. package/src/components/Code/Code.js +28 -0
  41. package/src/components/Code/index.js +3 -0
  42. package/src/components/StyledComponent.js +24 -0
  43. package/src/components/ThemedApp.js +25 -0
  44. package/src/core/Koffing.js +71 -0
  45. package/src/{Pokemon.js → core/Pokemon.js} +9 -2
  46. package/src/{PokemonTeam.js → core/PokemonTeam.js} +0 -2
  47. package/src/{PokemonTeamSet.js → core/PokemonTeamSet.js} +0 -2
  48. package/src/{ShowdownParser.js → core/ShowdownParser.js} +7 -8
  49. package/src/core/index.js +7 -0
  50. package/src/img/koffing-shiny.png +0 -0
  51. package/src/img/koffing.png +0 -0
  52. package/src/index.css +42 -0
  53. package/src/index.js +15 -74
  54. package/src/serviceWorker.js +141 -0
  55. package/src/setupTests.js +5 -0
  56. package/src/teams/example.koffing.js +25 -0
  57. package/src/tools/base64.js +25 -0
  58. package/src/tools/history.js +17 -0
  59. package/src/tools/index.js +4 -0
  60. package/src/variables.json +5 -0
  61. package/dist/koffing.js +0 -940
  62. package/dist/koffing.min.js +0 -1
@@ -0,0 +1,2 @@
1
+ (this.webpackJsonpkoffing=this.webpackJsonpkoffing||[]).push([[0],{35:function(e,t){e.exports="data:image/png;base64,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"},39:function(e){e.exports=JSON.parse('{"header_title":"Koffing - Pok\xe9mon Showdown Team Parser","github_url":"https://github.com/itsjavi/koffing","homepage":"https://itsjavi.com/koffing"}')},45:function(e,t,n){"use strict";(function(e){var a=n(9),i=n(8),r=Object(a.a)((function e(){Object(i.a)(this,e)}));r.encode=function(t){return new e(t||"").toString("base64")},r.decode=function(t){return new e(t||"","base64").toString("utf8")},r.urlEncode=function(e){return r.encode(e).replace("+","-").replace("/","_").replace(/=+$/,"")},r.urlDecode=function(e){for(e=e.replace("-","+").replace("_","/");e.length%4;)e+="=";return r.decode(e)},t.a=r}).call(this,n(68).Buffer)},60:function(e,t,n){e.exports=n(81)},65:function(e,t,n){},81:function(e,t,n){"use strict";n.r(t);var a=n(0),i=n.n(a),r=n(10),o=n.n(r),s=(n(65),n(52)),c=n(126),l=n(8),u=n(9),m=n(14),p=n(13),h=n(4),d=function(e){Object(m.a)(n,e);var t=Object(p.a)(n);function n(){return Object(l.a)(this,n),t.apply(this,arguments)}return Object(u.a)(n,null,[{key:"styled",value:function(e){return Object(h.a)(e)(this)}}]),n}(a.Component),f=n(119),v=n(120),g=n(122),y=n(121),b=n(35),k=n.n(b),A=n(39),w=function(e){Object(m.a)(n,e);var t=Object(p.a)(n);function n(){return Object(l.a)(this,n),t.apply(this,arguments)}return Object(u.a)(n,[{key:"render",value:function(){var e=this.props.classes;return i.a.createElement("div",{className:e.root},i.a.createElement(f.a,{position:"static"},i.a.createElement(v.a,null,i.a.createElement(y.a,{"aria-label":"Home",href:"#"},i.a.createElement("img",{alt:"logo",className:e.logo+" koffing-sprite",src:k.a})),i.a.createElement(g.a,{component:"h1",color:"inherit",className:e.title},A.header_title),i.a.createElement(y.a,{color:"inherit",href:A.github_url,title:"Source Code"},i.a.createElement("i",{className:"fab fa-github"})))))}}]),n}(d).styled({root:{flexGrow:1},title:{flex:1,fontWeight:400,fontSize:"1.3125rem"},logo:{position:"relative",display:"inline-block",verticalAlign:"middle",imageRendering:"crisp-edges;\n -ms-interpolation-mode:nearest-neighbor;\n image-rendering: -moz-crisp-edges;\n image-rendering: -webkit-crisp-edges;\n image-rendering: pixelated;","& koffing":{}}}),S=n(123),j=function(e){Object(m.a)(n,e);var t=Object(p.a)(n);function n(){return Object(l.a)(this,n),t.apply(this,arguments)}return Object(u.a)(n,[{key:"render",value:function(){var e=this.props.classes;return i.a.createElement("div",{className:e.root},i.a.createElement(S.a,{container:!0,spacing:10},i.a.createElement(S.a,{item:!0,sm:12,md:12},i.a.createElement("div",{className:e.footer},i.a.createElement(g.a,{variant:"caption",component:"p"},i.a.createElement("span",null,"Created by "),i.a.createElement("a",{href:"https://itsjavi.com",rel:"noreferrer noopener",target:"_blank"},"@itsjavi"),"/",i.a.createElement("a",{href:"https://route1rodent.com",rel:"noreferrer noopener",target:"_blank"},"@route1rodent"),"\xa0 | \xa0",i.a.createElement("span",null,"Powered by ReactJS and Material UI."))))))}}]),n}(d).styled((function(e){return{root:e.mixins.gutters({paddingTop:16,paddingBottom:16,marginTop:e.spacing(),flexGlow:1}),footer:{padding:2*e.spacing(),textAlign:"center"}}})),E=n(27),O=n(83),C=n(125),x=n(45),N=function(){return window.location.hash.replace(/^#/,"")},I=function(e){return window.location.origin+window.location.pathname+"#"+e},L=function(e){window.addEventListener("popstate",e,!1)},T=function(e){window.removeEventListener("popstate",e,!1)},B=n(127),J=n(124),R=Object(J.a)((function(e){return{root:{marginTop:0,overflow:"hidden"},textArea:{fontFamily:"monospace",fontSize:"1em",backgroundColor:e.palette.secondary.main,padding:e.spacing()}}}));var H=function(e){var t=e.value,n=e.onChange,a=R();return i.a.createElement(B.a,{autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:"false",multiline:!0,className:a.root,rows:"12",rowsMax:"24",autoFocus:!0,placeholder:"Place here your Showdown teams",fullWidth:!0,margin:"normal",value:t,inputProps:{className:a.textArea},onChange:n})},W=n(51),z=n.n(W),P=n(5),V=n.n(P),X=function(e){Object(m.a)(n,e);var t=Object(p.a)(n);function n(){return Object(l.a)(this,n),t.apply(this,arguments)}return Object(u.a)(n,[{key:"render",value:function(){var e=this.props.code,t="language-".concat(this.props.language),n=this.props.classes;return i.a.createElement("div",{className:n.root},i.a.createElement("pre",{className:n.pre},i.a.createElement("code",{className:t},i.a.createElement("div",{dangerouslySetInnerHTML:{__html:e}}))))}}]),n}(d);X.propTypes=Object.assign({},d.propTypes,{language:V.a.string.isRequired,code:V.a.string.isRequired});var Z=X.styled({root:{margin:"6px 0"},pre:{margin:0,border:"none !important",color:"#008008"}}),F=Object(J.a)((function(e){return{root:{padding:2*e.spacing(),color:e.palette.text.secondary},qrContainer:{padding:2*e.spacing(),textAlign:"center",backgroundColor:"#dde0f6"},jsonContainer:{padding:2*e.spacing(),backgroundColor:"#fafafa"}}})),M={src:k.a,height:48,width:48,excavate:!0};var Y=function(e){var t=e.qrValue,n=e.jsonValue,a=F();return i.a.createElement(O.a,{className:a.root,elevation:1},i.a.createElement(O.a,{className:a.qrContainer},i.a.createElement(z.a,{value:t,size:320,renderAs:"canvas",imageSettings:M})),i.a.createElement(O.a,{className:a.jsonContainer},i.a.createElement(Z,{code:n,language:"json"})))},G=function(){function e(){Object(l.a)(this,e),this.name=void 0,this.nickname=void 0,this.gender=void 0,this.item=void 0,this.ability=void 0,this.level=void 0,this.shiny=void 0,this.happiness=void 0,this.teratype=void 0,this.nature=void 0,this.evs=void 0,this.ivs=void 0,this.moves=[]}return Object(u.a)(e,[{key:"toJson",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:2;return JSON.stringify(this,null,e)}},{key:"toShowdown",value:function(){var e="";if(this.nickname?e+="".concat(this.nickname," (").concat(this.name,")"):e+="".concat(this.name),this.gender&&this.gender.match(/^[MF]$/i)&&(e+=" (".concat(this.gender.toUpperCase(),")")),this.item&&(e+=" @ ".concat(this.item)),e+="\n",isNaN(this.level)||(e+="Level: ".concat(this.level,"\n")),this.ability&&(e+="Ability: ".concat(this.ability,"\n")),!0===this.shiny&&(e+="Shiny: Yes\n"),isNaN(this.happiness)||(e+="Happiness: ".concat(this.happiness,"\n")),this.teratype&&(e+="Tera Type: ".concat(this.teratype,"\n")),this.nature&&(e+="".concat(this.nature," Nature\n")),this.evs){var t=this.evs;e+="EVs: "+["HP","Atk","Def","SpA","SpD","Spe"].filter((function(e){return!isNaN(t[e.toLowerCase()])})).map((function(e){var n=t[e.toLowerCase()];return"".concat(n," ").concat(e)})).join(" / ")+"\n"}if(this.ivs){var n=this.ivs;e+="IVs: "+["HP","Atk","Def","SpA","SpD","Spe"].filter((function(e){return!isNaN(n[e.toLowerCase()])})).map((function(e){var t=n[e.toLowerCase()];return"".concat(t," ").concat(e)})).join(" / ")+"\n"}return this.moves&&(e+=this.moves.map((function(e){return"- ".concat(e)})).join("\n")+"\n"),e.trim()}},{key:"toString",value:function(){return this.toShowdown()}}],[{key:"fromObject",value:function(t){var n=new e;return n.name=t.name,n.nickname=t.nickname,n.gender=t.gender,n.item=t.item,n.ability=t.ability,n.level=t.level,n.shiny=t.shiny,n.happiness=t.happiness,n.teratype=t.teratype,n.nature=t.nature,n.evs=t.evs,n.ivs=t.ivs,n.moves=t.moves,n}}]),e}(),U=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"gen7",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Untitled",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;Object(l.a)(this,e),this.name=n,this.format=t,this.folder=a,this.pokemon=[]}return Object(u.a)(e,[{key:"toJson",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:2;return JSON.stringify(this,null,e)}},{key:"toShowdown",value:function(){var e=this.folder?"".concat(this.folder,"/").concat(this.name):this.name,t="=== [".concat(this.format,"] ").concat(e," ===\n\n");return(t+=this.pokemon.map((function(e){return e.toString()})).join("\n\n")).trim()}},{key:"toString",value:function(){return this.toShowdown()}}],[{key:"fromObject",value:function(t){var n=new e;return n.name=t.name,n.format=t.format,n.folder=t.folder,n.pokemon=t.pokemon?t.pokemon.map((function(e){return G.fromObject(e)})):[],n}}]),e}(),D=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];Object(l.a)(this,e),this.teams=t}return Object(u.a)(e,[{key:"toJson",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:2;return JSON.stringify(this,null,e)}},{key:"toShowdown",value:function(){return this.teams.map((function(e){return e.toString()})).join("\n\n").trim()}},{key:"toString",value:function(){return this.toShowdown()}}],[{key:"fromObject",value:function(t){var n=new e;return n.teams=t.teams?t.teams.map((function(e){return U.fromObject(e)})):[],n}}]),e}(),K=function(){function e(t){Object(l.a)(this,e),this.code=t.trim()+""}return Object(u.a)(e,[{key:"parse",value:function(){var t=e.regexes,n=[],a={team:null,pokemon:null},i=this.code.trim().split("\n").map((function(e){return e.trim()})),r=this;return i.forEach((function(e){return e.match(t.team)?(a.team=new U,r._parseTeam(e,a.team),void n.push(a.team)):""===e||e.match(/^[- ]+$/)?void r._saveCurrent(n,a):a.pokemon?void(r._parseKeyValuePairs(e,a.pokemon)||r._parseEvsIvs(e,a.pokemon)||a.pokemon.moves.length<4&&e.match(t.move)&&a.pokemon.moves.push(t.move.exec(e)[1].trim())):(a.pokemon=new G,void r._parseNameLine(e,a.pokemon))})),this._saveCurrent(n,a),new D(n)}},{key:"_parseTeam",value:function(t,n){var a,i,r=e.regexes.team.exec(t),o=r[2].split("/");o.length>1?(i=o.shift(),a=o.join("/")):a=r[2],n.format=r[1].trim(),n.name=a.trim(),n.folder=i?i.trim():void 0}},{key:"_parseNameLine",value:function(t,n){var a=e.regexes;if(t.match(a.nickname_name)){var i=a.nickname_name.exec(t);n.nickname=i[1].trim(),n.name=i[2].trim()}else if(t.match(a.name)){var r=a.name.exec(t);n.name=r[1].trim()}t.match(a.gender)&&(n.gender=a.gender.exec(t)[1].toUpperCase().trim()),t.match(a.item)&&(n.item=a.item.exec(t)[1].trim())}},{key:"_parseEvsIvs",value:function(t,n){var a=e.regexes;if(t.match(a.eivs)){var i=a.eivs.exec(t),r=i[1].toLowerCase(),o=i[2].split("/"),s="evs"===r?255:31;return o.forEach((function(e){var t=a.eivs_value.exec(e.trim().toLowerCase());t?(n[r]||(n[r]={}),n[r][t[2]]=parseFloat(t[1]),n[r][t[2]]>s&&(n[r][t[2]]=s)):console.error("Invalid syntax for "+r+": "+e)})),!0}return!1}},{key:"_parseKeyValuePairs",value:function(t,n){var a=e.regexes;return["ability","level","shiny","happiness","teratype","nature"].some((function(e){return!!t.match(a[e])&&(n[e]=a[e].exec(t)[1].trim(),isNaN(n[e])||(n[e]=parseFloat(n[e])),"happiness"===e&&n[e]>255&&(n[e]=255),"level"===e&&n[e]<1&&(n[e]=1),"level"===e&&n[e]>100&&(n[e]=100),"shiny"===e&&(n[e]=!!n[e].match(/yes/i)),!0)}))}},{key:"_saveCurrent",value:function(e,t){return t.team||(t.team=new U,e.push(t.team)),t.pokemon&&(t.team.pokemon.push(t.pokemon),t.pokemon=null),this}},{key:"format",value:function(){return this.code=this.parse().toString(),this}},{key:"toString",value:function(){return this.code}}]),e}();K.regexes={team:/^===\s+\[(.*)\]\s+(.*)\s+===$/,gender:/\((F|M)\)/i,item:/@\s?(.*)$/i,name:/^([^()=@]{2,})/i,nickname_name:/^([^()=@]*)\s+\(([^()=@]{2,})\)/i,ability:/^Ability:\s?(.*)$/i,level:/^Level:\s?([0-9]{1,3})$/i,shiny:/^Shiny:\s?(Yes|No)$/i,happiness:/^Happiness:\s?([0-9]{1,3})$/i,teratype:/^Tera Type:\s?(.*)$/i,eivs:/^([EI]Vs):\s?(.*)$/i,eivs_value:/^([0-9]+)\s+(hp|atk|def|spa|spd|spe)$/i,nature:/^(.*)\s+Nature$/,move:/^[-~]\s?(.*)$/i};var Q=K,q=function(){function e(){Object(l.a)(this,e)}return Object(u.a)(e,null,[{key:"parse",value:function(e){return e instanceof D||e instanceof U||e instanceof G?e:e instanceof Q?e.parse():new Q(e).parse()}},{key:"format",value:function(e){return this.parse(e).toShowdown()}},{key:"toJson",value:function(e){return this.parse(e).toJson()}},{key:"toShowdown",value:function(e){return e instanceof D||e instanceof U||e instanceof G?e.toShowdown():e instanceof Q?e.parse().format():(("string"===typeof e||e instanceof String)&&(e=JSON.parse(e)),D.fromObject(JSON.parse(e)).toShowdown())}}]),e}(),_=function(e){Object(m.a)(n,e);var t=Object(p.a)(n);function n(e){var a;return Object(l.a)(this,n),(a=t.call(this,e)).state={stateUrl:"",teamText:"",teamTextBase64:x.a.encode(""),teamJson:"",teamObj:{}},a.handleInputChange=a.handleInputChange.bind(Object(E.a)(a)),a.handleHashChange=a.handleHashChange.bind(Object(E.a)(a)),a}return Object(u.a)(n,[{key:"componentDidMount",value:function(){this.update(this.loadTeam()),L(this.handleHashChange)}},{key:"componentWillUnmount",value:function(){T(this.handleHashChange)}},{key:"handleInputChange",value:function(e){this.update(e.target.value)}},{key:"handleHashChange",value:function(e){this.update(this.loadTeam())}},{key:"loadTeam",value:function(){var e=N();return""===e?"\n=== [gen7] Folder 1/Example Team ===\n\nSmogon (Koffing) (F) @ Eviolite\nLevel: 5\nAbility: Levitate\nShiny: Yes\nHappiness: 255\nEVs: 36 HP / 236 Def / 236 SpD\nIVs: 31 HP / 30 Atk / 31 SpA / 30 SpD / 31 Spe\nBold Nature\n- Will-O-Wisp\n- Pain Split\n- Sludge Bomb\n- Fire Blast\n\nWeezing @ Black Sludge\nAbility: Levitate\nEVs: 252 HP / 160 Def / 96 Spe\nBold Nature\n- Sludge Bomb\n- Will-O-Wisp\n- Toxic Spikes\n- Taunt\n":x.a.decode(e)}},{key:"update",value:function(e){e=e.trimStart();var t=x.a.encode(e),n=q.toJson(e);this.setState({stateUrl:I(t),teamText:e,teamTextBase64:t,teamJson:n,teamObj:JSON.parse(n)})}},{key:"prettify",value:function(){this.update(q.format(this.state.text)+"\n")}},{key:"getFirstTeamName",value:function(){return void 0===this.state.teamObj.teams||void 0===this.state.teamObj.teams[0]||void 0===this.state.teamObj.teams[0].name?"undefined":this.state.teamObj.teams[0].name}},{key:"render",value:function(){var e=this,t=this.props.classes;return i.a.createElement("div",{className:t.root},i.a.createElement(S.a,{container:!0,spacing:10},i.a.createElement(S.a,{item:!0,xs:12,sm:12,md:6,style:{paddingBottom:"1em"}},i.a.createElement(g.a,{variant:"h4",component:"h2"},this.getFirstTeamName()))),i.a.createElement(S.a,{container:!0,spacing:10},i.a.createElement(S.a,{item:!0,xs:12,sm:12,md:6},i.a.createElement(O.a,{className:t.paper,elevation:1},i.a.createElement(H,{value:this.state.teamText,onChange:this.handleInputChange}),i.a.createElement(C.a,{onClick:function(){return e.prettify()},variant:"contained",color:"primary"},"Prettify"),"\xa0",i.a.createElement(C.a,{onClick:function(){return e.update("")},variant:"text"},"Clear"))),i.a.createElement(S.a,{item:!0,xs:12,sm:12,md:6},i.a.createElement(Y,{qrValue:this.state.stateUrl,jsonValue:this.state.teamJson}))))}}]),n}(d).styled((function(e){return{root:e.mixins.gutters({paddingTop:16,paddingBottom:16,marginTop:e.spacing(),flexGlow:1}),paper:{padding:2*e.spacing(),color:e.palette.text.secondary},qrContainer:{padding:2*e.spacing(),textAlign:"center",backgroundColor:"#dde0f6"},jsonContainer:{padding:2*e.spacing(),backgroundColor:"#fafafa"}}})),$=function(e){Object(m.a)(n,e);var t=Object(p.a)(n);function n(){return Object(l.a)(this,n),t.apply(this,arguments)}return Object(u.a)(n,[{key:"render",value:function(){return i.a.createElement("div",{className:"koffing-app"},i.a.createElement(w,null),i.a.createElement(_,null),i.a.createElement(j,null))}}]),n}(a.Component),ee=Object(s.a)({typography:{fontFamily:'"Exo 2","Helvetica Neue",Arial,sans-serif'},palette:{primary:{main:"#6B71B8"},secondary:{main:"#F6F79D"}}}),te=function(){return i.a.createElement("div",{className:"koffing-app-container"},i.a.createElement(c.a,{theme:ee},i.a.createElement($,null)))};Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/));o.a.render(i.a.createElement(i.a.StrictMode,null,i.a.createElement(te,null)),document.getElementById("root")),"serviceWorker"in navigator&&navigator.serviceWorker.ready.then((function(e){e.unregister()})).catch((function(e){console.error(e.message)}))}},[[60,1,2]]]);
2
+ //# sourceMappingURL=main.07f66bec.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["img/koffing.png","tools/base64.js","components/StyledComponent.js","components/AppHeader/index.js","components/AppHeader/AppHeader.js","components/AppHeader/AppHeader.css.js","components/AppFooter/index.js","components/AppFooter/AppFooter.js","components/AppFooter/AppFooter.css.js","tools/history.js","components/BoardInput/BoardInput.css.js","components/BoardInput/BoardInput.js","components/BoardInput/index.js","components/Code/Code.js","components/Code/index.js","components/Code/Code.css.js","components/BoardOutput/BoardOutput.css.js","components/BoardOutput/BoardOutput.js","components/BoardOutput/index.js","core/Pokemon.js","core/PokemonTeam.js","core/PokemonTeamSet.js","core/ShowdownParser.js","core/Koffing.js","components/Board/index.js","components/Board/Board.js","teams/example.koffing.js","components/Board/Board.css.js","components/App.js","components/ThemedApp.js","serviceWorker.js","index.js"],"names":["module","exports","base64","encode","unencoded","Buffer","toString","decode","encoded","urlEncode","replace","urlDecode","length","StyledComponent","styles","withStyles","this","Component","AppHeader","classes","props","className","root","AppBar","position","Toolbar","IconButton","aria-label","href","alt","logo","src","component","color","title","vars","header_title","github_url","styled","flexGrow","flex","fontWeight","fontSize","display","verticalAlign","imageRendering","AppFooter","Grid","container","spacing","item","sm","md","footer","variant","rel","target","theme","mixins","gutters","paddingTop","paddingBottom","marginTop","flexGlow","padding","textAlign","window","location","hash","state","origin","pathname","callback","addEventListener","removeEventListener","makeStyles","overflow","textArea","fontFamily","backgroundColor","palette","secondary","main","BoardInput","value","onChange","useStyles","TextField","autoComplete","autoCorrect","autoCapitalize","spellCheck","multiline","rows","rowsMax","autoFocus","placeholder","fullWidth","margin","inputProps","Code","formattedCode","code","codeClassName","language","pre","dangerouslySetInnerHTML","__html","propTypes","Object","assign","PropTypes","string","isRequired","border","text","qrContainer","jsonContainer","qrIconSettings","height","width","excavate","BoardOutput","qrValue","jsonValue","Paper","elevation","size","renderAs","imageSettings","Pokemon","name","undefined","nickname","gender","ability","level","shiny","happiness","teratype","nature","evs","ivs","moves","indentation","JSON","stringify","str","match","toUpperCase","isNaN","filter","prop","toLowerCase","map","val","join","move","trim","toShowdown","obj","p","PokemonTeam","format","folder","pokemon","team","fromObject","PokemonTeamSet","teams","teamSet","ShowdownParser","regexes","current","lines","split","line","$this","forEach","_parseTeam","push","_saveCurrent","_parseKeyValuePairs","_parseEvsIvs","exec","_parseNameLine","teamName","teamFolder","teamData","teamNames","shift","rg","nickname_name","nameMatches","eivs","data","values","limit","stat","statData","eivs_value","parseFloat","console","error","some","key","parse","Koffing","toJson","String","Board","stateUrl","teamText","teamTextBase64","teamJson","teamObj","handleInputChange","bind","handleHashChange","update","loadTeam","history","event","teamCode","trimStart","valueBase64","valueJson","setState","xs","style","Typography","getFirstTeamName","paper","Button","onClick","prettify","App","createMuiTheme","typography","primary","ThemedApp","Boolean","hostname","ReactDOM","render","StrictMode","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","message"],"mappings":"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","file":"static/js/main.07f66bec.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,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\"","class base64 {\n static encode = function (unencoded) {\n return new Buffer(unencoded || '').toString('base64');\n };\n\n static decode = function (encoded) {\n return new Buffer(encoded || '', 'base64').toString('utf8');\n };\n\n\n static urlEncode = function (unencoded) {\n let encoded = base64.encode(unencoded);\n return encoded.replace('+', '-')\n .replace('/', '_').replace(/=+$/, '');\n };\n\n static urlDecode = function (encoded) {\n encoded = encoded.replace('-', '+').replace('_', '/');\n while (encoded.length % 4)\n encoded += '=';\n return base64.decode(encoded);\n };\n}\n\nexport default base64;\n","import {Component} from 'react';\nimport PropTypes from 'prop-types';\nimport {withStyles} from '@material-ui/core/styles';\n// eslint-disable-next-line no-unused-vars\nimport {StyledComponentProps} from '@material-ui/styles/withStyles'\n\n/**\n * @link https://material-ui.com/es/styles/basics/#higher-order-component-api\n */\nclass StyledComponent extends Component {\n static propTypes = {\n classes: PropTypes.object.isRequired\n }\n\n /**\n * @param {object} styles\n * @returns {React.ComponentType<any & StyledComponentProps<T>>}\n */\n static styled(styles) {\n return withStyles(styles)(this);\n }\n}\n\nexport default StyledComponent;\n","import AppHeader from './AppHeader';\n\nexport default AppHeader;\n","import React from 'react';\nimport StyledComponent from '../StyledComponent';\nimport AppBar from \"@material-ui/core/AppBar\";\nimport Toolbar from \"@material-ui/core/Toolbar\";\nimport Typo from '@material-ui/core/Typography';\nimport IconButton from \"@material-ui/core/IconButton\";\nimport logo from \"../../img/koffing.png\";\nimport vars from \"../../variables.json\";\nimport styles from \"./AppHeader.css\";\n\nclass AppHeader extends StyledComponent {\n render() {\n const {classes} = this.props;\n return (\n <div className={classes.root}>\n <AppBar position=\"static\">\n <Toolbar>\n <IconButton aria-label=\"Home\" href=\"#\">\n <img alt=\"logo\" className={classes.logo + \" koffing-sprite\"} src={logo}/>\n </IconButton>\n <Typo component=\"h1\" color=\"inherit\" className={classes.title}>\n {vars.header_title}\n </Typo>\n <IconButton color=\"inherit\" href={vars.github_url} title=\"Source Code\">\n <i className=\"fab fa-github\"/>\n </IconButton>\n </Toolbar>\n </AppBar>\n </div>\n );\n }\n}\n\nexport default AppHeader.styled(styles);\n","export default {\n root: {\n flexGrow: 1\n },\n title: {\n flex: 1,\n fontWeight: 400,\n fontSize: '1.3125rem'\n },\n logo: {\n position: \"relative\",\n display: \"inline-block\",\n verticalAlign: \"middle\",\n imageRendering: `crisp-edges;\n -ms-interpolation-mode:nearest-neighbor;\n image-rendering: -moz-crisp-edges;\n image-rendering: -webkit-crisp-edges;\n image-rendering: pixelated;`,\n '& koffing': {}\n }\n}\n","import AppFooter from './AppFooter';\n\nexport default AppFooter;\n","import React from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport Typo from '@material-ui/core/Typography';\nimport StyledComponent from \"../StyledComponent\";\nimport styles from \"./AppFooter.css\";\n\nclass AppFooter extends StyledComponent {\n render() {\n const {classes} = this.props;\n return (\n <div className={classes.root}>\n <Grid container spacing={10}>\n <Grid item sm={12} md={12}>\n <div className={classes.footer}>\n <Typo variant=\"caption\" component=\"p\">\n <span>Created by </span>\n <a href=\"https://itsjavi.com\" rel=\"noreferrer noopener\" target=\"_blank\">@itsjavi</a>\n /\n <a href=\"https://route1rodent.com\" rel=\"noreferrer noopener\" target=\"_blank\">@route1rodent</a>\n &nbsp; | &nbsp;\n <span>Powered by ReactJS and Material UI.</span>\n </Typo>\n </div>\n </Grid>\n </Grid>\n </div>\n );\n }\n}\n\nexport default AppFooter.styled(styles);\n","export default (theme) => ({\n root: theme.mixins.gutters({\n paddingTop: 16,\n paddingBottom: 16,\n marginTop: theme.spacing(),\n flexGlow: 1\n }),\n footer: {\n padding: theme.spacing() * 2,\n textAlign: 'center'\n }\n})\n","export default {\n getState() {\n return window.location.hash.replace(/^#/, '');\n },\n createStateUrl(state) {\n return window.location.origin + window.location.pathname + '#' + state;\n },\n pushState(state) {\n window.history.pushState(null, null, state);\n },\n addListener(callback) {\n window.addEventListener(\"popstate\", callback, false);\n },\n removeListener(callback) {\n window.removeEventListener(\"popstate\", callback, false);\n }\n}\n","import {makeStyles} from '@material-ui/core/styles';\n\nexport default makeStyles((theme) => ({\n root: {\n marginTop: 0,\n overflow: 'hidden'\n },\n textArea: {\n fontFamily: \"monospace\",\n fontSize: \"1em\",\n backgroundColor: theme.palette.secondary.main,\n padding: theme.spacing()\n }\n}))\n","import React from 'react';\nimport PropTypes from \"prop-types\";\nimport TextField from \"@material-ui/core/TextField\";\nimport useStyles from \"./BoardInput.css\";\n\nfunction BoardInput({value, onChange}) {\n const classes = useStyles();\n\n return <TextField\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n multiline\n className={classes.root}\n rows=\"12\"\n rowsMax=\"24\"\n autoFocus={true}\n placeholder=\"Place here your Showdown teams\"\n // defaultValue={exampleTeam}\n fullWidth\n margin=\"normal\"\n value={value}\n inputProps={{\n className: classes.textArea\n }}\n onChange={onChange}\n />\n}\n\nBoardInput.propTypes = {\n value: PropTypes.string.isRequired,\n onChange: PropTypes.func\n}\n\nexport default BoardInput;\n","import BoardInput from './BoardInput';\n\nexport default BoardInput;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport StyledComponent from \"../StyledComponent\";\nimport styles from \"./Code.css\";\n\nclass Code extends StyledComponent {\n static propTypes = Object.assign({}, super.propTypes, {\n language: PropTypes.string.isRequired,\n code: PropTypes.string.isRequired,\n })\n\n render() {\n const formattedCode = this.props.code;\n const codeClassName = `language-${this.props.language}`;\n const {classes} = this.props;\n return (\n <div className={classes.root}>\n <pre className={classes.pre}>\n <code className={codeClassName}>\n <div dangerouslySetInnerHTML={{__html: formattedCode}}/>\n </code>\n </pre>\n </div>\n );\n }\n}\n\nexport default Code.styled(styles);\n","import Code from './Code';\n\nexport default Code;\n","export default {\n root: {\n margin: '6px 0'\n },\n pre: {\n margin: 0,\n border: 'none !important',\n color: '#008008'\n }\n}\n","import {makeStyles} from '@material-ui/core/styles';\n\nexport default makeStyles((theme) => ({\n root: {\n padding: theme.spacing() * 2,\n color: theme.palette.text.secondary\n },\n qrContainer: {\n padding: theme.spacing() * 2,\n textAlign: \"center\",\n backgroundColor: \"#dde0f6\"\n },\n jsonContainer: {\n padding: theme.spacing() * 2,\n backgroundColor: \"#fafafa\"\n }\n}))\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport Paper from \"@material-ui/core/Paper\";\nimport QRCode from \"qrcode.react\";\nimport Code from \"../Code\";\nimport useStyles from \"./BoardOutput.css\";\nimport logo from \"../../img/koffing.png\";\n\nconst qrIconSettings = {\n src: logo,\n height: 48,\n width: 48,\n excavate: true\n}\n\nfunction BoardOutput({qrValue, jsonValue}) {\n const classes = useStyles();\n\n return (\n <Paper className={classes.root} elevation={1}>\n <Paper className={classes.qrContainer}>\n <QRCode value={qrValue} size={320} renderAs=\"canvas\" imageSettings={qrIconSettings}/>\n </Paper>\n <Paper className={classes.jsonContainer}>\n <Code code={jsonValue} language={'json'}/>\n </Paper>\n </Paper>\n );\n}\n\nBoardOutput.propTypes = {\n qrValue: PropTypes.string.isRequired,\n jsonValue: PropTypes.string.isRequired\n}\n\nexport default BoardOutput;\n","import BoardOutput from './BoardOutput';\n\nexport default BoardOutput;\n","class Pokemon {\n constructor() {\n /**\n * @type {String}\n */\n this.name = undefined;\n /**\n * @type {String}\n */\n this.nickname = undefined;\n /**\n * @type {String}\n */\n this.gender = undefined;\n /**\n * @type {String}\n */\n this.item = undefined;\n /**\n * @type {String}\n */\n this.ability = undefined;\n /**\n * @type {Number}\n */\n this.level = undefined;\n /**\n * @type {boolean}\n */\n this.shiny = undefined;\n /**\n * @type {Number}\n */\n this.happiness = undefined;\n /** \n * @type {String}\n */\n this.teratype = undefined;\n /**\n * @type {String}\n */\n this.nature = undefined;\n /**\n * @type {{ hp:Number, atk:Number, def: Number, spa: Number, spd: Number, spe: Number}}\n */\n this.evs = undefined;\n /**\n * @type {{ hp:Number, atk:Number, def: Number, spa: Number, spd: Number, spe: Number}}\n */\n this.ivs = undefined;\n /**\n * @type {String[]}\n */\n this.moves = [];\n }\n\n /**\n * @param {object|Pokemon} obj\n * @returns {Pokemon}\n */\n static fromObject(obj) {\n let p = new Pokemon();\n p.name = obj.name;\n p.nickname = obj.nickname;\n p.gender = obj.gender;\n p.item = obj.item;\n p.ability = obj.ability;\n p.level = obj.level;\n p.shiny = obj.shiny;\n p.happiness = obj.happiness;\n p.teratype = obj.teratype;\n p.nature = obj.nature;\n p.evs = obj.evs;\n p.ivs = obj.ivs;\n p.moves = obj.moves;\n\n return p;\n }\n\n /**\n * @param {Number} indentation\n * @returns {string}\n */\n toJson(indentation = 2) {\n return JSON.stringify(this, null, indentation);\n }\n\n /**\n * @returns {string}\n */\n toShowdown() {\n let str = '';\n\n if (this.nickname) {\n str += `${this.nickname} (${this.name})`;\n } else {\n str += `${this.name}`;\n }\n\n if (this.gender && this.gender.match(/^[MF]$/i)) {\n str += ` (${this.gender.toUpperCase()})`;\n }\n\n if (this.item) {\n str += ` @ ${this.item}`;\n }\n\n str += \"\\n\";\n\n if (!isNaN(this.level)) {\n str += `Level: ${this.level}\\n`;\n }\n\n if (this.ability) {\n str += `Ability: ${this.ability}\\n`;\n }\n\n if (this.shiny === true) {\n str += `Shiny: Yes\\n`;\n }\n\n if (!isNaN(this.happiness)) {\n str += `Happiness: ${this.happiness}\\n`;\n }\n \n if (this.teratype) {\n str += `Tera Type: ${this.teratype}\\n`;\n }\n\n if (this.nature) {\n str += `${this.nature} Nature\\n`;\n }\n\n if (this.evs) {\n let evs = this.evs;\n str += `EVs: ` + ['HP', 'Atk', 'Def', 'SpA', 'SpD', 'Spe']\n .filter(function (prop) {\n return !isNaN(evs[prop.toLowerCase()]);\n })\n .map(\n function (prop) {\n let val = evs[prop.toLowerCase()];\n return `${val} ${prop}`;\n }\n )\n .join(' / ') + '\\n';\n }\n\n if (this.ivs) {\n let ivs = this.ivs;\n str += `IVs: ` + ['HP', 'Atk', 'Def', 'SpA', 'SpD', 'Spe']\n .filter(function (prop) {\n return !isNaN(ivs[prop.toLowerCase()]);\n })\n .map(\n function (prop) {\n let val = ivs[prop.toLowerCase()];\n return `${val} ${prop}`;\n }\n )\n .join(' / ') + '\\n';\n }\n\n if (this.moves) {\n str += this.moves.map(function (move) {\n return `- ${move}`;\n }).join(\"\\n\") + \"\\n\";\n }\n\n return str.trim();\n }\n\n /**\n * @returns {string}\n */\n toString() {\n return this.toShowdown();\n }\n}\n\nexport default Pokemon;\n","import Pokemon from \"./Pokemon\";\n\nclass PokemonTeam {\n /**\n * @param {string} format\n * @param {string} name\n * @param {string|undefined} folder\n */\n constructor(format = 'gen7', name = 'Untitled', folder = undefined) {\n /**\n *\n * @type {string}\n */\n this.name = name;\n /**\n *\n * @type {string}\n */\n this.format = format;\n /**\n *\n * @type {string|undefined}\n */\n this.folder = folder;\n /**\n *\n * @type {Pokemon[]}\n */\n this.pokemon = [];\n }\n\n /**\n * @param {object|PokemonTeam} obj\n * @returns {PokemonTeam}\n */\n static fromObject(obj) {\n let team = new PokemonTeam();\n team.name = obj.name;\n team.format = obj.format;\n team.folder = obj.folder;\n team.pokemon = obj.pokemon ? obj.pokemon.map(function (pokemon) {\n return Pokemon.fromObject(pokemon);\n }) : [];\n\n return team;\n }\n\n /**\n * @param {Number} indentation\n * @returns {string}\n */\n toJson(indentation = 2) {\n return JSON.stringify(this, null, indentation);\n }\n\n /**\n * @returns {string}\n */\n toShowdown() {\n let name = this.folder ? `${this.folder}/${this.name}` : this.name;\n let str = `=== [${this.format}] ${name} ===\\n\\n`;\n\n str += this.pokemon.map(function (p) {\n return p.toString();\n }).join('\\n\\n');\n\n return str.trim();\n }\n\n /**\n * @returns {string}\n */\n toString() {\n return this.toShowdown();\n }\n}\n\nexport default PokemonTeam;","import PokemonTeam from \"./PokemonTeam\";\n\nclass PokemonTeamSet {\n /**\n * @param {PokemonTeam[]} teams\n */\n constructor(teams = []) {\n this.teams = teams;\n }\n\n /**\n * @param {object|PokemonTeamSet} obj\n * @returns {PokemonTeamSet}\n */\n static fromObject(obj) {\n let teamSet = new PokemonTeamSet();\n teamSet.teams = obj.teams ? obj.teams.map(function (team) {\n return PokemonTeam.fromObject(team);\n }) : [];\n\n return teamSet;\n }\n\n /**\n * @param {Number} indentation\n * @returns {string}\n */\n toJson(indentation = 2) {\n return JSON.stringify(this, null, indentation);\n }\n\n /**\n * @returns {string}\n */\n toShowdown() {\n return this.teams\n .map(function (p) {\n return p.toString();\n })\n .join('\\n\\n')\n .trim();\n }\n\n /**\n * @returns {string}\n */\n toString() {\n return this.toShowdown();\n }\n}\n\nexport default PokemonTeamSet;","import Pokemon from \"./Pokemon\";\nimport PokemonTeam from \"./PokemonTeam\";\nimport PokemonTeamSet from \"./PokemonTeamSet\";\n\n/**\n * Ported from Pokemon Showdown Client's exportTeam/importTeam functions.\n *\n * @see https://github.com/Zarel/Pokemon-Showdown-Client/blob/8994e9e/js/storage.js\n */\nclass ShowdownParser {\n /**\n * @param {String} code\n */\n constructor(code) {\n /**\n * @type {String}\n */\n this.code = code.trim() + \"\";\n }\n\n /**\n * @returns {PokemonTeamSet}\n */\n parse() {\n const regexes = ShowdownParser.regexes;\n\n /**\n * @type {PokemonTeam[]}\n */\n let teams = [];\n\n /**\n * @type {{team: PokemonTeam, pokemon: Pokemon}}\n */\n let current = {\n team: null,\n pokemon: null\n };\n\n /**\n * @type {string[]}\n */\n let lines = this.code\n .trim()\n .split(\"\\n\")\n .map(function (line) {\n return line.trim();\n });\n\n let $this = this;\n\n lines.forEach(function (line) {\n // New Team\n if (line.match(regexes.team)) {\n // Start new team\n current.team = new PokemonTeam();\n $this._parseTeam(line, current.team);\n teams.push(current.team);\n return;\n }\n\n // Separator\n if (line === '' || line.match(/^[- ]+$/)) {\n // Line break (empty or as dashes separator), previous Pokemon definition ended.\n $this._saveCurrent(teams, current);\n return;\n }\n\n // New Pokemon + nickname, name, gender and item\n if (!current.pokemon) {\n current.pokemon = new Pokemon();\n $this._parseNameLine(line, current.pokemon);\n return;\n }\n\n // Ability, Level, etc.\n if ($this._parseKeyValuePairs(line, current.pokemon)) {\n return;\n }\n\n // EVs and IVs\n if ($this._parseEvsIvs(line, current.pokemon)) {\n return;\n }\n\n // Moves\n if ((current.pokemon.moves.length < 4) && line.match(regexes.move)) {\n current.pokemon.moves.push(regexes.move.exec(line)[1].trim());\n }\n });\n\n this._saveCurrent(teams, current);\n\n return new PokemonTeamSet(teams);\n }\n\n /**\n * @param {string} line\n * @param {PokemonTeam} team\n * @private\n */\n _parseTeam(line, team) {\n const rg = ShowdownParser.regexes;\n\n let teamData = rg.team.exec(line);\n let teamNames = teamData[2].split('/');\n let teamName, teamFolder;\n\n if (teamNames.length > 1) {\n teamFolder = teamNames.shift();\n teamName = teamNames.join('/');\n } else {\n teamName = teamData[2];\n }\n\n team.format = teamData[1].trim();\n team.name = teamName.trim();\n team.folder = teamFolder ? teamFolder.trim() : undefined;\n }\n\n /**\n * @param {string} line\n * @param {Pokemon} pokemon\n * @private\n */\n _parseNameLine(line, pokemon) {\n const rg = ShowdownParser.regexes;\n\n if (line.match(rg.nickname_name)) { // has nickname?\n let nameMatches = rg.nickname_name.exec(line);\n pokemon.nickname = nameMatches[1].trim();\n pokemon.name = nameMatches[2].trim();\n } else if (line.match(rg.name)) {\n let nameMatches = rg.name.exec(line);\n pokemon.name = nameMatches[1].trim();\n }\n\n if (line.match(rg.gender)) {\n pokemon.gender = rg.gender.exec(line)[1].toUpperCase().trim();\n }\n\n if (line.match(rg.item)) {\n pokemon.item = rg.item.exec(line)[1].trim();\n }\n }\n\n /**\n * @param {string} line\n * @param {Pokemon} pokemon\n * @returns {boolean} True if it matched some, false otherwise\n * @private\n */\n _parseEvsIvs(line, pokemon) {\n const rg = ShowdownParser.regexes;\n\n if (line.match(rg.eivs)) {\n let data = rg.eivs.exec(line);\n let prop = data[1].toLowerCase();\n let values = data[2].split('/');\n let limit = prop === 'evs' ? 255 : 31;\n\n values.forEach(function (stat) {\n let statData = rg.eivs_value.exec(stat.trim().toLowerCase());\n if (!statData) {\n console.error(\"Invalid syntax for \" + prop + \": \" + stat);\n return;\n }\n if (!pokemon[prop]) {\n pokemon[prop] = {};\n }\n pokemon[prop][statData[2]] = parseFloat(statData[1]);\n\n if (pokemon[prop][statData[2]] > limit) {\n pokemon[prop][statData[2]] = limit;\n }\n });\n return true;\n }\n return false;\n }\n\n /**\n * @param {string} line\n * @param {Pokemon} pokemon\n * @returns {boolean} True if it matched some, false otherwise\n * @private\n */\n _parseKeyValuePairs(line, pokemon) {\n const rg = ShowdownParser.regexes;\n\n return ['ability', 'level', 'shiny', 'happiness', 'teratype', 'nature'].some(\n function (key) {\n if (line.match(rg[key])) {\n pokemon[key] = rg[key].exec(line)[1].trim();\n\n if (!isNaN(pokemon[key])) {\n pokemon[key] = parseFloat(pokemon[key]);\n }\n\n if (key === 'happiness' && pokemon[key] > 255) {\n pokemon[key] = 255;\n }\n\n if (key === 'level' && pokemon[key] < 1) {\n pokemon[key] = 1;\n }\n\n if (key === 'level' && pokemon[key] > 100) {\n pokemon[key] = 100;\n }\n\n if (key === 'shiny') {\n pokemon[key] = !!pokemon[key].match(/yes/i);\n }\n\n return true;\n }\n return false;\n }\n );\n }\n\n /**\n * Saves the current state of the parsed team.\n *\n * @param {Array} teams\n * @param {{team: PokemonTeam, pokemon: Pokemon}} current\n * @returns {ShowdownParser}\n * @private\n */\n _saveCurrent(teams, current) {\n if (!current.team) {\n // Create a team if there is no current one\n current.team = new PokemonTeam();\n teams.push(current.team);\n }\n if (current.pokemon) {\n // Create a team if there is no current one\n current.team.pokemon.push(current.pokemon);\n current.pokemon = null;\n }\n return this;\n }\n\n /**\n * Sanitizes and re-formats / prettifies the Showdown code\n *\n * @returns {ShowdownParser}\n */\n format() {\n this.code = this.parse().toString();\n return this;\n }\n\n /**\n * @returns {string}\n */\n toString() {\n return this.code;\n }\n}\n\nShowdownParser.regexes = {\n team: /^===\\s+\\[(.*)\\]\\s+(.*)\\s+===$/,\n gender: /\\((F|M)\\)/i,\n item: /@\\s?(.*)$/i,\n name: /^([^()=@]{2,})/i,\n nickname_name: /^([^()=@]*)\\s+\\(([^()=@]{2,})\\)/i,\n ability: /^Ability:\\s?(.*)$/i,\n level: /^Level:\\s?([0-9]{1,3})$/i,\n shiny: /^Shiny:\\s?(Yes|No)$/i,\n happiness: /^Happiness:\\s?([0-9]{1,3})$/i,\n teratype: /^Tera Type:\\s?(.*)$/i,\n eivs: /^([EI]Vs):\\s?(.*)$/i,\n eivs_value: /^([0-9]+)\\s+(hp|atk|def|spa|spd|spe)$/i,\n nature: /^(.*)\\s+Nature$/,\n move: /^[-~]\\s?(.*)$/i\n};\n\nexport default ShowdownParser;\n","import Pokemon from \"./Pokemon\";\nimport PokemonTeam from \"./PokemonTeam\";\nimport PokemonTeamSet from \"./PokemonTeamSet\";\nimport ShowdownParser from \"./ShowdownParser\";\n\nclass Koffing {\n /**\n * Converts from Showdown to a PokemonTeamSet object.\n *\n * @param {String|Pokemon|PokemonTeam|PokemonTeamSet|ShowdownParser} data Showdown code or object\n * @returns {PokemonTeamSet}\n */\n static parse(data) {\n if (\n data instanceof PokemonTeamSet\n || data instanceof PokemonTeam\n || data instanceof Pokemon\n ) {\n return data;\n }\n if (data instanceof ShowdownParser) {\n return data.parse();\n }\n return (new ShowdownParser(data)).parse();\n }\n\n /**\n * Prettifies and sanitizes the given Showdown code.\n *\n * @param {String|Pokemon|PokemonTeam|PokemonTeamSet|ShowdownParser} data Showdown code or object\n * @returns {String}\n */\n static format(data) {\n return this.parse(data).toShowdown();\n }\n\n /**\n * Converts from Showdown to JSON code.\n *\n * @param {String|Pokemon|PokemonTeam|PokemonTeamSet|ShowdownParser} data Showdown code or object\n * @returns {String}\n */\n static toJson(data) {\n return this.parse(data).toJson();\n }\n\n /**\n * Converts from JSON to Showdown code.\n *\n * @param {String|Object|Pokemon|PokemonTeam|PokemonTeamSet|ShowdownParser} data JSON code or object\n * @returns {String}\n */\n static toShowdown(data) {\n if (\n data instanceof PokemonTeamSet\n || data instanceof PokemonTeam\n || data instanceof Pokemon\n ) {\n return data.toShowdown();\n }\n if (data instanceof ShowdownParser) {\n return data.parse().format();\n }\n if (typeof data === 'string' || data instanceof String) {\n data = JSON.parse(data);\n }\n return PokemonTeamSet.fromObject(JSON.parse(data)).toShowdown();\n }\n}\n\nexport default Koffing;\n","import Board from './Board';\n\nexport default Board;\n","import React from 'react';\nimport Grid from '@material-ui/core/Grid';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from \"@material-ui/core/Typography\";\nimport Button from \"@material-ui/core/Button\";\nimport {base64, history} from \"../../tools\";\nimport StyledComponent from \"../StyledComponent\";\nimport BoardInput from \"../BoardInput\";\nimport BoardOutput from \"../BoardOutput\";\nimport exampleTeam from \"../../teams/example.koffing\";\nimport {Koffing} from \"../../core\";\nimport styles from \"./Board.css\";\n\nclass BoardComponent extends StyledComponent {\n\n constructor(props) {\n super(props);\n this.state = {\n stateUrl: '',\n teamText: '',\n teamTextBase64: base64.encode(''),\n teamJson: '',\n teamObj: {}\n };\n this.handleInputChange = this.handleInputChange.bind(this);\n this.handleHashChange = this.handleHashChange.bind(this);\n }\n\n componentDidMount() {\n this.update(this.loadTeam());\n history.addListener(this.handleHashChange)\n }\n\n componentWillUnmount() {\n history.removeListener(this.handleHashChange);\n }\n\n handleInputChange(event) {\n this.update(event.target.value);\n }\n\n handleHashChange(event) {\n this.update(this.loadTeam());\n }\n\n loadTeam() {\n let teamCode = history.getState();\n if (teamCode === '') {\n return exampleTeam;\n }\n return base64.decode(teamCode);\n }\n\n update(value) {\n value = value.trimStart();\n const valueBase64 = base64.encode(value);\n const valueJson = Koffing.toJson(value);\n this.setState({\n stateUrl: history.createStateUrl(valueBase64),\n teamText: value,\n teamTextBase64: valueBase64,\n teamJson: valueJson,\n teamObj: JSON.parse(valueJson)\n });\n }\n\n prettify() {\n this.update(Koffing.format(this.state.text) + \"\\n\");\n }\n\n getFirstTeamName() {\n const defaultName = 'undefined';\n if (\n this.state.teamObj['teams'] === undefined\n || this.state.teamObj['teams'][0] === undefined\n || this.state.teamObj['teams'][0].name === undefined\n ) {\n return defaultName;\n }\n return this.state.teamObj['teams'][0].name;\n }\n\n render() {\n const {classes} = this.props;\n return (\n <div className={classes.root}>\n <Grid container spacing={10}>\n <Grid item xs={12} sm={12} md={6} style={{paddingBottom: \"1em\"}}>\n <Typography variant=\"h4\" component=\"h2\">{this.getFirstTeamName()}</Typography>\n </Grid>\n </Grid>\n <Grid container spacing={10}>\n <Grid item xs={12} sm={12} md={6}>\n <Paper className={classes.paper} elevation={1}>\n <BoardInput value={this.state.teamText} onChange={this.handleInputChange}/>\n <Button onClick={() => this.prettify()} variant={'contained'} color={'primary'}>Prettify</Button>\n &nbsp;\n <Button onClick={() => this.update('')} variant={'text'}>Clear</Button>\n </Paper>\n </Grid>\n <Grid item xs={12} sm={12} md={6}>\n <BoardOutput qrValue={this.state.stateUrl} jsonValue={this.state.teamJson}/>\n </Grid>\n </Grid>\n </div>\n );\n }\n}\n\nexport default BoardComponent.styled(styles);\n","export default `\n=== [gen7] Folder 1/Example Team ===\n\nSmogon (Koffing) (F) @ Eviolite\nLevel: 5\nAbility: Levitate\nShiny: Yes\nHappiness: 255\nEVs: 36 HP / 236 Def / 236 SpD\nIVs: 31 HP / 30 Atk / 31 SpA / 30 SpD / 31 Spe\nBold Nature\n- Will-O-Wisp\n- Pain Split\n- Sludge Bomb\n- Fire Blast\n\nWeezing @ Black Sludge\nAbility: Levitate\nEVs: 252 HP / 160 Def / 96 Spe\nBold Nature\n- Sludge Bomb\n- Will-O-Wisp\n- Toxic Spikes\n- Taunt\n`;\n","export default (theme) => ({\n root: theme.mixins.gutters({\n paddingTop: 16,\n paddingBottom: 16,\n marginTop: theme.spacing(),\n flexGlow: 1\n }),\n paper: {\n padding: theme.spacing() * 2,\n color: theme.palette.text.secondary\n },\n qrContainer: {\n padding: theme.spacing() * 2,\n textAlign: \"center\",\n backgroundColor: \"#dde0f6\"\n },\n jsonContainer: {\n padding: theme.spacing() * 2,\n backgroundColor: \"#fafafa\"\n }\n})\n","import React, {Component} from 'react';\nimport AppHeader from './AppHeader';\nimport AppFooter from \"./AppFooter\";\nimport Board from \"./Board\";\n\nclass App extends Component {\n render() {\n return (\n <div className=\"koffing-app\">\n <AppHeader/>\n <Board/>\n <AppFooter/>\n </div>\n );\n }\n}\n\nexport default App;\n","import React from 'react';\nimport {createMuiTheme, MuiThemeProvider} from '@material-ui/core/styles';\nimport App from \"./App\";\n\nconst theme = createMuiTheme({\n typography: {\n fontFamily: '\"Exo 2\",\"Helvetica Neue\",Arial,sans-serif',\n },\n palette: {\n primary: {main: '#6B71B8'},\n secondary: {main: '#F6F79D'},\n },\n});\n\n\nconst ThemedApp = () => (\n <div className=\"koffing-app-container\">\n {/*<CssBaseline/>*//* MUI adds the reset at the end, which is not what we want*/}\n <MuiThemeProvider theme={theme}>\n <App/>\n </MuiThemeProvider>\n </div>\n);\n\nexport default ThemedApp;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// teams are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport ThemedApp from './components/ThemedApp';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n <React.StrictMode>\n <ThemedApp/>\n </React.StrictMode>,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}
@@ -0,0 +1,2 @@
1
+ !function(e){function r(r){for(var n,f,i=r[0],l=r[1],a=r[2],c=0,s=[];c<i.length;c++)f=i[c],Object.prototype.hasOwnProperty.call(o,f)&&o[f]&&s.push(o[f][0]),o[f]=0;for(n in l)Object.prototype.hasOwnProperty.call(l,n)&&(e[n]=l[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,i=1;i<t.length;i++){var l=t[i];0!==o[l]&&(n=!1)}n&&(u.splice(r--,1),e=f(f.s=t[0]))}return e}var n={},o={1:0},u=[];function f(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,f),t.l=!0,t.exports}f.m=e,f.c=n,f.d=function(e,r,t){f.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},f.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.t=function(e,r){if(1&r&&(e=f(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(f.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)f.d(t,n,function(r){return e[r]}.bind(null,n));return t},f.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return f.d(r,"a",r),r},f.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},f.p="/koffing/";var i=this.webpackJsonpkoffing=this.webpackJsonpkoffing||[],l=i.push.bind(i);i.push=r,i=i.slice();for(var a=0;a<i.length;a++)r(i[a]);var p=l;t()}([]);
2
+ //# sourceMappingURL=runtime-main.525bb0ff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","1","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.525bb0ff.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/koffing/\";\n\n \tvar jsonpArray = this[\"webpackJsonpkoffing\"] = this[\"webpackJsonpkoffing\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
package/package.json CHANGED
@@ -1,41 +1,52 @@
1
1
  {
2
2
  "name": "koffing",
3
- "version": "0.4.0",
4
- "license": "MIT",
5
- "description": "Pokemon Showdown Team parser that converts your strategies to machine-readable JSON code.",
6
- "author": "Javi Aguilar (@itjsavi)",
7
- "keywords": [
8
- "pokemon",
9
- "smogon",
10
- "showdown",
11
- "pokemon-showdown"
12
- ],
3
+ "version": "0.5.0",
13
4
  "repository": {
14
- "type": "git",
15
- "url": "git+https://github.com/capsulemonsters/koffing.git"
5
+ "url": "https://github.com/itsjavi/koffing",
6
+ "type": "git"
16
7
  },
17
- "bugs": {
18
- "url": "https://github.com/capsulemonsters/koffing/issues"
8
+ "homepage": "/koffing",
9
+ "license": "MIT",
10
+ "dependencies": {
11
+ "@material-ui/core": "^4.11.0",
12
+ "@material-ui/styles": "^4.10.0",
13
+ "@testing-library/jest-dom": "^4.2.4",
14
+ "@testing-library/react": "^9.3.2",
15
+ "@testing-library/user-event": "^7.1.2",
16
+ "prop-types": "^15.7.2",
17
+ "qrcode.react": "^1.0.0",
18
+ "react": "^16.13.1",
19
+ "react-dom": "^16.13.1",
20
+ "react-scripts": "3.4.3"
19
21
  },
20
- "homepage": "https://github.com/capsulemonsters/koffing#readme",
21
- "main": "dist/koffing.js",
22
22
  "scripts": {
23
- "start": "npx webpack-dev-server --config ./webpack.config-docs.js --mode development",
24
- "build-dist": "npx webpack --mode production",
25
- "build-docs": "npx webpack --config ./webpack.config-docs.js --mode production",
26
- "build-all": "npm run build-dist && npm run build-docs",
27
- "test": "echo \"Error: no test specified\" && exit 1"
23
+ "start": "react-scripts start",
24
+ "build": "react-scripts build",
25
+ "test": "react-scripts test",
26
+ "eject": "react-scripts eject",
27
+ "deploy": "make gh-pages"
28
+ },
29
+ "eslintConfig": {
30
+ "extends": "react-app"
31
+ },
32
+ "browserslist": {
33
+ "production": [
34
+ ">0.2%",
35
+ "not dead",
36
+ "not op_mini all"
37
+ ],
38
+ "development": [
39
+ "last 1 chrome version",
40
+ "last 1 firefox version",
41
+ "last 1 safari version"
42
+ ]
43
+ },
44
+ "ghPagesDeploy": {
45
+ "repository": "git@github.com:itsjavi/koffing.git",
46
+ "directory": "build",
47
+ "commitMessage": "update gh-pages build"
28
48
  },
29
49
  "devDependencies": {
30
- "babel-cli": "^6.26.0",
31
- "babel-loader": "^7.1.4",
32
- "babel-preset-env": "^1.6.1",
33
- "babel-preset-react": "^6.24.1",
34
- "material-ui": "^1.0.0-beta.38",
35
- "react": "^16.2.0",
36
- "react-dom": "^16.2.0",
37
- "webpack": "^4.2.0",
38
- "webpack-cli": "^2.0.13",
39
- "webpack-dev-server": "^3.1.1"
50
+ "gh-pages-publish": "https://github.com/itsjavi/node-gh-pages-deploy#1.2.0"
40
51
  }
41
52
  }
Binary file
@@ -0,0 +1,30 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8"/>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
6
+ <meta name="theme-color" content="#000000"/>
7
+
8
+ <title>Koffing - Pokemon Showdown Team parser | Online Pokemon Showdown Team parser</title>
9
+
10
+ <link rel="shortcut icon" type="image/png" href="%PUBLIC_URL%/favicon.png"/>
11
+ <script async src="https://www.googletagmanager.com/gtag/js?id=UA-85082661-2"></script>
12
+ <script>
13
+ window.dataLayer = window.dataLayer || [];
14
+
15
+ function gtag() {
16
+ dataLayer.push(arguments);
17
+ }
18
+
19
+ gtag('js', new Date());
20
+
21
+ gtag('config', 'UA-85082661-2');
22
+ </script>
23
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Exo+2:300,400,500">
24
+ <link href="https://use.fontawesome.com/releases/v5.14.0/css/all.css" rel="stylesheet">
25
+ </head>
26
+ <body>
27
+ <noscript>You need to enable JavaScript and a modern browser to run this app.</noscript>
28
+ <div id="root"></div>
29
+ </body>
30
+ </html>
@@ -0,0 +1,3 @@
1
+ # https://www.robotstxt.org/robotstxt.html
2
+ User-agent: *
3
+ Disallow:
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import {render} from '@testing-library/react';
3
+ import ThemedApp from './components/ThemedApp';
4
+
5
+ test('renders the prettify button', () => {
6
+ const {getByText} = render(<ThemedApp/>);
7
+ const testedElement = getByText(/Prettify/i);
8
+ expect(testedElement).toBeInTheDocument();
9
+ });
@@ -0,0 +1,18 @@
1
+ import React, {Component} from 'react';
2
+ import AppHeader from './AppHeader';
3
+ import AppFooter from "./AppFooter";
4
+ import Board from "./Board";
5
+
6
+ class App extends Component {
7
+ render() {
8
+ return (
9
+ <div className="koffing-app">
10
+ <AppHeader/>
11
+ <Board/>
12
+ <AppFooter/>
13
+ </div>
14
+ );
15
+ }
16
+ }
17
+
18
+ export default App;
@@ -0,0 +1,12 @@
1
+ export default (theme) => ({
2
+ root: theme.mixins.gutters({
3
+ paddingTop: 16,
4
+ paddingBottom: 16,
5
+ marginTop: theme.spacing(),
6
+ flexGlow: 1
7
+ }),
8
+ footer: {
9
+ padding: theme.spacing() * 2,
10
+ textAlign: 'center'
11
+ }
12
+ })
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import Grid from '@material-ui/core/Grid';
3
+ import Typo from '@material-ui/core/Typography';
4
+ import StyledComponent from "../StyledComponent";
5
+ import styles from "./AppFooter.css";
6
+
7
+ class AppFooter extends StyledComponent {
8
+ render() {
9
+ const {classes} = this.props;
10
+ return (
11
+ <div className={classes.root}>
12
+ <Grid container spacing={10}>
13
+ <Grid item sm={12} md={12}>
14
+ <div className={classes.footer}>
15
+ <Typo variant="caption" component="p">
16
+ <span>Created by </span>
17
+ <a href="https://itsjavi.com" rel="noreferrer noopener" target="_blank">@itsjavi</a>
18
+ /
19
+ <a href="https://route1rodent.com" rel="noreferrer noopener" target="_blank">@route1rodent</a>
20
+ &nbsp; | &nbsp;
21
+ <span>Powered by ReactJS and Material UI.</span>
22
+ </Typo>
23
+ </div>
24
+ </Grid>
25
+ </Grid>
26
+ </div>
27
+ );
28
+ }
29
+ }
30
+
31
+ export default AppFooter.styled(styles);
@@ -0,0 +1,3 @@
1
+ import AppFooter from './AppFooter';
2
+
3
+ export default AppFooter;
@@ -0,0 +1,21 @@
1
+ export default {
2
+ root: {
3
+ flexGrow: 1
4
+ },
5
+ title: {
6
+ flex: 1,
7
+ fontWeight: 400,
8
+ fontSize: '1.3125rem'
9
+ },
10
+ logo: {
11
+ position: "relative",
12
+ display: "inline-block",
13
+ verticalAlign: "middle",
14
+ imageRendering: `crisp-edges;
15
+ -ms-interpolation-mode:nearest-neighbor;
16
+ image-rendering: -moz-crisp-edges;
17
+ image-rendering: -webkit-crisp-edges;
18
+ image-rendering: pixelated;`,
19
+ '& koffing': {}
20
+ }
21
+ }
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import StyledComponent from '../StyledComponent';
3
+ import AppBar from "@material-ui/core/AppBar";
4
+ import Toolbar from "@material-ui/core/Toolbar";
5
+ import Typo from '@material-ui/core/Typography';
6
+ import IconButton from "@material-ui/core/IconButton";
7
+ import logo from "../../img/koffing.png";
8
+ import vars from "../../variables.json";
9
+ import styles from "./AppHeader.css";
10
+
11
+ class AppHeader extends StyledComponent {
12
+ render() {
13
+ const {classes} = this.props;
14
+ return (
15
+ <div className={classes.root}>
16
+ <AppBar position="static">
17
+ <Toolbar>
18
+ <IconButton aria-label="Home" href="#">
19
+ <img alt="logo" className={classes.logo + " koffing-sprite"} src={logo}/>
20
+ </IconButton>
21
+ <Typo component="h1" color="inherit" className={classes.title}>
22
+ {vars.header_title}
23
+ </Typo>
24
+ <IconButton color="inherit" href={vars.github_url} title="Source Code">
25
+ <i className="fab fa-github"/>
26
+ </IconButton>
27
+ </Toolbar>
28
+ </AppBar>
29
+ </div>
30
+ );
31
+ }
32
+ }
33
+
34
+ export default AppHeader.styled(styles);
@@ -0,0 +1,3 @@
1
+ import AppHeader from './AppHeader';
2
+
3
+ export default AppHeader;
@@ -0,0 +1,21 @@
1
+ export default (theme) => ({
2
+ root: theme.mixins.gutters({
3
+ paddingTop: 16,
4
+ paddingBottom: 16,
5
+ marginTop: theme.spacing(),
6
+ flexGlow: 1
7
+ }),
8
+ paper: {
9
+ padding: theme.spacing() * 2,
10
+ color: theme.palette.text.secondary
11
+ },
12
+ qrContainer: {
13
+ padding: theme.spacing() * 2,
14
+ textAlign: "center",
15
+ backgroundColor: "#dde0f6"
16
+ },
17
+ jsonContainer: {
18
+ padding: theme.spacing() * 2,
19
+ backgroundColor: "#fafafa"
20
+ }
21
+ })
@@ -0,0 +1,110 @@
1
+ import React from 'react';
2
+ import Grid from '@material-ui/core/Grid';
3
+ import Paper from '@material-ui/core/Paper';
4
+ import Typography from "@material-ui/core/Typography";
5
+ import Button from "@material-ui/core/Button";
6
+ import {base64, history} from "../../tools";
7
+ import StyledComponent from "../StyledComponent";
8
+ import BoardInput from "../BoardInput";
9
+ import BoardOutput from "../BoardOutput";
10
+ import exampleTeam from "../../teams/example.koffing";
11
+ import {Koffing} from "../../core";
12
+ import styles from "./Board.css";
13
+
14
+ class BoardComponent extends StyledComponent {
15
+
16
+ constructor(props) {
17
+ super(props);
18
+ this.state = {
19
+ stateUrl: '',
20
+ teamText: '',
21
+ teamTextBase64: base64.encode(''),
22
+ teamJson: '',
23
+ teamObj: {}
24
+ };
25
+ this.handleInputChange = this.handleInputChange.bind(this);
26
+ this.handleHashChange = this.handleHashChange.bind(this);
27
+ }
28
+
29
+ componentDidMount() {
30
+ this.update(this.loadTeam());
31
+ history.addListener(this.handleHashChange)
32
+ }
33
+
34
+ componentWillUnmount() {
35
+ history.removeListener(this.handleHashChange);
36
+ }
37
+
38
+ handleInputChange(event) {
39
+ this.update(event.target.value);
40
+ }
41
+
42
+ handleHashChange(event) {
43
+ this.update(this.loadTeam());
44
+ }
45
+
46
+ loadTeam() {
47
+ let teamCode = history.getState();
48
+ if (teamCode === '') {
49
+ return exampleTeam;
50
+ }
51
+ return base64.decode(teamCode);
52
+ }
53
+
54
+ update(value) {
55
+ value = value.trimStart();
56
+ const valueBase64 = base64.encode(value);
57
+ const valueJson = Koffing.toJson(value);
58
+ this.setState({
59
+ stateUrl: history.createStateUrl(valueBase64),
60
+ teamText: value,
61
+ teamTextBase64: valueBase64,
62
+ teamJson: valueJson,
63
+ teamObj: JSON.parse(valueJson)
64
+ });
65
+ }
66
+
67
+ prettify() {
68
+ this.update(Koffing.format(this.state.text) + "\n");
69
+ }
70
+
71
+ getFirstTeamName() {
72
+ const defaultName = 'undefined';
73
+ if (
74
+ this.state.teamObj['teams'] === undefined
75
+ || this.state.teamObj['teams'][0] === undefined
76
+ || this.state.teamObj['teams'][0].name === undefined
77
+ ) {
78
+ return defaultName;
79
+ }
80
+ return this.state.teamObj['teams'][0].name;
81
+ }
82
+
83
+ render() {
84
+ const {classes} = this.props;
85
+ return (
86
+ <div className={classes.root}>
87
+ <Grid container spacing={10}>
88
+ <Grid item xs={12} sm={12} md={6} style={{paddingBottom: "1em"}}>
89
+ <Typography variant="h4" component="h2">{this.getFirstTeamName()}</Typography>
90
+ </Grid>
91
+ </Grid>
92
+ <Grid container spacing={10}>
93
+ <Grid item xs={12} sm={12} md={6}>
94
+ <Paper className={classes.paper} elevation={1}>
95
+ <BoardInput value={this.state.teamText} onChange={this.handleInputChange}/>
96
+ <Button onClick={() => this.prettify()} variant={'contained'} color={'primary'}>Prettify</Button>
97
+ &nbsp;
98
+ <Button onClick={() => this.update('')} variant={'text'}>Clear</Button>
99
+ </Paper>
100
+ </Grid>
101
+ <Grid item xs={12} sm={12} md={6}>
102
+ <BoardOutput qrValue={this.state.stateUrl} jsonValue={this.state.teamJson}/>
103
+ </Grid>
104
+ </Grid>
105
+ </div>
106
+ );
107
+ }
108
+ }
109
+
110
+ export default BoardComponent.styled(styles);
@@ -0,0 +1,3 @@
1
+ import Board from './Board';
2
+
3
+ export default Board;