diff --git a/_figures/assets/CRUD/index_routes.html b/_figures/assets/CRUD/index_routes.html index 845899d6..8e53d31c 100644 --- a/_figures/assets/CRUD/index_routes.html +++ b/_figures/assets/CRUD/index_routes.html @@ -6,28 +6,24 @@ -
+
http://localhost:3000/rails/info/routes
+ - + + - - - - @@ -47,7 +43,10 @@ /books(.:format) + @@ -62,6 +61,9 @@ + + + + + + + -
HelperHelper + (Path / + Url) + HTTP Verb Path Controller#ActionSource Location
- Path / - Url - - - - +
- books#index +

books#index

+
+ /Users/igaiga/books_app/config/routes.rb:2

books#create

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -76,6 +78,9 @@

books#new

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -90,6 +95,9 @@

books#edit

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -104,6 +112,9 @@

books#show

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -117,6 +128,9 @@

books#update

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -130,6 +144,9 @@

books#update

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -143,8 +160,10 @@

books#destroy

+ /Users/igaiga/books_app/config/routes.rb:2 +
diff --git a/_figures/assets/new-create/create_routes.html b/_figures/assets/new-create/create_routes.html index 3f1ebdb4..dfcd47cd 100644 --- a/_figures/assets/new-create/create_routes.html +++ b/_figures/assets/new-create/create_routes.html @@ -6,7 +6,7 @@ -
+

リクエスト

@@ -18,21 +18,20 @@

リクエスト

- - - - - - - - - - - - + + + + + + + + + + @@ -52,6 +51,9 @@

リクエスト

+ + + + + + + +
HelperHTTP VerbPathController#Action
Path / - Url - -
Helper + (Path / + Url) + HTTP VerbPathController#ActionSource Location
+

books#index

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -65,6 +67,9 @@

リクエスト

books#create

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -79,6 +84,9 @@

リクエスト

books#new

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -93,6 +101,9 @@

リクエスト

books#edit

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -107,6 +118,9 @@

リクエスト

books#show

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -120,6 +134,9 @@

リクエスト

books#update

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -133,6 +150,9 @@

リクエスト

books#update

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -146,6 +166,9 @@

リクエスト

books#destroy

+ /Users/igaiga/books_app/config/routes.rb:2 +
diff --git a/_figures/assets/new-create/new_routes.html b/_figures/assets/new-create/new_routes.html index d73ddc1c..4ec2db56 100644 --- a/_figures/assets/new-create/new_routes.html +++ b/_figures/assets/new-create/new_routes.html @@ -6,44 +6,46 @@ -
+
- - - - - - - - - - - - - - - - - - - - - +
HelperHTTP VerbPathController#Action
Path / - Url - -
+ + + + + + + + + + + + + + + + + + - - - + + + + + - + + + + +
Helper + (Path / + Url) + HTTP VerbPathController#ActionSource Location
+
- books_path + books_path + GET + /books(.:format) +

books#index

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -57,13 +59,16 @@

books#create

+ /Users/igaiga/books_app/config/routes.rb:2 +
- new_book_path + new_book_path - GET + GET /books/new(.:format) @@ -71,10 +76,13 @@

books#new

+ /Users/igaiga/books_app/config/routes.rb:2 +
- edit_book_path + edit_book_path GET @@ -85,10 +93,13 @@

books#edit

+ /Users/igaiga/books_app/config/routes.rb:2 +
- book_path + book_path GET @@ -99,8 +110,11 @@

books#show

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -112,6 +126,9 @@

books#update

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -125,6 +142,9 @@

books#update

+ /Users/igaiga/books_app/config/routes.rb:2 +
@@ -138,10 +158,14 @@

books#destroy

