{"action":"opened","number":1,"pull_request":{"url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/pulls/1","id":296485088,"node_id":"MDExOlB1bGxSZXF1ZXN0Mjk2NDg1MDg4","html_url":"https://github.com/cheap29/vuejs-whiteboard/pull/1","diff_url":"https://github.com/cheap29/vuejs-whiteboard/pull/1.diff","patch_url":"https://github.com/cheap29/vuejs-whiteboard/pull/1.patch","issue_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/issues/1","number":1,"state":"open","locked":false,"title":"webpackの導入、SQLite依存の削除","user":{"login":"kmycode","id":13672783,"node_id":"MDQ6VXNlcjEzNjcyNzgz","avatar_url":"https://avatars2.githubusercontent.com/u/13672783?v=4","gravatar_id":"","url":"https://api.github.com/users/kmycode","html_url":"https://github.com/kmycode","followers_url":"https://api.github.com/users/kmycode/followers","following_url":"https://api.github.com/users/kmycode/following{/other_user}","gists_url":"https://api.github.com/users/kmycode/gists{/gist_id}","starred_url":"https://api.github.com/users/kmycode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kmycode/subscriptions","organizations_url":"https://api.github.com/users/kmycode/orgs","repos_url":"https://api.github.com/users/kmycode/repos","events_url":"https://api.github.com/users/kmycode/events{/privacy}","received_events_url":"https://api.github.com/users/kmycode/received_events","type":"User","site_admin":false},"body":"コードをうちなりに修正してみましたー。\r\n修正内容とか、コードを読んでおもたこととか、ちょっと雑に書いてみますー\r\n\r\nちょっとたくさんありすぎて推敲しきれず分かりづらいとこ多いかもしれませんが、ご遠慮なく聞いてみてくださいなのです‥‥\r\n\r\n## Node.js上で動作する部分、ブラウザ上で動作する部分の区別が必要です\r\n\r\n言語は同じJavaScriptなので混合しやすいですが、\r\nNode.js上で動作する部分、そうでない部分があいまいになっているように思います。\r\n両者には以下の違いが含まれます。\r\n\r\n* Node.js上で動作する部分\r\n  * ローカルファイルへのアクセスが可能\r\n    * `require`が使用可能\r\n    * SQLiteが利用可能\r\n  * プログラムはNode.js上でアプリケーションとして実行される\r\n    * `console.log`やエラーはターミナル上に表示される\r\n    * Node.jsの各種プラグインが使用可能\r\n* ブラウザ上で動作する部分\r\n  * ローカルファイルへのアクセスが**不可**\r\n    * `require`は使用不可\r\n    * SQLiteも使用不可\r\n  * プログラムはブラウザ上でスクリプトとして実行される\r\n    * `console.log`やエラーはブラウザのコンソール上に表示される\r\n    * できることはもちろんブラウザと全く同じ\r\n    * **Node.jsを介したからと言って、Node.jsの機能が使えるわけではない**\r\n      * Node.jsの機能が使えたと思っている部分は、実はJavaScript言語に標準で用意されている関数だったりしませんか？\r\n\r\n### 今回のPRでの修正事項\r\n\r\n両者を区別するため、以下のように修正しています。この一部には、後述の`webpack`関連の修正も含みます。\r\n\r\n* Node.js上で動作する部分は`app.js`に集約\r\n* ブラウザ上で動作する部分は`src`フォルダに集約\r\n\r\n## クライアントサイドでSQLiteは使えません\r\n\r\nこの項目の内容はほぼ前項と重複しますが、表題の通りです。\r\n\r\nうちも当初は混合していましたが、**Node.jsのメリットは、サーバサイドとクライアントサイドを同じJavaScript（もしくはAltJS）で開発できることであって、本来サーバサイドで実装すべき機能がクライアントサイドで実装できることではありません。**\r\nただのアプリケーションサーバを作っているにすぎません。ASP.NETでC#とHTML/JavaScriptを同時に書いているのと同じです。両者の言語が同じになっただけです。\r\n\r\nご存知と思いますが、SQLiteはローカルファイルへのアクセスを伴うため、ブラウザ上では動作しません。\r\nブラウザ上で完結するアプリを意図するのであれば、ブラウザがあらかじめ用意した`LocalStorage`を利用します。\r\n\r\nあくまでSQLiteに拘るのであれば、システムをサーバ、クライアント、DBの３つに分けた[3階層システム](http://e-words.jp/w/3%E9%9A%8E%E5%B1%A4%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html)の検討が必要です。\r\nうちは趣味でゲームを作ったとき、サーバとクライアントを分離してそれぞれ独立したアプリケーションにし、両者をAjaxやHTTP Streamingといった非同期通信で繋げました。\r\n\r\nただし上記のゲームは数万行規模なので、今回みたいな小規模な開発であれば、アプリケーションサーバ自身がHTMLを出力する構成にするのが早いかもしれません。\r\nすでにサーバとしてExpressをお使いのようなので、ExpressのルータにREST APIを定義し、Vue側からAjax（`axios`）を使って呼び出す感じが手っ取り早いと思います。\r\n\r\n### 今回のPRでの修正事項\r\n\r\nLocalStorageを利用したコードが残っていたので、SQLite依存部分をすべて削除することで対応しました\r\n\r\n## Node.js上でWebアプリケーションを開発する場合、`webpack`は多くの場合必要です\r\n\r\n`webpack`とは、複数のJavaScriptファイルを１つのファイルにまとめるNPMパッケージです。\r\nJavaScriptは、昔はHTML上に`<script>`タグを書いてロードするのが通例でしたが、\r\n現在はモジュール開発が通例になっています。\r\n\r\nモジュール開発とは、簡単に言うと、１つの`.js`ファイルに１つの機能を分けて書くことです。\r\n機能の数だけ、`.js`ファイルが発生します。\r\nそれを`require`で、エントリーポイントとなる`.js`ファイルから取り込む感じです。\r\n\r\nNPMパッケージの中には、クライアントサイドから`require`することを想定したものもあるため\r\n今後を考えて`webpack`を導入してみました。\r\n今回は対応していませんが、VueやjQueryもそれぞれNPMパッケージが存在し\r\n`require`することで利用できます。\r\n\r\n### 今回のPRでの修正事項\r\n\r\n* `src/assets/**/*.js`ファイルは、`npm run build`を実行することにより、`dist/main.js`にまとめられます\r\n  * エントリーポイントは`src/assets/script.js`です。ここから各種ファイルを取り込みます\r\n* 関数の場所を明確にするため、一部関数の定義を以下のように変更しています\r\n\r\n~~~\r\n// Before\r\nfunction functionName() {\r\n  ...\r\n}\r\n\r\n// After\r\nwindow.functionName = function() {\r\n  ...\r\n}\r\n~~~\r\n\r\n## 今回修正してないけど改善したほうがいいと（個人的に）思ってる項目\r\n\r\nまず、Vueには[初心者向けのガイド](https://jp.vuejs.org/v2/guide/index.html)がありますので、一通り読んでみてくださいー。\r\n\r\nVueはコンポーネント指向であり、ページを複数の部品に分解して組む感じになっています。それぞれのコンポーネントの結合度を下げることは、大規模なアプリケーションを制作するときの助けに必ずなります。\r\nただ、コンポーネントの切り出し方を間違えると面倒になっちゃうので、はじめは「アプリケーションという１つのコンポーネントを作る」感じでいったほうがいいかもしれません。\r\n実際、今回のプログラムも、言ってしまえばそのような構成になっています。\r\nちなみにコンポーネントは親子関係を持ちます。\r\n\r\nもしコンポーネントを`.vue`ファイルを使って組むのであれば、Vue CLIの利用が事実上必須になります。\r\nVisual Studio Codeには`.vue`ファイルのシンタックスハイライトを行ってくれる拡張が存在しますが、それも事実上必須です。\r\n\r\n### VueとjQueryは基本的に併用しないでください。jQueryの基本機能はほぼすべて代替可能です。併用が必要な場合、最小限の利用にとどめてください\r\n\r\n昨日も社内で説明いたしましたが、Vueは内部で仮想DOMを生成します。\r\n一方で、jQueryは生のDOMを直接操作します。\r\n今回のプログラムでは、VueもjQueryもメインで使われているようですが、\r\n両者を併用することによるデメリットは複数あります。\r\n\r\n* Vueによる仮想DOMと、jQueryによる実際のDOMの間に矛盾が発生します\r\n  * Vueのパフォーマンスに影響が出ます\r\n  * 動作が意図しない結果になることがあります\r\n  * 場合によっては、自分でVueのDOMを強制更新する必要が生じることもあります\r\n* Vueを使うことによる恩恵を破壊する可能性があります\r\n  * jQueryでVueが利用するDOMを直接操作すると、Vueによるバインディングが正常に動作しなくなる可能性があります\r\n  * VueはHTMLの中に値を直接埋め込み、バインディングを表現します。これは、スクリプトがDOM構造に依存しないことを意味します。jQueryのセレクタによってスクリプトとDOM構造の間に結合が発生し、ここに本来Vueでは発生しえない依存が発生します\r\n    * HTML（**Markup Language**、View）とJavaScript（ふるまい、ビジネスロジック）の分業ができていないことを意味します\r\n* Vueコンポーネント内でjQueryを利用した場合、無関係の他のコンポーネントを破壊する可能性があります\r\n  * Vueは、コンポーネントベースで開発したほうが望ましいとされており、そのために設計されています。お互いのコンポーネントは本来、お互いへの依存を持たず独立するものです。一方でjQueryはグローバル空間に対してアクセスするものであり、Vueのコンポーネントによる隠蔽を無視します\r\n  * コンポーネント内で安易にjQueryを利用すると、セレクタの書き方によっては、無関係の他のコンポーネントのDOMにアクセスします。ここに、コンポーネントによる隠蔽が崩壊します\r\n\r\nこのほかにも、うちが思い出せていないだけで、もっとたくさんのデメリットがあるはずです。\r\nVueとjQueryをどうやって併用するか、と書かれたサイトが多数出ていますが、一方で上記のような危険性について説明する記事が検索にあがらないのは残念です。\r\n\r\nここに、主な各種DOM操作のVueにおける代替手段を紹介します。\r\n\r\n| 操作 | Vueにおける手段 |\r\n| -- | -- |\r\n| クラス名のバインディング | `:class=\"classNameAsString\"`、`:class=\"{'a': true, 'b': num === 3}\"` |\r\n| CSSのバインディング | `:style=\"cssAsString\"`、`:style=\"{`color`:textColor}\"` |\r\n| DOMの非表示 | `v-if=\"true / false\"`、`v-show=\"true / false\"` |\r\n\r\nそのほかの操作については、VueのドキュメントやGoogle検索などを参照してみてください。\r\n\r\njQueryは、Vueで代替可能な基礎部分にはなるべく使わないでください。\r\nもし、Vueで代用可能な部分にどうしてもjQueryを使いたいのであれば、最初からVueを使わないのが一番です。\r\nそもそもjQueryは単なるライブラリに過ぎず、アニメーションを含むすべての機能はVueやCSSなどを駆使して対応可能です。\r\n\r\nただ、現在でもjQueryで作られたライブラリが多く、要件によってはjQueryを使わないことは非現実的かもしれません。\r\nVueで作るサイトにjQueryのライブラリを導入したいのであれば、jQueryの利用が必要最小限になるよう工夫するか、jQueryの手の及ぶ範囲にVueの機能が混じらないよう注意するか、代替のライブラリを探すかが必要になります。\r\nあるDOMにはVueを使う、このDOMにはjQueryを使う、というふうにDOMごとに明確に分けたほうがいいと思います。\r\n**ライブラリによる制約なき限り、Vueによる恩恵を破壊しないことは最低条件です**。\r\n\r\n### グローバル関数は作らないでください\r\n\r\nグローバル関数を作成することはC言語の慣習でしたが、現在は作るべきではありません。\r\n作るのであれば、名前空間の汚染に対する注意が必要です。\r\n名前空間を分けるか、クラス（`prototype`）を利用するかしたほうが、関数名などの衝突を生まず安全です。\r\n\r\n手軽にプログラムを書きたい場合は、うちもグローバル関数を作ることはありますが、\r\nデメリットを認識したうえで作っています。\r\nグローバル関数の代替手段は状況によって大きく異なりますのであえて明記はしませんが、\r\nグローバル関数を作らないほうがいい理由は、少し検索すれば多くのサイトがあがってきますので参考になると思います。\r\n\r\n隠蔽（カプセル化）は、オブジェクト指向プログラミングでなくても、プログラミング上で重要な概念です。\r\n\r\n### JavaScriptでダブルクオーテーションは使わないことをおすすめします\r\n\r\nJavaScriptにおけるダブルクオーテーションとシングルクオーテーションの違いはご存知の通りです。\r\nPCのスペックの低かった時代からの慣習で、シングルクオーテーションを使うことが半ば文化として定着しています。\r\nESLintでも、ダブルクオーテーションを使うと警告が出るほどです。\r\n複数人開発の場合、gitで無駄なdiffを作る、コーディング規約が統一されないといったことがよく発生しますので\r\nそれを減らすために、お互い世界の文化を知っておいたほうがいいと思います。\r\n\r\n### ページ遷移、リロードはもったいないと思います\r\n\r\n今回のプログラムではところどころに`location.href=`とか`location.reload()`とか使われており、\r\nVueではバインディングが使えるのにもったいないと思います。\r\nこれらの操作はなくてもいいんじゃないかとー。それとも、jQueryと併用することによってページ表示がバグったりしてるのでしょうか。\r\n\r\nプログラム上で保持するデータと、実際にストレージに保存されているデータの間の矛盾が心配であれば、\r\n`try`と`catch`を使う、関数呼び出しによるエラーをハンドリングして画面に表示するなどいうふうに、矛盾が発生しないようコーディングするか、\r\nまたは今回のようにそこまで高い信頼性を必要としない場合、特に何もせず放置で大丈夫だと思います。\r\n\r\n（ネットに転がっているコードには、プログラムの信頼性に配慮した処理が抜けている場合も多いので注意して下さい）\r\n\r\nもし、TwitterなどのようにURLを変更したい場合（多くの場合はSEOによるものであって、ページ遷移が目的ではない）は、[Vue Router](https://router.vuejs.org/ja/)を検討してみてください。","created_at":"2019-07-11T06:35:37Z","updated_at":"2019-07-11T06:35:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/pulls/1/commits","review_comments_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/pulls/1/comments","review_comment_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/issues/1/comments","statuses_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/statuses/632ff5dc600bad36fddbf50e471e578e2a3a47ad","head":{"label":"kmycode:develop","ref":"develop","sha":"632ff5dc600bad36fddbf50e471e578e2a3a47ad","user":{"login":"kmycode","id":13672783,"node_id":"MDQ6VXNlcjEzNjcyNzgz","avatar_url":"https://avatars2.githubusercontent.com/u/13672783?v=4","gravatar_id":"","url":"https://api.github.com/users/kmycode","html_url":"https://github.com/kmycode","followers_url":"https://api.github.com/users/kmycode/followers","following_url":"https://api.github.com/users/kmycode/following{/other_user}","gists_url":"https://api.github.com/users/kmycode/gists{/gist_id}","starred_url":"https://api.github.com/users/kmycode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kmycode/subscriptions","organizations_url":"https://api.github.com/users/kmycode/orgs","repos_url":"https://api.github.com/users/kmycode/repos","events_url":"https://api.github.com/users/kmycode/events{/privacy}","received_events_url":"https://api.github.com/users/kmycode/received_events","type":"User","site_admin":false},"repo":{"id":196308109,"node_id":"MDEwOlJlcG9zaXRvcnkxOTYzMDgxMDk=","name":"vuejs-whiteboard","full_name":"kmycode/vuejs-whiteboard","private":false,"owner":{"login":"kmycode","id":13672783,"node_id":"MDQ6VXNlcjEzNjcyNzgz","avatar_url":"https://avatars2.githubusercontent.com/u/13672783?v=4","gravatar_id":"","url":"https://api.github.com/users/kmycode","html_url":"https://github.com/kmycode","followers_url":"https://api.github.com/users/kmycode/followers","following_url":"https://api.github.com/users/kmycode/following{/other_user}","gists_url":"https://api.github.com/users/kmycode/gists{/gist_id}","starred_url":"https://api.github.com/users/kmycode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kmycode/subscriptions","organizations_url":"https://api.github.com/users/kmycode/orgs","repos_url":"https://api.github.com/users/kmycode/repos","events_url":"https://api.github.com/users/kmycode/events{/privacy}","received_events_url":"https://api.github.com/users/kmycode/received_events","type":"User","site_admin":false},"html_url":"https://github.com/kmycode/vuejs-whiteboard","description":"vuejs を使用しての 登録、編集、削除のホワイトボード","fork":true,"url":"https://api.github.com/repos/kmycode/vuejs-whiteboard","forks_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/forks","keys_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/teams","hooks_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/hooks","issue_events_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/issues/events{/number}","events_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/events","assignees_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/assignees{/user}","branches_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/branches{/branch}","tags_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/tags","blobs_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/git/refs{/sha}","trees_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/statuses/{sha}","languages_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/languages","stargazers_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/stargazers","contributors_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/contributors","subscribers_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/subscribers","subscription_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/subscription","commits_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/commits{/sha}","git_commits_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/git/commits{/sha}","comments_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/comments{/number}","issue_comment_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/issues/comments{/number}","contents_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/contents/{+path}","compare_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/merges","archive_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/downloads","issues_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/issues{/number}","pulls_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/pulls{/number}","milestones_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/milestones{/number}","notifications_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/labels{/name}","releases_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/releases{/id}","deployments_url":"https://api.github.com/repos/kmycode/vuejs-whiteboard/deployments","created_at":"2019-07-11T02:46:48Z","updated_at":"2019-07-11T02:46:50Z","pushed_at":"2019-07-11T04:10:04Z","git_url":"git://github.com/kmycode/vuejs-whiteboard.git","ssh_url":"git@github.com:kmycode/vuejs-whiteboard.git","clone_url":"https://github.com/kmycode/vuejs-whiteboard.git","svn_url":"https://github.com/kmycode/vuejs-whiteboard","homepage":null,"size":48,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"cheap29:develop","ref":"develop","sha":"dc9d76096e19ad30b3e75bf58d70359675f56124","user":{"login":"cheap29","id":47554655,"node_id":"MDQ6VXNlcjQ3NTU0NjU1","avatar_url":"https://avatars0.githubusercontent.com/u/47554655?v=4","gravatar_id":"","url":"https://api.github.com/users/cheap29","html_url":"https://github.com/cheap29","followers_url":"https://api.github.com/users/cheap29/followers","following_url":"https://api.github.com/users/cheap29/following{/other_user}","gists_url":"https://api.github.com/users/cheap29/gists{/gist_id}","starred_url":"https://api.github.com/users/cheap29/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cheap29/subscriptions","organizations_url":"https://api.github.com/users/cheap29/orgs","repos_url":"https://api.github.com/users/cheap29/repos","events_url":"https://api.github.com/users/cheap29/events{/privacy}","received_events_url":"https://api.github.com/users/cheap29/received_events","type":"User","site_admin":false},"repo":{"id":194050431,"node_id":"MDEwOlJlcG9zaXRvcnkxOTQwNTA0MzE=","name":"vuejs-whiteboard","full_name":"cheap29/vuejs-whiteboard","private":false,"owner":{"login":"cheap29","id":47554655,"node_id":"MDQ6VXNlcjQ3NTU0NjU1","avatar_url":"https://avatars0.githubusercontent.com/u/47554655?v=4","gravatar_id":"","url":"https://api.github.com/users/cheap29","html_url":"https://github.com/cheap29","followers_url":"https://api.github.com/users/cheap29/followers","following_url":"https://api.github.com/users/cheap29/following{/other_user}","gists_url":"https://api.github.com/users/cheap29/gists{/gist_id}","starred_url":"https://api.github.com/users/cheap29/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cheap29/subscriptions","organizations_url":"https://api.github.com/users/cheap29/orgs","repos_url":"https://api.github.com/users/cheap29/repos","events_url":"https://api.github.com/users/cheap29/events{/privacy}","received_events_url":"https://api.github.com/users/cheap29/received_events","type":"User","site_admin":false},"html_url":"https://github.com/cheap29/vuejs-whiteboard","description":"vuejs を使用しての 登録、編集、削除のホワイトボード","fork":false,"url":"https://api.github.com/repos/cheap29/vuejs-whiteboard","forks_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/forks","keys_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/teams","hooks_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/hooks","issue_events_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/issues/events{/number}","events_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/events","assignees_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/assignees{/user}","branches_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/branches{/branch}","tags_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/tags","blobs_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/git/refs{/sha}","trees_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/statuses/{sha}","languages_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/languages","stargazers_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/stargazers","contributors_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/contributors","subscribers_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/subscribers","subscription_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/subscription","commits_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/commits{/sha}","git_commits_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/git/commits{/sha}","comments_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/comments{/number}","issue_comment_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/issues/comments{/number}","contents_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/contents/{+path}","compare_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/merges","archive_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/downloads","issues_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/issues{/number}","pulls_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/pulls{/number}","milestones_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/milestones{/number}","notifications_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/labels{/name}","releases_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/releases{/id}","deployments_url":"https://api.github.com/repos/cheap29/vuejs-whiteboard/deployments","created_at":"2019-06-27T08:02:30Z","updated_at":"2019-07-02T03:58:08Z","pushed_at":"2019-07-11T06:35:38Z","git_url":"git://github.com/cheap29/vuejs-whiteboard.git","ssh_url":"git@github.com:cheap29/vuejs-whiteboard.git","clone_url":"https://github.com/cheap29/vuejs-whiteboard.git","svn_url":"https://github.com/cheap29/vuejs-whiteboard","homepage":null,"size":43,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":1,"license":null,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cheap29/vuejs-whiteboard/pulls/1"},"html":{"href":"https://github.com/cheap29/vuejs-whiteboard/pull/1"},"issue":{"href":"https://api.github.com/repos/cheap29/vuejs-whiteboard/issues/1"},"comments":{"href":"https://api.github.com/repos/cheap29/vuejs-whiteboard/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/cheap29/vuejs-whiteboard/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/cheap29/vuejs-whiteboard/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cheap29/vuejs-whiteboard/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/cheap29/vuejs-whiteboard/statuses/632ff5dc600bad36fddbf50e471e578e2a3a47ad"}},"author_association":"NONE","merged":false,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"maintainer_can_modify":true,"commits":3,"additions":222,"deletions":67,"changed_files":11}}
{"actor":{"display_login":"kmycode"}}