aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--app/Controllers/Http/RecipeController.js64
-rw-r--r--app/Controllers/Http/UserController.js19
-rw-r--r--config/bodyParser.js2
-rw-r--r--package.json1
-rw-r--r--public/css/vanilla.css138
-rw-r--r--public/js/new.js23
-rw-r--r--public/new.html131
-rw-r--r--yarn.lock117
9 files changed, 441 insertions, 56 deletions
diff --git a/README.md b/README.md
index 41457b6..9a7d01b 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
1# ferdi-server 1# ferdi-server
2Unofficial Franz server replacement for use with the Ferdi Client. 2Unofficial Franz server replacement for use with the Ferdi Client.
3 3
4⚠️ Currently not to be used publicly/productively as there are no validations etc. yet.
5
4## Features 6## Features
5- [x] User registration and login 7- [x] User registration and login
6- [x] Service creation, download and listing 8- [x] Service creation, download and listing
diff --git a/app/Controllers/Http/RecipeController.js b/app/Controllers/Http/RecipeController.js
index 641f4ef..407379e 100644
--- a/app/Controllers/Http/RecipeController.js
+++ b/app/Controllers/Http/RecipeController.js
@@ -4,9 +4,27 @@ const Recipe = use('App/Models/Recipe');
4const Helpers = use('Helpers') 4const Helpers = use('Helpers')
5const Drive = use('Drive') 5const Drive = use('Drive')
6const fetch = require('node-fetch'); 6const fetch = require('node-fetch');
7const targz = require('targz');
7const path = require('path'); 8const path = require('path');
9const fs = require('fs');
10
11const compress = (src, dest) => {
12 return new Promise((resolve, reject) => {
13 targz.compress({
14 src,
15 dest
16 }, function (err) {
17 if (err) {
18 reject(err);
19 } else {
20 resolve(dest);
21 }
22 });
23 })
24}
8 25
9class RecipeController { 26class RecipeController {
27 // List official and custom recipes
10 async list({ 28 async list({
11 response 29 response
12 }) { 30 }) {
@@ -26,19 +44,29 @@ class RecipeController {
26 return response.send(recipes) 44 return response.send(recipes)
27 } 45 }
28 46
47 // Create a new recipe using the new.html page
29 async create({ 48 async create({
30 request, 49 request,
31 response 50 response
32 }) { 51 }) {
33 const data = request.all(); 52 const data = request.all();
34 53
35 const pkg = request.file('package') 54 // Check for invalid characters
55 if (/\.{1,}/.test(data.id) || /\/{1,}/.test(data.id)) {
56 return response.send('Invalid recipe name. Your recipe name may not contain "." or "/"');
57 }
36 58
37 await pkg.move(path.join(Helpers.appRoot(), '/recipes/'), { 59 // Move uploaded files to temporary path
38 name: data.id + '.tar.gz', 60 const files = request.file('files')
39 overwrite: false 61 await files.moveAll(Helpers.tmpPath('recipe'))
40 })
41 62
63 // Compress files to .tar.gz file
64 compress(
65 Helpers.tmpPath('recipe'),
66 path.join(Helpers.appRoot(), '/recipes/' + data.id + '.tar.gz')
67 );
68
69 // Create recipe in db
42 await Recipe.create({ 70 await Recipe.create({
43 name: data.name, 71 name: data.name,
44 recipeId: data.id, 72 recipeId: data.id,
@@ -56,23 +84,25 @@ class RecipeController {
56 return response.send('Created new recipe') 84 return response.send('Created new recipe')
57 } 85 }
58 86
87 // Search official and custom recipes
59 async search({ 88 async search({
60 request, 89 request,
61 response 90 response
62 }) { 91 }) {
63 const needle = request.input('needle') 92 const needle = request.input('needle')
64 93
94 // Get results
65 const remoteResults = JSON.parse(await (await fetch('https://api.franzinfra.com/v1/recipes/search?needle=' + needle)).text()); 95 const remoteResults = JSON.parse(await (await fetch('https://api.franzinfra.com/v1/recipes/search?needle=' + needle)).text());
66 const localResultsArray = (await Recipe.query().where('name', 'LIKE', '%' + needle + '%').fetch()).toJSON(); 96 const localResultsArray = (await Recipe.query().where('name', 'LIKE', '%' + needle + '%').fetch()).toJSON();
67 const localResults = localResultsArray.map(recipe => ({ 97 const localResults = localResultsArray.map(recipe => ({
68 "id": recipe.recipeId, 98 "id": recipe.recipeId,
69 "name": recipe.name, 99 "name": recipe.name,
70 ...JSON.parse(recipe.data) 100 ...JSON.parse(recipe.data)
71 })) 101 }))
72 102
73 const results = [ 103 const results = [
74 ...localResults, 104 ...localResults,
75 ...remoteResults, 105 ...remoteResults,
76 ] 106 ]
77 107
78 return response.send(results); 108 return response.send(results);
@@ -86,16 +116,16 @@ class RecipeController {
86 }) { 116 }) {
87 const service = params.recipe; 117 const service = params.recipe;
88 118
89 // Chack for invalid characters 119 // Check for invalid characters
90 if (/\.{1,}/.test(service) || /\/{1,}/.test(service)) { 120 if (/\.{1,}/.test(service) || /\/{1,}/.test(service)) {
91 return response.send('Invalid recipe name'); 121 return response.send('Invalid recipe name');
92 } 122 }
93 123
94 // Check if recipe exists in recipes folder 124 // Check if recipe exists in recipes folder
95 if (await Drive.exists(service + '.tar.gz')) { 125 if (await Drive.exists(service + '.tar.gz')) {
96 response.send(await Drive.get(service + '.tar.gz')) 126 response.send(await Drive.get(service + '.tar.gz'))
97 } else { 127 } else {
98 response.redirect('https://api.franzinfra.com/v1/recipes/download/' + service) 128 response.redirect('https://api.franzinfra.com/v1/recipes/download/' + service)
99 } 129 }
100 } 130 }
101} 131}
diff --git a/app/Controllers/Http/UserController.js b/app/Controllers/Http/UserController.js
index 062e16f..f78f28d 100644
--- a/app/Controllers/Http/UserController.js
+++ b/app/Controllers/Http/UserController.js
@@ -13,11 +13,20 @@ class UserController {
13 session 13 session
14 }) { 14 }) {
15 const data = request.only(['firstname', 'email', 'password']); 15 const data = request.only(['firstname', 'email', 'password']);
16 const user = await User.create({ 16
17 email: data.email, 17 try {
18 password: data.password, 18 const user = await User.create({
19 username: data.firstname 19 email: data.email,
20 }); 20 password: data.password,
21 username: data.firstname
22 });
23 } catch(e) {
24 return response.status(401).send({
25 "message": "E-Mail Address already in use",
26 "status": 401
27 })
28 }
29
21 const token = await auth.generate(user) 30 const token = await auth.generate(user)
22 31
23 return response.send({ 32 return response.send({
diff --git a/config/bodyParser.js b/config/bodyParser.js
index c481b01..f04d291 100644
--- a/config/bodyParser.js
+++ b/config/bodyParser.js
@@ -20,7 +20,7 @@ module.exports = {
20 | is over 1mb it will not be processed. 20 | is over 1mb it will not be processed.
21 | 21 |
22 */ 22 */
23 limit: '1mb', 23 limit: '50mb',
24 24
25 /* 25 /*
26 |-------------------------------------------------------------------------- 26 |--------------------------------------------------------------------------
diff --git a/package.json b/package.json
index f3940d5..327fb8e 100644
--- a/package.json
+++ b/package.json
@@ -29,6 +29,7 @@
29 "node-fetch": "^2.6.0", 29 "node-fetch": "^2.6.0",
30 "pg": "^7.12.1", 30 "pg": "^7.12.1",
31 "sqlite3": "^4.1.0", 31 "sqlite3": "^4.1.0",
32 "targz": "^1.0.1",
32 "uuid": "^3.3.3" 33 "uuid": "^3.3.3"
33 }, 34 },
34 "devDependencies": {}, 35 "devDependencies": {},
diff --git a/public/css/vanilla.css b/public/css/vanilla.css
new file mode 100644
index 0000000..37bc051
--- /dev/null
+++ b/public/css/vanilla.css
@@ -0,0 +1,138 @@
1/* Reset */
2html, body, div, span, applet, object, iframe,
3h1, h2, h3, h4, h5, h6, p, blockquote, pre,
4a, abbr, acronym, address, big, cite, code,
5del, dfn, em, img, ins, kbd, q, s, samp,
6small, strike, strong, sub, sup, tt, var,
7b, u, i, center,
8dl, dt, dd, ol, ul, li,
9fieldset, form, label, legend,
10table, caption, tbody, tfoot, thead, tr, th, td,
11article, aside, canvas, details, embed,
12figure, figcaption, footer, header, hgroup,
13menu, nav, output, ruby, section, summary,
14time, mark, audio, video {
15 margin: 0;
16 padding: 0;
17 border: 0;
18 font-size: 100%;
19 font: inherit;
20 vertical-align: baseline;
21}
22* {
23 box-sizing: border-box;
24}
25
26
27
28/* Variables */
29:root {
30 --desktop-font-size: 1.3rem/1.5;
31 --mobile-font-size: 1.1rem/1.4;
32 --text-color: #2d2d2d;
33 --link-color: blue;
34 --primary-color: lightsteelblue;
35 --secondary-color: aliceblue;
36 --tertiary-color: whitesmoke;
37}
38
39
40
41
42/* Typography */
43body {
44 color: var(--text-color);
45 padding: 3rem;
46 font: var(--desktop-font-size) -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto, Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji", "Segoe UI Symbol";
47}
48
49h1,h2,h3,h4,h5,h6,p,blockquote,dl,img,figure {
50 margin: 2rem 0;
51}
52
53h1,h2,h3,h4,h5,h6 { font-weight: bold; }
54h1 { font-size: 200%; }
55h2 { font-size: 150%; }
56h3 { font-size: 120%; }
57h4,h5,h6 { font-size: 100%; }
58h5, h6 { text-transform: uppercase; }
59
60header h1 { border-bottom: 1px solid; }
61
62p { margin: 2rem 0; }
63
64a,a:visited { color: var(--link-color); }
65
66strong, time, b { font-weight: bold; }
67em, dfn, i { font-style: italic; }
68sub { font-size: 60%; vertical-align: bottom; }
69small { font-size: 80%; }
70
71blockquote, q {
72 background: var(--secondary-color);
73 border-left: 10px solid var(--primary-color);
74 font-family: "Georgia", serif;
75 padding: 1rem;
76}
77blockquote p:first-child { margin-top: 0; }
78cite {
79 font-family: "Georgia", serif;
80 font-style: italic;
81 font-weight: bold;
82}
83
84kbd,code,samp,pre,var { font-family: monospace; font-weight: bold; }
85code, pre {
86 background: var(--tertiary-color);
87 padding: 0.5rem 1rem;
88}
89code pre , pre code { padding: 0; }
90
91
92
93/* Elements */
94hr {
95 background: var(--text-color);
96 border: 0;
97 height: 1px;
98 margin: 4rem 0;
99}
100
101img { max-width: 100%; }
102
103figure {
104 border: 1px solid var(--primary-color);
105 display: inline-block;
106 padding: 1rem;
107 width: auto;
108}
109figure img { margin: 0; }
110figure figcaption { font-size: 80%; }
111
112ul, ol { margin: 2rem 0; padding: 0 0 0 4rem; }
113
114dl dd { padding-left: 2rem; }
115
116table {
117 border: 1px solid var(--primary-color);
118 border-collapse: collapse;
119 table-layout: fixed;
120 width: 100%;
121}
122table caption { margin: 2rem 0; }
123table thead { text-align: center; }
124table tbody { text-align: right; }
125table tr { border-bottom: 1px solid var(--primary-color); }
126table tbody tr:nth-child(even) { background: var(--tertiary-color); }
127table th { background: var(--secondary-color); font-weight: bold; }
128table th, table td { padding: 1rem; }
129table th:not(last-of-type), table td:not(last-of-type) { border-right: 1px solid var(--primary-color); }
130
131
132
133/* Mobile Styling */
134@media screen and (max-width: 50rem) {
135 body {
136 font: var(--mobile-font-size) -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto, Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji", "Segoe UI Symbol"
137 }
138} \ No newline at end of file
diff --git a/public/js/new.js b/public/js/new.js
new file mode 100644
index 0000000..4f54245
--- /dev/null
+++ b/public/js/new.js
@@ -0,0 +1,23 @@
1const elDrop = document.getElementById('dropzone');
2const submitBtn = document.getElementById('submitbutton');
3const fileInput = document.getElementById('files');
4
5elDrop.addEventListener('dragover', function (event) {
6 event.preventDefault();
7});
8
9elDrop.addEventListener('drop', async function (event) {
10 event.preventDefault();
11
12 submitBtn.disabled = true;
13
14 fileInput.files = event.dataTransfer.files;
15
16 elDrop.innerText = `✓ ${fileInput.files.length} files selected`;
17 elDrop.style.height = 'inherit';
18
19 submitBtn.disabled = false;
20});
21elDrop.addEventListener('click', () => {
22 fileInput.click();
23}) \ No newline at end of file
diff --git a/public/new.html b/public/new.html
index 69deafd..b0e4b41 100644
--- a/public/new.html
+++ b/public/new.html
@@ -1,40 +1,115 @@
1<!DOCTYPE html> 1<!DOCTYPE html>
2<html lang="en"> 2<html lang="en">
3
3<head> 4<head>
4 <meta charset="UTF-8"> 5 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge">
7 <title>Create a new service</title> 8 <title>Create a new service</title>
8 9
9 <style> 10 <link rel="stylesheet" href="css/vanilla.css">
10 input { 11
11 margin-bottom: 1rem; 12 <style>
12 } 13 input {
13 </style> 14 margin-bottom: 1rem;
15 width: 100%;
16 padding: 0.5rem;
17 }
18
19 button {
20 display: flex;
21 overflow: hidden;
22 padding: 12px 12px;
23 cursor: pointer;
24 width: 100%;
25 -webkit-user-select: none;
26 -moz-user-select: none;
27 -ms-user-select: none;
28 user-select: none;
29 transition: all 150ms linear;
30 text-align: center;
31 white-space: nowrap;
32 text-decoration: none !important;
33 text-transform: none;
34 text-transform: capitalize;
35 color: #fff;
36 border: 0 none;
37 border-radius: 4px;
38 font-size: 13px;
39 font-weight: 500;
40 line-height: 1.3;
41 -webkit-appearance: none;
42 -moz-appearance: none;
43 appearance: none;
44 justify-content: center;
45 align-items: center;
46 flex: 0 0 160px;
47 box-shadow: 2px 5px 10px #e4e4e4;
48 color: #FFFFFF;
49 background: #161616;
50 }
51
52 #dropzone {
53 width: 100%;
54 height: 30vh;
55 background-color: #ebebeb;
56
57 display: flex;
58 align-items: center;
59 justify-content: center;
60 text-align: center;
61
62 cursor: pointer;
63 }
64
65 #dropzone p {
66 font-size: 0.85rem;
67 }
68
69 #files {
70 display: none;
71 }
72
73 </style>
14</head> 74</head>
75
15<body> 76<body>
16 <h1>Create a new service</h1> 77 <h1>Create a new recipe</h1>
17 <form action="new" method="post" enctype="multipart/form-data"> 78 <p>Please create a recipe using <a href="https://github.com/meetfranz/plugins/blob/master/docs/integration.md">the
18 <label for="author">Author</label><br /> 79 official Franz guide</a>, then publish it here.</p>
19 <input type="text" name="author" placeholder="Jon Doe" required><br /> 80 <form action="new" method="post" enctype="multipart/form-data">
81 <label for="author">Author</label><br />
82 <input type="text" name="author" placeholder="Jon Doe" required><br />
83
84 <label for="name">Name</label><br />
85 <input type="text" name="name" placeholder="Sample Service" required><br />
20 86
21 <label for="name">Name</label><br /> 87 <label for="id">Service ID</label><br />
22 <input type="text" name="name" placeholder="Sample Service" required><br /> 88 <input type="text" name="id" placeholder="sample-service" required><br />
23 89
24 <label for="id">Service ID</label><br /> 90 <label for="png">Link to PNG image*</label><br />
25 <input type="text" name="id" placeholder="sample-service" required><br /> 91 <input type="text" name="png" placeholder="https://.../logo.png" required><br />
26 92
27 <label for="png">Link to PNG image</label><br /> 93 <label for="svg">Link to SVG image*</label><br />
28 <input type="text" name="png" placeholder="https://.../logo.png" required><br /> 94 <input type="text" name="svg" placeholder="https://.../logo.svg" required><br />
95 *These images must be publicly availible and have CORS enabled in order to work.<br /><br />
29 96
30 <label for="svg">Link to SVG image</label><br /> 97 <label for="package">Recipe files</label><br />
31 <input type="text" name="svg" placeholder="https://.../logo.svg" required><br /> 98 <div id="dropzone" effectAllowed="move">
99 <div>
100 Drop recipe files here<br />or click here to select files
101 <p>
102 Drag and drop your recipe files into this area.<br />
103 Please do not select the folder that contains the files but rather the files itself.
104 </p>
105 </div>
106 </div>
107 <input type="file" name="files[]" id="files" value="" multiple><br /><br />
32 108
33 <label for="package">Package</label><br /> 109 <button type="submit" id="submitbutton">Create recipe</button>
34 *Please package your service into a .tar.gz file<br /> 110 </form>
35 <input type="file" name="package" id="package"><br />
36 111
37 <button type="submit">Create</button> 112 <script src="js/new.js"></script>
38 </form>
39</body> 113</body>
40</html> \ No newline at end of file 114
115</html>
diff --git a/yarn.lock b/yarn.lock
index 26f1e52..f2ebd3d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -58,6 +58,13 @@
58 resolved "https://registry.yarnpkg.com/@adonisjs/cors/-/cors-1.0.7.tgz#9b7565ad0b80215c620e8864b4af8651220a527c" 58 resolved "https://registry.yarnpkg.com/@adonisjs/cors/-/cors-1.0.7.tgz#9b7565ad0b80215c620e8864b4af8651220a527c"
59 integrity sha512-jBO+bI/zdydAXURL02gQxXB57L5+eV2MUYp7zmDrVa12M6mQPMRz5TC2F7a0Kknx9JUr5dsl4+eN0XNfe/8sWQ== 59 integrity sha512-jBO+bI/zdydAXURL02gQxXB57L5+eV2MUYp7zmDrVa12M6mQPMRz5TC2F7a0Kknx9JUr5dsl4+eN0XNfe/8sWQ==
60 60
61"@adonisjs/drive@^1.0.4":
62 version "1.0.4"
63 resolved "https://registry.yarnpkg.com/@adonisjs/drive/-/drive-1.0.4.tgz#0dd2a3a5be7bf60fe80bc03d066c48eca9251ade"
64 integrity sha512-p2Ot+ylOwtGV6gHIKIMJG0M+AxBatjnqv+UOrUW3Y8xsyN9bKg9khZTEqn7WrHUAlmeS4WUR5T68KIaxuXgRDw==
65 dependencies:
66 "@slynova/flydrive" "^0.3.1"
67
61"@adonisjs/fold@^4.0.9": 68"@adonisjs/fold@^4.0.9":
62 version "4.0.9" 69 version "4.0.9"
63 resolved "https://registry.yarnpkg.com/@adonisjs/fold/-/fold-4.0.9.tgz#1a9860af2dbe29e4111d7f0cc234be15c2e28be8" 70 resolved "https://registry.yarnpkg.com/@adonisjs/fold/-/fold-4.0.9.tgz#1a9860af2dbe29e4111d7f0cc234be15c2e28be8"
@@ -143,6 +150,16 @@
143 haye "^2.0.1" 150 haye "^2.0.1"
144 lodash "^4.17.5" 151 lodash "^4.17.5"
145 152
153"@slynova/flydrive@^0.3.1":
154 version "0.3.1"
155 resolved "https://registry.yarnpkg.com/@slynova/flydrive/-/flydrive-0.3.1.tgz#7d89c43a90ef8599b29d5f7aadd9e82b6904e8ce"
156 integrity sha512-/C3chxZRqonxjQwj70WOyqtw0JGjBr6rjvkcrGlDedUXi5YoiJiTVHwD4ry6tHJKwOi3PtxpWO9RZwSKElVWzw==
157 dependencies:
158 create-output-stream "0.0.1"
159 fs-extra "^6.0.0"
160 node-exceptions "^3.0.0"
161 resetable "^1.0.2"
162
146abbrev@1: 163abbrev@1:
147 version "1.1.1" 164 version "1.1.1"
148 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 165 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -573,6 +590,14 @@ bcryptjs@^2.4.3:
573 resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb" 590 resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
574 integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms= 591 integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=
575 592
593bl@^1.0.0:
594 version "1.2.2"
595 resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c"
596 integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==
597 dependencies:
598 readable-stream "^2.3.5"
599 safe-buffer "^5.1.1"
600
576bluebird@^3.5.1: 601bluebird@^3.5.1:
577 version "3.5.5" 602 version "3.5.5"
578 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" 603 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
@@ -602,11 +627,29 @@ braces@^2.3.1:
602 split-string "^3.0.2" 627 split-string "^3.0.2"
603 to-regex "^3.0.1" 628 to-regex "^3.0.1"
604 629
630buffer-alloc-unsafe@^1.1.0:
631 version "1.1.0"
632 resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
633 integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
634
635buffer-alloc@^1.2.0:
636 version "1.2.0"
637 resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
638 integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
639 dependencies:
640 buffer-alloc-unsafe "^1.1.0"
641 buffer-fill "^1.0.0"
642
605buffer-equal-constant-time@1.0.1: 643buffer-equal-constant-time@1.0.1:
606 version "1.0.1" 644 version "1.0.1"
607 resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 645 resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
608 integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 646 integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
609 647
648buffer-fill@^1.0.0:
649 version "1.0.0"
650 resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
651 integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
652
610buffer-writer@2.0.0: 653buffer-writer@2.0.0:
611 version "2.0.0" 654 version "2.0.0"
612 resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" 655 resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04"
@@ -686,7 +729,7 @@ choices-separator@^2.0.0:
686 debug "^2.6.6" 729 debug "^2.6.6"
687 strip-color "^0.1.0" 730 strip-color "^0.1.0"
688 731
689chownr@^1.1.1: 732chownr@^1.0.1, chownr@^1.1.1:
690 version "1.1.2" 733 version "1.1.2"
691 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6" 734 resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6"
692 integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A== 735 integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==
@@ -887,6 +930,13 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
887 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 930 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
888 integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 931 integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
889 932
933create-output-stream@0.0.1:
934 version "0.0.1"
935 resolved "https://registry.yarnpkg.com/create-output-stream/-/create-output-stream-0.0.1.tgz#e0ac31e27defeae0e4f699c0edb9c6558c9fa5ab"
936 integrity sha1-4Kwx4n3v6uDk9pnA7bnGVYyfpas=
937 dependencies:
938 mkdirp "^0.5.1"
939
890cross-env@^5.1.0: 940cross-env@^5.1.0:
891 version "5.2.0" 941 version "5.2.0"
892 resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" 942 resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2"
@@ -1064,7 +1114,7 @@ encodeurl@^1.0.2, encodeurl@~1.0.2:
1064 resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 1114 resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
1065 integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 1115 integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
1066 1116
1067end-of-stream@^1.1.0, end-of-stream@^1.4.1: 1117end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
1068 version "1.4.1" 1118 version "1.4.1"
1069 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" 1119 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
1070 integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== 1120 integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==
@@ -1304,6 +1354,20 @@ fresh@0.5.2, fresh@^0.5.2:
1304 resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1354 resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
1305 integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 1355 integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
1306 1356
1357fs-constants@^1.0.0:
1358 version "1.0.0"
1359 resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
1360 integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
1361
1362fs-extra@^6.0.0:
1363 version "6.0.1"
1364 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-6.0.1.tgz#8abc128f7946e310135ddc93b98bddb410e7a34b"
1365 integrity sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==
1366 dependencies:
1367 graceful-fs "^4.1.2"
1368 jsonfile "^4.0.0"
1369 universalify "^0.1.0"
1370
1307fs-extra@^7.0.0: 1371fs-extra@^7.0.0:
1308 version "7.0.1" 1372 version "7.0.1"
1309 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 1373 resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
@@ -2752,6 +2816,14 @@ psl@^1.1.24:
2752 resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd" 2816 resolved "https://registry.yarnpkg.com/psl/-/psl-1.3.0.tgz#e1ebf6a3b5564fa8376f3da2275da76d875ca1bd"
2753 integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag== 2817 integrity sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==
2754 2818
2819pump@^1.0.0:
2820 version "1.0.3"
2821 resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954"
2822 integrity sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==
2823 dependencies:
2824 end-of-stream "^1.1.0"
2825 once "^1.3.1"
2826
2755pump@^3.0.0: 2827pump@^3.0.0:
2756 version "3.0.0" 2828 version "3.0.0"
2757 resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 2829 resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
@@ -2819,7 +2891,7 @@ rc@^1.2.7:
2819 minimist "^1.2.0" 2891 minimist "^1.2.0"
2820 strip-json-comments "~2.0.1" 2892 strip-json-comments "~2.0.1"
2821 2893
2822readable-stream@^2.0.6, readable-stream@^2.3.6: 2894readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@^2.3.6:
2823 version "2.3.6" 2895 version "2.3.6"
2824 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 2896 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
2825 integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 2897 integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@@ -2942,7 +3014,7 @@ require-uncached@^1.0.3:
2942 caller-path "^0.1.0" 3014 caller-path "^0.1.0"
2943 resolve-from "^1.0.0" 3015 resolve-from "^1.0.0"
2944 3016
2945resetable@^1.0.3: 3017resetable@^1.0.2, resetable@^1.0.3:
2946 version "1.0.3" 3018 version "1.0.3"
2947 resolved "https://registry.yarnpkg.com/resetable/-/resetable-1.0.3.tgz#0b8370bec2b921da04db0b22df8c9640fe399420" 3019 resolved "https://registry.yarnpkg.com/resetable/-/resetable-1.0.3.tgz#0b8370bec2b921da04db0b22df8c9640fe399420"
2948 integrity sha512-AJuhrcU5TVUaM5j0wSjZXlzt0Qb5pai7nDI+klgv7deuSHy5Kom7ovwBt5tMMO3XmJ9YYSCbKhkgDJHL4MEerQ== 3020 integrity sha512-AJuhrcU5TVUaM5j0wSjZXlzt0Qb5pai7nDI+klgv7deuSHy5Kom7ovwBt5tMMO3XmJ9YYSCbKhkgDJHL4MEerQ==
@@ -2991,7 +3063,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
2991 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 3063 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
2992 integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 3064 integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
2993 3065
2994safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: 3066safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
2995 version "5.2.0" 3067 version "5.2.0"
2996 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 3068 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
2997 integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 3069 integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
@@ -3375,6 +3447,29 @@ syntax-error@^1.1.4:
3375 dependencies: 3447 dependencies:
3376 acorn-node "^1.2.0" 3448 acorn-node "^1.2.0"
3377 3449
3450tar-fs@^1.8.1:
3451 version "1.16.3"
3452 resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509"
3453 integrity sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==
3454 dependencies:
3455 chownr "^1.0.1"
3456 mkdirp "^0.5.1"
3457 pump "^1.0.0"
3458 tar-stream "^1.1.2"
3459
3460tar-stream@^1.1.2:
3461 version "1.6.2"
3462 resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
3463 integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
3464 dependencies:
3465 bl "^1.0.0"
3466 buffer-alloc "^1.2.0"
3467 end-of-stream "^1.0.0"
3468 fs-constants "^1.0.0"
3469 readable-stream "^2.3.0"
3470 to-buffer "^1.1.1"
3471 xtend "^4.0.0"
3472
3378tar@^4: 3473tar@^4:
3379 version "4.4.10" 3474 version "4.4.10"
3380 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" 3475 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1"
@@ -3388,6 +3483,13 @@ tar@^4:
3388 safe-buffer "^5.1.2" 3483 safe-buffer "^5.1.2"
3389 yallist "^3.0.3" 3484 yallist "^3.0.3"
3390 3485
3486targz@^1.0.1:
3487 version "1.0.1"
3488 resolved "https://registry.yarnpkg.com/targz/-/targz-1.0.1.tgz#8f76a523694cdedfbb5d60a4076ff6eeecc5398f"
3489 integrity sha1-j3alI2lM3t+7XWCkB2/27uzFOY8=
3490 dependencies:
3491 tar-fs "^1.8.1"
3492
3391tarn@^1.1.4: 3493tarn@^1.1.4:
3392 version "1.1.5" 3494 version "1.1.5"
3393 resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d" 3495 resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d"
@@ -3431,6 +3533,11 @@ tmp@0.0.x:
3431 dependencies: 3533 dependencies:
3432 os-tmpdir "~1.0.2" 3534 os-tmpdir "~1.0.2"
3433 3535
3536to-buffer@^1.1.1:
3537 version "1.1.1"
3538 resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
3539 integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
3540
3434to-object-path@^0.3.0: 3541to-object-path@^0.3.0:
3435 version "0.3.0" 3542 version "0.3.0"
3436 resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 3543 resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"