+ /Users/igaiga/books_app/config/routes.rb:2 +
- \ No newline at end of file + diff --git a/_figures/assets/new-create/new_view_form.html b/_figures/assets/new-create/new_view_form.html index 0b98ee94..0039dc87 100644 --- a/_figures/assets/new-create/new_view_form.html +++ b/_figures/assets/new-create/new_view_form.html @@ -20,7 +20,7 @@ </div>
<div> <%= form.label :memo %> - <%= form.text_area :memo %> + <%= form.textarea :memo %> </div>
<div> <%= form.submit %> diff --git a/_figures/assets/new-create/new_view_form_memo_html.html b/_figures/assets/new-create/new_view_form_memo_html.html index b78393db..013b0a78 100644 --- a/_figures/assets/new-create/new_view_form_memo_html.html +++ b/_figures/assets/new-create/new_view_form_memo_html.html @@ -17,7 +17,7 @@ ...
<div> <%= form.label :memo %> - <%= form.text_area :memo %> + <%= form.textarea :memo %> </div>
... diff --git a/_figures/assets/package-lock.json b/_figures/assets/package-lock.json index 211b887e..12c18218 100644 --- a/_figures/assets/package-lock.json +++ b/_figures/assets/package-lock.json @@ -1,329 +1,335 @@ { + "name": "dependabot_20250523-1504-8ip559", + "lockfileVersion": 3, "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@fortawesome/fontawesome-free": { + "packages": { + "": { + "dependencies": { + "@fortawesome/fontawesome-free": "^5.11.2", + "ress": "^2.0.1" + }, + "devDependencies": { + "gulp": "^4.0.2", + "gulp-notify": "^3.2.0", + "gulp-plumber": "^1.2.1", + "gulp-sass": "^6.0.1" + } + }, + "node_modules/@fortawesome/fontawesome-free": { "version": "5.11.2", "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.11.2.tgz", - "integrity": "sha512-XiUPoS79r1G7PcpnNtq85TJ7inJWe0v+b5oZJZKb0pGHNIV6+UiNeQWiFGmuQ0aj7GEhnD/v9iqxIsjuRKtEnQ==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "integrity": "sha512-XiUPoS79r1G7PcpnNtq85TJ7inJWe0v+b5oZJZKb0pGHNIV6+UiNeQWiFGmuQ0aj7GEhnD/v9iqxIsjuRKtEnQ==", + "engines": { + "node": ">=6" } }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-colors": { + "node_modules/ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", "dev": true, - "requires": { + "dependencies": { "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "ansi-cyan": { + "node_modules/ansi-cyan": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", "dev": true, - "requires": { + "dependencies": { "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "ansi-gray": { + "node_modules/ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", "dev": true, - "requires": { + "dependencies": { "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "ansi-red": { + "node_modules/ansi-red": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", "dev": true, - "requires": { + "dependencies": { "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "ansi-regex": { + "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "ansi-wrap": { + "node_modules/ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "anymatch": { + "node_modules/anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, - "requires": { + "dependencies": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" } }, - "append-buffer": { + "node_modules/append-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", "dev": true, - "requires": { + "dependencies": { "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "archy": { + "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arr-diff": { + "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "arr-filter": { + "node_modules/arr-filter": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", "dev": true, - "requires": { + "dependencies": { "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "arr-flatten": { + "node_modules/arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "arr-map": { + "node_modules/arr-map": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", "dev": true, - "requires": { + "dependencies": { "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "arr-union": { + "node_modules/arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "array-each": { + "node_modules/array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "array-initial": { + "node_modules/array-initial": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", "dev": true, - "requires": { + "dependencies": { "array-slice": "^1.0.0", "is-number": "^4.0.0" }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "array-last": { + "node_modules/array-last": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", "dev": true, - "requires": { + "dependencies": { "is-number": "^4.0.0" }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "array-slice": { + "node_modules/array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "array-sort": { + "node_modules/array-sort": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", "dev": true, - "requires": { + "dependencies": { "default-compare": "^1.0.0", "get-value": "^2.0.6", "kind-of": "^5.0.2" }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "array-unique": { + "node_modules/array-sort/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, - "requires": { - "safer-buffer": "~2.1.0" + "engines": { + "node": ">=0.10.0" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "assign-symbols": { + "node_modules/assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "async-done": { + "node_modules/async-done": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", "dev": true, - "requires": { + "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.2", "process-nextick-args": "^2.0.0", "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" } }, - "async-each": { + "node_modules/async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", - "dev": true - }, - "async-settle": { + "node_modules/async-settle": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", "dev": true, - "requires": { + "dependencies": { "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" } }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { + "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } }, - "bach": { + "node_modules/bach": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", "dev": true, - "requires": { + "dependencies": { "arr-filter": "^1.1.1", "arr-flatten": "^1.0.1", "arr-map": "^2.0.0", @@ -333,20 +339,23 @@ "async-done": "^1.2.2", "async-settle": "^1.0.0", "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base": { + "node_modules/base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, - "requires": { + "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", @@ -355,87 +364,87 @@ "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "bcrypt-pbkdf": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, - "requires": { - "tweetnacl": "^0.14.3" + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "binary-extensions": { + "node_modules/binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, - "requires": { - "inherits": "~2.0.0" + "engines": { + "node": ">=0.10.0" } }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { + "node_modules/braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, - "requires": { + "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", @@ -447,36 +456,43 @@ "split-string": "^3.0.2", "to-regex": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "buffer-equal": { + "node_modules/buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "cache-base": { + "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, - "requires": { + "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", @@ -486,61 +502,45 @@ "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "camelcase": { + "node_modules/camelcase": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, - "chalk": { + "node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "chokidar": { + "node_modules/chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, - "requires": { + "dependencies": { "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", - "fsevents": "^1.2.7", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", @@ -550,452 +550,438 @@ "readdirp": "^2.2.1", "upath": "^1.1.1" }, - "dependencies": { - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - } + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chokidar/node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "class-utils": { + "node_modules/class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, - "requires": { + "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "cliui": { + "node_modules/cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, - "requires": { + "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", "wrap-ansi": "^2.0.0" } }, - "clone": { + "node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8" + } }, - "clone-buffer": { + "node_modules/clone-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "clone-stats": { + "node_modules/clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, - "cloneable-readable": { + "node_modules/cloneable-readable": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.1", "process-nextick-args": "^2.0.0", "readable-stream": "^2.3.5" } }, - "code-point-at": { + "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "collection-map": { + "node_modules/collection-map": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", "dev": true, - "requires": { + "dependencies": { "arr-map": "^2.0.2", "for-own": "^1.0.0", "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "collection-visit": { + "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, - "requires": { + "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "color-support": { + "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, - "requires": { - "delayed-stream": "~1.0.0" + "bin": { + "color-support": "bin.js" } }, - "component-emitter": { + "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, - "concat-map": { + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { + "node_modules/concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, - "requires": { + "engines": [ + "node >= 0.8" + ], + "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "convert-source-map": { + "node_modules/convert-source-map": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "~5.1.1" } }, - "copy-descriptor": { + "node_modules/copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "copy-props": { + "node_modules/copy-props": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", "dev": true, - "requires": { + "dependencies": { "each-props": "^1.3.0", "is-plain-object": "^2.0.1" } }, - "core-util-is": { + "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "d": { + "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, - "requires": { + "dependencies": { "es5-ext": "^0.10.50", "type": "^1.0.1" } }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "decamelize": { + "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "decode-uri-component": { + "node_modules/decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "default-compare": { + "node_modules/default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^5.0.2" }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "default-resolution": { + "node_modules/default-compare/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-resolution": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "define-properties": { + "node_modules/define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, - "requires": { + "dependencies": { "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" } }, - "define-property": { + "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, - "requires": { + "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "delayed-stream": { + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "delegates": { + "node_modules/define-property/node_modules/is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } }, - "detect-file": { + "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "duplexify": { + "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, - "requires": { + "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, - "each-props": { + "node_modules/each-props": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", "dev": true, - "requires": { + "dependencies": { "is-plain-object": "^2.0.1", "object.defaults": "^1.1.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "end-of-stream": { + "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "requires": { + "dependencies": { "once": "^1.4.0" } }, - "error-ex": { + "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "requires": { + "dependencies": { "is-arrayish": "^0.2.1" } }, - "es5-ext": { + "node_modules/es5-ext": { "version": "0.10.51", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.51.tgz", "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", "dev": true, - "requires": { + "dependencies": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.1", "next-tick": "^1.0.0" } }, - "es6-iterator": { + "node_modules/es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, - "requires": { + "dependencies": { "d": "1", "es5-ext": "^0.10.35", "es6-symbol": "^3.1.1" } }, - "es6-symbol": { + "node_modules/es6-symbol": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.2.tgz", "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", "dev": true, - "requires": { + "dependencies": { "d": "^1.0.1", "es5-ext": "^0.10.51" } }, - "es6-weak-map": { + "node_modules/es6-weak-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, - "requires": { + "dependencies": { "d": "1", "es5-ext": "^0.10.46", "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.1" } }, - "escape-string-regexp": { + "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "expand-brackets": { + "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, - "requires": { + "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", @@ -1004,69 +990,83 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, - "requires": { + "dependencies": { "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "extend": { + "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { + "node_modules/extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, - "requires": { + "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "extglob": { + "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, - "requires": { + "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", @@ -1076,876 +1076,1011 @@ "snapdragon": "^0.8.1", "to-regex": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "fancy-log": { + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fancy-log": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", "dev": true, - "requires": { + "dependencies": { "ansi-gray": "^0.1.1", "color-support": "^1.1.3", "parse-node-version": "^1.0.0", "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fill-range": { + "node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "find-up": { + "node_modules/find-up": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, - "requires": { + "dependencies": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "findup-sync": { + "node_modules/findup-sync": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, - "requires": { + "dependencies": { "detect-file": "^1.0.0", "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" } }, - "fined": { + "node_modules/fined": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "dev": true, - "requires": { + "dependencies": { "expand-tilde": "^2.0.2", "is-plain-object": "^2.0.3", "object.defaults": "^1.1.0", "object.pick": "^1.2.0", "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" } }, - "flagged-respawn": { + "node_modules/flagged-respawn": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "flush-write-stream": { + "node_modules/flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, - "for-in": { + "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "for-own": { + "node_modules/for-own": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, - "requires": { + "dependencies": { "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { + "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, - "requires": { + "dependencies": { "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "fs-mkdirp-stream": { + "node_modules/fs-mkdirp-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.11", "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "bundleDependencies": [ + "node-pre-gyp" + ], + "deprecated": "Upgrade to fsevents v2 to mitigate potential security issues", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/fsevents/node_modules/abbrev": { + "version": "1.1.1", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/ansi-regex": { + "version": "2.1.1", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/aproba": { + "version": "1.2.0", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/are-we-there-yet": { + "version": "1.1.5", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "deprecated": "This package is no longer supported.", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/fsevents/node_modules/balanced-match": { + "version": "1.0.0", + "integrity": "sha512-9Y0g0Q8rmSt+H33DfKv7FOc3v+iRI+o1lbzt8jGcIosYW37IIW/2XVYq5NPdmaD5NQ59Nk26Kl/vZbwW9Fr8vg==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/brace-expansion": { + "version": "1.1.11", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fsevents/node_modules/chownr": { + "version": "1.1.1", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/code-point-at": { + "version": "1.1.0", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/concat-map": { + "version": "0.0.1", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/console-control-strings": { + "version": "1.1.0", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/core-util-is": { + "version": "1.0.2", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/debug": { + "version": "4.1.1", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/fsevents/node_modules/deep-extend": { + "version": "0.6.0", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fsevents/node_modules/delegates": { + "version": "1.0.0", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/detect-libc": { + "version": "1.0.3", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "inBundle": true, + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/fsevents/node_modules/fs-minipass": { + "version": "1.2.5", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "minipass": "^2.2.1" + } + }, + "node_modules/fsevents/node_modules/fs.realpath": { + "version": "1.0.0", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/gauge": { + "version": "2.7.4", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/fsevents/node_modules/glob": { + "version": "7.1.3", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/has-unicode": { + "version": "2.0.1", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/iconv-lite": { + "version": "0.4.24", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/ignore-walk": { + "version": "3.0.1", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fsevents/node_modules/inflight": { + "version": "1.0.6", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/inherits": { + "version": "2.0.3", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/ini": { + "version": "1.3.5", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/isarray": { + "version": "1.0.0", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/minimatch": { + "version": "3.0.4", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/minimist": { + "version": "0.0.8", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/minipass": { + "version": "2.3.5", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/fsevents/node_modules/minizlib": { + "version": "1.2.1", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "minipass": "^2.2.1" + } + }, + "node_modules/fsevents/node_modules/mkdirp": { + "version": "0.5.1", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fsevents/node_modules/ms": { + "version": "2.1.1", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/needle": { + "version": "2.3.0", + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/fsevents/node_modules/node-pre-gyp": { + "version": "0.12.0", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", + "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/fsevents/node_modules/nopt": { + "version": "4.0.1", + "integrity": "sha512-+5XZFpQZEY0cg5JaxLwGxDlKNKYxuXwGt8/Oi3UXm5/4ymrJve9d2CURituxv3rSrVCGZj4m1U1JlHTdcKt2Ng==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/fsevents/node_modules/npm-bundled": { + "version": "1.0.6", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/npm-packlist": { + "version": "1.4.1", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "node_modules/fsevents/node_modules/npmlog": { + "version": "4.1.2", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/fsevents/node_modules/number-is-nan": { + "version": "1.0.1", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/object-assign": { + "version": "4.1.1", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/once": { + "version": "1.4.0", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/os-homedir": { + "version": "1.0.2", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/os-tmpdir": { + "version": "1.0.2", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/osenv": { + "version": "0.1.5", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "deprecated": "This package is no longer supported.", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/fsevents/node_modules/path-is-absolute": { + "version": "1.0.1", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/process-nextick-args": { + "version": "2.0.0", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/rc": { + "version": "1.2.8", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/fsevents/node_modules/rc/node_modules/minimist": { + "version": "1.2.0", + "integrity": "sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/readable-stream": { + "version": "2.3.6", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fsevents/node_modules/rimraf": { + "version": "2.6.3", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/fsevents/node_modules/safe-buffer": { + "version": "5.1.2", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/safer-buffer": { + "version": "2.1.2", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/sax": { + "version": "1.2.4", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/semver": { + "version": "5.7.0", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true, + "inBundle": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fsevents/node_modules/set-blocking": { + "version": "2.0.0", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/signal-exit": { + "version": "3.0.2", + "integrity": "sha512-meQNNykwecVxdu1RlYMKpQx4+wefIYpmxi6gexo/KAbwquJrBUrBmKYJrE8KFkVQAAVWEnwNdu21PgrD77J3xA==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/string_decoder": { + "version": "1.1.1", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fsevents/node_modules/string-width": { + "version": "1.0.2", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-ansi": { + "version": "3.0.1", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-json-comments": { + "version": "2.0.1", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "inBundle": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/tar": { + "version": "4.4.8", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "inBundle": true, + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "engines": { + "node": ">=4.5" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "node_modules/fsevents/node_modules/util-deprecate": { + "version": "1.0.2", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "inBundle": true, + "optional": true }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "node_modules/fsevents/node_modules/wide-align": { + "version": "1.1.3", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, + "inBundle": true, "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "string-width": "^1.0.2 || 2" } }, - "function-bind": { + "node_modules/fsevents/node_modules/wrappy": { + "version": "1.0.2", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/fsevents/node_modules/yallist": { + "version": "3.0.3", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true, + "inBundle": true, + "optional": true + }, + "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "get-caller-file": { + "node_modules/get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-value": { + "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, - "requires": { - "assert-plus": "^1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "glob": { + "node_modules/glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, - "requires": { + "dependencies": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" - }, + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "glob-stream": { + "node_modules/glob-stream": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", "dev": true, - "requires": { + "dependencies": { "extend": "^3.0.0", "glob": "^7.1.1", "glob-parent": "^3.1.0", @@ -1956,124 +2091,106 @@ "remove-trailing-separator": "^1.0.1", "to-absolute-glob": "^2.0.0", "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" } }, - "glob-watcher": { + "node_modules/glob-watcher": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==", "dev": true, - "requires": { + "dependencies": { "anymatch": "^2.0.0", "async-done": "^1.2.0", "chokidar": "^2.0.0", "is-negated-glob": "^1.0.0", "just-debounce": "^1.0.0", "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" } }, - "global-modules": { + "node_modules/global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, - "requires": { + "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "global-prefix": { + "node_modules/global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, - "requires": { + "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", "ini": "^1.3.4", "is-windows": "^1.0.1", "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" } }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - } - }, - "glogg": { + "node_modules/glogg": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", "dev": true, - "requires": { + "dependencies": { "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "graceful-fs": { + "node_modules/graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, - "growly": { + "node_modules/growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, - "gulp": { + "node_modules/gulp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", "dev": true, - "requires": { + "dependencies": { "glob-watcher": "^5.0.3", "gulp-cli": "^2.2.0", "undertaker": "^1.2.1", "vinyl-fs": "^3.0.0" }, - "dependencies": { - "gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - } - } - } - }, - "gulp-notify": { + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-notify": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/gulp-notify/-/gulp-notify-3.2.0.tgz", "integrity": "sha512-qEocs1UVoDKKUjfsxJNMNwkRla0PbsyJwsqNNXpzYWsLQ29LhxRMY3wnTGZcc4hMHtalnvah/Dwlwb4NijH/0A==", "dev": true, - "requires": { + "dependencies": { "ansi-colors": "^1.0.1", "fancy-log": "^1.3.2", "lodash.template": "^4.4.0", @@ -2081,607 +2198,633 @@ "node.extend": "^2.0.0", "plugin-error": "^0.1.2", "through2": "^2.0.3" + }, + "engines": { + "node": ">=0.8.0", + "npm": ">=1.2.10" } }, - "gulp-plumber": { + "node_modules/gulp-plumber": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/gulp-plumber/-/gulp-plumber-1.2.1.tgz", "integrity": "sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==", "dev": true, - "requires": { + "dependencies": { "chalk": "^1.1.3", "fancy-log": "^1.3.2", "plugin-error": "^0.1.2", "through2": "^2.0.3" + }, + "engines": { + "node": ">=0.10", + "npm": ">=1.2.10" } }, - "gulp-sass": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-4.0.2.tgz", - "integrity": "sha512-q8psj4+aDrblJMMtRxihNBdovfzGrXJp1l4JU0Sz4b/Mhsi2DPrKFYCGDwjIWRENs04ELVHxdOJQ7Vs98OFohg==", + "node_modules/gulp-sass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-6.0.1.tgz", + "integrity": "sha512-4wonidxB8lGPHvahelpGavUBJAuERSl+OIVxPCyQthK4lSJhZ/u3/qjFcyAtnMIXDl6fXTn34H4BXsN7gt54kQ==", "dev": true, - "requires": { - "chalk": "^2.3.0", - "lodash.clonedeep": "^4.3.2", - "node-sass": "^4.8.3", + "license": "MIT", + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "picocolors": "^1.0.0", "plugin-error": "^1.0.1", - "replace-ext": "^1.0.0", - "strip-ansi": "^4.0.0", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "replace-ext": "^2.0.0", + "strip-ansi": "^6.0.1", + "vinyl-sourcemaps-apply": "^0.2.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/gulp-sass/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "requires": { - "glogg": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-sass/node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" } }, - "har-schema": { + "node_modules/gulp-sass/node_modules/replace-ext": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/gulp-sass/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp/node_modules/gulp-cli": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", + "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.1.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.0.1", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "has": { + "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "has-ansi": { + "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { + "node_modules/has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "has-value": { + "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, - "requires": { + "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "has-values": { + "node_modules/has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, - "requires": { + "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "homedir-polyfill": { + "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, - "requires": { + "dependencies": { "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "hosted-git-info": { + "node_modules/hosted-git-info": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", "dev": true }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", - "dev": true - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { + "node_modules/ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", + "dev": true, + "engines": { + "node": "*" + } }, - "interpret": { + "node_modules/interpret": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "invert-kv": { + "node_modules/invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is": { + "node_modules/is": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "is-absolute": { + "node_modules/is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, - "requires": { + "dependencies": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-accessor-descriptor": { + "node_modules/is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "deprecated": "Please upgrade to v0.1.7", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-arrayish": { + "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-buffer": { + "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-data-descriptor": { + "node_modules/is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "deprecated": "Please upgrade to v0.1.5", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-descriptor": { + "node_modules/is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, - "requires": { + "dependencies": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", "kind-of": "^5.0.0" }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "is-extendable": { + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, - "requires": { - "number-is-nan": "^1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "is-fullwidth-code-point": { + "node_modules/is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, - "requires": { + "dependencies": { "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-glob": { + "node_modules/is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, - "requires": { + "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-negated-glob": { + "node_modules/is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-number": { + "node_modules/is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-plain-object": { + "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-relative": { + "node_modules/is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, - "requires": { + "dependencies": { "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { + "node_modules/is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, - "requires": { + "dependencies": { "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-utf8": { + "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", "dev": true }, - "is-valid-glob": { + "node_modules/is-valid-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-windows": { + "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "is-wsl": { + "node_modules/is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { + "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, - "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "json-stable-stringify-without-jsonify": { + "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "just-debounce": { + "node_modules/just-debounce": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", "dev": true }, - "kind-of": { + "node_modules/kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "last-run": { + "node_modules/last-run": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", "dev": true, - "requires": { + "dependencies": { "default-resolution": "^2.0.0", "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" } }, - "lazystream": { + "node_modules/lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, - "requires": { + "dependencies": { "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" } }, - "lcid": { + "node_modules/lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, - "requires": { + "dependencies": { "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "lead": { + "node_modules/lead": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, - "requires": { + "dependencies": { "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" } }, - "liftoff": { + "node_modules/liftoff": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", "dev": true, - "requires": { + "dependencies": { "extend": "^3.0.0", "findup-sync": "^3.0.0", "fined": "^1.0.1", @@ -2690,167 +2833,140 @@ "object.map": "^1.0.0", "rechoir": "^0.6.2", "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" } }, - "load-json-file": { + "node_modules/load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", "pinkie-promise": "^2.0.0", "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true - }, - "lodash._reinterpolate": { + "node_modules/lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, - "lodash.clonedeep": { + "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "lodash.template": { + "node_modules/lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "deprecated": "This package is deprecated. Use https://socket.dev/npm/package/eta instead.", "dev": true, - "requires": { + "dependencies": { "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, - "lodash.templatesettings": { + "node_modules/lodash.templatesettings": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "dev": true, - "requires": { + "dependencies": { "lodash._reinterpolate": "^3.0.0" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-iterator": { + "node_modules/make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "map-cache": { + "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "map-visit": { + "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, - "requires": { + "dependencies": { "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "matchdep": { + "node_modules/matchdep": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", "dev": true, - "requires": { + "dependencies": { "findup-sync": "^2.0.0", "micromatch": "^3.0.4", "resolve": "^1.4.0", "stack-trace": "0.0.10" }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "micromatch": { + "node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, - "requires": { + "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", @@ -2864,100 +2980,76 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", - "dev": true - }, - "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", - "dev": true, - "requires": { - "mime-db": "1.40.0" - } - }, - "minimatch": { + "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "mixin-deep": { + "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, - "requires": { + "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "engines": { + "node": ">=0.10.0" } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, - "requires": { - "minimist": "0.0.8" - }, "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "mute-stdout": { + "node_modules/mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "nan": { + "node_modules/nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true + "dev": true, + "optional": true }, - "nanomatch": { + "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, - "requires": { + "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", @@ -2969,48 +3061,23 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "next-tick": { + "node_modules/next-tick": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, - "node-gyp": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", - "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", - "dev": true, - "requires": { - "fstream": "^1.0.0", - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^2.0.0", - "which": "1" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "node-notifier": { + "node_modules/node-notifier": { "version": "5.4.3", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", "dev": true, - "requires": { + "dependencies": { "growly": "^1.3.0", "is-wsl": "^1.1.0", "semver": "^5.5.0", @@ -3018,518 +3085,525 @@ "which": "^1.3.0" } }, - "node-sass": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", - "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", - "dev": true, - "requires": { - "async-foreach": "^0.1.3", - "chalk": "^1.1.1", - "cross-spawn": "^3.0.0", - "gaze": "^1.0.0", - "get-stdin": "^4.0.1", - "glob": "^7.0.3", - "in-publish": "^2.0.0", - "lodash": "^4.17.11", - "meow": "^3.7.0", - "mkdirp": "^0.5.1", - "nan": "^2.13.2", - "node-gyp": "^3.8.0", - "npmlog": "^4.0.0", - "request": "^2.88.0", - "sass-graph": "^2.2.4", - "stdout-stream": "^1.4.0", - "true-case-path": "^1.0.2" - } - }, - "node.extend": { + "node_modules/node.extend": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-2.0.2.tgz", "integrity": "sha512-pDT4Dchl94/+kkgdwyS2PauDFjZG0Hk0IcHIB+LkW27HLDtdoeMxHTxZh39DYbPP8UflWXWj9JcdDozF+YDOpQ==", "dev": true, - "requires": { + "dependencies": { "has": "^1.0.3", "is": "^3.2.1" + }, + "engines": { + "node": ">=0.4.0" } }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { + "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "requires": { + "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, - "normalize-path": { + "node_modules/normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, - "requires": { + "dependencies": { "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "now-and-later": { + "node_modules/now-and-later": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { + "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "object-copy": { + "node_modules/object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, - "requires": { + "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-keys": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "object-visit": { + "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.assign": { + "node_modules/object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, - "requires": { + "dependencies": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", "has-symbols": "^1.0.0", "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" } }, - "object.defaults": { + "node_modules/object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, - "requires": { + "dependencies": { "array-each": "^1.0.1", "array-slice": "^1.0.0", "for-own": "^1.0.0", "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.map": { + "node_modules/object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, - "requires": { + "dependencies": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.pick": { + "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.reduce": { + "node_modules/object.reduce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", "dev": true, - "requires": { + "dependencies": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "ordered-read-streams": { + "node_modules/ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, - "requires": { + "dependencies": { "readable-stream": "^2.0.1" } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { + "node_modules/os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "dev": true, - "requires": { + "dependencies": { "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "parse-filepath": { + "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, - "requires": { + "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "parse-json": { + "node_modules/parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, - "requires": { + "dependencies": { "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "parse-node-version": { + "node_modules/parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "parse-passwd": { + "node_modules/parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "pascalcase": { + "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-dirname": { + "node_modules/path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", "dev": true }, - "path-exists": { + "node_modules/path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, - "requires": { + "dependencies": { "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-root": { + "node_modules/path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, - "requires": { + "dependencies": { "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "path-root-regex": { + "node_modules/path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-type": { + "node_modules/path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, - "pify": { + "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "pinkie": { + "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "pinkie-promise": { + "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, - "requires": { + "dependencies": { "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "plugin-error": { + "node_modules/plugin-error": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", "dev": true, - "requires": { + "dependencies": { "ansi-cyan": "^0.1.1", "ansi-red": "^0.1.1", "arr-diff": "^1.0.1", "arr-union": "^2.0.1", "extend-shallow": "^1.1.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - } - } - }, - "posix-character-classes": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "pretty-hrtime": { + "node_modules/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "process-nextick-args": { + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", - "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", - "dev": true - }, - "pump": { + "node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, - "requires": { + "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "pumpify": { + "node_modules/pumpify": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, - "requires": { + "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "read-pkg": { + "node_modules/read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, - "requires": { + "dependencies": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "read-pkg-up": { + "node_modules/read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, - "requires": { + "dependencies": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "readable-stream": { + "node_modules/readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, - "requires": { + "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", @@ -3539,321 +3613,270 @@ "util-deprecate": "~1.0.1" } }, - "readdirp": { + "node_modules/readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" } }, - "rechoir": { + "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, - "requires": { + "dependencies": { "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "regex-not": { + "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "remove-bom-buffer": { + "node_modules/remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", "dev": true, - "requires": { + "dependencies": { "is-buffer": "^1.1.5", "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "remove-bom-stream": { + "node_modules/remove-bom-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", "dev": true, - "requires": { + "dependencies": { "remove-bom-buffer": "^3.0.0", "safe-buffer": "^5.1.0", "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" } }, - "remove-trailing-separator": { + "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "repeat-element": { + "node_modules/repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "repeat-string": { + "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, - "requires": { - "is-finite": "^1.0.0" + "engines": { + "node": ">=0.10" } }, - "replace-ext": { + "node_modules/replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "replace-homedir": { + "node_modules/replace-homedir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", "dev": true, - "requires": { + "dependencies": { "homedir-polyfill": "^1.0.1", "is-absolute": "^1.0.0", "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" } }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - } - }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "node_modules/require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, - "resolve": { + "node_modules/resolve": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, - "requires": { + "dependencies": { "path-parse": "^1.0.6" } }, - "resolve-dir": { + "node_modules/resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, - "requires": { + "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "resolve-options": { + "node_modules/resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", "dev": true, - "requires": { + "dependencies": { "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "resolve-url": { + "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, - "ress": { + "node_modules/ress": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ress/-/ress-2.0.1.tgz", "integrity": "sha512-yIFO2SiMp/lWdtIVE9E5I5ZCLAcwsyUYE7g2LdDmNAIhHvw6e9tL3Ybr8Hi9nQOtQnMrnU9UTkxHxWFNL9Y/4w==" }, - "ret": { + "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "requires": { - "glob": "^7.1.3" + "engines": { + "node": ">=0.12" } }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safe-regex": { + "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "lodash": "^4.0.0", - "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" - } - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "dev": true, - "requires": { - "js-base64": "^2.1.8", - "source-map": "^0.4.2" - }, "dependencies": { - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } + "ret": "~0.1.10" } }, - "semver": { + "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver" + } }, - "semver-greatest-satisfied-range": { + "node_modules/semver-greatest-satisfied-range": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", "dev": true, - "requires": { + "dependencies": { "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" } }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-value": { + "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "shellwords": { + "node_modules/shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", "dev": true }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "snapdragon": { + "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, - "requires": { + "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", @@ -3863,110 +3886,140 @@ "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "snapdragon-node": { + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "deprecated": "Please upgrade to v1.0.1", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.2.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "source-map": { + "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-resolve": { + "node_modules/source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, - "requires": { + "dependencies": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", @@ -3974,357 +4027,311 @@ "urix": "^0.1.0" } }, - "source-map-url": { + "node_modules/source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true }, - "sparkles": { + "node_modules/sparkles": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "spdx-correct": { + "node_modules/spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, - "requires": { + "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-exceptions": { + "node_modules/spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, - "spdx-expression-parse": { + "node_modules/spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, - "requires": { + "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-license-ids": { + "node_modules/spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, - "split-string": { + "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "stack-trace": { + "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "static-extend": { + "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, - "requires": { + "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "engines": { + "node": ">=0.10.0" } }, - "stdout-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", - "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, - "requires": { - "readable-stream": "^2.0.1" + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "stream-exhaust": { + "node_modules/stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "dev": true }, - "stream-shift": { + "node_modules/stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, - "string-width": { + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, - "requires": { + "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, - "requires": { + "dependencies": { "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "supports-color": { + "node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "sver-compat": { + "node_modules/sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", "dev": true, - "requires": { + "dependencies": { "es6-iterator": "^2.0.1", "es6-symbol": "^3.1.1" } }, - "tar": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", - "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.12", - "inherits": "2" - } - }, - "through2": { + "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "requires": { + "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, - "through2-filter": { + "node_modules/through2-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, - "requires": { + "dependencies": { "through2": "~2.0.0", "xtend": "~4.0.0" } }, - "time-stamp": { + "node_modules/time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "to-absolute-glob": { + "node_modules/to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "dev": true, - "requires": { + "dependencies": { "is-absolute": "^1.0.0", "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-object-path": { + "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex": { + "node_modules/to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, - "requires": { + "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-through": { + "node_modules/to-through": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", "dev": true, - "requires": { + "dependencies": { "through2": "^2.0.3" - } - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "true-case-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", - "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", - "dev": true, - "requires": { - "glob": "^7.1.2" + "engines": { + "node": ">= 0.10" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, - "type": { + "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, - "typedarray": { + "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "unc-path-regex": { + "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "undertaker": { + "node_modules/undertaker": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", "dev": true, - "requires": { + "dependencies": { "arr-flatten": "^1.0.1", "arr-map": "^2.0.0", "bach": "^1.0.0", @@ -4334,171 +4341,179 @@ "object.defaults": "^1.0.0", "object.reduce": "^1.0.0", "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "undertaker-registry": { + "node_modules/undertaker-registry": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "union-value": { + "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, - "requires": { + "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "unique-stream": { + "node_modules/unique-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, - "requires": { + "dependencies": { "json-stable-stringify-without-jsonify": "^1.0.1", "through2-filter": "^3.0.0" } }, - "unset-value": { + "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, - "requires": { + "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "upath": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, - "requires": { - "punycode": "^2.1.0" + "engines": { + "node": ">=4", + "yarn": "*" } }, - "urix": { + "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "use": { + "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", - "dev": true - }, - "v8flags": { + "node_modules/v8flags": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", "dev": true, - "requires": { + "dependencies": { "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" } }, - "validate-npm-package-license": { + "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "requires": { + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "value-or-function": { + "node_modules/value-or-function": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "engines": { + "node": ">= 0.10" } }, - "vinyl": { + "node_modules/vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "dev": true, - "requires": { + "dependencies": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", "clone-stats": "^1.0.0", "cloneable-readable": "^1.0.0", "remove-trailing-separator": "^1.0.1", "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "vinyl-fs": { + "node_modules/vinyl-fs": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", "dev": true, - "requires": { + "dependencies": { "fs-mkdirp-stream": "^1.0.0", "glob-stream": "^6.1.0", "graceful-fs": "^4.0.0", @@ -4516,14 +4531,17 @@ "value-or-function": "^3.0.0", "vinyl": "^2.0.0", "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" } }, - "vinyl-sourcemap": { + "node_modules/vinyl-sourcemap": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", "dev": true, - "requires": { + "dependencies": { "append-buffer": "^1.0.2", "convert-source-map": "^1.5.0", "graceful-fs": "^4.1.6", @@ -4531,81 +4549,78 @@ "now-and-later": "^2.0.0", "remove-bom-buffer": "^3.0.0", "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "vinyl-sourcemaps-apply": { + "node_modules/vinyl-sourcemaps-apply": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", "dev": true, - "requires": { + "dependencies": { "source-map": "^0.5.1" } }, - "which": { + "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "which-module": { + "node_modules/which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", "dev": true }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, - "requires": { + "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { + "node_modules/yargs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", "dev": true, - "requires": { + "dependencies": { "camelcase": "^3.0.0", "cliui": "^3.2.0", "decamelize": "^1.1.1", @@ -4621,12 +4636,12 @@ "yargs-parser": "^5.0.0" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", "dev": true, - "requires": { + "dependencies": { "camelcase": "^3.0.0" } } diff --git a/_figures/assets/package.json b/_figures/assets/package.json index 2195f8cb..96360254 100644 --- a/_figures/assets/package.json +++ b/_figures/assets/package.json @@ -6,7 +6,7 @@ "gulp": "^4.0.2", "gulp-notify": "^3.2.0", "gulp-plumber": "^1.2.1", - "gulp-sass": "^4.0.2" + "gulp-sass": "^6.0.1" }, "dependencies": { "@fortawesome/fontawesome-free": "^5.11.2", diff --git a/_figures/assets/smallest-app/routes.html b/_figures/assets/smallest-app/routes.html index d129d27c..bcfb9ee7 100644 --- a/_figures/assets/smallest-app/routes.html +++ b/_figures/assets/smallest-app/routes.html @@ -6,28 +6,23 @@ -
+
http://localhost:3000/rails/info/routes
- + + - - - - @@ -52,6 +47,9 @@ hello#index
Controllerのアクション +
HelperHelper + (Path / + Url) + HTTP Verb Path Controller#ActionSource Location
- Path / - Url - - - - +
+ /Users/igaiga/helloworld/config/routes.rb:2 +
@@ -75,4 +73,4 @@

リクエスト

- \ No newline at end of file + diff --git a/_figures/scripts/html_figures/cropper.rb b/_figures/scripts/html_figures/cropper.rb index 573c1629..eb5e17b5 100644 --- a/_figures/scripts/html_figures/cropper.rb +++ b/_figures/scripts/html_figures/cropper.rb @@ -9,7 +9,7 @@ def self.width_height(file_path) "index_flow_controller.png" => [1320, 1000], "index_flow_routes.png" => [1320, 1000], "index_flow_view.png" => [1320, 1000], - "index_routes.png" => [1300, 1020], + "index_routes.png" => [1800, 1020], }, "model" => { "create_flow_controller.png" => [1320, 1100], @@ -25,12 +25,12 @@ def self.width_height(file_path) "create_flow_controller.png" => [1320, 1100], "create_flow_routes.png" => [1320, 1120], "create_overview.png" => [1820, 900], - "create_routes.png" => [1320, 1180], + "create_routes.png" => [1820, 1180], "new_flow.png" => [1320, 980], "new_flow_controller.png" => [1320, 980], "new_flow_routes.png" => [1320, 980], "new_flow_view.png" => [1320, 980], - "new_routes.png" => [1320, 960], + "new_routes.png" => [1800, 960], "new_view_form.png" => [1820, 1140], "new_view_form_memo_html.png" => [1820, 740], "new_view_form_screenshot.png" => [960, 920], @@ -42,7 +42,7 @@ def self.width_height(file_path) "rails_app_request_to_response.png" => [1320, 980], "rails_files.png" => [980, 580], "rails_g_controller.png" => [1180, 760], - "routes.png" => [1320, 940], + "routes.png" => [1820, 940], "routes_mapping.png" => [1320, 480], }, } @@ -62,7 +62,8 @@ def self.crop end private_class_method def self.crop_exec(file_path, width, height) - system "convert #{file_path} -crop #{width}x#{height}+0+0 #{file_path}" + # imagemagickのconvert機能をつかう + system "magick #{file_path} -crop #{width}x#{height}+0+0 #{file_path}" end end diff --git a/_figures/scripts/screenshots/books_app/cropper.rb b/_figures/scripts/screenshots/books_app/cropper.rb index 0a00e05f..5f9dc30f 100644 --- a/_figures/scripts/screenshots/books_app/cropper.rb +++ b/_figures/scripts/screenshots/books_app/cropper.rb @@ -4,13 +4,13 @@ def self.width_height(file_path) dir_name, file_name = file_path.split("/").last(2) wh = { "screenshots" => { - "books_created_data_1.png" => [780, 350], + "books_created_data_1.png" => [800, 400], "books_edit_data_1.png" => [500, 490], "books_index_blank.png" => [340, 310], - "books_index_data_1.png" => [1290, 370], + "books_index_data_1.png" => [1290, 400], "books_index_data_2.png" => [1290, 720], "books_new_blank.png" => [420, 500], - "books_new_data_1.png" => [420, 500], + "books_new_data_1.png" => [420, 580], "books_show_data_1.png" => [780, 290], "books_with_author_new.png" => [440, 600], "books_with_upload_created.png" => [860, 1200], @@ -33,7 +33,8 @@ def self.crop end private_class_method def self.crop_exec(file_path, width, height) - system "convert #{file_path} -crop #{width}x#{height}+0+0 #{file_path}" + # imagemagickのconvert機能をつかう + system "magick #{file_path} -crop #{width}x#{height}+0+0 #{file_path}" end end diff --git a/_figures/scripts/screenshots/books_app/edit_10_replace_for_author.rb b/_figures/scripts/screenshots/books_app/edit_10_replace_for_author.rb index da99ac4c..5b37f42c 100644 --- a/_figures/scripts/screenshots/books_app/edit_10_replace_for_author.rb +++ b/_figures/scripts/screenshots/books_app/edit_10_replace_for_author.rb @@ -29,8 +29,8 @@ def replace_partial_book_html_erb def replace_books_controller file_name = "books_app/app/controllers/books_controller.rb" - src_regex = /params\.require\(:book\)\.permit\(:title, :memo\)/ - dst = %Q[params.require(:book).permit(:title, :memo, :author)] + src_regex = Regexp.new(Regexp.escape("params.expect(book: [ :title, :memo ])")) + dst = %Q[params.expect(book: [ :title, :memo, :author ])] replace(file_name: file_name, src_regex: src_regex, dst: dst) end diff --git a/_figures/scripts/screenshots/books_app/edit_20_replace_for_picture_upload.rb b/_figures/scripts/screenshots/books_app/edit_20_replace_for_picture_upload.rb index 313b13e5..1c966fb1 100644 --- a/_figures/scripts/screenshots/books_app/edit_20_replace_for_picture_upload.rb +++ b/_figures/scripts/screenshots/books_app/edit_20_replace_for_picture_upload.rb @@ -43,8 +43,8 @@ def replace_partial_book_html_erb def replace_books_controller file_name = "books_app/app/controllers/books_controller.rb" - src_regex = /params\.require\(:book\)\.permit\(:title, :memo, :author\)/ - dst = %Q[params.require(:book).permit(:title, :memo, :author, :picture)] + src_regex = Regexp.new(Regexp.escape("params.expect(book: [ :title, :memo, :author ])")) + dst = %Q[params.expect(book: [ :title, :memo, :author, :picture ])] replace(file_name: file_name, src_regex: src_regex, dst: dst) end diff --git a/_figures/scripts/screenshots/books_app/replaced/20191017231132_add_author_to_books.rb b/_figures/scripts/screenshots/books_app/replaced/20191017231132_add_author_to_books.rb index b922faee..b4a519da 100644 --- a/_figures/scripts/screenshots/books_app/replaced/20191017231132_add_author_to_books.rb +++ b/_figures/scripts/screenshots/books_app/replaced/20191017231132_add_author_to_books.rb @@ -1,4 +1,4 @@ -class AddAuthorToBooks < ActiveRecord::Migration[6.0] +class AddAuthorToBooks < ActiveRecord::Migration[8.0] def change add_column :books, :author, :string end diff --git a/_figures/scripts/screenshots/books_app/replaced/20191020225655_add_picture_to_books.rb b/_figures/scripts/screenshots/books_app/replaced/20191020225655_add_picture_to_books.rb index 76d25a0a..dcd93e2a 100644 --- a/_figures/scripts/screenshots/books_app/replaced/20191020225655_add_picture_to_books.rb +++ b/_figures/scripts/screenshots/books_app/replaced/20191020225655_add_picture_to_books.rb @@ -1,4 +1,4 @@ -class AddPictureToBooks < ActiveRecord::Migration[6.0] +class AddPictureToBooks < ActiveRecord::Migration[8.0] def change add_column :books, :picture, :string end diff --git a/_figures/scripts/screenshots/books_app/replacer.rb b/_figures/scripts/screenshots/books_app/replacer.rb index 5c63cba5..85838862 100644 --- a/_figures/scripts/screenshots/books_app/replacer.rb +++ b/_figures/scripts/screenshots/books_app/replacer.rb @@ -44,6 +44,7 @@ class Replacer "books_created_data_1.png" => "crud", # modelのページでも使っている "books_index_blank.png" => "crud", "books_new_data_1.png" => "new-create", + "books_created_data_1.png" => "model", "books_with_author_new.png" => "model", "books_with_upload_created.png" => "picture-upload", "books_with_upload_new.png" => "picture-upload", diff --git a/_figures/scripts/screenshots/helloworld/screenshots_crop.rb b/_figures/scripts/screenshots/helloworld/screenshots_crop.rb index da73873b..77a4eb97 100644 --- a/_figures/scripts/screenshots/helloworld/screenshots_crop.rb +++ b/_figures/scripts/screenshots/helloworld/screenshots_crop.rb @@ -16,5 +16,6 @@ def height(file_path) end Dir.glob("screenshots/**/*.png") do |file_path| - system "convert #{file_path} -crop #{width(file_path)}x#{height(file_path)}+0+0 #{file_path}" + # imagemagickのconvert機能をつかう + system "magick #{file_path} -crop #{width(file_path)}x#{height(file_path)}+0+0 #{file_path}" end diff --git a/_posts/01_preface.md b/_posts/01_preface.md index 8253392a..0dc65c44 100644 --- a/_posts/01_preface.md +++ b/_posts/01_preface.md @@ -4,7 +4,7 @@ > *もっと多くの開発者を Ruby で幸せにしたい。* -> *- matz* +> *- Matz* ブラウザを使って買い物をする、SNSを読み書きする、料理のレシピを検索する。Webアプリが提供するサービスは私たちの生活に深く根ざしています。それらを使うだけではなくて、どうやって動いているか知りたい、自分でも作ってみたい。本書はその第一歩を踏み出すための資料です。 @@ -38,7 +38,7 @@ - Railsの基礎はわかっている -本書はRailsの入門的な本やサイトを読んで難しいと感じた方に、そこまでの知識を埋められるように書いています。逆に言えば、他の入門書を読める力があれば、本書は易しすぎると感じるかもしれません。具体的には、[Railsチュートリアル](https://railstutorial.jp/) を読み進められるようであれば、本書から得られるものは少ないのではないかと思います。 +本書はRailsの入門的な本やサイトを読んで難しいと感じた方に、そこまでの知識を埋められるように書いています。逆に言えば、他の入門書を読める力があれば、本書はやさしすぎると感じるかもしれません。具体的には、[Railsチュートリアル](https://railstutorial.jp/) を読み進められるようであれば、本書から得られるものは少ないのではないかと思います。 ## 書式例 @@ -101,13 +101,13 @@ Use Ctrl-C to stop ## 開発環境 -本書は2023年5月1日現在の最新バージョンであるRuby 3.2.2、Rails 7.0.4.3で動作確認をしています。 +本書は2025年4月1日現在の最新バージョンであるRuby 3.4.2、Rails 8.0.2で動作確認をしています。 Webアプリのプログラムを書くための道具として、ターミナル、エディタ、ブラウザをつかいます。 -ターミナルはコンピュータをコントロールするための道具です。自分で書いたプログラムをターミナルから実行することができます。ターミナルでRubyおよびRailsのプログラムを実行するためには、開発環境を作る必要があります。最初にMacとWindowsの場合それぞれでの環境構築方法を説明して、そのあとでどちらの環境でも共通であるRubyとRailsのインストール方法を説明します。また、Docker環境をつかって開発環境をつくる方法も説明しています。 +ターミナルはコンピュータをコントロールするための道具です。自分で書いたプログラムをターミナルから実行することができます。ターミナルでRubyおよびRailsのプログラムを実行するためには、開発環境を作る必要があります。最初にMacとWindowsの場合それぞれでの環境構築方法を説明して、そのあとでどちらの環境でも共通であるRubyとRailsのインストール方法を説明します。また、Docker環境をつかって開発環境をつくる方法も説明しています。🌠TODO: 更新 -エディタはプログラムを入力する道具です。エディタは好みのものがあればそれを利用してください。特にない場合は [Visual Studio Code](https://code.visualstudio.com/) をお勧めします。Visual Studio Codeは無料で使うことができます。ライセンスはMITライセンスです。 +エディタはプログラムを入力する道具です。エディタは好みのものがあればそれを利用してください。特にない場合は [Visual Studio Code](https://code.visualstudio.com) をお勧めします。Visual Studio Codeはマイクロソフトによって開発されたオープンソースのエディタで、無料で使うことができます。ライセンスはMITライセンスです。 ブラウザはつくったWebアプリへアクセスするための道具としてつかいます。お好きなものをご利用いただけますが、文中で説明につかわれている [Chrome](https://www.google.co.jp/chrome/browser/) を使うと分かりやすいです。 @@ -117,13 +117,15 @@ Webアプリのプログラムを書くための道具として、ターミナ ### Macに開発環境をつくる +🌠新しいMBPで試してみるとよさそう + 開発環境づくりに必要なxcodeツールをインストールします。 ```console $ xcode-select --install ``` -[Homebrew](https://brew.sh/) をインストールします。HomebrewはMacでさまざまな便利なプログラムをインストール、管理するためのツールです。以下のコマンド中の`-fsSL`の後ろに表示上は改行をいれていますが、実行するときは次の行とつなげて1行のコマンドとして実行してください。 +[Homebrew](https://brew.sh) をインストールします。HomebrewはMacでさまざまな便利なプログラムをインストール、管理するためのツールです。以下のコマンド中の`-fsSL`の後ろに表示上は改行をいれていますが、実行するときは次の行とつなげて1行のコマンドとして実行してください。 ```console $ /bin/bash -c "$(curl -fsSL @@ -141,23 +143,17 @@ $ source ~/.zshrc これでRubyとRailsをインストールするための準備ができました。つづいて「RubyとRailsをインストールする」へ進んでください。 -もしも、Rails6.1以前のRailsをつかう場合や、JavaScriptのライブラリを利用する場合には、Webpackerと呼ばれるライブラリを利用することがあります。Webpackerをつかう場合には、以下の手順でyarnなどの必要なJavaScriptライブラリをインストールします。 - -```console -$ brew install yarn -``` - ### Windowsに開発環境をつくる Windowsの場合はWSL2(Windows Subsystem for Linux 2、以下WSL)とrbenvを利用することで開発環境をつくることができます。インストールしたWSL上でLinux向けツールを利用して開発します。WSLを利用するためにはWindows10以降が必要です。もしもWindows10よりも前のバージョンを利用している場合や、WSLのインストールがうまく行かないときには、 [RailsGirlsガイド インストール・レシピ](https://railsgirls.jp/install) のページにある「Windows 用セットアップ(WSLが使えない方向け)」を参考にしてみてください。 -WSLをインストールする方法は [Windows Subsystem for Linux Installation Guide for Windows 10 のページ](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10) に書かれていますので、こちらの手順でインストールしてください。また、 [RailsGirlsガイド インストール・レシピ](https://railsgirls.jp/install) のページにも同様の手順がスクリーンショットをつかって丁寧に説明されています。インストールするLinuxを選ぶところでは好きなものを選んでもらって構いませんが、特になければデフォルトであるUbuntuを選択することをお勧めします。UbuntuのバージョンはUbuntu 20.04を想定しています。 +WSLをインストールする方法は [WSL を使用して Windows に Linux をインストールする方法](https://learn.microsoft.com/ja-jp/windows/wsl/install) に書かれていますので、こちらの手順でインストールしてください。また、 [RailsGirlsガイド インストール・レシピ](https://railsgirls.jp/install) のページにも同様の手順がスクリーンショットをつかって丁寧に説明されています。インストールするLinuxを選ぶところでは好きなものを選んでもらって構いませんが、特になければデフォルトであるUbuntuを選択することをお勧めします。 WSLのインストール後、起動したアプリケーションはターミナルあるいはBashウィンドウと呼びます。ターミナルにはユーザー名とパスワードの入力を促す画面が表示されていますので、適当なユーザー名(半角英数小文字のみ)とパスワードを入力しましょう。パスワードは2回入力する必要があり、画面には表示されませんが正しく入力されています。 ターミナルで以下のコマンドを実行してください。sudo apt installコマンド中のlibyaml-devの後ろとlibgdbm-devの後ろに表示上は改行をいれていますが、実行するときは次の行とつなげて1行のコマンドとして実行してください。 -なお、最初のコマンドを実行する際にパスワードの入力を求められますが、先程ターミナルに入力したパスワードを入力してください。Windowsのパスワードではないことに注意してください。 `sudo dpkg-reconfigure tzdata` を実行するとタイムゾーンを設定する画面が出ますので、「Asia」を矢印キーで移動して選択して、Tabキーを押してOkボタンに移動して、Enterキーを押してください。つづいて都市を選択する以下の画面が起動するので、「Tokyo」を矢印キーで移動して選択して、Tabキーを押してOkボタンに移動して、Enterキーを押してください。 +なお、最初のコマンドを実行するときにパスワードの入力を求められますが、先程ターミナルに入力したパスワードを入力してください。Windowsのパスワードではないことに注意してください。 `sudo dpkg-reconfigure tzdata` を実行するとタイムゾーンを設定する画面が出ますので、「Asia」を矢印キーで移動して選択して、Tabキーを押してOkボタンに移動して、Enterキーを押してください。つづいて都市を選択する以下の画面が起動するので、「Tokyo」を矢印キーで移動して選択して、Tabキーを押してOkボタンに移動して、Enterキーを押してください。 ```console $ sudo dpkg-reconfigure tzdata @@ -180,29 +176,18 @@ $ source ~/.bashrc これでRubyとRailsをインストールするための準備ができました。つづいて「RubyとRailsをインストールする」へ進んでください。 -もしも、Rails6.1以前のRailsをつかう場合や、JavaScriptのライブラリを利用する場合には、Webpackerと呼ばれるライブラリを利用することがあります。Webpackerをつかう場合には、以下の手順でyarnなどの必要なJavaScriptライブラリをインストールします。 - -```console -$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash -$ source ~/.bashrc -$ nvm install --lts -$ nvm alias default lts/* -$ nvm use default -$ npm install --global yarn -``` - ### RubyとRailsをインストールする rbenvを使ってRubyをインストールします。Rubyのバージョンは、より新しいものがあればそちらを利用して構いません。rbenvからインストール可能なRubyのバージョンは`rbenv install -l`で調べることができます。 ```console -$ rbenv install 3.2.2 +$ rbenv install 3.4.2 ``` インストールしたRubyを利用するように設定します。 ```console -$ rbenv global 3.2.2 +$ rbenv global 3.4.2 ``` 以上でRubyのインストールは完了です。続いて、インストールしたRubyを使ってRailsをインストールします。 @@ -215,21 +200,57 @@ $ gem i rails ```console $ rails -v -Rails 7.0.4.3 +Rails 8.0.2 ``` このようにインストールしたRailsのバージョンが表示されればインストール成功です。結果に表示されるバージョンの数字は、実行時の最新バージョンとなるため異なることがあります。 -Railsは最新バージョンのものをつかって問題ありませんが、もしも問題が出て進められなくなったときには、`gem i rails -v 7.0.4.3`のようにバージョンを指定して、本書の内容と揃えることもできます。そのときには、以降のページで出てくる`rails new アプリ名`コマンドを実行するときに、つかうバージョンを指定し`rails _7.0.4.3_ new アプリ名`とします。 +Railsは最新バージョンのものをつかって問題ありませんが、もしも問題が出て進められなくなったときには、`gem i rails -v 8.0.2` のようにバージョンを指定して、本書の内容と揃えることもできます。そのときには、以降のページで出てくる`rails new アプリ名`コマンドを実行するときに、つかうバージョンを指定し`rails _8.0.2_ new アプリ名`とします。 ここまででRubyとRailsの開発環境構築ができました。次の章へ進んでください。 +### Visual Studio Codeでつかえる環境をつくる with Dev Container (仮) + +🌠TODO: 良さそうならこれを最初に持って行く + +ここまで説明した方法はRubyやRailsを自分のコンピュータへ直接インストールする方法でした。別の方法として、Dev Container環境でRailsアプリ開発環境をつくる方法もあります。Dev Container環境ではRubyやRailsを自分のコンピュータへ直接インストールせずに、RailsアプリケーションをDockerコンテナ上で実行します。Visual Studio Codeをつかうと、Dockerコンテナの起動やコンテナ内のターミナル操作などをエディタ上からかんたんに行えます。ただし、開発環境の動作を理解するためにはコンテナ技術に関する基礎知識が必要になります。 + +最初にVisual Studio Code(以下VS Code)、Docker、rails-newをセットアップします。 + +VS Codeはマイクロソフトによって開発されたオープンソースのエディタで、無料でつかうことができます。ライセンスはMITライセンスです。公式ページからダウンロードしてインストールします。また、あわせてdev container拡張機能をマーケットプレイスからダウンロードしてインストールしておきます。 + +- [Visual Studio Code 公式ページ](https://code.visualstudio.com) +- [Visual Studio Code マーケットプレイス dev container拡張機能](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) + +Dockerはコンテナと呼ばれる仮想環境パッケージをつかってアプリ実行環境(ここではRails開発環境)をつくることができるプラットフォームです。Docker Desktopなどをつかってインストールします。 + +- Docker Desktop [https://docs.docker.com/desktop](https://docs.docker.com/desktop) + +rails-newはRubyがインストールされていなくても新規Railsアプリケーションをつくることができるツールです。rails-newを次の方法でインストールします。 + +GitHubの[リリースページ](https://github.com/rails/rails-new/releases)から最新バージョンのAssets欄を表示して、つかっているプラットフォームのファイルをダウンロードしてください。Apple Silicon(たとえばM1など)のmacOSでは「rails-new-aarch64-apple-darwin.tar.gz」、Windowsでは「rails-new-x86_64-pc-windows-gnu.zip」となります。ダウンロード後に .tar.gz ファイルを解凍するとrails-new 実行可能ファイルを取得できます。このrails-newファイルをパスの通ったフォルダへ配置して、ターミナルから実行できるようにします。 + +- Rails new リリースページ [https://github.com/rails/rails-new/releases](https://github.com/rails/rails-new/releases) + +macOSではターミナルからrails-newコマンドを実行すると「"rails-new"は、開発元を検証できないため開けません。」と表示されます。ターミナルでrails-newファイルが置いてあるフォルダへ移動して、次のコマンドで実行可能にすることができます。このコマンドは「(セキュリティ上の警告を確認して問題ないので)実行を許可します」という変更をコマンドファイルに行います。 + +```bash +$ xattr -d com.apple.quarantine ./rails-new +``` + +🌠このページに沿って説明を執筆中 +TODO: rails-newでサンプルファイルをrails newする。helloworldを題材にした方が良いか考える。 + +https://railsguides.jp/getting_started_with_devcontainer.html + ### Dockerをつかって開発環境をつくる +🌠TODO: 書き換え、またはVSCodeの方へ寄せてしまって削除でも良いか確認。Ruby3.4対応が出ていないので、ひっこめた方がよさそう。 + Dockerをつかってかんたんに開発環境をつくる Docked Rails CLI がRailsコアチームより提供されています。あらかじめ、Docker DesktopなどでDocker環境をつくっておきます。 - Docked Rails CLI [https://github.com/rails/docked](https://github.com/rails/docked) -- Docker Desktop [https://www.docker.com/products/docker-desktop](https://www.docker.com/products/docker-desktop) +- Docker Desktop [https://docs.docker.com/desktop](https://docs.docker.com/desktop) この環境でつかわれるRubyとRailsのバージョンは[Docked Rails CLIリポジトリ Dockerfile](https://github.com/rails/docked/blob/main/Dockerfile)で確認できます。2023年5月1日現在、Rubyはv3.2.0、Railsは`gem install rails`でインストールされる最新バージョンv7.0.4.3がつかわれます。 diff --git a/_posts/02_smallest_app.md b/_posts/02_smallest_app.md index 2ab67f9e..8cfa3474 100644 --- a/_posts/02_smallest_app.md +++ b/_posts/02_smallest_app.md @@ -49,14 +49,15 @@ $ rails s ```console $ rails s => Booting Puma -=> Rails 7.0.4.3 application starting in development +=> Rails 8.0.2 application starting in development => Run `bin/rails server --help` for more startup options Puma starting in single mode... -* Puma version: 5.6.5 (ruby 3.2.2-p53) ("Birdie's Version") -* Min threads: 5 -* Max threads: 5 +* Puma version: 6.6.0 ("Return to Forever") +* Ruby version: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [arm64-darwin22] +* Min threads: 3 +* Max threads: 3 * Environment: development -* PID: 30819 +* PID: 50873 * Listening on http://127.0.0.1:3000 * Listening on http://[::1]:3000 Use Ctrl-C to stop @@ -156,7 +157,7 @@ Use Ctrl-C to stop ```diff -

現在時刻: <%= Time.current %>

-+

現在時刻: <%= Time.current.in_time_zone('Asia/Tokyo') %>

++

現在時刻: <%= Time.current.in_time_zone("Asia/Tokyo") %>

``` ![現在時刻表示](assets/smallest-app/time_jst.png) @@ -170,7 +171,7 @@ Use Ctrl-C to stop ```diff class HelloController < ApplicationController def index -+ @time = Time.current.in_time_zone('Asia/Tokyo') ++ @time = Time.current.in_time_zone("Asia/Tokyo") end end ``` @@ -180,7 +181,7 @@ end `app/views/hello/index.html.erb` ```diff --

現在時刻: <%= Time.current.in_time_zone('Asia/Tokyo') %>

+-

現在時刻: <%= Time.current.in_time_zone("Asia/Tokyo") %>

+

現在時刻: <%= @time %>

``` @@ -190,7 +191,7 @@ end ### コラム: タイムゾーンの設定 -今回の `Time.current.in_time_zone('Asia/Tokyo')` はこの場所で使う時刻だけを日本時間へ変更しました。この方法のほかに、アプリ全体でタイムゾーンを日本時間に設定する方法もあります。その場合はconfig/application.rbファイル中に `config.time_zone = 'Asia/Tokyo'` と設定します。この方法の利点は、プログラムの中のあちこちで `in_time_zone('Asia/Tokyo')` を書かずに済み、config/application.rbファイルの1カ所にまとめることができることです。 +今回の `Time.current.in_time_zone("Asia/Tokyo")` はこの場所で使う時刻だけを日本時間へ変更しました。この方法のほかに、アプリ全体でタイムゾーンを日本時間に設定する方法もあります。その場合はconfig/application.rbファイル中に `config.time_zone = "Asia/Tokyo"` と設定します。この方法の利点は、プログラムの中のあちこちで `in_time_zone("Asia/Tokyo")` を書かずに済み、config/application.rbファイルの1カ所にまとめることができることです。 ## Webアプリはどのように動作しているか @@ -276,7 +277,6 @@ create README.md create Rakefile ... (略) create app -create app/assets/config/manifest.js create app/assets/stylesheets/application.css ... (略) ``` @@ -347,24 +347,26 @@ Routesは「リクエストのURLとHTTPメソッド」に応じて次に処理 ![Routes](assets/smallest-app/routes_mapping.png) -では、対応表であるRoutes表を見て見ましょう。rails serverを起動させて `/rails/info/routes` へアクセスしてみてください。Routes表の見方を説明したのが次の図です。 +では、対応表であるRoutes表を見て見ましょう。rails serverを起動させて `/rails/info/routes` へアクセスしてみてください。Routes表の見方を説明したのが次の図です。実際のRoutes表はもっと長いのですが、本書では説明に関係する行だけを載せています。 ![Routes表](assets/smallest-app/routes.png) 表中の "HTTP Verb" がHTTPメソッドです。"Path"(パス)はURLの後半部分に相当します。URLが"http://localhost:3000/hello/index"である場合、パスは"/hello/index"になります。(表示されたパスの後半部分の"(.:format)"は省略できる記述で、レスポンスで返すフォーマットを指定するための機能です。省略した場合はHTMLを返すのが普通です。) -右端の"Controller#Action"が処理の移るコントローラとアクションを示しています。ここでは "hello#index" と書かれていますが、#の左側がコントローラ名、右側がアクション名です。この場合は、「HelloControllerのindexアクション」を示しています。 +"Controller#Action"が処理の移るコントローラとアクションを示しています。ここでは "hello#index" と書かれていますが、#の左側がコントローラ名、右側がアクション名です。この場合は、「HelloControllerのindexアクション」を示しています。 この対応表を解釈すると、「リクエストのHTTPメソッドが"GET"、パスが"/hello/index"のとき、次の処理は"HelloController"の"index"アクションになる」となります。 ここで表示されたRoutesは`config/routes.rb`ファイルから生成されています。このファイルには次のような記述があります。 ```ruby -get 'hello/index' +get "hello/index" ``` これがRoutesのコード部分で、この1行からさきほど説明した対応表が生成されています。「パス"hello/index"へのGETでのアクセスでHelloControllerのindexアクションが呼ばれる」という文です。Routesの書き方はまた追って説明していきます。 +Routes表の各行がどのファイルのどの行からつくられたかは、Routes表のSource Location列に書かれています。ここでは `/Users/igaiga/helloworld/config/routes.rb:2` なので、`config/routes.rb`の2行目であることを示しています。 + Routesについてまとめると、「RoutesはリクエストのパスとHTTPメソッドによって次の処理先であるコントローラとアクションを決める対応表」となります。 それでは、次の処理が行われるコントローラをみてみましょう。 @@ -376,14 +378,14 @@ Routesについてまとめると、「RoutesはリクエストのパスとHTTP ```ruby class HelloController < ApplicationController def index - @time = Time.current.in_time_zone('Asia/Tokyo') + @time = Time.current.in_time_zone("Asia/Tokyo") end end ``` HelloControllerのindexアクションが呼び出されます。`def index`から`end`までがindexアクションです。コントローラにあるpublicなメソッドをアクションと呼びます。アクションはRoutesから次の処理先として指示される可能性があります。 -このindexアクションでは`@time`というインスタンス変数に現在時刻を代入しています。アクションの中のプログラム、ここでは `@time = Time.current.in_time_zone('Asia/Tokyo')` は、インデント(字下げ)されて書かれます。 +このindexアクションでは`@time`というインスタンス変数に現在時刻を代入しています。アクションの中のプログラム、ここでは `@time = Time.current.in_time_zone("Asia/Tokyo")` は、インデント(字下げ)されて書かれます。 変数は名札のようなもので、代入したものをあとから使えるように名前をつける仕組みです。変数のうち、@はじまりの変数のことをインスタンス変数といいます。インスタンス変数を使うと、コントローラから、このあとの処理先であるビューへ情報を伝えることができます。ちなみに、@はじまりではない変数はローカル変数と呼ばれ、このメソッド(アクション)を抜けると役目を終えて使えなくなります。つまり、ローカル変数へ代入してもビューから使うことはできません。ビューで使うためには、@はじまりのインスタンス変数を利用します。 @@ -407,7 +409,7 @@ HelloControllerのindexアクションが呼び出されます。`def index`か

現在時刻: <%= @time %>

``` -HTMLのpタグがあります。その中にHTMLではない `<%=` と `%>` というタグがあります。これがRubyのコードを実行するためのタグです。ここではその中にある `@time` が実行されます。@timeインスタンス変数にはコントローラで実行された現在時刻 `Time.current.in_time_zone('Asia/Tokyo')` の結果が代入されているので、これがHTMLへ埋め込まれます。 +HTMLのpタグがあります。その中にHTMLではない `<%=` と `%>` というタグがあります。これがRubyのコードを実行するためのタグです。ここではその中にある `@time` が実行されます。@timeインスタンス変数にはコントローラで実行された現在時刻 `Time.current.in_time_zone("Asia/Tokyo")` の結果が代入されているので、これがHTMLへ埋め込まれます。 ビューで作られたHTMLは、Railsがその他の加工を加えてレスポンスとして送出され、ブラウザに表示されます。作られたHTMLはブラウザで「ページのソースを表示」機能をつかって確認することができます。 diff --git a/_posts/03_crud.md b/_posts/03_crud.md index e5acc7c2..889103f3 100644 --- a/_posts/03_crud.md +++ b/_posts/03_crud.md @@ -19,8 +19,8 @@ $ rails new books_app $ rails new books_app create ... (略) -Pin Stimulus - append config/importmap. + create db/cable_schema.rb + force config/cable.yml ``` 次に、以下のコマンドを実行します(メッセージ中 "20220120025416"、"0.xxxxs" などの数字は実行するごとに異なります)。 @@ -36,7 +36,7 @@ $ rails s $ rails g scaffold book title:string memo:text invoke active_record create db/migrate/20220120025416_create_books.rb -... +... (略) create app/views/books/_book.json.jbuilder $ rails db:migrate @@ -207,13 +207,15 @@ class BooksController < ApplicationController ```erb

<%= notice %>

+<% content_for :title, "Books" %> +

Books

- <% @books.each do |book| %> ⬅ @booksはbookがいくつか入った配列 - <%= render book %> ⬅ 個々のbookのtitleやmemoを表示 + <% @books.each do |book| %> + <%= render book %>

- <%= link_to "Show this book", book %> ⬅ Show(詳細画面)へのリンクを生成 + <%= link_to "Show this book", book %>

<% end %>
diff --git a/_posts/04_new_create.md b/_posts/04_new_create.md index f4b7854c..4842d69d 100644 --- a/_posts/04_new_create.md +++ b/_posts/04_new_create.md @@ -75,6 +75,8 @@ Bookクラスには色々と便利な機能があるのですが、それは後 ビューのコード `views/books/new.html.erb` を見てみましょう。 ```erb +<% content_for :title, "New book" %> +

New book

<%= render "form", book: @book %> @@ -124,7 +126,7 @@ Bookクラスには色々と便利な機能があるのですが、それは後
<%= form.label :memo, style: "display: block" %> - <%= form.text_area :memo %> + <%= form.textarea :memo %>
@@ -168,7 +170,7 @@ Railsコードの部分をもう少し詳しく見てみましょう。`<%= form ![メモ部品](assets/new-create/new_view_form_memo_html.png) -メモの部分も同様です。`form.label :memo, style: "display: block"` が "Memo" を表示する部分です。`form.text_area :memo` がその下のテキスト入力欄を作ります。`text_area` は先ほどの `text_field` よりも広くて改行を入力できるテキスト入力欄を作るメソッドです。 +メモの部分も同様です。`form.label :memo, style: "display: block"` が "Memo" を表示する部分です。`form.textarea :memo` がその下のテキスト入力欄を作ります。`textarea` は先ほどの `text_field` よりも広くて改行を入力できるテキスト入力欄を作るメソッドです。 ![投稿ボタン部品](assets/new-create/new_view_form_submit_html.png) @@ -209,7 +211,7 @@ new画面でCreate bookボタンを押すと新たなリクエストを飛ばす いつものように最初の処理はroutesです。 -![routes](assets/new-create/create_routes.png) +![Routes表](assets/new-create/create_routes.png) URLのパスは/books 、HTTPメソッドはPOSTなので対応するコントローラとアクションはbooks#create、つまりBooksControllerのcreateアクションが呼び出されます。 @@ -229,7 +231,7 @@ def create respond_to do |format| if @book.save # ⬅2. 本のデータを保存する # ⬅3a. 成功したらshow画面へ - format.html { redirect_to book_url(@book), notice: "Book was successfully created." } + format.html { redirect_to @book, notice: "Book was successfully created." } format.json { render :show, status: :created, location: @book } else # ⬅3b. 保存失敗したらnew画面へ(元の画面) @@ -256,7 +258,7 @@ def create ```ruby def book_params - params.require(:book).permit(:title, :memo) + params.expect(book: [ :title, :memo ]) end ``` @@ -270,7 +272,7 @@ end def book_params + p "**********" # 見つけ易くするための目印。何でも良い。 + p params # paramsの中身を表示 - params.require(:book).permit(:title, :memo) + params.expect(book: [ :title, :memo ]) end ``` @@ -300,17 +302,19 @@ Processing by BooksController#create as TURBO_STREAM ### Strong Parameters -`book_params`の説明に戻ります。`params`の後ろについている、requireとpermitとはなんでしょうか? +`book_params`の説明に戻ります。`params`の後ろについている、expectとはなんでしょうか? `app/controllers/books_controller.rb` ```ruby def book_params - params.require(:book).permit(:title, :memo) + params.expect(book: [ :title, :memo ]) end ``` -params以降のrequire, permitメソッドは、パラメータの内容を制限します。意図していないデータが入ってくるのを防ぐための仕組みです。ここでは、bookのtitle, memoだけを受け取るようにしています。requireには対象となるモデル名(モデルについては次章で説明します)を、permitには更新を許可するカラム名を指定します。 +paramsの後ろにつづくexpectメソッドは、意図していないデータが入ってくるのを防ぐためにパラメータの内容を制限します。ここでは、bookのtitle, memoだけを受け取るようにしています。expectへ渡すキーワード引数のキーワードには対象となるモデル名を(モデルについては次章で説明します)、値には更新を許可するカラム名を配列で指定します。ここで書かれている `expect(book: [ :title, :memo ])` では、bookモデルのtitleカラムおよびmemoカラムを許可します。 + +expectメソッドはRails8.0で導入されました。Rails7.2まではrequireメソッドとpermitメソッドをつかって `params.require(:book).permit(:title, :memo)` と書きます。 このパラメータを制限する仕組みはStrong Parametersと呼ばれます。これが必要な理由は、攻撃に対する防御、つまりセキュリティ対策です。ブラウザから飛ばすパラメータは、ユーザーの手によって改ざんすることも可能です。つまり、任意のパラメータを飛ばして攻撃をすることもできます。そのため、1つ前のnew画面で用意したformに存在しないパラメータが飛んでくる可能性もあるので、ここで変更を許可するパラメータを絞っています。 @@ -328,7 +332,7 @@ def create respond_to do |format| if @book.save # ⬅2. 本のデータを保存する # ⬅3a. 成功したらshow画面へ - format.html { redirect_to book_url(@book), notice: "Book was successfully created." } + format.html { redirect_to @book, notice: "Book was successfully created." } format.json { render :show, status: :created, location: @book } else # ⬅3b. 保存失敗したらnew画面へ(元の画面) @@ -339,7 +343,7 @@ def create end def book_params - params.require(:book).permit(:title, :memo) + params.expect(book: [ :title, :memo ]) end ``` @@ -355,7 +359,7 @@ Book.new(book_params)で本のデータを作ります。newはクラスの - newアクションではまだデータを保存せず、サーバのデータ変更を伴わないためHTTPメソッドGETを使う - createアクションではデータを保存し、サーバのデータ変更を伴うためHTTPメソッドPOSTを使う - ユーザーがブラウザでformへ入力した内容はリクエスト内のパラメータとしてRailsアプリへ届き、 paramsで渡ってきたパラメータを取得できる -- セキュリティ問題対策のためStrongParameters(requireメソッド、permitメソッド)を利用してparamsに制限をかける +- セキュリティ問題対策のためStrongParameters(expectメソッド)を利用してparamsに制限をかける 次の章ではモデルについて説明します。 diff --git a/_posts/05_model.md b/_posts/05_model.md index ea1fd319..83dd93c5 100644 --- a/_posts/05_model.md +++ b/_posts/05_model.md @@ -122,8 +122,8 @@ rails c ```console $ rails c -Loading development environment (Rails 7.0.4.3) -irb(main):001:0> +Loading development environment (Rails 8.0.2) +books-app(dev)> ``` rails consoleで以下のコードを実行してみてください。 @@ -206,7 +206,7 @@ DBの設計書をマイグレーションファイルと呼びます。マイグ `db/migrate/20211225013956_create_books.rb` ```ruby -class CreateBooks < ActiveRecord::Migration[7.0] +class CreateBooks < ActiveRecord::Migration[8.0] def change create_table :books do |t| t.string :title @@ -218,7 +218,7 @@ class CreateBooks < ActiveRecord::Migration[7.0] end ``` -1行目 `ActiveRecord::Migration[7.0]` の末尾にある数字はRailsのバージョンを表します。Rails7.0.xではこのように7.0となります。 +1行目 `ActiveRecord::Migration[8.0]` の末尾にある数字はRailsのバージョンを表します。Rails8.0.xではこのように8.0となります。 3行目 `create_table :books` でbooksという名前のテーブルを作ります。DBはテーブルという単位でデータを管理します。ここでは、本に関するデータを保存するためにbooksという名前のテーブルを作っています。テーブル名はモデル名の複数形にするというルールがあります。 @@ -393,7 +393,7 @@ $ rails g migration Addカラム名Toテーブル名 カラム名:型名 ``` ```ruby -class AddAuthorToBooks < ActiveRecord::Migration[7.0] +class AddAuthorToBooks < ActiveRecord::Migration[8.0] def change add_column :books, :author, :string end @@ -484,7 +484,7 @@ create db/migrate/20220107022320_add_author_to_books.rb `db/migrate/20220107022320_add_author_to_books.rb` ```ruby -class AddAuthorToBooks < ActiveRecord::Migration[7.0] +class AddAuthorToBooks < ActiveRecord::Migration[8.0] def change add_column :books, :author, :string end @@ -518,7 +518,7 @@ $ rails db:migrate
<%= form.label :memo, style: "display: block" %> - <%= form.text_area :memo %> + <%= form.textarea :memo %>
+
@@ -566,16 +566,14 @@ StrongParametersにauthorを追加します。 class BooksController < ApplicationController ... def book_params -- params.require(:book).permit(:title, :memo) -+ params.require(:book).permit(:title, :memo, :author) +- params.expect(book: [ :title, :memo ]) ++ params.expect(book: [ :title, :memo, :author ]) end end ``` #### 動作確認 -rails serverを起動して動作を確認してみましょう。 +rails serverを起動して動作を確認してみましょう。new、show、indexの各画面にAuthor欄が追加されて、登録できるようになりました。 ![新規入力画面](assets/model/books_with_author_new.png) - -new、show、indexの各画面にAuthor欄が追加されて、登録できるようになりました。 diff --git a/_posts/06_gem.md b/_posts/06_gem.md index 2acade32..93e53523 100644 --- a/_posts/06_gem.md +++ b/_posts/06_gem.md @@ -16,14 +16,13 @@ Gemをインストールするにはgem iコマンドを利用します。gem i $ gem i awesome_print ``` ```console -Fetching awesome_print-1.9.2.gem Successfully installed awesome_print-1.9.2 1 gem installed ``` コマンドを実行すると、上記のような表示が出てGemを使えるようになります。Gem名の後ろにハイフンで続く数字はバージョンです。実行したときの最新バージョンがインストールされるため、数字は異なることもあります。 -インストールしたawesome_printは、きれいに表示するapというメソッドを提供します。irbを起動して試しに使ってみましょう。irbは対話形式でRubyプログラムを実行できる仕組みです。rails consoleもirbを利用しています。 +インストールしたawesome_printは、きれいに表示するapメソッドを提供します。irbを起動して試しに使ってみましょう。irbは対話形式でRubyプログラムを実行できる仕組みです。rails consoleもirbを利用しています。 ```bash $ irb @@ -45,7 +44,7 @@ $ irb => nil ``` -このような形式で配列[1,2,3]が表示されれば成功です。Rubyが標準で持っているpメソッドも同等のことができますが、apメソッドの方がきれいに読み易い形で表示してくれます。 +このような形式で配列[1,2,3]が表示されれば成功です。Rubyが標準で持っているpメソッドやppメソッドも同等のことができますが、apメソッドの方がきれいに読みやすい形で表示してくれます。 プログラムで最初に実行した`require "awesome_print"`はapを使えるようにするためのコードです。Gemライブラリは、gem installしたあと、requireを実行することで利用できます。使い方はGemごとに異なるため、Gem名で検索してドキュメントを読んでみてください。GitHubのページが用意されていることが多いです。 @@ -57,37 +56,34 @@ BundlerでGem群をインストールするには2つの手順を実行します 1つ目はGemfileという名前のファイルに使用するGemを書くこと。2つ目はbundle installコマンドを実行することです。仕組みの名前はBundlerですが、コマンド名はbundleと最後にrが付かない点に注意です。 -Railsアプリは最初からBundlerの仕組みを利用するようになっています。GemfileはRailsアプリの場合、Railsのルートフォルダに置いてあります。エディタで開いてみましょう。 +Railsアプリは最初からBundlerの仕組みを利用するようになっいて、GemfileもRailsのルートフォルダに置いてあります。エディタで開いてみましょう。 ```ruby source "https://rubygems.org" -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -ruby "3.2.2" # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" -gem "rails", "~> 7.0.4", ">= 7.0.4.3" +gem "rails", "~> 8.0.2" ... ``` -たくさんのgemが表示されました。Railsアプリは最初につくった状態ですでに10個以上のgemが登録されています。ここに、さきほどのawesome_print gemを追加してみましょう。書く場所はどこでも良いのですが、一番最後の行へ追加することにします。Gemfileへ次の一行を追加して保存します。 +たくさんのGemが表示されました。Railsアプリは最初につくった状態ですでに10個以上のGemが登録されています。ここに、さきほどのawesome_print Gemを追加してみましょう。書く場所はどこでも良いのですが、一番最後の行へ追加することにします。Gemfileへ次の一行を追加して保存します。 ```ruby gem "awesome_print" ``` -追加して保存したら、以下のようにbundle installコマンドを実行します。このコマンドの実行時にはネットワークへ接続が必要なため、少し時間がかかります。また、各Gemのバージョンや、Bundle complete!につづけて表示される数字は異なることがあります。 +追加して保存したら、以下のようにbundle installコマンドを実行します。このコマンドの実行時にはネットワークへ接続が必要なため、少し時間がかかります。既に `awesome_print` Gemがインストール済みのときは、 `Installing awesome_print 1.9.2` などの表示は出ません。また、各Gemのバージョンや、Bundle complete!につづけて表示される数字は異なることがあります。 ```console $ bundle install ... -Using awesome_print 1.9.2 +Installing awesome_print 1.9.2 ... -Bundle complete! 18 Gemfile dependencies, 83 gems now installed. +Bundle complete! 24 Gemfile dependencies, 131 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. ``` -これでawesome_print gemを使う準備は完了です。試しにrails consoleを起動して、apメソッドを使ってみましょう。 +これでawesome_print Gemを使う準備は完了です。試しにrails consoleを起動して、apメソッドを使ってみましょう。 ```console $ rails c @@ -99,23 +95,23 @@ $ rails c ] => nil > ap Book.first -irb(main):002:0> ap Book.last - (1.0ms) SELECT sqlite_version(*) -Book Load (0.4ms) SELECT "books".* FROM "books" ORDER BY "books"."id" ASC LIMIT ? [["LIMIT", 1]] # { - :id => 1, - :title => "RubyとRailsの学習ガイド", - :memo => "Rails関連技術地図とそれらの学習資料の紹介", - :created_at => Fri, 07 Jan 2022 02:06:03.593544000 UTC +00:00, - :updated_at => Fri, 07 Jan 2022 02:06:03.593544000 UTC +00:00 +Book Load (0.2ms) SELECT "books".* FROM "books" ORDER BY "books"."id" ASC LIMIT 1 + /*application='BooksApp'*/ +# { + :id => 1, + :title => "RubyとRailsの学習ガイド", + :memo => "Railsの関連技術地図とそれらの学習資料", + :created_at => 2025-04-28 07:22:27.108228000 UTC +00:00, + :updated_at => 2025-04-28 07:22:27.108228000 UTC +00:00, } => nil ``` -ターミナルに改行されて色がついて読み易く表示されているかと思います。またRailsアプリではrequireを書く必要がありません。ちなみに、書いても問題ありません。requireは複数回実行しても問題ないためです。 +位置が揃えて改行され、色がついて読みやすく表示されているかと思います。またRailsアプリではrequireを書く必要がありません。ちなみに、requireは複数回実行しても問題ないため、requireを書いても問題ありません。 公開されているRubyで書かれたプログラムにGemfileが添えられていたときにはbundle installコマンドを実行してからプログラムを実行してみましょう。多くの場合、ドキュメントにその旨が書かれていますが、暗黙の了解で省略されていることもあります。 -また、Gemfileを変更してbundle installコマンドを実行すると、Gemfile.lockというファイルが作成されます。Gemfile.lockには、使われているGem名とそのバージョン情報が記録されています。Gemfile.lockは自動で作られるものなので、編集する必要はありません。ソースコードを保管するときは、GemfileとGemfile.lockの両方のファイルを保管してください。 +また、bundle installコマンドを実行すると、Gemfileと同じフォルダにGemfile.lockというファイルが作成されます。Gemfile.lockには、使われているGem名とそのバージョン情報が記録されています。Gemfile.lockは自動で作られるものなので、編集する必要はありません。ソースコードを保管するときは、GemfileとGemfile.lockの両方のファイルを保管してください。 2つのファイルの違いを例え話で説明すると、GemfileはGemをインストールするための発注書です。Gemfileに使いたいGem名を書いて、bundle installコマンドを実行すると、発注書に従ってGemがインストールされます。Gemfile.lockは納品書です。発注書にもとづいて実際にインストールされたGemとそのバージョン情報などが書かれています。 @@ -123,7 +119,7 @@ Book Load (0.4ms) SELECT "books".* FROM "books" ORDER BY "books"."id" ASC LIMIT 各Gemは随時、新しいバージョンがリリースされます。Gemfileに書かれたGemの新しいバージョンをインストールしたい場合は`bundle update`コマンドを使います。実行すると、新しいバージョンのGemがあればインストールして、Gemfile.lockファイルを更新します。`bundle update`コマンドを実行すると、Gemfile中のすべてのGemがバージョンアップ対象となります。 -特定のGemだけをバージョンアップしたい場合は、`bundle update Gem名` とGem名をつけて実行すればOKです。指定したGemが利用している他のGemがある場合は、セットでバージョンアップされます。 +特定のGemだけをバージョンアップしたい場合は、`bundle update Gem名` とGem名をつけて実行すればOKです。指定したGemが利用している他のGemがある場合は、あわせてバージョンアップされます。 ## Gemfileに書かれたGemを使って実行する @@ -137,23 +133,23 @@ bundle exec rake -T このように、実行したいコマンドの前にbundle execと書くことで、Gemfile, Gemfile.lockに書かれたバージョンのGemを使って実行します。bundle execに続けて、railsコマンドのほか、rubyコマンド、rakeコマンド、irbコマンドなど、Rubyに関係するあらゆるコマンドを書くことができます。 -ところで、ここまでrailsコマンドを使ってきましたが、ここにbundle execを書かなくてもいいのでしょうか?答えは、「書く必要はない」です。railsコマンドを実行すると、bin/railsファイルが実行され、その中でbundle exec相当の処理を行っています。 +ところで、ここまでrailsコマンドを使ってきましたが、ここにbundle execを書かなくても良いのでしょうか?答えは、「書く必要はない」です。railsコマンドを実行すると、bin/railsファイルが実行され、その中でbundle exec相当の処理を行っています。 ## Gemfileでのバージョン指定 利用するバージョンを指定したい場合は、Gemfileにバージョンを追記します。RailsアプリのGemfileを見ると、いくつかバージョンがすでに指定してあるものがあります。 ```ruby -gem 'capybara', '>= 2.15' +gem "sqlite3", ">= 2.1" ``` -これは「capybara Gemのバージョンは、2.15以上」という意味の指定になります。これは数式の意味と同じですね。一方、こんな見慣れないバージョン指定表記があります。 +これは「sqlite3 Gemのバージョンは、2.1以上」という意味の指定になります。これは数式の意味と同じですね。一方、こんな見慣れないバージョン指定表記があります。 ```ruby -gem 'sqlite3', '~> 1.4' +gem "rails", "~> 8.0.2" ``` - ~> という記号、このケースでは、`>= 1.4.0` かつ `< 1.5` という意味になります。小さいバージョンアップは受け入れて、大きなバージョンアップは受け入れない、という記号です。 + ~> という記号、このケースでは、`>= 8.0.2` かつ `< 8.1` という意味になります。小さいバージョンアップは受け入れて、大きなバージョンアップは受け入れない、という記号です。バージョン8.0.2.1や8.0.3はインストールされますが、バージョン8.1や9.0はインストールされません。 バージョンの表記の仕様は [Bundlerのページ](https://bundler.io/gemfile.html) に解説されています。 diff --git a/_posts/07_picture_upload.md b/_posts/07_picture_upload.md index 29a793be..882fd8d3 100644 --- a/_posts/07_picture_upload.md +++ b/_posts/07_picture_upload.md @@ -1,6 +1,6 @@ # 画像アップロード機能の追加 -アプリに画像アップロード機能を追加します。画像情報を格納するためのDBカラムを追加し、carrierwave gemを利用して画像アップロード機能を実装します。 +アプリに画像アップロード機能を追加します。画像情報を格納するためのDBカラムを追加し、carrierwave Gemを利用して画像アップロード機能を実装します。 この章では「CRUDの基礎とindexアクション」でつくったbooks_appを引き続き題材に使っていきます。モデルの章の後半で行ったbooksテーブルにauthorカラムを追加した後の状態を想定していますが、authorカラムの追加作業は行わなくてもこの章の内容は実行可能です。 @@ -26,12 +26,10 @@ create db/migrate/20220109012706_add_picture_to_books.rb 作成されたmigrationファイルは以下のようになっています。 -``` -db/migrate/20220109012706_add_picture_to_books.rb -``` +`db/migrate/20220109012706_add_picture_to_books.rb` ```ruby -class AddPictureToBooks < ActiveRecord::Migration[7.0] +class AddPictureToBooks < ActiveRecord::Migration[8.0] def change add_column :books, :picture, :string end @@ -50,15 +48,15 @@ $ rails db:migrate == 20220109012706 AddPictureToBooks: migrated (0.0008s) ======================= ``` -## carrierwave gemを追加 +## carrierwave Gemを追加 -次は画像upload機能を持つライブラリcarrierwave gemを追加します。gemを追加する場合はGemfileへ追記します。記述する場所はどこでも良いのですが、今回は一番最後の行へ追記することにします。Gemfileへ次の一行を追加して保存します。 +次は画像upload機能を持つライブラリcarrierwave Gemを追加します。Gemを追加する場合はGemfileへ追記します。記述する場所はどこでも良いのですが、今回は一番最後の行へ追記することにします。Gemfileへ次の一行を追加して保存します。 ```ruby gem "carrierwave" ``` -Gemfileの内容でgemを利用できるようにbundle installコマンドをターミナルで実行します(メッセージ中"Installing carrierwave 2.2.3"や"17 Gemfile dependencies, 84 gems now installed."の数字は異なる場合があります)。 +Gemfileの内容でgemを利用できるようにbundle installコマンドをターミナルで実行します(メッセージ中"Installing carrierwave 3.1.1"や"23 Gemfile dependencies, 130 gems now installed."の数字は異なる場合があります)。 ```bash $ bundle install @@ -67,15 +65,15 @@ $ bundle install ```console $ bundle install ... -Installing carrierwave 2.2.3 +Installing carrierwave 3.1.1 ... -Bundle complete! 17 Gemfile dependencies, 84 gems now installed. +Bundle complete! 23 Gemfile dependencies, 130 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. ``` -bundle installコマンドを実行すると、Gemfileに書かれたgemがまだなければインストールし利用可能にします。また、Gemfile.lockに利用するバージョンが書き込まれます。 +bundle installコマンドを実行すると、Gemfileに書かれたGemがまだなければインストールし利用可能にします。また、Gemfile.lockに利用するバージョンが書き込まれます。 -続いて、carrierwaveを利用可能にするために、carrierwaveが提供する`rails g uploader Picture`コマンドを実行して必要なファイルを作成します。Rails6.1以前の環境では、事前に`bin/spring stop`コマンドを実行し、springというキャッシュの仕組みを再起動しておきます。Rails7.0以降ではspringがデフォルトでインストールされなくなったので、`bin/spring stop`コマンドは不要です。 +続いて、carrierwaveを利用可能にするために、carrierwaveが提供する`rails g uploader Picture`コマンドを実行して必要なファイルを作成します。 ```bash $ rails g uploader Picture @@ -109,8 +107,8 @@ class Book < ApplicationRecord class BooksController < ApplicationController ... def book_params -- params.require(:book).permit(:title, :memo, :author) -+ params.require(:book).permit(:title, :memo, :author, :picture) +- params.expect(book: [ :title, :memo, :author ]) ++ params.expect(book: [ :title, :memo, :author, :picture ]) end end ``` @@ -131,7 +129,7 @@ end
<%= form.label :memo, style: "display: block" %> - <%= form.text_area :memo %> + <%= form.textarea :memo %>
@@ -212,6 +210,6 @@ uploadした画像ファイルがブラウザに表示されているのを確 ポイントをまとめます。 -- carrierwave gemを使うと画像アップロード機能を追加できる -- Gemfileに新しいgemを追加した後、bundle installコマンドでインストールする +- carrierwave Gemを使うと画像アップロード機能を追加できる +- Gemfileに新しいGemを追加した後、bundle installコマンドでインストールする - マイグレーションファイルの生成はrails g migration Addカラム名Toテーブル名 カラム名:型名 diff --git a/_posts/08_postface.md b/_posts/08_postface.md index ebd4b881..d53b70c1 100644 --- a/_posts/08_postface.md +++ b/_posts/08_postface.md @@ -20,14 +20,14 @@ Gitはソースコードを管理するシステムであり、遠隔地にあ ### つくったアプリを公開する -ここまで作ったアプリをWebサービスとして公開するには、PaaS(Platform as a Service)と呼ばれるサービスを使うとかんたんに公開できます。アプリケーションのソースコードを転送するだけでWebサービスを公開できるので、AWSなどのサーバを借りるタイプのものと比べて手軽に使うことができます。RailsアプリではHerokuと呼ばれるサービスがよく使われています。資料としては、 [『RailsGirlsガイド Heroku に Rails アプリをアップ』](https://railsgirls.jp/heroku) のページが最新の情報へとメンテナンスされていることが多くお勧めです。 +ここまで作ったアプリをWebサービスとして公開するには、PaaS(Platform as a Service)と呼ばれるサービスを使うとかんたんに公開できます。アプリケーションのソースコードを転送するだけでWebサービスを公開できるので、AWSなどのサーバを借りるタイプのものと比べて手軽に使うことができます。RailsアプリではHerokuと呼ばれるサービスがよく使われているようです。資料としては、 [『RailsGirlsガイド Heroku に Rails アプリをアップ』](https://railsgirls.jp/heroku) のページが最新の情報にメンテナンスされていることが多くお勧めです。 - RailsGirlsガイド Heroku に Rails アプリをアップ - [https://railsgirls.jp/heroku](https://railsgirls.jp/heroku) ### 学び方の資料 -Railsを学びはじめると、Webサービスにはたくさんの技術が使われていることに気づきます。いま学んでいるこの技術は全体の中でどんな位置づけなんだろう?次は何を学べばいいのだろう?「RubyとRailsの学習ガイド」はRubyそしてRailsを学ぶ旅のガイドブックです。技術を学び、戻ってくるたびにレベルアップする、Webサービスを作る技術者の冒険の旅をサポートする地図です。各技術を学ぶための資料や書籍の情報を書いています。 +Railsを学びはじめると、Webサービスにはたくさんの技術が使われていることに気づきます。いま学んでいるこの技術は全体の中でどんな位置づけなんだろう?次は何を学べばいいのだろう?RubyそしてRailsを学ぶ旅のガイドブックとして「RubyとRailsの学習ガイド」があります。技術を学び、戻ってくるたびにレベルアップする、Webサービスを作る技術者の冒険の旅をサポートする地図です。各技術を学ぶための資料や書籍の情報を書いています。 - RubyとRailsの学習ガイド 2023 - 五十嵐邦明 著 [https://igaigarb.booth.pm](https://igaigarb.booth.pm) @@ -40,9 +40,12 @@ Railsを学びはじめると、Webサービスにはたくさんの技術が使 - Ruby on Rails ガイド - [https://railsguides.jp](https://railsguides.jp) - - 電子書籍版 [https://tatsu-zine.com/books/railsguides](https://tatsu-zine.com/books/railsguides) - RailsガイドにはRailsの多くの機能についての説明が書かれています。私はRailsの機能の使い方がわからないときに最初にあたるサイトとしてつかっています。調べ物でつかうのも良いですが、一度通読しておくと、どのような機能があるかを把握できるのでその後の開発を加速させることができます。Railsの機能開発とセットで書かれているため、最新バージョンのRailsに対応した記事を読むことができます。たまに読み返すと、新機能が追記されていて「こんな書き方もできるのか」と勉強になります。時間をかけてでも全体へ目を通す価値のある資料です。本書でも各章の最後に、その章の内容に該当するRailsガイドへのリンクを書いているのでぜひ読んでみてください。 +- Ruby on Rails ガイド 「Rails をはじめよう」 + - [https://railsguides.jp/getting_started.html](https://railsguides.jp/getting_started.html) + - RailsガイドにあるRailsの入門記事です。ECサイトアプリをRailsが標準で用意している機能のいくつかをつかってつくる方法を説明しています。本書「Railsの教科書」を読んだあとに、もう少し大きなアプリをつくることはとても良い練習になるので、このページをお勧めします。 + - api.rubyonrails.org - [https://api.rubyonrails.org](https://api.rubyonrails.org) - Railsのリファレンスページです。メソッド名やクラス名で検索することができます。Railsのコード中に書かれたドキュメントを、読みやすく検索しやすく提供しているページです。また、各メソッドの説明からGitHubの該当ソースコードへのリンクも貼られているので、ソースコードを調べる入り口としても便利です。詳しく説明が書かれているので、知らない機能について調べるときに最初に読む資料としてRailsガイドとあわせてお勧めです。 @@ -53,27 +56,14 @@ Railsを学びはじめると、Webサービスにはたくさんの技術が使 - Ruby on Rails チュートリアル - [https://railstutorial.jp](https://railstutorial.jp) - - 電子書籍版 [https://tatsu-zine.com/books/railstutorial](https://tatsu-zine.com/books/railstutorial) - Railsアプリを作りながら学ぶWeb上の資料です。Railsを学ぶ初期の資料として定番のものです。実際にアプリを作りながら知識を深めたいという方へお勧めです。特徴として、有料の解説動画も購入できるようになっています。文章だけでなく、動画もあわせて学びたい方にもおすすめです。Rails7.0対応。 - はじめてつくるWebアプリケーション 〜Ruby on Railsでプログラミングへの第一歩を踏み出そう - 江森真由美、やだけいこ、小林智恵 著 技術評論社 ISBN: 978-4297134686 - はじめてプログラミングにチャレンジする人へ向けた1冊です。環境構築からはじめ、RailsでシンプルなWebアプリを実際に作る一連の流れがわかるようになっています。読者がつまずきやすそうなポイントは特に手厚く解説し、プログラミングの楽しさやWebアプリの基礎を知ることができるように工夫されています。Rails7.0対応。 -- 現場で使える Ruby on Rails 5 速習実践ガイド - - 株式会社万葉 監修 マイナビ出版 ISBN: 978-4839962227 - - Railsの基礎知識を広く学べる、通称『現場Rails』と呼ばれる書籍です。Railsの基礎を網羅的に説明しています。Railsの受託開発や開発支援を長年つづけている株式会社万葉のみなさんが執筆されているので、タイトル通り現場で使える技術に即した内容です。Rails5.2対応。 - -- 独習Ruby on Rails - - 小餅良介 著 翔泳社 ISBN: 978-4798160689 - - Railsの基礎を丁寧に解説した入門書です。ひとつひとつの機能に対して図を多くつかってわかりやすく説明しています。Rails5.2対応。 - -- Ruby on Rails 6 実践ガイド - - 黒田努 著 インプレス ISBN: 978-4295008057 - - Railsの入門書籍です。サンプルアプリつくりを通してRailsの各機能を説明していきます。必要な知識を過不足なく順序よく並べて説明しています。最初の版から良い内容でしたが、積み重ねた改訂によりさらに磨きがかかっています。Rails6.0対応。 - - パーフェクトRuby on Rails 【増補改訂版】 - - すがわらまさのり、前島真一、橋立友宏、五十嵐邦明、後藤優一 著 技術評論社 ISBN: 9784297114626 + - すがわらまさのり、前島真一、橋立友宏、五十嵐邦明、後藤優一 著 技術評論社 ISBN: 978-4297114626 - Railsの基礎から応用まで網羅した書籍です。実際にRailsでプロダクトを作っている著者陣がそのノウハウを踏まえて体系的にRailsを解説しています。他の本ではあまり解説されていない踏み込んだ内容まで説明されていたり、また、サンプルアプリを手を動かして作ることができるのも良いところです。初級者から中級者へのステップアップに。Rails6.0対応。 ### Rubyを学ぶ資料 @@ -88,13 +78,9 @@ RailsはRubyというプログラミング言語で作られています。Ruby - 五十嵐邦明、松岡浩平 著 技術評論社 ISBN: 978-4297101237 - 私と松岡さんで書き、べこさんがイラストを担当した書籍です。プログラミングが初めての方へ向けた、Rubyプログラミングの入門書です。プログラミングの基礎である条件分岐、繰り返しの概念を図解を入れて丁寧に説明します。そしてRubyでよく使われる整数、文字列、配列、ハッシュと言ったオブジェクトを説明しています。また、エラー時の対処方法、リファレンスマニュアルの調べ方、デバッグの基礎も学べるので、自分で調べる力をつけることができます。Railsで必要となる知識を学ぶことをゴールにしているので、メソッドやクラス、モジュールの作り方、使い方など、最低限必要となる知識を効率良く学べます。加えて、Gemとそれを束ねるBundlerの使い方を学べます。第4刷よりRuby3.2に対応しました。 -- たのしいRuby 第6版 - - 高橋征義、後藤裕蔵 著 SBクリエイティブ ISBN: 978-4797399844 - - Rubyプログラミングに必要な知識を幅広く説明していて、この本でカバーしていないRubyの知識を探すのが難しいほどです。15年以上に渡って改訂されて読み継がれている名著です。Ruby2.6対応。 - - プロを目指す人のためのRuby入門 改訂2版 - 伊藤淳一 著 技術評論社 ISBN: 978-4297124373 - - Rubyプログラミングの実践技術を学ぶ本です。「いくつかの書き方があるが、このケースではこう書くと良い」という著者のお勧めに沿ってRubyでの自然な書き方を学べます。テストの書き方やデバッグ方法の説明に加え、Ruby3.0で導入された新機能についても説明があります。改訂してRuby3.0に対応しています。 + - Rubyプログラミングの実践技術を学ぶ本です。「いくつかの書き方があるが、このケースではこう書くと良い」という著者のお勧めに沿ってRubyでの自然な書き方を学べます。テストの書き方やデバッグ方法の説明に加え、Ruby3.0で導入された新機能についても説明があります。改訂2版でRuby3.0に対応しています。 - まんがでわかるRuby - youchan、湊川あい 著 [https://booth.pm/ja/items/1306534](https://booth.pm/ja/items/1306534) @@ -111,12 +97,12 @@ HTMLとCSSをつかったデザインを学ぶ資料としては、 [サルワ ## Rubyコミュニティ -なにより、自分で作りたいアプリを作ってみるのが一番勉強になります。作っている上で、もしもつまづき、インターネットで検索しても分からないことがあったときには、近くのRubyコミュニティへぜひ足を運んでみてください。新しいRubyist(あなたのことです!)を温かく迎えてくれるはずです。Rubyコミュニティは「都市名.rb」という名前で活動していることが多いです。全国各地のRubyコミュニティについて、[地域Rubyの会](https://github.com/ruby-no-kai/official/wiki/RegionalRubyistMeetUp)のページに情報がまとまっています。また、[RubyKaigi](https://rubykaigi.org)や[地域Ruby会議](https://regional.rubykaigi.org)と呼ばれるカンファレンスも定期的に開催されています。2020年以降はオンラインで開催されるRubyコミュニティも増えて、全国どこからでも参加しやすくなっています。 +なにより、自分で作りたいアプリを作ってみるのが一番勉強になります。作っている上で、もしもつまづき、インターネットで検索しても分からないことがあったときには、近くのRubyコミュニティへぜひ足を運んでみてください。新しいRubyist(あなたのことです!)を温かく迎えてくれるはずです。Rubyコミュニティは「地域名.rb」という名前で活動していることが多いです。全国各地のRubyコミュニティについて、[地域.rb](https://scrapbox.io/ruby-jp/%E5%9C%B0%E5%9F%9F.rb)のページに情報がまとまっています。また、[RubyKaigi](https://rubykaigi.org)や[地域Ruby会議](https://regional.rubykaigi.org)と呼ばれるカンファレンスも定期的に開催されています。現地開催に加え、オンラインでの開催も増えており、全国どこからでもRubyコミュニティに参加しやすくなっています。 ネット上の集まりとして、[ruby-jp](https://ruby-jp.github.io/)という、Rubyistが集まるSlackワークスペースもあります。2000人以上が参加し、RubyやRailsに限らず、あらゆる技術について話をしています。質問をするチャンネルもありますので、つまづいたことがあるときに聞いてみるときっと回答が返ってくると思います。技術以外にも、各地のカンファレンスやミートアップの情報について話したりするのはもちろん、つくった料理の紹介や語学学習情報の交換など、さまざまな話題を扱うチャンネルがあります。 -- 地域Rubyの会 - - [https://github.com/ruby-no-kai/official/wiki/RegionalRubyistMeetUp](https://github.com/ruby-no-kai/official/wiki/RegionalRubyistMeetUp) +- 地域.rb + - [https://scrapbox.io/ruby-jp/地域.rb](https://scrapbox.io/ruby-jp/%E5%9C%B0%E5%9F%9F.rb) - RubyKaigi - [https://rubykaigi.org](https://rubykaigi.org) - 地域Ruby会議 @@ -126,9 +112,9 @@ HTMLとCSSをつかったデザインを学ぶ資料としては、 [サルワ ## 謝辞 -本書は2012年4月から始めた一橋大学での講義資料からはじまり、そのあと幾度かの改訂を経て現在へ至ります。当時はRuby1.9, Rails3.2という環境でしたので、現在のRuby3.2, Rails7.0までの道のりで、Rubyは11回、Railsは9回のバージョンアップを重ねたことになります。10年前から同じ言語、同じフレームワークを使って仕事ができていることは本当にすごいことです。Railsコアチームのみなさん、コントリビュータのみなさん、GemなどOSS開発者のみなさんへ感謝します。 +本書は2012年4月から始めた一橋大学での講義資料からはじまり、そのあと幾度かの改訂を経て現在へ至ります。当時はRuby1.9, Rails3.2という環境でしたので、現在のRuby3.4, Rails8.0までの道のりで、Rubyは13回、Railsは12回のバージョンアップを重ねたことになります。10年前から同じ言語、同じフレームワークを使って仕事ができていることは本当にすごいことです。Rubyコアチームのみなさん、Railsコアチームのみなさん、コントリビュータのみなさん、GemなどOSS開発者のみなさんへ感謝します。 -素晴らしい言語とコミュニティをつくってくれたmatzさんこと、まつもとゆきひろさん、Rubyコアチームのみなさん、そしてRubyistのみなさんへ感謝します。matzさんのおかげで私の人生はたのしいことをたくさん経験できています。 +素晴らしい言語とコミュニティをつくってくれたMatzさんこと、まつもとゆきひろさん、Rubyコアチームのみなさん、そしてRubyistのみなさんへ感謝します。Matzさんのおかげで私の人生はたのしいことをたくさん経験できています。 この講義資料を最初につくったときにレビューをしてくれた濱崎健吾さんへ感謝します。講義にもTAとして参加し、毎回の講義の内容についても一緒に考えてくれて、大変心強かったし、なによりたのしい時間でした。 @@ -138,7 +124,7 @@ HTMLとCSSをつかったデザインを学ぶ資料としては、 [サルワ 達人出版会の高橋征義さん、山根ゆりえさん、大変お世話になりました。教科書を書き始めた2012年からの4年間を電子書籍という形でまとめられたことを嬉しく思っています。レビューの内容ももちろん、レビュー方法も勉強になりました。 -改訂にあたり図を描いてくださったべこさんへ深く感謝します。HTML/CSSを活用して、どんどんバージョンアップしていくRailsを楽に追いかけていけるように工夫してくださいました。また、わかりやすい図を目指して一緒に考えてくださいました。 +改訂にあたり図や表紙を描いてくださったべこさんへ深く感謝します。HTML/CSSを活用して、どんどんバージョンアップしていくRailsを楽に追いかけていけるように工夫してくださいました。また、わかりやすい図を目指して一緒に考えてくださいました。 執筆スポンサーとして協賛いただき、私の執筆時間をつくってくださった株式会社フィヨルド、株式会社ギフティの各社様に感謝いたします。Rubyを学ぶ人たちへより多くの学習資料を届けるという趣旨に賛同いただき、深く感謝します。 @@ -148,16 +134,16 @@ HTMLとCSSをつかったデザインを学ぶ資料としては、 [サルワ - 五十嵐邦明 - ガーネットテック373株式会社 -- twitter: igaiga555 +- X: igaiga555 - https://garnettech373.com -群馬高専出身。フリーランスのRuby, Railsエンジニア。2003年、Rubyで書かれたWeb日記アプリtDiaryを使い始めてRubyistになる。一橋大学の非常勤講師として2012年から2年間、RubyとRailsを教える。受託開発会社、Webサービス開発会社CTOなどを経て2017年よりフリーランス、2019年ガーネットテック373株式会社を設立、同社代表取締役社長。RubyWorld ConferenceやRubyConf台湾などで講演。島根県Ruby合宿、Rails Girls、フィヨルドブートキャンプ、大名エンジニアカレッジなどで講師役を務める。著書に『ゼロからわかる Ruby超入門』、『Railsの教科書』、『Railsの練習帳』、『パーフェクトRuby on Rails[増補改訂版]』、『RubyとRailsの学習ガイド』ほか。 +群馬高専出身。フリーランスのRuby, Railsエンジニア。2003年、Rubyで書かれたWeb日記アプリtDiaryをつかい始めてRubyistになる。一橋大学の非常勤講師として2012年から2年間、RubyとRailsを教える。2019年ガーネットテック373株式会社を設立、同社代表取締役社長。Kaigi on Rails、RubyWorld Conference、RubyConf台湾などで講演。島根県Ruby合宿、Rails Girls、フィヨルドブートキャンプ、大名エンジニアカレッジなどで講師役を務める。著書に『ゼロからわかる Ruby超入門』、『Railsの教科書』、『Railsの練習帳』、『パーフェクトRuby on Rails[増補改訂版]』、『RubyとRailsの学習ガイド』ほか。 ## デザイナー略歴 - べこ - べころもち工房 -- twitter: becolomochi +- X: becolomochi - https://becolomochi.com 群馬高専卒業後、印刷会社にDTPオペレータとして入社。そののち関連企業のWebシステム開発部署へWebデザイナーとして異動。現在会社員兼自営業で活動中。 diff --git a/_review/.ruby-version b/_review/.ruby-version index 94ff29cc..f9892605 100644 --- a/_review/.ruby-version +++ b/_review/.ruby-version @@ -1 +1 @@ -3.1.1 +3.4.4 diff --git a/_review/Gemfile.lock b/_review/Gemfile.lock index 8e294346..6011a003 100644 --- a/_review/Gemfile.lock +++ b/_review/Gemfile.lock @@ -1,20 +1,26 @@ GEM remote: https://rubygems.org/ specs: - image_size (3.0.1) + csv (3.3.4) + image_size (3.4.0) md2review (1.12.1) redcarpet (> 2.0.0) + nkf (0.2.0) pastel (0.8.0) tty-color (~> 0.5) - rake (13.0.6) - redcarpet (3.5.1) - review (5.4.0) + rake (13.2.1) + redcarpet (3.6.1) + review (5.10.0) + csv image_size + nkf + rexml rouge rubyzip tty-logger - rouge (3.28.0) - rubyzip (2.3.2) + rexml (3.4.1) + rouge (4.5.2) + rubyzip (2.4.1) tty-color (0.6.0) tty-logger (0.6.0) pastel (~> 0.8) @@ -29,4 +35,4 @@ DEPENDENCIES review BUNDLED WITH - 2.2.33 + 2.6.9 diff --git a/_review/bin/change_images_gray.rb b/_review/bin/change_images_gray.rb index 1b439f3a..8ac230dc 100644 --- a/_review/bin/change_images_gray.rb +++ b/_review/bin/change_images_gray.rb @@ -1,6 +1,6 @@ # $ ruby bin/change_images_gray.rb # モノクロ版作成用。カラー画像をモノクロ化。 -# imagemagickのconvertコマンドを利用 Dir.glob("images/**/*.*").each do |filename| - system("convert -type GrayScale #{filename} #{filename}") + # imagemagickのconvert機能をつかう + system("magick -type GrayScale #{filename} #{filename}") end diff --git a/_review/config.yml b/_review/config.yml index d088fcd9..ad17f6f5 100644 --- a/_review/config.yml +++ b/_review/config.yml @@ -31,8 +31,8 @@ subtitle: |- # 著者名。「, 」で区切って複数指定できる # 読みを入れる例 aut: [{name: "青木峰郎", file-as: "アオキミネロウ"}, {name: "武藤健志", file-as: "ムトウケンシ"}, {name: "高橋征義", file-as: "タカハシマサヨシ"}, {name: "角征典", file-as: "カドマサノリ"}] -aut: ["五十嵐邦明 ガーネットテック373株式会社 / twitter: igaiga555"] -dsr: ["becolomochi / twitter: becolomochi"] +aut: ["五十嵐邦明 ガーネットテック373株式会社 / X: igaiga555"] +dsr: ["becolomochi / X: becolomochi"] pbl: Ruby超入門オブジェクトさんファンクラブ prt: 日光企画 @@ -73,16 +73,16 @@ prt: 日光企画 # a-trl, trl: 翻訳者 # 刊行日(省略した場合は実行時の日付) -date: 2023-05-11 +date: 2025-05-11 # 発行年月。YYYY-MM-DD形式による配列指定。省略した場合はdateを使用する # 複数指定する場合は次のように記述する # [["初版第1刷の日付", "初版第2刷の日付"], ["第2版第1刷の日付"]] # 日付の後ろを空白文字で区切り、任意の文字列を置くことも可能。 -history: [["2023-05-11 v2.2.0 Ruby 3.2.2 Rails 7.0.4.3 RubyKaigi2023, 技術書典14", "2022-09-10 v2.1.3 技術書典13", "2022-03-23 v2.1.2 達人出版会", "2022-01-22 v2.1.0 Ruby 3.1.0 Rails 7.0.1 技術書典12", "2020-02-29 v2.0.0 Ruby 2.7.0 Rails 6.0.2.1 技術書典8", "2017-08-20 v1.2.0 Ruby 2.4.1 Rails 5.1.2", "2016-07-26 v1.0.0 Ruby 2.3.1 Rails 5.0.0", "2016-03-31 v0.9.0 Ruby 2.3.0 Rails 5.0.0beta3 初版"]] +history: [["2025-05-11 v2.3.0 Ruby 3.4.3 Rails 8.0.2 技術書典18", "2023-05-11 v2.2.0 Ruby 3.2.2 Rails 7.0.4.3 RubyKaigi2023, 技術書典14", "2022-01-22 v2.1.0 Ruby 3.1.0 Rails 7.0.1 技術書典12, 技術書典13", "2020-02-29 v2.0.0 Ruby 2.7.0 Rails 6.0.2.1 技術書典8", "2017-08-20 v1.2.0 Ruby 2.4.1 Rails 5.1.2", "2016-07-26 v1.0.0 Ruby 2.3.1 Rails 5.0.0", "2016-03-31 v0.9.0 Ruby 2.3.0 Rails 5.0.0beta3 初版"]] # [experimental] 新刊を頒布したイベント名(例:「技術書典6(2019年春)新刊」) -pubevent_name: 技術書典12 +pubevent_name: 技術書典 # 権利表記(配列で複数指定可) -rights: (C) 2016-2023 五十嵐邦明, becolomochi +rights: (C) 2016-2025 五十嵐邦明, becolomochi # description: 説明 # subject: 短い説明用タグ(配列で複数指定可) # type: 書籍のカテゴリーなど(配列で複数指定可) diff --git a/_review/contents/01_preface.re b/_review/contents/01_preface.re index 09361177..37cca993 100644 --- a/_review/contents/01_preface.re +++ b/_review/contents/01_preface.re @@ -10,7 +10,7 @@ -@{- matz} +@{- Matz} //} diff --git a/_review/contents/02_smallest_app.re b/_review/contents/02_smallest_app.re index 2afad498..36d7c1af 100644 --- a/_review/contents/02_smallest_app.re +++ b/_review/contents/02_smallest_app.re @@ -67,14 +67,15 @@ $ rails s //emlist[][console]{ $ rails s => Booting Puma -=> Rails 7.0.4.3 application starting in development +=> Rails 8.0.2 application starting in development => Run `bin/rails server --help` for more startup options Puma starting in single mode... -* Puma version: 5.6.5 (ruby 3.2.2-p53) ("Birdie's Version") -* Min threads: 5 -* Max threads: 5 +* Puma version: 6.6.0 ("Return to Forever") +* Ruby version: ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [arm64-darwin22] +* Min threads: 3 +* Max threads: 3 * Environment: development -* PID: 30819 +* PID: 50873 * Listening on http://127.0.0.1:3000 * Listening on http://[::1]:3000 Use Ctrl-C to stop @@ -217,7 +218,7 @@ Use Ctrl-C to stop //emlist[][diff]{ -

現在時刻: <%= Time.current %>

-+

現在時刻: <%= Time.current.in_time_zone('Asia/Tokyo') %>

++

現在時刻: <%= Time.current.in_time_zone("Asia/Tokyo") %>

//} @@ -241,7 +242,7 @@ Use Ctrl-C to stop //emlist[][diff]{ class HelloController < ApplicationController def index -+ @time = Time.current.in_time_zone('Asia/Tokyo') ++ @time = Time.current.in_time_zone("Asia/Tokyo") end end //} @@ -255,7 +256,7 @@ end //emlist[][diff]{ --

現在時刻: <%= Time.current.in_time_zone('Asia/Tokyo') %>

+-

現在時刻: <%= Time.current.in_time_zone("Asia/Tokyo") %>

+

現在時刻: <%= @time %>

//} @@ -270,7 +271,7 @@ end === コラム: タイムゾーンの設定 -今回の @{Time.current.in_time_zone('Asia/Tokyo')} はこの場所で使う時刻だけを日本時間へ変更しました。この方法のほかに、アプリ全体でタイムゾーンを日本時間に設定する方法もあります。その場合はconfig/application.rbファイル中に @{config.time_zone = 'Asia/Tokyo'} と設定します。この方法の利点は、プログラムの中のあちこちで @{in_time_zone('Asia/Tokyo')} を書かずに済み、config/application.rbファイルの1カ所にまとめることができることです。 +今回の @{Time.current.in_time_zone("Asia/Tokyo")} はこの場所で使う時刻だけを日本時間へ変更しました。この方法のほかに、アプリ全体でタイムゾーンを日本時間に設定する方法もあります。その場合はconfig/application.rbファイル中に @{config.time_zone = "Asia/Tokyo"} と設定します。この方法の利点は、プログラムの中のあちこちで @{in_time_zone("Asia/Tokyo")} を書かずに済み、config/application.rbファイルの1カ所にまとめることができることです。 == Webアプリはどのように動作しているか @@ -421,7 +422,6 @@ create README.md create Rakefile ... (略) create app -create app/assets/config/manifest.js create app/assets/stylesheets/application.css ... (略) //} @@ -537,7 +537,7 @@ Routesは「リクエストのURLとHTTPメソッド」に応じて次に処理 -では、対応表であるRoutes表を見て見ましょう。rails serverを起動させて @{/rails/info/routes} へアクセスしてみてください。Routes表の見方を説明したのが次の図です。 +では、対応表であるRoutes表を見て見ましょう。rails serverを起動させて @{/rails/info/routes} へアクセスしてみてください。Routes表の見方を説明したのが次の図です。実際のRoutes表はもっと長いのですが、本書では説明に関係する行だけを載せています。 @@ -551,7 +551,7 @@ Routesは「リクエストのURLとHTTPメソッド」に応じて次に処理 -右端の"Controller#Action"が処理の移るコントローラとアクションを示しています。ここでは "hello#index" と書かれていますが、#の左側がコントローラ名、右側がアクション名です。この場合は、「HelloControllerのindexアクション」を示しています。 +"Controller#Action"が処理の移るコントローラとアクションを示しています。ここでは "hello#index" と書かれていますが、#の左側がコントローラ名、右側がアクション名です。この場合は、「HelloControllerのindexアクション」を示しています。 @@ -563,7 +563,7 @@ Routesは「リクエストのURLとHTTPメソッド」に応じて次に処理 //emlist[][ruby]{ -get 'hello/index' +get "hello/index" //} @@ -571,6 +571,10 @@ get 'hello/index' +Routes表の各行がどのファイルのどの行からつくられたかは、Routes表のSource Location列に書かれています。ここでは @{/Users/igaiga/helloworld/config/routes.rb:2} なので、@{config/routes.rb}の2行目であることを示しています。 + + + Routesについてまとめると、「RoutesはリクエストのパスとHTTPメソッドによって次の処理先であるコントローラとアクションを決める対応表」となります。 @@ -587,7 +591,7 @@ Routesについてまとめると、「RoutesはリクエストのパスとHTTP //emlist[][ruby]{ class HelloController < ApplicationController def index - @time = Time.current.in_time_zone('Asia/Tokyo') + @time = Time.current.in_time_zone("Asia/Tokyo") end end //} @@ -597,7 +601,7 @@ HelloControllerのindexアクションが呼び出されます。@{def index -このindexアクションでは@{@time}というインスタンス変数に現在時刻を代入しています。アクションの中のプログラム、ここでは @{@time = Time.current.in_time_zone('Asia/Tokyo')} は、インデント(字下げ)されて書かれます。 +このindexアクションでは@{@time}というインスタンス変数に現在時刻を代入しています。アクションの中のプログラム、ここでは @{@time = Time.current.in_time_zone("Asia/Tokyo")} は、インデント(字下げ)されて書かれます。 @@ -641,7 +645,7 @@ HelloControllerのindexアクションが呼び出されます。@{def index //} -HTMLのpタグがあります。その中にHTMLではない @{<%=} と @{%>} というタグがあります。これがRubyのコードを実行するためのタグです。ここではその中にある @{@time} が実行されます。@timeインスタンス変数にはコントローラで実行された現在時刻 @{Time.current.in_time_zone('Asia/Tokyo')} の結果が代入されているので、これがHTMLへ埋め込まれます。 +HTMLのpタグがあります。その中にHTMLではない @{<%=} と @{%>} というタグがあります。これがRubyのコードを実行するためのタグです。ここではその中にある @{@time} が実行されます。@timeインスタンス変数にはコントローラで実行された現在時刻 @{Time.current.in_time_zone("Asia/Tokyo")} の結果が代入されているので、これがHTMLへ埋め込まれます。 diff --git a/_review/contents/03_crud.re b/_review/contents/03_crud.re index 2118c3ee..57a42ebb 100644 --- a/_review/contents/03_crud.re +++ b/_review/contents/03_crud.re @@ -26,8 +26,8 @@ $ rails new books_app $ rails new books_app create ... (略) -Pin Stimulus - append config/importmap. + create db/cable_schema.rb + force config/cable.yml //} @@ -45,7 +45,7 @@ $ rails s $ rails g scaffold book title:string memo:text invoke active_record create db/migrate/20220120025416_create_books.rb -... +... (略) create app/views/books/_book.json.jbuilder $ rails db:migrate @@ -332,13 +332,15 @@ class BooksController < ApplicationController //emlist[][erb]{

<%= notice %>

+<% content_for :title, "Books" %> +

Books

- <% @books.each do |book| %> ⬅ @booksはbookがいくつか入った配列 - <%= render book %> ⬅ 個々のbookのtitleやmemoを表示 + <% @books.each do |book| %> + <%= render book %>

- <%= link_to "Show this book", book %> ⬅ Show(詳細画面)へのリンクを生成 + <%= link_to "Show this book", book %>

<% end %>
diff --git a/_review/contents/04_new_create.re b/_review/contents/04_new_create.re index 4c9021ec..3a15deb2 100644 --- a/_review/contents/04_new_create.re +++ b/_review/contents/04_new_create.re @@ -150,6 +150,8 @@ Bookクラスには色々と便利な機能があるのですが、それは後 //emlist[][erb]{ +<% content_for :title, "New book" %> +

New book

<%= render "form", book: @book %> @@ -213,7 +215,7 @@ Bookクラスには色々と便利な機能があるのですが、それは後
<%= form.label :memo, style: "display: block" %> - <%= form.text_area :memo %> + <%= form.textarea :memo %>
@@ -286,7 +288,7 @@ Railsコードの部分をもう少し詳しく見てみましょう。@{<%= -メモの部分も同様です。@{form.label :memo, style: "display: block"} が "Memo" を表示する部分です。@{form.text_area :memo} がその下のテキスト入力欄を作ります。@{text_area} は先ほどの @{text_field} よりも広くて改行を入力できるテキスト入力欄を作るメソッドです。 +メモの部分も同様です。@{form.label :memo, style: "display: block"} が "Memo" を表示する部分です。@{form.textarea :memo} がその下のテキスト入力欄を作ります。@{textarea} は先ほどの @{text_field} よりも広くて改行を入力できるテキスト入力欄を作るメソッドです。 @@ -374,7 +376,7 @@ new画面でCreate bookボタンを押すと新たなリクエストを飛ばす -//image[create_routes][routes]{ +//image[create_routes][Routes表]{ //} @@ -409,7 +411,7 @@ def create respond_to do |format| if @book.save # ⬅2. 本のデータを保存する # ⬅3a. 成功したらshow画面へ - format.html { redirect_to book_url(@book), notice: "Book was successfully created." } + format.html { redirect_to @book, notice: "Book was successfully created." } format.json { render :show, status: :created, location: @book } else # ⬅3b. 保存失敗したらnew画面へ(元の画面) @@ -442,7 +444,7 @@ def create //emlist[][ruby]{ def book_params - params.require(:book).permit(:title, :memo) + params.expect(book: [ :title, :memo ]) end //} @@ -462,7 +464,7 @@ end def book_params + p "**********" # 見つけ易くするための目印。何でも良い。 + p params # paramsの中身を表示 - params.require(:book).permit(:title, :memo) + params.expect(book: [ :title, :memo ]) end //} @@ -511,7 +513,7 @@ Processing by BooksController#create as TURBO_STREAM === Strong Parameters -@{book_params}の説明に戻ります。@{params}の後ろについている、requireとpermitとはなんでしょうか? +@{book_params}の説明に戻ります。@{params}の後ろについている、expectとはなんでしょうか? @@ -520,12 +522,16 @@ Processing by BooksController#create as TURBO_STREAM //emlist[][ruby]{ def book_params - params.require(:book).permit(:title, :memo) + params.expect(book: [ :title, :memo ]) end //} -params以降のrequire, permitメソッドは、パラメータの内容を制限します。意図していないデータが入ってくるのを防ぐための仕組みです。ここでは、bookのtitle, memoだけを受け取るようにしています。requireには対象となるモデル名(モデルについては次章で説明します)を、permitには更新を許可するカラム名を指定します。 +paramsの後ろにつづくexpectメソッドは、意図していないデータが入ってくるのを防ぐためにパラメータの内容を制限します。ここでは、bookのtitle, memoだけを受け取るようにしています。expectへ渡すキーワード引数のキーワードには対象となるモデル名を(モデルについては次章で説明します)、値には更新を許可するカラム名を配列で指定します。ここで書かれている @{expect(book: [ :title, :memo ])} では、bookモデルのtitleカラムおよびmemoカラムを許可します。 + + + +expectメソッドはRails8.0で導入されました。Rails7.2まではrequireメソッドとpermitメソッドをつかって @{params.require(:book).permit(:title, :memo)} と書きます。 @@ -552,7 +558,7 @@ def create respond_to do |format| if @book.save # ⬅2. 本のデータを保存する # ⬅3a. 成功したらshow画面へ - format.html { redirect_to book_url(@book), notice: "Book was successfully created." } + format.html { redirect_to @book, notice: "Book was successfully created." } format.json { render :show, status: :created, location: @book } else # ⬅3b. 保存失敗したらnew画面へ(元の画面) @@ -563,7 +569,7 @@ def create end def book_params - params.require(:book).permit(:title, :memo) + params.expect(book: [ :title, :memo ]) end //} @@ -586,7 +592,7 @@ Book.new(book_params)で本のデータを作ります。newはクラスの * newアクションではまだデータを保存せず、サーバのデータ変更を伴わないためHTTPメソッドGETを使う * createアクションではデータを保存し、サーバのデータ変更を伴うためHTTPメソッドPOSTを使う * ユーザーがブラウザでformへ入力した内容はリクエスト内のパラメータとしてRailsアプリへ届き、 paramsで渡ってきたパラメータを取得できる - * セキュリティ問題対策のためStrongParameters(requireメソッド、permitメソッド)を利用してparamsに制限をかける + * セキュリティ問題対策のためStrongParameters(expectメソッド)を利用してparamsに制限をかける diff --git a/_review/contents/05_model.re b/_review/contents/05_model.re index 0403823e..f02f5bac 100644 --- a/_review/contents/05_model.re +++ b/_review/contents/05_model.re @@ -179,8 +179,8 @@ rails c //emlist[][console]{ $ rails c -Loading development environment (Rails 7.0.4.3) -irb(main):001:0> +Loading development environment (Rails 8.0.2) +books-app(dev)> //} @@ -307,7 +307,7 @@ DBの設計書をマイグレーションファイルと呼びます。マイグ //emlist[][ruby]{ -class CreateBooks < ActiveRecord::Migration[7.0] +class CreateBooks < ActiveRecord::Migration[8.0] def change create_table :books do |t| t.string :title @@ -320,7 +320,7 @@ end //} -1行目 @{ActiveRecord::Migration[7.0]} の末尾にある数字はRailsのバージョンを表します。Rails7.0.xではこのように7.0となります。 +1行目 @{ActiveRecord::Migration[8.0]} の末尾にある数字はRailsのバージョンを表します。Rails8.0.xではこのように8.0となります。 @@ -586,7 +586,7 @@ $ rails g migration Addカラム名Toテーブル名 カラム名:型名 //} //emlist[][ruby]{ -class AddAuthorToBooks < ActiveRecord::Migration[7.0] +class AddAuthorToBooks < ActiveRecord::Migration[8.0] def change add_column :books, :author, :string end @@ -710,7 +710,7 @@ create db/migrate/20220107022320_add_author_to_books.rb //emlist[][ruby]{ -class AddAuthorToBooks < ActiveRecord::Migration[7.0] +class AddAuthorToBooks < ActiveRecord::Migration[8.0] def change add_column :books, :author, :string end @@ -746,7 +746,7 @@ $ rails db:migrate
<%= form.label :memo, style: "display: block" %> - <%= form.text_area :memo %> + <%= form.textarea :memo %>
+
@@ -800,8 +800,8 @@ StrongParametersにauthorを追加します。 class BooksController < ApplicationController ... def book_params -- params.require(:book).permit(:title, :memo) -+ params.require(:book).permit(:title, :memo, :author) +- params.expect(book: [ :title, :memo ]) ++ params.expect(book: [ :title, :memo, :author ]) end end //} @@ -809,7 +809,7 @@ end ==== 動作確認 -rails serverを起動して動作を確認してみましょう。 +rails serverを起動して動作を確認してみましょう。new、show、indexの各画面にAuthor欄が追加されて、登録できるようになりました。 @@ -817,7 +817,3 @@ rails serverを起動して動作を確認してみましょう。 //} - - -new、show、indexの各画面にAuthor欄が追加されて、登録できるようになりました。 - diff --git a/_review/contents/06_gem.re b/_review/contents/06_gem.re index f61fa9f3..ffa73e14 100644 --- a/_review/contents/06_gem.re +++ b/_review/contents/06_gem.re @@ -26,7 +26,6 @@ $ gem i awesome_print //} //emlist[][console]{ -Fetching awesome_print-1.9.2.gem Successfully installed awesome_print-1.9.2 1 gem installed //} @@ -36,7 +35,7 @@ Successfully installed awesome_print-1.9.2 -インストールしたawesome_printは、きれいに表示するapというメソッドを提供します。irbを起動して試しに使ってみましょう。irbは対話形式でRubyプログラムを実行できる仕組みです。rails consoleもirbを利用しています。 +インストールしたawesome_printは、きれいに表示するapメソッドを提供します。irbを起動して試しに使ってみましょう。irbは対話形式でRubyプログラムを実行できる仕組みです。rails consoleもirbを利用しています。 //emlist[][bash]{ @@ -62,7 +61,7 @@ $ irb //} -このような形式で配列[1,2,3]が表示されれば成功です。Rubyが標準で持っているpメソッドも同等のことができますが、apメソッドの方がきれいに読み易い形で表示してくれます。 +このような形式で配列[1,2,3]が表示されれば成功です。Rubyが標準で持っているpメソッドやppメソッドも同等のことができますが、apメソッドの方がきれいに読みやすい形で表示してくれます。 @@ -84,22 +83,19 @@ BundlerでGem群をインストールするには2つの手順を実行します -Railsアプリは最初からBundlerの仕組みを利用するようになっています。GemfileはRailsアプリの場合、Railsのルートフォルダに置いてあります。エディタで開いてみましょう。 +Railsアプリは最初からBundlerの仕組みを利用するようになっいて、GemfileもRailsのルートフォルダに置いてあります。エディタで開いてみましょう。 //emlist[][ruby]{ source "https://rubygems.org" -git_source(:github) { |repo| "https://github.com/#{repo}.git" } - -ruby "3.2.2" # Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main" -gem "rails", "~> 7.0.4", ">= 7.0.4.3" +gem "rails", "~> 8.0.2" ... //} -たくさんのgemが表示されました。Railsアプリは最初につくった状態ですでに10個以上のgemが登録されています。ここに、さきほどのawesome_print gemを追加してみましょう。書く場所はどこでも良いのですが、一番最後の行へ追加することにします。Gemfileへ次の一行を追加して保存します。 +たくさんのGemが表示されました。Railsアプリは最初につくった状態ですでに10個以上のGemが登録されています。ここに、さきほどのawesome_print Gemを追加してみましょう。書く場所はどこでも良いのですが、一番最後の行へ追加することにします。Gemfileへ次の一行を追加して保存します。 //emlist[][ruby]{ @@ -107,20 +103,20 @@ gem "awesome_print" //} -追加して保存したら、以下のようにbundle installコマンドを実行します。このコマンドの実行時にはネットワークへ接続が必要なため、少し時間がかかります。また、各Gemのバージョンや、Bundle complete!につづけて表示される数字は異なることがあります。 +追加して保存したら、以下のようにbundle installコマンドを実行します。このコマンドの実行時にはネットワークへ接続が必要なため、少し時間がかかります。既に @{awesome_print} Gemがインストール済みのときは、 @{Installing awesome_print 1.9.2} などの表示は出ません。また、各Gemのバージョンや、Bundle complete!につづけて表示される数字は異なることがあります。 //emlist[][console]{ $ bundle install ... -Using awesome_print 1.9.2 +Installing awesome_print 1.9.2 ... -Bundle complete! 18 Gemfile dependencies, 83 gems now installed. +Bundle complete! 24 Gemfile dependencies, 131 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. //} -これでawesome_print gemを使う準備は完了です。試しにrails consoleを起動して、apメソッドを使ってみましょう。 +これでawesome_print Gemを使う準備は完了です。試しにrails consoleを起動して、apメソッドを使ってみましょう。 //emlist[][console]{ @@ -133,20 +129,20 @@ $ rails c ] => nil > ap Book.first -irb(main):002:0> ap Book.last - (1.0ms) SELECT sqlite_version(*) -Book Load (0.4ms) SELECT "books".* FROM "books" ORDER BY "books"."id" ASC LIMIT ? [["LIMIT", 1]] # { - :id => 1, - :title => "RubyとRailsの学習ガイド", - :memo => "Rails関連技術地図とそれらの学習資料の紹介", - :created_at => Fri, 07 Jan 2022 02:06:03.593544000 UTC +00:00, - :updated_at => Fri, 07 Jan 2022 02:06:03.593544000 UTC +00:00 +Book Load (0.2ms) SELECT "books".* FROM "books" ORDER BY "books"."id" ASC LIMIT 1 + /*application='BooksApp'*/ +# { + :id => 1, + :title => "RubyとRailsの学習ガイド", + :memo => "Railsの関連技術地図とそれらの学習資料", + :created_at => 2025-04-28 07:22:27.108228000 UTC +00:00, + :updated_at => 2025-04-28 07:22:27.108228000 UTC +00:00, } => nil //} -ターミナルに改行されて色がついて読み易く表示されているかと思います。またRailsアプリではrequireを書く必要がありません。ちなみに、書いても問題ありません。requireは複数回実行しても問題ないためです。 +位置が揃えて改行され、色がついて読みやすく表示されているかと思います。またRailsアプリではrequireを書く必要がありません。ちなみに、requireは複数回実行しても問題ないため、requireを書いても問題ありません。 @@ -154,7 +150,7 @@ Book Load (0.4ms) SELECT "books".* FROM "books" ORDER BY "books"."id" ASC LIMIT -また、Gemfileを変更してbundle installコマンドを実行すると、Gemfile.lockというファイルが作成されます。Gemfile.lockには、使われているGem名とそのバージョン情報が記録されています。Gemfile.lockは自動で作られるものなので、編集する必要はありません。ソースコードを保管するときは、GemfileとGemfile.lockの両方のファイルを保管してください。 +また、bundle installコマンドを実行すると、Gemfileと同じフォルダにGemfile.lockというファイルが作成されます。Gemfile.lockには、使われているGem名とそのバージョン情報が記録されています。Gemfile.lockは自動で作られるものなので、編集する必要はありません。ソースコードを保管するときは、GemfileとGemfile.lockの両方のファイルを保管してください。 @@ -168,7 +164,7 @@ Book Load (0.4ms) SELECT "books".* FROM "books" ORDER BY "books"."id" ASC LIMIT -特定のGemだけをバージョンアップしたい場合は、@{bundle update Gem名} とGem名をつけて実行すればOKです。指定したGemが利用している他のGemがある場合は、セットでバージョンアップされます。 +特定のGemだけをバージョンアップしたい場合は、@{bundle update Gem名} とGem名をつけて実行すればOKです。指定したGemが利用している他のGemがある場合は、あわせてバージョンアップされます。 == Gemfileに書かれたGemを使って実行する @@ -190,7 +186,7 @@ bundle exec rake -T -ところで、ここまでrailsコマンドを使ってきましたが、ここにbundle execを書かなくてもいいのでしょうか?答えは、「書く必要はない」です。railsコマンドを実行すると、bin/railsファイルが実行され、その中でbundle exec相当の処理を行っています。 +ところで、ここまでrailsコマンドを使ってきましたが、ここにbundle execを書かなくても良いのでしょうか?答えは、「書く必要はない」です。railsコマンドを実行すると、bin/railsファイルが実行され、その中でbundle exec相当の処理を行っています。 == Gemfileでのバージョン指定 @@ -200,19 +196,19 @@ bundle exec rake -T //emlist[][ruby]{ -gem 'capybara', '>= 2.15' +gem "sqlite3", ">= 2.1" //} -これは「capybara Gemのバージョンは、2.15以上」という意味の指定になります。これは数式の意味と同じですね。一方、こんな見慣れないバージョン指定表記があります。 +これは「sqlite3 Gemのバージョンは、2.1以上」という意味の指定になります。これは数式の意味と同じですね。一方、こんな見慣れないバージョン指定表記があります。 //emlist[][ruby]{ -gem 'sqlite3', '~> 1.4' +gem "rails", "~> 8.0.2" //} - ~> という記号、このケースでは、@{>= 1.4.0} かつ @{< 1.5} という意味になります。小さいバージョンアップは受け入れて、大きなバージョンアップは受け入れない、という記号です。 + ~> という記号、このケースでは、@{>= 8.0.2} かつ @{< 8.1} という意味になります。小さいバージョンアップは受け入れて、大きなバージョンアップは受け入れない、という記号です。バージョン8.0.2.1や8.0.3はインストールされますが、バージョン8.1や9.0はインストールされません。 diff --git a/_review/contents/07_picture_upload.re b/_review/contents/07_picture_upload.re index edca2ab3..bea2717b 100644 --- a/_review/contents/07_picture_upload.re +++ b/_review/contents/07_picture_upload.re @@ -2,7 +2,7 @@ = 画像アップロード機能の追加 -アプリに画像アップロード機能を追加します。画像情報を格納するためのDBカラムを追加し、carrierwave gemを利用して画像アップロード機能を実装します。 +アプリに画像アップロード機能を追加します。画像情報を格納するためのDBカラムを追加し、carrierwave Gemを利用して画像アップロード機能を実装します。 @@ -37,12 +37,12 @@ create db/migrate/20220109012706_add_picture_to_books.rb 作成されたmigrationファイルは以下のようになっています。 -//emlist{ -db/migrate/20220109012706_add_picture_to_books.rb -//} + +@{db/migrate/20220109012706_add_picture_to_books.rb} + //emlist[][ruby]{ -class AddPictureToBooks < ActiveRecord::Migration[7.0] +class AddPictureToBooks < ActiveRecord::Migration[8.0] def change add_column :books, :picture, :string end @@ -65,10 +65,10 @@ $ rails db:migrate == 20220109012706 AddPictureToBooks: migrated (0.0008s) ======================= //} -== carrierwave gemを追加 +== carrierwave Gemを追加 -次は画像upload機能を持つライブラリcarrierwave gemを追加します。gemを追加する場合はGemfileへ追記します。記述する場所はどこでも良いのですが、今回は一番最後の行へ追記することにします。Gemfileへ次の一行を追加して保存します。 +次は画像upload機能を持つライブラリcarrierwave Gemを追加します。Gemを追加する場合はGemfileへ追記します。記述する場所はどこでも良いのですが、今回は一番最後の行へ追記することにします。Gemfileへ次の一行を追加して保存します。 //emlist[][ruby]{ @@ -76,7 +76,7 @@ gem "carrierwave" //} -Gemfileの内容でgemを利用できるようにbundle installコマンドをターミナルで実行します(メッセージ中"Installing carrierwave 2.2.3"や"17 Gemfile dependencies, 84 gems now installed."の数字は異なる場合があります)。 +Gemfileの内容でgemを利用できるようにbundle installコマンドをターミナルで実行します(メッセージ中"Installing carrierwave 3.1.1"や"23 Gemfile dependencies, 130 gems now installed."の数字は異なる場合があります)。 //emlist[][bash]{ @@ -86,18 +86,18 @@ $ bundle install //emlist[][console]{ $ bundle install ... -Installing carrierwave 2.2.3 +Installing carrierwave 3.1.1 ... -Bundle complete! 17 Gemfile dependencies, 84 gems now installed. +Bundle complete! 23 Gemfile dependencies, 130 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. //} -bundle installコマンドを実行すると、Gemfileに書かれたgemがまだなければインストールし利用可能にします。また、Gemfile.lockに利用するバージョンが書き込まれます。 +bundle installコマンドを実行すると、Gemfileに書かれたGemがまだなければインストールし利用可能にします。また、Gemfile.lockに利用するバージョンが書き込まれます。 -続いて、carrierwaveを利用可能にするために、carrierwaveが提供する@{rails g uploader Picture}コマンドを実行して必要なファイルを作成します。Rails6.1以前の環境では、事前に@{bin/spring stop}コマンドを実行し、springというキャッシュの仕組みを再起動しておきます。Rails7.0以降ではspringがデフォルトでインストールされなくなったので、@{bin/spring stop}コマンドは不要です。 +続いて、carrierwaveを利用可能にするために、carrierwaveが提供する@{rails g uploader Picture}コマンドを実行して必要なファイルを作成します。 //emlist[][bash]{ @@ -137,8 +137,8 @@ class Book < ApplicationRecord class BooksController < ApplicationController ... def book_params -- params.require(:book).permit(:title, :memo, :author) -+ params.require(:book).permit(:title, :memo, :author, :picture) +- params.expect(book: [ :title, :memo, :author ]) ++ params.expect(book: [ :title, :memo, :author, :picture ]) end end //} @@ -163,7 +163,7 @@ end
<%= form.label :memo, style: "display: block" %> - <%= form.text_area :memo %> + <%= form.textarea :memo %>
@@ -267,7 +267,7 @@ uploadした画像ファイルがブラウザに表示されているのを確 ポイントをまとめます。 - * carrierwave gemを使うと画像アップロード機能を追加できる - * Gemfileに新しいgemを追加した後、bundle installコマンドでインストールする + * carrierwave Gemを使うと画像アップロード機能を追加できる + * Gemfileに新しいGemを追加した後、bundle installコマンドでインストールする * マイグレーションファイルの生成はrails g migration Addカラム名Toテーブル名 カラム名:型名 diff --git a/_review/contents/08_postface.re b/_review/contents/08_postface.re index 78eb9b8e..b520018b 100644 --- a/_review/contents/08_postface.re +++ b/_review/contents/08_postface.re @@ -22,7 +22,7 @@ Gitはソースコードを管理するシステムであり、遠隔地にあ === つくったアプリを公開する -ここまで作ったアプリをWebサービスとして公開するには、PaaS(Platform as a Service)と呼ばれるサービスを使うとかんたんに公開できます。アプリケーションのソースコードを転送するだけでWebサービスを公開できるので、AWSなどのサーバを借りるタイプのものと比べて手軽に使うことができます。RailsアプリではHerokuと呼ばれるサービスがよく使われています。資料としては、 @{https://railsgirls.jp/heroku,『RailsGirlsガイド Heroku に Rails アプリをアップ』} のページが最新の情報へとメンテナンスされていることが多くお勧めです。 +ここまで作ったアプリをWebサービスとして公開するには、PaaS(Platform as a Service)と呼ばれるサービスを使うとかんたんに公開できます。アプリケーションのソースコードを転送するだけでWebサービスを公開できるので、AWSなどのサーバを借りるタイプのものと比べて手軽に使うことができます。RailsアプリではHerokuと呼ばれるサービスがよく使われているようです。資料としては、 @{https://railsgirls.jp/heroku,『RailsGirlsガイド Heroku に Rails アプリをアップ』} のページが最新の情報にメンテナンスされていることが多くお勧めです。 * RailsGirlsガイド Heroku に Rails アプリをアップ ** @{https://railsgirls.jp/heroku,https://railsgirls.jp/heroku} @@ -31,7 +31,7 @@ Gitはソースコードを管理するシステムであり、遠隔地にあ === 学び方の資料 -Railsを学びはじめると、Webサービスにはたくさんの技術が使われていることに気づきます。いま学んでいるこの技術は全体の中でどんな位置づけなんだろう?次は何を学べばいいのだろう?「RubyとRailsの学習ガイド」はRubyそしてRailsを学ぶ旅のガイドブックです。技術を学び、戻ってくるたびにレベルアップする、Webサービスを作る技術者の冒険の旅をサポートする地図です。各技術を学ぶための資料や書籍の情報を書いています。 +Railsを学びはじめると、Webサービスにはたくさんの技術が使われていることに気づきます。いま学んでいるこの技術は全体の中でどんな位置づけなんだろう?次は何を学べばいいのだろう?RubyそしてRailsを学ぶ旅のガイドブックとして「RubyとRailsの学習ガイド」があります。技術を学び、戻ってくるたびにレベルアップする、Webサービスを作る技術者の冒険の旅をサポートする地図です。各技術を学ぶための資料や書籍の情報を書いています。 * RubyとRailsの学習ガイド 2023 ** 五十嵐邦明 著 @{https://igaigarb.booth.pm,https://igaigarb.booth.pm} @@ -48,8 +48,10 @@ Railsを学びはじめると、Webサービスにはたくさんの技術が使 * Ruby on Rails ガイド ** @{https://railsguides.jp,https://railsguides.jp} - ** 電子書籍版 @{https://tatsu-zine.com/books/railsguides,https://tatsu-zine.com/books/railsguides} ** RailsガイドにはRailsの多くの機能についての説明が書かれています。私はRailsの機能の使い方がわからないときに最初にあたるサイトとしてつかっています。調べ物でつかうのも良いですが、一度通読しておくと、どのような機能があるかを把握できるのでその後の開発を加速させることができます。Railsの機能開発とセットで書かれているため、最新バージョンのRailsに対応した記事を読むことができます。たまに読み返すと、新機能が追記されていて「こんな書き方もできるのか」と勉強になります。時間をかけてでも全体へ目を通す価値のある資料です。本書でも各章の最後に、その章の内容に該当するRailsガイドへのリンクを書いているのでぜひ読んでみてください。 + * Ruby on Rails ガイド 「Rails をはじめよう」 + ** @{https://railsguides.jp/getting_started.html,https://railsguides.jp/getting_started.html} + ** RailsガイドにあるRailsの入門記事です。ECサイトアプリをRailsが標準で用意している機能のいくつかをつかってつくる方法を説明しています。本書「Railsの教科書」を読んだあとに、もう少し大きなアプリをつくることはとても良い練習になるので、このページをお勧めします。 * api.rubyonrails.org ** @{https://api.rubyonrails.org,https://api.rubyonrails.org} ** Railsのリファレンスページです。メソッド名やクラス名で検索することができます。Railsのコード中に書かれたドキュメントを、読みやすく検索しやすく提供しているページです。また、各メソッドの説明からGitHubの該当ソースコードへのリンクも貼られているので、ソースコードを調べる入り口としても便利です。詳しく説明が書かれているので、知らない機能について調べるときに最初に読む資料としてRailsガイドとあわせてお勧めです。 @@ -58,22 +60,12 @@ Railsを学びはじめると、Webサービスにはたくさんの技術が使 ** Railsの学習をサポートする書籍です。難易度としては、「Railsの教科書」を終えて「Railsガイド」をおおよそ学んだあとに読んでいただけるとちょうど良いレベル感です。Railsアプリを書いていくときに有用な知識を選んで書かれています。どのページからでも読みはじめられるようになっているので、読みたいトピックから読みはじめられます。 * Ruby on Rails チュートリアル ** @{https://railstutorial.jp,https://railstutorial.jp} - ** 電子書籍版 @{https://tatsu-zine.com/books/railstutorial,https://tatsu-zine.com/books/railstutorial} ** Railsアプリを作りながら学ぶWeb上の資料です。Railsを学ぶ初期の資料として定番のものです。実際にアプリを作りながら知識を深めたいという方へお勧めです。特徴として、有料の解説動画も購入できるようになっています。文章だけでなく、動画もあわせて学びたい方にもおすすめです。Rails7.0対応。 * はじめてつくるWebアプリケーション 〜Ruby on Railsでプログラミングへの第一歩を踏み出そう ** 江森真由美、やだけいこ、小林智恵 著 技術評論社 ISBN: 978-4297134686 ** はじめてプログラミングにチャレンジする人へ向けた1冊です。環境構築からはじめ、RailsでシンプルなWebアプリを実際に作る一連の流れがわかるようになっています。読者がつまずきやすそうなポイントは特に手厚く解説し、プログラミングの楽しさやWebアプリの基礎を知ることができるように工夫されています。Rails7.0対応。 - * 現場で使える Ruby on Rails 5 速習実践ガイド - ** 株式会社万葉 監修 マイナビ出版 ISBN: 978-4839962227 - ** Railsの基礎知識を広く学べる、通称『現場Rails』と呼ばれる書籍です。Railsの基礎を網羅的に説明しています。Railsの受託開発や開発支援を長年つづけている株式会社万葉のみなさんが執筆されているので、タイトル通り現場で使える技術に即した内容です。Rails5.2対応。 - * 独習Ruby on Rails - ** 小餅良介 著 翔泳社 ISBN: 978-4798160689 - ** Railsの基礎を丁寧に解説した入門書です。ひとつひとつの機能に対して図を多くつかってわかりやすく説明しています。Rails5.2対応。 - * Ruby on Rails 6 実践ガイド - ** 黒田努 著 インプレス ISBN: 978-4295008057 - ** Railsの入門書籍です。サンプルアプリつくりを通してRailsの各機能を説明していきます。必要な知識を過不足なく順序よく並べて説明しています。最初の版から良い内容でしたが、積み重ねた改訂によりさらに磨きがかかっています。Rails6.0対応。 * パーフェクトRuby on Rails 【増補改訂版】 - ** すがわらまさのり、前島真一、橋立友宏、五十嵐邦明、後藤優一 著 技術評論社 ISBN: 9784297114626 + ** すがわらまさのり、前島真一、橋立友宏、五十嵐邦明、後藤優一 著 技術評論社 ISBN: 978-4297114626 ** Railsの基礎から応用まで網羅した書籍です。実際にRailsでプロダクトを作っている著者陣がそのノウハウを踏まえて体系的にRailsを解説しています。他の本ではあまり解説されていない踏み込んだ内容まで説明されていたり、また、サンプルアプリを手を動かして作ることができるのも良いところです。初級者から中級者へのステップアップに。Rails6.0対応。 @@ -88,12 +80,9 @@ RailsはRubyというプログラミング言語で作られています。Ruby * ゼロからわかる Ruby超入門 ** 五十嵐邦明、松岡浩平 著 技術評論社 ISBN: 978-4297101237 ** 私と松岡さんで書き、べこさんがイラストを担当した書籍です。プログラミングが初めての方へ向けた、Rubyプログラミングの入門書です。プログラミングの基礎である条件分岐、繰り返しの概念を図解を入れて丁寧に説明します。そしてRubyでよく使われる整数、文字列、配列、ハッシュと言ったオブジェクトを説明しています。また、エラー時の対処方法、リファレンスマニュアルの調べ方、デバッグの基礎も学べるので、自分で調べる力をつけることができます。Railsで必要となる知識を学ぶことをゴールにしているので、メソッドやクラス、モジュールの作り方、使い方など、最低限必要となる知識を効率良く学べます。加えて、Gemとそれを束ねるBundlerの使い方を学べます。第4刷よりRuby3.2に対応しました。 - * たのしいRuby 第6版 - ** 高橋征義、後藤裕蔵 著 SBクリエイティブ ISBN: 978-4797399844 - ** Rubyプログラミングに必要な知識を幅広く説明していて、この本でカバーしていないRubyの知識を探すのが難しいほどです。15年以上に渡って改訂されて読み継がれている名著です。Ruby2.6対応。 * プロを目指す人のためのRuby入門 改訂2版 ** 伊藤淳一 著 技術評論社 ISBN: 978-4297124373 - ** Rubyプログラミングの実践技術を学ぶ本です。「いくつかの書き方があるが、このケースではこう書くと良い」という著者のお勧めに沿ってRubyでの自然な書き方を学べます。テストの書き方やデバッグ方法の説明に加え、Ruby3.0で導入された新機能についても説明があります。改訂してRuby3.0に対応しています。 + ** Rubyプログラミングの実践技術を学ぶ本です。「いくつかの書き方があるが、このケースではこう書くと良い」という著者のお勧めに沿ってRubyでの自然な書き方を学べます。テストの書き方やデバッグ方法の説明に加え、Ruby3.0で導入された新機能についても説明があります。改訂2版でRuby3.0に対応しています。 * まんがでわかるRuby ** youchan、湊川あい 著 @{https://booth.pm/ja/items/1306534,https://booth.pm/ja/items/1306534} ** お絵かきプログラムを題材に、Rubyの基礎をマンガと分かりやすい文章で解説しています。短いプログラムを書くだけで、なぜだかさまざまな図形が描かれる。たのしくプログラミングしていたら、基礎知識がいつのまにか身についていた、そんな本です。Rubyの特徴でもある「たのしさ」を最大限に引き出してくれる1冊です。 @@ -113,14 +102,14 @@ HTMLとCSSをつかったデザインを学ぶ資料としては、 @{http == Rubyコミュニティ -なにより、自分で作りたいアプリを作ってみるのが一番勉強になります。作っている上で、もしもつまづき、インターネットで検索しても分からないことがあったときには、近くのRubyコミュニティへぜひ足を運んでみてください。新しいRubyist(あなたのことです!)を温かく迎えてくれるはずです。Rubyコミュニティは「都市名.rb」という名前で活動していることが多いです。全国各地のRubyコミュニティについて、@{https://github.com/ruby-no-kai/official/wiki/RegionalRubyistMeetUp,地域Rubyの会}のページに情報がまとまっています。また、@{https://rubykaigi.org,RubyKaigi}や@{https://regional.rubykaigi.org,地域Ruby会議}と呼ばれるカンファレンスも定期的に開催されています。2020年以降はオンラインで開催されるRubyコミュニティも増えて、全国どこからでも参加しやすくなっています。 +なにより、自分で作りたいアプリを作ってみるのが一番勉強になります。作っている上で、もしもつまづき、インターネットで検索しても分からないことがあったときには、近くのRubyコミュニティへぜひ足を運んでみてください。新しいRubyist(あなたのことです!)を温かく迎えてくれるはずです。Rubyコミュニティは「地域名.rb」という名前で活動していることが多いです。全国各地のRubyコミュニティについて、@{https://scrapbox.io/ruby-jp/%E5%9C%B0%E5%9F%9F.rb,地域.rb}のページに情報がまとまっています。また、@{https://rubykaigi.org,RubyKaigi}や@{https://regional.rubykaigi.org,地域Ruby会議}と呼ばれるカンファレンスも定期的に開催されています。現地開催に加え、オンラインでの開催も増えており、全国どこからでもRubyコミュニティに参加しやすくなっています。 ネット上の集まりとして、@{https://ruby-jp.github.io/,ruby-jp}という、Rubyistが集まるSlackワークスペースもあります。2000人以上が参加し、RubyやRailsに限らず、あらゆる技術について話をしています。質問をするチャンネルもありますので、つまづいたことがあるときに聞いてみるときっと回答が返ってくると思います。技術以外にも、各地のカンファレンスやミートアップの情報について話したりするのはもちろん、つくった料理の紹介や語学学習情報の交換など、さまざまな話題を扱うチャンネルがあります。 - * 地域Rubyの会 - ** @{https://github.com/ruby-no-kai/official/wiki/RegionalRubyistMeetUp,https://github.com/ruby-no-kai/official/wiki/RegionalRubyistMeetUp} + * 地域.rb + ** @{https://scrapbox.io/ruby-jp/%E5%9C%B0%E5%9F%9F.rb,https://scrapbox.io/ruby-jp/地域.rb} * RubyKaigi ** @{https://rubykaigi.org,https://rubykaigi.org} * 地域Ruby会議 @@ -132,11 +121,11 @@ HTMLとCSSをつかったデザインを学ぶ資料としては、 @{http == 謝辞 -本書は2012年4月から始めた一橋大学での講義資料からはじまり、そのあと幾度かの改訂を経て現在へ至ります。当時はRuby1.9, Rails3.2という環境でしたので、現在のRuby3.2, Rails7.0までの道のりで、Rubyは11回、Railsは9回のバージョンアップを重ねたことになります。10年前から同じ言語、同じフレームワークを使って仕事ができていることは本当にすごいことです。Railsコアチームのみなさん、コントリビュータのみなさん、GemなどOSS開発者のみなさんへ感謝します。 +本書は2012年4月から始めた一橋大学での講義資料からはじまり、そのあと幾度かの改訂を経て現在へ至ります。当時はRuby1.9, Rails3.2という環境でしたので、現在のRuby3.4, Rails8.0までの道のりで、Rubyは13回、Railsは12回のバージョンアップを重ねたことになります。10年前から同じ言語、同じフレームワークを使って仕事ができていることは本当にすごいことです。Rubyコアチームのみなさん、Railsコアチームのみなさん、コントリビュータのみなさん、GemなどOSS開発者のみなさんへ感謝します。 -素晴らしい言語とコミュニティをつくってくれたmatzさんこと、まつもとゆきひろさん、Rubyコアチームのみなさん、そしてRubyistのみなさんへ感謝します。matzさんのおかげで私の人生はたのしいことをたくさん経験できています。 +素晴らしい言語とコミュニティをつくってくれたMatzさんこと、まつもとゆきひろさん、Rubyコアチームのみなさん、そしてRubyistのみなさんへ感謝します。Matzさんのおかげで私の人生はたのしいことをたくさん経験できています。 @@ -156,7 +145,7 @@ HTMLとCSSをつかったデザインを学ぶ資料としては、 @{http -改訂にあたり図を描いてくださったべこさんへ深く感謝します。HTML/CSSを活用して、どんどんバージョンアップしていくRailsを楽に追いかけていけるように工夫してくださいました。また、わかりやすい図を目指して一緒に考えてくださいました。 +改訂にあたり図や表紙を描いてくださったべこさんへ深く感謝します。HTML/CSSを活用して、どんどんバージョンアップしていくRailsを楽に追いかけていけるように工夫してくださいました。また、わかりやすい図を目指して一緒に考えてくださいました。 @@ -170,18 +159,18 @@ HTMLとCSSをつかったデザインを学ぶ資料としては、 @{http == 著者略歴 * 五十嵐邦明 * ガーネットテック373株式会社 - * twitter: igaiga555 + * X: igaiga555 * https://garnettech373.com -群馬高専出身。フリーランスのRuby, Railsエンジニア。2003年、Rubyで書かれたWeb日記アプリtDiaryを使い始めてRubyistになる。一橋大学の非常勤講師として2012年から2年間、RubyとRailsを教える。受託開発会社、Webサービス開発会社CTOなどを経て2017年よりフリーランス、2019年ガーネットテック373株式会社を設立、同社代表取締役社長。RubyWorld ConferenceやRubyConf台湾などで講演。島根県Ruby合宿、Rails Girls、フィヨルドブートキャンプ、大名エンジニアカレッジなどで講師役を務める。著書に『ゼロからわかる Ruby超入門』、『Railsの教科書』、『Railsの練習帳』、『パーフェクトRuby on Rails[増補改訂版]』、『RubyとRailsの学習ガイド』ほか。 +群馬高専出身。フリーランスのRuby, Railsエンジニア。2003年、Rubyで書かれたWeb日記アプリtDiaryをつかい始めてRubyistになる。一橋大学の非常勤講師として2012年から2年間、RubyとRailsを教える。2019年ガーネットテック373株式会社を設立、同社代表取締役社長。Kaigi on Rails、RubyWorld Conference、RubyConf台湾などで講演。島根県Ruby合宿、Rails Girls、フィヨルドブートキャンプ、大名エンジニアカレッジなどで講師役を務める。著書に『ゼロからわかる Ruby超入門』、『Railsの教科書』、『Railsの練習帳』、『パーフェクトRuby on Rails[増補改訂版]』、『RubyとRailsの学習ガイド』ほか。 == デザイナー略歴 * べこ * べころもち工房 - * twitter: becolomochi + * X: becolomochi * https://becolomochi.com diff --git a/_review/images/02_smallest_app/hello_index.png b/_review/images/02_smallest_app/hello_index.png index 6f9af8c1..cd3d116d 100644 Binary files a/_review/images/02_smallest_app/hello_index.png and b/_review/images/02_smallest_app/hello_index.png differ diff --git a/_review/images/02_smallest_app/hello_world.png b/_review/images/02_smallest_app/hello_world.png index 605c0fa4..906a0f29 100644 Binary files a/_review/images/02_smallest_app/hello_world.png and b/_review/images/02_smallest_app/hello_world.png differ diff --git a/_review/images/02_smallest_app/routes.png b/_review/images/02_smallest_app/routes.png index dd10cbe6..9c74a515 100644 Binary files a/_review/images/02_smallest_app/routes.png and b/_review/images/02_smallest_app/routes.png differ diff --git a/_review/images/02_smallest_app/time_jst.png b/_review/images/02_smallest_app/time_jst.png index d198a0e4..b0f98634 100644 Binary files a/_review/images/02_smallest_app/time_jst.png and b/_review/images/02_smallest_app/time_jst.png differ diff --git a/_review/images/02_smallest_app/time_utc.png b/_review/images/02_smallest_app/time_utc.png index c0d3e66d..7e248741 100644 Binary files a/_review/images/02_smallest_app/time_utc.png and b/_review/images/02_smallest_app/time_utc.png differ diff --git a/_review/images/03_crud/books_created_data_1.png b/_review/images/03_crud/books_created_data_1.png index 4aea0d60..13de9792 100644 Binary files a/_review/images/03_crud/books_created_data_1.png and b/_review/images/03_crud/books_created_data_1.png differ diff --git a/_review/images/03_crud/books_index_blank.png b/_review/images/03_crud/books_index_blank.png index 43785fdb..c34b0040 100644 Binary files a/_review/images/03_crud/books_index_blank.png and b/_review/images/03_crud/books_index_blank.png differ diff --git a/_review/images/03_crud/books_index_data_1.png b/_review/images/03_crud/books_index_data_1.png index 2e245f06..e78bc367 100644 Binary files a/_review/images/03_crud/books_index_data_1.png and b/_review/images/03_crud/books_index_data_1.png differ diff --git a/_review/images/03_crud/books_index_data_2.png b/_review/images/03_crud/books_index_data_2.png index 8b2b3329..7411283e 100644 Binary files a/_review/images/03_crud/books_index_data_2.png and b/_review/images/03_crud/books_index_data_2.png differ diff --git a/_review/images/03_crud/crud_4_pages.png b/_review/images/03_crud/crud_4_pages.png index 3fe83260..58a69c39 100644 Binary files a/_review/images/03_crud/crud_4_pages.png and b/_review/images/03_crud/crud_4_pages.png differ diff --git a/_review/images/03_crud/index_flow.png b/_review/images/03_crud/index_flow.png index d611e06b..63525d51 100644 Binary files a/_review/images/03_crud/index_flow.png and b/_review/images/03_crud/index_flow.png differ diff --git a/_review/images/03_crud/index_flow_controller.png b/_review/images/03_crud/index_flow_controller.png index ca234fff..f26882c2 100644 Binary files a/_review/images/03_crud/index_flow_controller.png and b/_review/images/03_crud/index_flow_controller.png differ diff --git a/_review/images/03_crud/index_flow_routes.png b/_review/images/03_crud/index_flow_routes.png index 80210399..f2248dab 100644 Binary files a/_review/images/03_crud/index_flow_routes.png and b/_review/images/03_crud/index_flow_routes.png differ diff --git a/_review/images/03_crud/index_flow_view.png b/_review/images/03_crud/index_flow_view.png index f3aa96e5..69568995 100644 Binary files a/_review/images/03_crud/index_flow_view.png and b/_review/images/03_crud/index_flow_view.png differ diff --git a/_review/images/03_crud/index_routes.png b/_review/images/03_crud/index_routes.png index fcd38b1b..52a71ee8 100644 Binary files a/_review/images/03_crud/index_routes.png and b/_review/images/03_crud/index_routes.png differ diff --git a/_review/images/04_new_create/books_new_data_1.png b/_review/images/04_new_create/books_new_data_1.png index ab7cf2df..edd3b21a 100644 Binary files a/_review/images/04_new_create/books_new_data_1.png and b/_review/images/04_new_create/books_new_data_1.png differ diff --git a/_review/images/04_new_create/create_flow_routes.png b/_review/images/04_new_create/create_flow_routes.png index 5c9560fe..6beab2e4 100644 Binary files a/_review/images/04_new_create/create_flow_routes.png and b/_review/images/04_new_create/create_flow_routes.png differ diff --git a/_review/images/04_new_create/create_routes.png b/_review/images/04_new_create/create_routes.png index 647c0902..2c6d0c54 100644 Binary files a/_review/images/04_new_create/create_routes.png and b/_review/images/04_new_create/create_routes.png differ diff --git a/_review/images/04_new_create/new_routes.png b/_review/images/04_new_create/new_routes.png index 943896dd..58a09c1f 100644 Binary files a/_review/images/04_new_create/new_routes.png and b/_review/images/04_new_create/new_routes.png differ diff --git a/_review/images/04_new_create/new_view_form.png b/_review/images/04_new_create/new_view_form.png index 77bf60c9..58dedad2 100644 Binary files a/_review/images/04_new_create/new_view_form.png and b/_review/images/04_new_create/new_view_form.png differ diff --git a/_review/images/04_new_create/new_view_form_memo_html.png b/_review/images/04_new_create/new_view_form_memo_html.png index ebc28175..55658126 100644 Binary files a/_review/images/04_new_create/new_view_form_memo_html.png and b/_review/images/04_new_create/new_view_form_memo_html.png differ diff --git a/_review/images/05_model/books_created_data_1.png b/_review/images/05_model/books_created_data_1.png index 4aea0d60..679f631e 100644 Binary files a/_review/images/05_model/books_created_data_1.png and b/_review/images/05_model/books_created_data_1.png differ diff --git a/_review/images/05_model/books_with_author_new.png b/_review/images/05_model/books_with_author_new.png index a39988e9..037136f6 100644 Binary files a/_review/images/05_model/books_with_author_new.png and b/_review/images/05_model/books_with_author_new.png differ diff --git a/_review/images/07_picture_upload/books_with_upload_created.png b/_review/images/07_picture_upload/books_with_upload_created.png index f96ebd1d..972afef9 100644 Binary files a/_review/images/07_picture_upload/books_with_upload_created.png and b/_review/images/07_picture_upload/books_with_upload_created.png differ diff --git a/_review/images/07_picture_upload/books_with_upload_new.png b/_review/images/07_picture_upload/books_with_upload_new.png index 27c20312..4a597898 100644 Binary files a/_review/images/07_picture_upload/books_with_upload_new.png and b/_review/images/07_picture_upload/books_with_upload_new.png differ diff --git a/assets/crud/books_created_data_1.png b/assets/crud/books_created_data_1.png index 4aea0d60..13de9792 100644 Binary files a/assets/crud/books_created_data_1.png and b/assets/crud/books_created_data_1.png differ diff --git a/assets/crud/books_index_blank.png b/assets/crud/books_index_blank.png index 43785fdb..c34b0040 100644 Binary files a/assets/crud/books_index_blank.png and b/assets/crud/books_index_blank.png differ diff --git a/assets/crud/books_index_data_1.png b/assets/crud/books_index_data_1.png index 2e245f06..e78bc367 100644 Binary files a/assets/crud/books_index_data_1.png and b/assets/crud/books_index_data_1.png differ diff --git a/assets/crud/books_index_data_2.png b/assets/crud/books_index_data_2.png index 8b2b3329..7411283e 100644 Binary files a/assets/crud/books_index_data_2.png and b/assets/crud/books_index_data_2.png differ diff --git a/assets/crud/crud_4_pages.png b/assets/crud/crud_4_pages.png index 3fe83260..58a69c39 100644 Binary files a/assets/crud/crud_4_pages.png and b/assets/crud/crud_4_pages.png differ diff --git a/assets/crud/index_flow.png b/assets/crud/index_flow.png index d611e06b..63525d51 100644 Binary files a/assets/crud/index_flow.png and b/assets/crud/index_flow.png differ diff --git a/assets/crud/index_flow_controller.png b/assets/crud/index_flow_controller.png index ca234fff..f26882c2 100644 Binary files a/assets/crud/index_flow_controller.png and b/assets/crud/index_flow_controller.png differ diff --git a/assets/crud/index_flow_routes.png b/assets/crud/index_flow_routes.png index 80210399..f2248dab 100644 Binary files a/assets/crud/index_flow_routes.png and b/assets/crud/index_flow_routes.png differ diff --git a/assets/crud/index_flow_view.png b/assets/crud/index_flow_view.png index f3aa96e5..69568995 100644 Binary files a/assets/crud/index_flow_view.png and b/assets/crud/index_flow_view.png differ diff --git a/assets/crud/index_routes.png b/assets/crud/index_routes.png index fcd38b1b..52a71ee8 100644 Binary files a/assets/crud/index_routes.png and b/assets/crud/index_routes.png differ diff --git a/assets/model/books_created_data_1.png b/assets/model/books_created_data_1.png index 4aea0d60..679f631e 100644 Binary files a/assets/model/books_created_data_1.png and b/assets/model/books_created_data_1.png differ diff --git a/assets/model/books_with_author_new.png b/assets/model/books_with_author_new.png index a39988e9..037136f6 100644 Binary files a/assets/model/books_with_author_new.png and b/assets/model/books_with_author_new.png differ diff --git a/assets/new-create/books_new_data_1.png b/assets/new-create/books_new_data_1.png index ab7cf2df..edd3b21a 100644 Binary files a/assets/new-create/books_new_data_1.png and b/assets/new-create/books_new_data_1.png differ diff --git a/assets/new-create/create_routes.png b/assets/new-create/create_routes.png index 647c0902..2c6d0c54 100644 Binary files a/assets/new-create/create_routes.png and b/assets/new-create/create_routes.png differ diff --git a/assets/new-create/new_routes.png b/assets/new-create/new_routes.png index 943896dd..58a09c1f 100644 Binary files a/assets/new-create/new_routes.png and b/assets/new-create/new_routes.png differ diff --git a/assets/new-create/new_view_form.png b/assets/new-create/new_view_form.png index 77bf60c9..58dedad2 100644 Binary files a/assets/new-create/new_view_form.png and b/assets/new-create/new_view_form.png differ diff --git a/assets/new-create/new_view_form_memo_html.png b/assets/new-create/new_view_form_memo_html.png index ebc28175..55658126 100644 Binary files a/assets/new-create/new_view_form_memo_html.png and b/assets/new-create/new_view_form_memo_html.png differ diff --git a/assets/picture-upload/books_with_upload_created.png b/assets/picture-upload/books_with_upload_created.png index f96ebd1d..972afef9 100644 Binary files a/assets/picture-upload/books_with_upload_created.png and b/assets/picture-upload/books_with_upload_created.png differ diff --git a/assets/picture-upload/books_with_upload_new.png b/assets/picture-upload/books_with_upload_new.png index 27c20312..4a597898 100644 Binary files a/assets/picture-upload/books_with_upload_new.png and b/assets/picture-upload/books_with_upload_new.png differ diff --git a/assets/smallest-app/hello_index.png b/assets/smallest-app/hello_index.png index 52713e7f..cd3d116d 100644 Binary files a/assets/smallest-app/hello_index.png and b/assets/smallest-app/hello_index.png differ diff --git a/assets/smallest-app/hello_world.png b/assets/smallest-app/hello_world.png index 0823c7fa..906a0f29 100644 Binary files a/assets/smallest-app/hello_world.png and b/assets/smallest-app/hello_world.png differ diff --git a/assets/smallest-app/routes.png b/assets/smallest-app/routes.png index dd10cbe6..9c74a515 100644 Binary files a/assets/smallest-app/routes.png and b/assets/smallest-app/routes.png differ diff --git a/assets/smallest-app/time_jst.png b/assets/smallest-app/time_jst.png index 92aa89ec..b0f98634 100644 Binary files a/assets/smallest-app/time_jst.png and b/assets/smallest-app/time_jst.png differ diff --git a/assets/smallest-app/time_utc.png b/assets/smallest-app/time_utc.png index 800fedda..7e248741 100644 Binary files a/assets/smallest-app/time_utc.png and b/assets/smallest-app/time_utc.png differ diff --git a/documents/make_screenshots.md b/documents/make_screenshots.md index c93f0302..b3e6f3e6 100644 --- a/documents/make_screenshots.md +++ b/documents/make_screenshots.md @@ -37,12 +37,21 @@ - HTMLからレンダリングしたファイル - _figures/aseets/ 以下のフォルダにhtmlファイルがあるもの - - レンダリングスクリプトは _figures/scripts/html_figures 以下 + - _figures/assets/README.mdも参照 + - レンダリングスクリプトは _figures/scripts/html_figures/ 以下 + - $ cd _figures/scripts/html_figures + - $ ./all_run.sh - Adobe Illustrator で作成した変更されないファイル - _figures/aseets/ 以下のフォルダに画像がそのまま置いてあるもの - assetsへのコピースクリプトは書いていない - アプリで撮影したスクリーンショット - レンダリングスクリプトは _figures/scripts/screenshots 以下 + - helloworld + - $ cd _figures/scripts/screenshots/helloworld + - $ ./generate_helloworld.sh + - books_app + - $ cd _figures/scripts/screenshots/books_app + - $ ./generate_books_app.sh - chrome_dev_toolのスクリーンショットを加工したもの - _figures/chrome_dev_tool 以下にあるもの - assetsへのコピースクリプトは書いていない