├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── cli
├── assets.js
├── auth.js
├── builddash.js
├── cli.js
├── constants.js
├── datafns.js
├── env.js
├── exec.js
├── init.js
├── pkgjson.js
├── prompts.js
├── snapshot.js
├── splunkd.js
└── vercel.js
├── license_report.txt
├── package.json
├── template
├── .gitignore
├── .prettierrc
├── next.config.js
├── package.json
├── public
│ ├── favicon.ico
│ └── fonts
│ │ ├── inconsolata-regular.woff
│ │ ├── proxima-bold-webfont.woff
│ │ ├── proxima-regular-webfont.woff
│ │ ├── proxima-semibold-webfont.woff
│ │ ├── splunkdatasans-bold.woff2
│ │ ├── splunkdatasans-regular.woff2
│ │ └── splunkdatasans-semibold.woff2
├── src
│ ├── _version.json
│ ├── autoupdate.js
│ ├── components
│ │ ├── dashboard.js
│ │ ├── home.js
│ │ ├── loading.js
│ │ ├── nossr.js
│ │ └── page.js
│ ├── datasource.js
│ ├── drilldown.js
│ ├── pages
│ │ ├── [dashboard].jsx
│ │ ├── _document.jsx
│ │ ├── api
│ │ │ ├── _version.json
│ │ │ ├── data
│ │ │ │ ├── [dsid].js
│ │ │ │ ├── _snapshot.json
│ │ │ │ ├── package.json
│ │ │ │ └── yarn.lock
│ │ │ ├── package.json
│ │ │ └── version.js
│ │ └── index.jsx
│ ├── polyfills.js
│ ├── preset.js
│ ├── ready.js
│ └── styles.js
└── yarn.lock
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env
17 | .vscode
18 |
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
23 | /test-project
24 |
25 | /tmp
26 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 140,
3 | "semi": true,
4 | "singleQuote": true,
5 | "tabWidth": 4,
6 | "trailingComma": "es5"
7 | }
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright 2020, Splunk Inc.
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Dashboard Publisher
2 |
3 | **EXPERIMENTAL** tool that creates a Next.js project for a given list of Splunk dashboards, optionally making the dashboards accessible to anyone using [Vercel](https://vercel.com). Search results are proxied through serverless functions, which handle authentication and efficient CDN caching.
4 |
5 | ## Prerequisites
6 |
7 | - Node.js 12+, NPM, Yarn
8 | - [Vercel CLI](https://vercel.com/download) if you want to publish on Vercel
9 |
10 | ## Get started
11 |
12 | 1. Install `dashpub` CLI globally
13 |
14 | ```sh-session
15 | $ npm i -g @splunk/dashpub
16 | ```
17 |
18 | 2. Initialize a new project
19 |
20 | ```sh-session
21 | $ dashpub init
22 | ```
23 |
24 | Follow the instructions to create your dashboard project.
25 |
26 | ---
27 |
28 | Copyright 2020 Splunk Inc.
29 |
30 | Licensed under the Apache License, Version 2.0 (the "License");
31 | you may not use this file except in compliance with the License.
32 | You may obtain a copy of the License at
33 |
34 | http://www.apache.org/licenses/LICENSE-2.0
35 |
36 | Unless required by applicable law or agreed to in writing, software
37 | distributed under the License is distributed on an "AS IS" BASIS,
38 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
39 | See the License for the specific language governing permissions and
40 | limitations under the License.
41 |
--------------------------------------------------------------------------------
/cli/assets.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const { splunkd } = require('./splunkd');
18 | const { writeFile } = require('fs-extra');
19 | const sharp = require('sharp');
20 | const crypto = require('crypto');
21 | const path = require('path');
22 | const fetch = require('node-fetch');
23 | require('dotenv').config();
24 |
25 | function shortHash(buffer) {
26 | const h = crypto.createHash('sha256');
27 | h.write(buffer);
28 | h.end();
29 | return h.digest('hex').slice(0, 20);
30 | }
31 |
32 | function parseDataUri(dataUri) {
33 | if (!dataUri.startsWith('data:')) {
34 | throw new Error('Invalid data URI');
35 | }
36 | const semiIdx = dataUri.indexOf(';');
37 | if (semiIdx < 0) {
38 | throw new Error('Invalid data URI');
39 | }
40 | const mime = dataUri.slice(5, semiIdx);
41 | if (!dataUri.slice(semiIdx + 1, 7) === 'base64,') {
42 | throw new Error('Unsupported data URI encoding');
43 | }
44 | const data = Buffer.from(dataUri.slice(semiIdx + 8), 'base64');
45 | return [mime, data];
46 | }
47 |
48 | const seenImages = {};
49 |
50 | async function storeImage(data, mimeType, { name = 'img', projectDir }) {
51 | let optimzed = data;
52 | let filename;
53 |
54 | switch (mimeType) {
55 | case 'image/svg+xml':
56 | filename = `${name}.svg`;
57 | break;
58 | case 'image/jpeg':
59 | case 'image/jpg':
60 | filename = `${name}.jpg`;
61 | optimzed = await sharp(data)
62 | .jpeg()
63 | .toBuffer();
64 | break;
65 | case 'image/png':
66 | filename = `${name}.png`;
67 | optimzed = await sharp(data)
68 | .png()
69 | .toBuffer();
70 | break;
71 | case 'image/gif':
72 | filename = `${name}.gif`;
73 | break;
74 | default:
75 | throw new Error(`Unsupported mime type: ${mimeType}`);
76 | }
77 |
78 | filename = `${shortHash(optimzed)}_${filename}`;
79 | await writeFile(path.join(projectDir, 'public/assets', filename), optimzed);
80 |
81 | return filename;
82 | }
83 |
84 | async function downloadImage(src, assetType, splunkdInfo, projectDir) {
85 | if (!src) {
86 | return src;
87 | }
88 | if (src in seenImages) {
89 | return seenImages[src];
90 | }
91 | const [type, id] = src.split('://');
92 |
93 | if (type === 'https' || type === 'http') {
94 | const res = await fetch(src);
95 |
96 | const data = await res.buffer();
97 | const mimeType = res.headers.get('Content-Type');
98 |
99 | const filename = await storeImage(data, mimeType, { projectDir });
100 | const newUri = `/assets/${filename}`;
101 | seenImages[src] = newUri;
102 | return newUri;
103 | }
104 |
105 | if (type === 'splunk-enterprise-kvstore') {
106 | const imgData = await splunkd(
107 | 'GET',
108 | `/servicesNS/nobody/splunk-dashboard-studio/storage/collections/data/splunk-dashboard-${assetType}/${encodeURIComponent(id)}`,
109 | splunkdInfo
110 | );
111 |
112 | const [mimeType, data] = parseDataUri(imgData.dataURI);
113 | const filename = await storeImage(data, mimeType, { name: id, projectDir });
114 | const newUri = `/assets/${filename}`;
115 | seenImages[src] = newUri;
116 | return newUri;
117 | }
118 |
119 | throw new Error(`Unexpected image type: ${type}`);
120 | }
121 |
122 | module.exports = {
123 | downloadImage,
124 | };
125 |
--------------------------------------------------------------------------------
/cli/auth.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const { getPackageJson } = require('./pkgjson');
18 | const { writeDotenv } = require('./env');
19 | const { splunkdPassword } = require('./prompts');
20 |
21 | async function updatePassword() {
22 | const pkg = await getPackageJson();
23 | const { user, url } = pkg.dashpub.splunkd;
24 |
25 | console.log(`Enter password for user ${user} at ${url}`);
26 | const password = await splunkdPassword(url, user);
27 |
28 | await writeDotenv({
29 | splunkdUrl: url,
30 | splunkdUser: user,
31 | splunkdPassword: password,
32 | });
33 |
34 | return { username: user, password, url };
35 | }
36 |
37 | async function ensureAuth() {
38 | if (!process.env.SPLUNKD_PASSWORD) {
39 | return await updatePassword();
40 | }
41 |
42 | const pkg = await getPackageJson();
43 | const { user, url } = pkg.dashpub.splunkd;
44 | return { username: user, url, password: process.env.SPLUNKD_PASSWORD };
45 | }
46 |
47 | module.exports = {
48 | updatePassword,
49 | ensureAuth,
50 | };
51 |
--------------------------------------------------------------------------------
/cli/builddash.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const { loadDashboard } = require('./splunkd');
18 | const { downloadImage } = require('./assets');
19 | const { generateCdnDataSources } = require('./datafns');
20 | const { writeFile, mkdirp, remove } = require('fs-extra');
21 | const { cli } = require('cli-ux');
22 | const path = require('path');
23 |
24 | const COMPONENT_CODE = `\
25 | import React, { lazy, Suspense } from 'react';
26 | import Loading from '../../components/loading';
27 | import NoSSR from '../../components/nossr';
28 | import definition from './definition.json';
29 |
30 | const Dashboard = lazy(() => import('../../components/dashboard'));
31 |
32 | export default function () {
33 | return (
34 |
35 | }>
36 |
37 |
38 |
39 | );
40 | }
41 | `;
42 |
43 | async function generateDashboard({ name, targetName = name, app, projectFolder }, splunkdInfo) {
44 | const dash = await loadDashboard(name, app, splunkdInfo);
45 | const [dsManifest, newDash] = await generateCdnDataSources(dash, projectFolder);
46 | for (const viz of Object.values(newDash.visualizations || {})) {
47 | try {
48 | if (viz.type === 'viz.singlevalueicon') {
49 | viz.options.icon = await downloadImage(viz.options.icon, 'icons', splunkdInfo, projectFolder);
50 | }
51 | if (viz.type === 'splunk.singlevalueicon') {
52 | viz.options.icon = await downloadImage(viz.options.icon, 'icons', splunkdInfo, projectFolder);
53 | }
54 | if (viz.type === 'viz.img') {
55 | if (viz.options.src.match(/\$.*\$/g) )
56 | console.log(`Skipping image download due to token ${viz.options.src}`)
57 | else{
58 | viz.options.src = await downloadImage(viz.options.src, 'images', splunkdInfo, projectFolder);
59 | }
60 | }
61 | if (viz.type === 'splunk.image') {
62 | if (viz.options.src.match(/\$.*\$/g) )
63 | console.log(`Skipping image download due to token ${viz.options.src}`)
64 | else{
65 | viz.options.src = await downloadImage(viz.options.src, 'images', splunkdInfo, projectFolder);
66 | }
67 | }
68 | } catch (e) {
69 | console.error(`Failed to download image ${viz.options.icon || viz.options.src}`, e);
70 | }
71 | }
72 |
73 | if (newDash.layout.options.backgroundImage) {
74 | newDash.layout.options.backgroundImage.src = await downloadImage(
75 | newDash.layout.options.backgroundImage.src,
76 | 'images',
77 | splunkdInfo,
78 | projectFolder
79 | );
80 | }
81 |
82 | const dir = path.join(projectFolder, 'src/dashboards', targetName);
83 | await mkdirp(dir);
84 | await writeFile(path.join(dir, 'definition.json'), Buffer.from(JSON.stringify(newDash, null, 2), 'utf-8'));
85 | await writeFile(path.join(dir, 'index.js'), COMPONENT_CODE, 'utf-8');
86 |
87 | return [dsManifest, { [name]: newDash.title }];
88 | }
89 |
90 | async function generate(app, dashboards, splunkdInfo, projectFolder) {
91 | console.log(`Generating ${dashboards.length} dashboards...`);
92 | // cleanup
93 | await remove(path.join(projectFolder, 'public/assets'));
94 | await remove(path.join(projectFolder, 'src/pages/api/data/_datasources.json'));
95 | await remove(path.join(projectFolder, 'src/dashboards'));
96 |
97 | // create required dirs
98 | await mkdirp(path.join(projectFolder, 'public/assets'));
99 | await mkdirp(path.join(projectFolder, 'src/pages/api/data'));
100 |
101 | let datasourcesManifest = {};
102 | let dashboardsManifest = {};
103 |
104 | for (const dashboard of dashboards) {
105 | const targetName = dashboard;
106 | cli.action.start(`Generating dashboard ${dashboard}`);
107 | const [dsManifest, dashboardInfo] = await generateDashboard(
108 | {
109 | name: dashboard,
110 | targetName,
111 | app,
112 | projectFolder,
113 | },
114 | splunkdInfo
115 | );
116 |
117 | datasourcesManifest = Object.assign(datasourcesManifest, dsManifest);
118 | Object.assign(dashboardsManifest, dashboardInfo);
119 | cli.action.stop();
120 | }
121 |
122 | cli.action.start('Writing manifest files...');
123 | await writeFile(path.join(projectFolder, 'src/pages/api/data/_datasources.json'), JSON.stringify(datasourcesManifest, null, 4), {
124 | encoding: 'utf-8',
125 | });
126 | await writeFile(path.join(projectFolder, 'src/_dashboards.json'), JSON.stringify(dashboardsManifest, null, 4), {
127 | encoding: 'utf-8',
128 | });
129 | cli.action.stop();
130 | }
131 |
132 | module.exports = {
133 | generate,
134 | };
135 |
--------------------------------------------------------------------------------
/cli/cli.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /*
4 | Copyright 2020 Splunk Inc.
5 |
6 | Licensed under the Apache License, Version 2.0 (the "License");
7 | you may not use this file except in compliance with the License.
8 | You may obtain a copy of the License at
9 |
10 | http://www.apache.org/licenses/LICENSE-2.0
11 |
12 | Unless required by applicable law or agreed to in writing, software
13 | distributed under the License is distributed on an "AS IS" BASIS,
14 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | See the License for the specific language governing permissions and
16 | limitations under the License.
17 | */
18 |
19 | const { initNewProject, generateDashboards } = require('./init');
20 | const { getPackageJson } = require('./pkgjson');
21 | const { ensureAuth, updatePassword } = require('./auth');
22 | const { takeDataSnapshot, clearSnapshot } = require('./snapshot');
23 |
24 | require('dotenv').config();
25 |
26 | const usage = () => {
27 | console.error(`Usage: dashpub (init|update|auth|snapshot) [...options]`);
28 | process.exit(1);
29 | };
30 |
31 | async function main([cmd]) {
32 | if (cmd === 'init') {
33 | await initNewProject();
34 | } else if (cmd === 'auth') {
35 | await loadProject();
36 | await updatePassword();
37 | } else if (cmd === 'update') {
38 | const project = await loadProject();
39 | const splunkdInfo = await ensureAuth();
40 | await generateDashboards(project.dashboards, splunkdInfo, process.cwd());
41 | if (project.settings.useDataSnapshots) {
42 | await takeDataSnapshot(process.cwd(), project, splunkdInfo);
43 | } else {
44 | await clearSnapshot(process.cwd());
45 | }
46 | } else if (cmd === 'snapshot') {
47 | const project = await loadProject();
48 | const splunkdInfo = await ensureAuth();
49 | await takeDataSnapshot(process.cwd(), project, splunkdInfo);
50 | } else {
51 | usage();
52 | }
53 | }
54 |
55 | async function loadProject() {
56 | const pkg = await getPackageJson();
57 | if (!pkg.dashpub) {
58 | throw new Error('This project does not seem to dashpub-generated. Missing dashpub section in package.json');
59 | }
60 | return pkg.dashpub;
61 | }
62 |
63 | main(process.argv.slice(2)).catch(e => {
64 | console.error(e);
65 | process.exit(1);
66 | });
67 |
--------------------------------------------------------------------------------
/cli/constants.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const SPLUNK_DASHBOARDS_APP = 'search';
18 |
19 | module.exports = {
20 | SPLUNK_DASHBOARDS_APP,
21 | };
22 |
--------------------------------------------------------------------------------
/cli/datafns.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const crypto = require('crypto');
18 |
19 | const makeId = ds => {
20 | const h = crypto.createHash('sha256');
21 | if (ds.query) {
22 | h.write(ds.query);
23 | }
24 | if (ds.queryParameters) {
25 | if (ds.queryParameters.earliest) {
26 | h.write(ds.queryParameters.earliest);
27 | }
28 | if (ds.queryParameters.latest) {
29 | h.write(ds.queryParameters.latest);
30 | }
31 | }
32 | if (ds.refresh) {
33 | h.write(ds.refresh);
34 | }
35 | if (ds.postprocess) {
36 | h.write(ds.postprocess);
37 | }
38 | h.end();
39 | const s = h.digest('hex').slice(0, 24);
40 | let res = '';
41 | for (let i = 0; i < s.length; i += 2) {
42 | res += (parseInt(s.slice(i, i + 2), 16) % 36).toString(36)[0];
43 | }
44 | return res;
45 | };
46 |
47 | const units = {
48 | ms: 1,
49 | s: 1000,
50 | m: 60000,
51 | h: 3600000,
52 | };
53 |
54 | function parseRefreshTime(refresh, defaultValue = 400) {
55 | if (typeof refresh === 'number') {
56 | return refresh;
57 | }
58 | if (typeof refresh === 'string') {
59 | const m = refresh.match(/^(\d+)(ms|s|m|h)$/);
60 | if (m) {
61 | const v = parseInt(m[1]);
62 | if (!isNaN(v)) {
63 | const u = units[m[2]];
64 | if (u) {
65 | const ms = v * u;
66 |
67 | if (ms < 1000) {
68 | console.log('WARN: Ignoring sub-second refresh time');
69 | return defaultValue;
70 | }
71 | return Math.floor(ms / 1000);
72 | }
73 | }
74 | }
75 | const n = parseInt(refresh, 10);
76 | if (!isNaN(n)) {
77 | return n;
78 | }
79 | }
80 | return defaultValue;
81 | }
82 |
83 | async function generateCdnDataSource([key, ds], allDataSources) {
84 | let settings = ds.options;
85 |
86 | if (ds.type === 'ds.chain') {
87 | const base = allDataSources[ds.options.extend];
88 | if (!base) {
89 | throw new Error(`Unable to find base search ${ds.options.extend} for data source ${key}`);
90 | }
91 | settings = {
92 | ...base.options,
93 | postprocess: ds.options.query,
94 | };
95 | }
96 |
97 | if (!settings.query) {
98 | return null;
99 | }
100 |
101 | const id = makeId(settings);
102 |
103 | const dataSourceManifest = [
104 | id,
105 | {
106 | search: { ...settings, refresh: parseRefreshTime(ds.options.refresh) },
107 | app: 'search',
108 | id,
109 | },
110 | ];
111 |
112 | const dataSourceDefinition = [
113 | key,
114 | {
115 | type: 'ds.cdn',
116 | name: ds.name,
117 | options: {
118 | uri: `/api/data/${id}`,
119 | "enableSmartSources": true
120 | },
121 | },
122 | ];
123 |
124 | return [dataSourceManifest, dataSourceDefinition];
125 | }
126 |
127 | async function generateCdnDataSources(def, projectDir) {
128 | const results = []; //await Promise.all(Object.entries(def.dataSources || {}).map(e => generateCdnDataSource(e, def.dataSources)));
129 | for (const e of Object.entries(def.dataSources || {})) {
130 | const res = await generateCdnDataSource(e, def.dataSources);
131 | if (res != null) {
132 | results.push(res);
133 | }
134 | }
135 |
136 | const dsManifest = Object.fromEntries(results.map(r => r[0]));
137 | const dataSourceDefinition = Object.fromEntries(results.map(r => r[1]));
138 |
139 | return [
140 | dsManifest,
141 | {
142 | ...def,
143 | dataSources: dataSourceDefinition,
144 | },
145 | ];
146 | }
147 |
148 | module.exports = {
149 | generateCdnDataSources,
150 | };
151 |
--------------------------------------------------------------------------------
/cli/env.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const fs = require('fs-extra');
18 | const path = require('path');
19 |
20 | async function writeDotenv({ splunkdUrl, splunkdUser, splunkdPassword }, { destFolder = process.cwd() } = {}) {
21 | console.log('Writing splunkd password to .env');
22 | await fs.writeFile(
23 | path.join(destFolder, '.env'),
24 | [
25 | `SPLUNKD_URL=${splunkdUrl}`,
26 | `SPLUNKD_USER=${splunkdUser}`,
27 | `SPLUNKD_PASSWORD=${splunkdPassword}`,
28 | 'BROWSER=none',
29 | '',
30 | ].join('\n'),
31 | {
32 | encoding: 'utf-8',
33 | }
34 | );
35 | }
36 |
37 | module.exports = {
38 | writeDotenv,
39 | };
40 |
--------------------------------------------------------------------------------
/cli/exec.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const { cli } = require('cli-ux');
18 | const chalk = require('chalk');
19 | const execa = require('execa');
20 |
21 | class ExecError extends Error {
22 | constructor(message, code, stdout, stderr) {
23 | super(message);
24 | this.code = code;
25 | this.stdout = stdout;
26 | this.stderr = stderr;
27 | }
28 | }
29 |
30 | class Secret {
31 | constructor(value) {
32 | this.value = value;
33 | }
34 | }
35 |
36 | const exec = async (cmd, args, options) => {
37 | try {
38 | const rawArgs = args.map(a => (a instanceof Secret ? a.value : a));
39 | const displayArgs = args.map(a => (a instanceof Secret ? '*******' : a));
40 | cli.action.start(`${chalk.yellow('$')} ${cmd} ${displayArgs.join(' ')}`);
41 | const res = await execa(cmd, rawArgs, options);
42 | cli.action.stop(chalk.green('OK'));
43 | return res;
44 | } catch (e) {
45 | cli.action.stop(chalk.red('FAILED'));
46 | console.error(chalk.red(e.stderr));
47 | const code = e.code;
48 | throw new ExecError(`${cmd} exited with code ${code}`, code, e.stdout, e.stderr);
49 | }
50 | };
51 |
52 | module.exports = {
53 | exec,
54 | Secret,
55 | };
56 |
--------------------------------------------------------------------------------
/cli/init.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | /*
4 | Copyright 2020 Splunk Inc.
5 |
6 | Licensed under the Apache License, Version 2.0 (the "License");
7 | you may not use this file except in compliance with the License.
8 | You may obtain a copy of the License at
9 |
10 | http://www.apache.org/licenses/LICENSE-2.0
11 |
12 | Unless required by applicable law or agreed to in writing, software
13 | distributed under the License is distributed on an "AS IS" BASIS,
14 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | See the License for the specific language governing permissions and
16 | limitations under the License.
17 | */
18 |
19 | const prompts = require('./prompts');
20 | const splunkd = require('./splunkd');
21 | const { cli } = require('cli-ux');
22 | const fs = require('fs-extra');
23 | const path = require('path');
24 | const { exec, Secret } = require('./exec');
25 | const { generate } = require('./builddash');
26 | const chalk = require('chalk');
27 | const { updatePackageJson } = require('./pkgjson');
28 | const { writeDotenv } = require('./env');
29 | const { SPLUNK_DASHBOARDS_APP } = require('./constants');
30 | const { initVercelProject } = require('./vercel');
31 |
32 | const toFolderName = projectName => projectName.toLowerCase().replace(/[\W_]+/g, '-');
33 |
34 | const postInitInstructions = ({ folderName }) => chalk`
35 |
36 | {green Project successfully generated in {bold ./${folderName}}}
37 |
38 | Next steps:
39 |
40 | {yellow $} cd ./${folderName}
41 |
42 | {gray # Start developing}
43 |
44 | {yellow $} yarn dev
45 |
46 | {gray Open a browser at http://localhost:3000}
47 | `;
48 |
49 | async function generateDashboards(selectedDashboards, splunkdInfo, destFolder) {
50 | await generate(SPLUNK_DASHBOARDS_APP, selectedDashboards, splunkdInfo, destFolder);
51 | }
52 |
53 | async function initNewProject() {
54 | console.log(`Welcome to DASHPUB, let's setup a new project.\n`);
55 |
56 | const projectName = await prompts.string('Project name:');
57 | const folderName = await prompts.string('Folder name:', {
58 | default: toFolderName(projectName),
59 | });
60 |
61 | console.log('\nEnter information to access your dashboards in Splunk Enterprise:');
62 |
63 | const splunkdUrl = await prompts.splunkdUrl();
64 | const splunkdUser = await prompts.splunkdUsername();
65 | const splunkdPassword = await prompts.splunkdPassword(splunkdUrl, splunkdUser);
66 |
67 | const splunkdInfo = {
68 | url: splunkdUrl,
69 | username: splunkdUser,
70 | password: splunkdPassword,
71 | };
72 |
73 | cli.action.start(`Loading dashboards from ${SPLUNK_DASHBOARDS_APP} app`);
74 | const dashboards = await splunkd.listDashboards(SPLUNK_DASHBOARDS_APP, splunkdInfo);
75 | cli.action.stop(`found ${dashboards.length} dashboards`);
76 |
77 | const selectedDashboards = await prompts.selectDashboards(dashboards);
78 |
79 | console.log(`\nCreating project in ./${folderName}`);
80 | const srcFolder = path.join(__dirname, '..');
81 | const destFolder = path.join(process.cwd(), folderName);
82 | await fs.mkdir(destFolder);
83 |
84 | await fs.copy(path.join(srcFolder, 'template'), destFolder, { recursive: true });
85 | const copyToDest = (p, opts) => fs.copy(path.join(srcFolder, p), path.join(destFolder, p), opts);
86 | await copyToDest('yarn.lock');
87 |
88 | await updatePackageJson({ folderName, version: '1.0.0', projectName, splunkdUrl, splunkdUser, selectedDashboards }, { destFolder });
89 | await writeDotenv({ splunkdUrl, splunkdUser, splunkdPassword }, { destFolder });
90 |
91 | await exec('yarn', ['install'], { cwd: destFolder });
92 | await generateDashboards(selectedDashboards, splunkdInfo, destFolder);
93 |
94 | await exec('git', ['init'], { cwd: destFolder });
95 | await exec('git', ['add', '.'], { cwd: destFolder });
96 | await exec('git', ['commit', '-m', 'initialized dashpub project'], { cwd: destFolder });
97 |
98 | if (await prompts.confirm(`Setup Vercel project?`)) {
99 | await initVercelProject({ folderName, destFolder, splunkdUrl, splunkdUser, splunkdPassword });
100 | } else {
101 | console.log(postInitInstructions({ folderName }));
102 | }
103 | }
104 |
105 | module.exports = {
106 | initNewProject,
107 | generateDashboards,
108 | };
109 |
--------------------------------------------------------------------------------
/cli/pkgjson.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const fs = require('fs-extra');
18 | const path = require('path');
19 |
20 | async function getPackageJson(folder = process.cwd()) {
21 | return JSON.parse(await fs.readFile(path.join(folder, 'package.json'), { encoding: 'utf-8' }));
22 | }
23 |
24 | async function updatePackageJson(
25 | { folderName, version, projectName, splunkdUrl, splunkdUser, selectedDashboards, settings },
26 | { destFolder = process.cwd() } = {}
27 | ) {
28 | const pkg = await getPackageJson(destFolder);
29 | if (folderName != null) {
30 | pkg.name = folderName;
31 | }
32 | if (version != null) {
33 | pkg.version = version;
34 | }
35 | const prev = pkg.dashpub || { splunkd: {} };
36 | pkg.dashpub = {
37 | projectName: projectName || prev.projectName,
38 | settings: Object.assign(
39 | {
40 | useDataSnapshots: false,
41 | },
42 | prev.settings,
43 | settings
44 | ),
45 | splunkd: {
46 | url: splunkdUrl || prev.splunkd.url,
47 | user: splunkdUser || prev.splunkd.user,
48 | },
49 | dashboards: selectedDashboards || prev.dashboards,
50 | };
51 |
52 | await fs.writeFile(path.join(destFolder, 'package.json'), JSON.stringify(pkg, null, 4));
53 | }
54 |
55 | module.exports = {
56 | updatePackageJson,
57 | getPackageJson,
58 | };
59 |
--------------------------------------------------------------------------------
/cli/prompts.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const inquirer = require('inquirer');
18 | const fetch = require('node-fetch');
19 | const { validateAuth } = require('./splunkd');
20 |
21 | const noValidateHttpsAgent = new (require('https').Agent)({
22 | rejectUnauthorized: false,
23 | });
24 |
25 | inquirer.registerPrompt('checkbox-plus', require('inquirer-checkbox-plus-prompt'));
26 |
27 | const string = (prompt, opts) =>
28 | inquirer
29 | .prompt({
30 | name: 'value',
31 | message: prompt,
32 | ...opts,
33 | })
34 | .then(({ value }) => value);
35 |
36 | const confirm = prompt =>
37 | inquirer
38 | .prompt({
39 | type: 'confirm',
40 | name: 'confirmed',
41 | message: prompt,
42 | })
43 | .then(r => r.confirmed);
44 |
45 | const splunkdUrl = () =>
46 | inquirer
47 | .prompt({
48 | name: 'splunkdurl',
49 | message: 'Enter the splunkd URL of the splunk service you want to connect to:',
50 | default: 'https://my.splunkserver.com:8089',
51 |
52 | validate: async input => {
53 | if (input === 'https://my.splunkserver.com:8089') {
54 | throw new Error(`Don't use the example ;)`);
55 | }
56 | let url;
57 | try {
58 | url = new URL(input);
59 | } catch (e) {
60 | throw new Error(`Invalid URL: ${e.message}`);
61 | }
62 |
63 | try {
64 | url.pathname = '/';
65 | url.search = '?output_mode=json';
66 | const res = await fetch(url, {
67 | method: 'GET',
68 | agent: url.protocol === 'https:' ? noValidateHttpsAgent : undefined,
69 | });
70 |
71 | if (res.status !== 200) {
72 | throw new Error(`Received unexpected response: HTTP status ${res.status}`);
73 | }
74 |
75 | const { generator } = await res.json().catch(() => ({}));
76 |
77 | if (generator == null || generator.version == null) {
78 | throw new Error('Received unexpected response, is this splunkd?');
79 | }
80 | } catch (e) {
81 | throw new Error(`Failed to connect to splunkd: ${e.message}`);
82 | }
83 |
84 | return true;
85 | },
86 | })
87 | .then(({ splunkdurl }) => splunkdurl);
88 |
89 | const splunkdUsername = (defaultUser = 'admin') =>
90 | inquirer
91 | .prompt({
92 | name: 'username',
93 | message: 'Splunk user:',
94 | default: defaultUser,
95 | })
96 | .then(({ username }) => username);
97 |
98 | const splunkdPassword = (url, user) =>
99 | inquirer
100 | .prompt({
101 | type: 'password',
102 | name: 'password',
103 | message: 'Password:',
104 | default: 'changeme',
105 | async validate(pwd) {
106 | try {
107 | await validateAuth({ url, user, password: pwd });
108 | } catch (e) {
109 | throw new Error(`Failed to validate password: ${e.message}`);
110 | }
111 | return true;
112 | },
113 | })
114 | .then(({ password }) => password);
115 |
116 | const selectDashboards = dashboards =>
117 | inquirer
118 | .prompt({
119 | type: 'checkbox-plus',
120 | name: 'dashboards',
121 | message: 'Select one or more dashboards you want to publish',
122 | pageSize: 10,
123 | highlight: true,
124 | searchable: true,
125 | source: async (selected, input) => {
126 | const search = (input || '').toLowerCase();
127 | const matching = dashboards.filter(d => d.name.toLowerCase().includes(search) || d.label.toLowerCase().includes(search));
128 | return matching.map(({ name, label }) => ({ name: `${label} [${name}]`, short: label, value: name }));
129 | },
130 | validate: selected => {
131 | if (selected.length > 0) {
132 | return true;
133 | }
134 | throw new Error('Please select one or more dashboards');
135 | },
136 | })
137 | .then(({ dashboards }) => dashboards);
138 |
139 | module.exports = {
140 | string,
141 | confirm,
142 | splunkdUrl,
143 | splunkdUsername,
144 | splunkdPassword,
145 | selectDashboards,
146 | };
147 |
--------------------------------------------------------------------------------
/cli/snapshot.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const fs = require('fs');
18 | const path = require('path');
19 | const qs = require('querystring');
20 | const fetch = require('node-fetch');
21 | const debug = require('debug')('datasnapshot');
22 | const { cli } = require('cli-ux');
23 | require('dotenv').config();
24 |
25 | const qualifiedSearchString = query => (query.trim().startsWith('|') ? query : `search ${query}`);
26 | const sleep = ms => new Promise(r => setTimeout(r, ms));
27 |
28 | async function fetchData(search, { id, app, refresh, splunkdUrl, splunkUser, splunkPassword }) {
29 | const log = require('debug')(`ds:${id}`);
30 |
31 | const agent = splunkdUrl.startsWith('https')
32 | ? new (require('https').Agent)({
33 | rejectUnauthorized: false,
34 | })
35 | : undefined;
36 |
37 | log('Executing search for data fn', id);
38 | const SERVICE_PREFIX = `servicesNS/${encodeURIComponent(splunkUser)}/${encodeURIComponent(app)}`;
39 | const r = await fetch(`${splunkdUrl}/${SERVICE_PREFIX}/search/jobs`, {
40 | method: 'POST',
41 | headers: {
42 | Authorization: `Basic ${Buffer.from([splunkUser, splunkPassword].join(':')).toString('base64')}`,
43 | 'Content-Type': 'application/x-www-form-urlencoded',
44 | },
45 | body: qs.stringify({
46 | output_mode: 'json',
47 | earliest_time: (search.queryParameters || {}).earliest,
48 | latest_time: (search.queryParameters || {}).latest,
49 | search: qualifiedSearchString(search.query),
50 | // reuse_max_seconds_ago: refresh,
51 | timeout: 120,
52 | }),
53 | agent,
54 | });
55 |
56 | if (r.status > 299) {
57 | throw new Error(`Failed to dispatch job, splunkd returned HTTP status ${r.status}`);
58 | }
59 | const { sid } = await r.json();
60 | log(`Received search job sid=${sid} - waiting for job to complete`);
61 |
62 | let complete = false;
63 | while (!complete) {
64 | const statusData = await fetch(`${splunkdUrl}/${SERVICE_PREFIX}/search/jobs/${encodeURIComponent(sid)}?output_mode=json`, {
65 | headers: {
66 | Authorization: `Basic ${Buffer.from([splunkUser, splunkPassword].join(':')).toString('base64')}`,
67 | },
68 | agent,
69 | }).then(r => r.json());
70 |
71 | const jobStatus = statusData.entry[0].content;
72 | if (jobStatus.isFailed) {
73 | throw new Error('Search job failed');
74 | }
75 | complete = jobStatus.isDone;
76 | if (!complete) {
77 | await sleep(250);
78 | }
79 | }
80 |
81 | log('Search job sid=%s for data fn id=%s is complete', sid, id);
82 |
83 | const resultsQs = qs.stringify({
84 | output_mode: 'json_cols',
85 | count: 10000,
86 | offset: 0,
87 | search: search.postprocess,
88 | });
89 | const data = await fetch(`${splunkdUrl}/${SERVICE_PREFIX}/search/jobs/${sid}/results?${resultsQs}`, {
90 | method: 'GET',
91 | headers: {
92 | Authorization: `Basic ${Buffer.from([splunkUser, splunkPassword].join(':')).toString('base64')}`,
93 | },
94 | agent,
95 | }).then(r => r.json());
96 |
97 | return data;
98 | }
99 |
100 | function* findUsedDataSources(dashboardManifest, readJSON) {
101 | const seen = new Set();
102 |
103 | for (const dashboard of Object.keys(dashboardManifest)) {
104 | const def = readJSON(`src/dashboards/${dashboard}/definition.json`);
105 |
106 | for (const viz of Object.values(def.visualizations)) {
107 | if (viz.dataSources) {
108 | for (const dsid of Object.values(viz.dataSources)) {
109 | const id = def.dataSources[dsid].options.uri.split('/').slice(-1)[0];
110 | if (!seen.has(id)) {
111 | seen.add(id);
112 | yield id;
113 | }
114 | }
115 | }
116 | }
117 | }
118 | }
119 |
120 | async function takeDataSnapshot(projectRoot, project, splunkdInfo) {
121 | cli.action.start('Analyzing datasources from all dashboards');
122 | const projectFile = filePath => path.join(projectRoot, filePath);
123 | const readJSON = filePath => JSON.parse(fs.readFileSync(projectFile(filePath), { encoding: 'utf-8' }));
124 | const dataSources = readJSON('src/pages/api/data/_datasources.json');
125 | const baseOptions = {
126 | splunkdUrl: splunkdInfo.url,
127 | splunkUser: splunkdInfo.username,
128 | splunkPassword: splunkdInfo.password,
129 | };
130 |
131 | if (!baseOptions.splunkPassword) {
132 | throw new Error('SPLUNKD_PASSWORD environment variable not set');
133 | }
134 |
135 | const allData = {};
136 |
137 | const usedDatasources = [...findUsedDataSources(readJSON('src/_dashboards.json'), readJSON)];
138 | cli.action.stop(`found ${usedDatasources.length} unique data sources`);
139 | const progress = cli.progress({
140 | format: 'Fetching search results | {bar} | {value}/{total} searches',
141 | });
142 | let complete = 0;
143 | progress.start(usedDatasources.length, 0);
144 |
145 | for (let i = 0; i < usedDatasources.length; i += 10) {
146 | const chunk = usedDatasources.slice(i, i + 10);
147 | debug('Processing chunk idx=%d len=%d', i, chunk.length);
148 | const results = await Promise.all(
149 | chunk.map(id =>
150 | (async () => {
151 | const { search, app } = dataSources[id];
152 | debug('Fetching DS', id);
153 | const data = await fetchData(search, { id, app, ...baseOptions, refresh: 400 });
154 | progress.update(++complete);
155 | return { id, data };
156 | })()
157 | )
158 | );
159 | for (const { id, data } of results) {
160 | allData[id] = data;
161 | }
162 | }
163 | progress.stop();
164 |
165 | cli.action.start('Writing snapshot file');
166 | fs.writeFileSync(projectFile('src/pages/api/data/_snapshot.json'), JSON.stringify(allData, null, 2), { encoding: 'utf-8' });
167 | cli.action.stop();
168 | }
169 |
170 | async function clearSnapshot(projectRoot) {
171 | fs.writeFileSync(path.join(projectRoot, 'src/pages/api/data/_snapshot.json'), '{}', { encoding: 'utf-8' });
172 | }
173 |
174 | module.exports = {
175 | clearSnapshot,
176 | takeDataSnapshot,
177 | };
178 |
--------------------------------------------------------------------------------
/cli/splunkd.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const fetch = require('node-fetch');
18 | const { XmlDocument } = require('xmldoc');
19 |
20 | const noValidateHttpsAgent = new (require('https').Agent)({
21 | rejectUnauthorized: false,
22 | });
23 |
24 | const qs = obj =>
25 | Object.entries(obj)
26 | .map(([name, value]) => `${encodeURIComponent(name)}=${encodeURIComponent(value)}`)
27 | .join('&');
28 |
29 | const splunkd = (
30 | method,
31 | path,
32 | { body, url = process.env.SPLUNKD_URL, username = process.env.SPLUNKD_USER, password = process.env.SPLUNKD_PASSWORD } = {}
33 | ) => {
34 | return fetch(`${url}${path}`, {
35 | method,
36 | headers: {
37 | Authorization: `Basic ${Buffer.from(`${username}:${password}`).toString('base64')}`,
38 | },
39 | body,
40 | agent: url.startsWith('https:') ? noValidateHttpsAgent : undefined,
41 | }).then(async res => {
42 | if (res.status > 299) {
43 | const msg = await extractErrorMessage(res, `Splunkd responded with HTTP status ${res.status} requesting ${path}`);
44 | throw new Error(msg);
45 | }
46 | return res.json();
47 | });
48 | };
49 |
50 | async function extractErrorMessage(response, defaultMsg) {
51 | if (response.status === 404) {
52 | return defaultMsg;
53 | }
54 | try {
55 | const json = await response.json();
56 | console.log(json);
57 | } catch (e) {
58 | // ignore
59 | }
60 | return defaultMsg;
61 | }
62 |
63 | const extractDashboardDefinition = xmlSrc => {
64 | const doc = new XmlDocument(xmlSrc);
65 | const def = JSON.parse(doc.childNamed('definition').val);
66 | const theme = doc.attr['theme'];
67 | return theme ? { ...def, theme } : def;
68 | };
69 |
70 | const loadDashboard = (
71 | name,
72 | app,
73 | { url = process.env.SPLUNKD_URL, username = process.env.SPLUNKD_USER, password = process.env.SPLUNKD_PASSWORD } = {}
74 | ) =>
75 | splunkd('GET', `/servicesNS/-/${encodeURIComponent(app)}/data/ui/views/${encodeURIComponent(name)}?output_mode=json`, {
76 | url,
77 | username,
78 | password,
79 | }).then(data => extractDashboardDefinition(data.entry[0].content['eai:data']));
80 |
81 | const listDashboards = async (
82 | app,
83 | { url = process.env.SPLUNKD_URL, username = process.env.SPLUNKD_USER, password = process.env.SPLUNKD_PASSWORD } = {}
84 | ) => {
85 | const res = await splunkd(
86 | 'GET',
87 | `/servicesNS/-/${encodeURIComponent(app)}/data/ui/views?${qs({
88 | output_mode: 'json',
89 | count: 0,
90 | offset: 0,
91 | search: `(isDashboard=1 AND isVisible=1 AND (version=2 OR version=1))`,
92 | })}`,
93 | {
94 | url,
95 | username,
96 | password,
97 | }
98 | );
99 |
100 | return res.entry
101 | .filter(entry => entry.acl.app === app)
102 | .map(entry => ({
103 | name: entry.name,
104 | label: entry.content.label,
105 | }));
106 | };
107 |
108 | async function validateAuth({ url, user, password }) {
109 | try {
110 | await splunkd('GET', '/services/server/info', { url, username: user, password });
111 | return true;
112 | } catch (e) {
113 | return false;
114 | }
115 | }
116 |
117 | module.exports = {
118 | splunkd,
119 | loadDashboard,
120 | listDashboards,
121 | validateAuth,
122 | qs,
123 | };
124 |
--------------------------------------------------------------------------------
/cli/vercel.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const prompts = require('./prompts');
18 | const { exec, Secret } = require('./exec');
19 | const fs = require('fs-extra');
20 | const path = require('path');
21 | const chalk = require('chalk');
22 | const { cli } = require('cli-ux');
23 |
24 | const postInitInstructions = ({ folderName }) => chalk`
25 |
26 | {green Project successfully generated in {bold ./${folderName}}}
27 |
28 | {gray Next steps:}
29 |
30 | {yellow $} cd ./${folderName}
31 |
32 | {gray {bold.blue 1)} Setup the project with Vercel}
33 |
34 | {yellow $} vercel
35 |
36 | {gray Follow the steps to set up the project}
37 |
38 | {gray {bold.blue 2)} Run locally}
39 |
40 | {yellow $} vercel dev --listen 3333
41 |
42 | {gray Open a browser at http://localhost:3333}
43 |
44 | {gray {bold.blue 3)} Deploy to Vercel:}
45 |
46 | {yellow $} vercel --prod
47 |
48 | {gray {bold.blue 4)} [optional] Push to a Github repository and set up the Vercel Github Integration
49 |
50 | https://vercel.com/docs/git-integrations/vercel-for-github}
51 | `;
52 |
53 | async function initVercelProject({ folderName, destFolder, splunkdUrl, splunkdUser, splunkdPassword = process.env.SPLUNKD_PASSWORD }) {
54 | const nowSplunkdPasswordSecret = `dashpub-${folderName}-splunkd-password`;
55 |
56 | cli.action.start('Creating vercel.json');
57 | await fs.writeFile(
58 | path.join(destFolder, 'vercel.json'),
59 | JSON.stringify(
60 | {
61 | version: 2,
62 | env: {
63 | SPLUNKD_URL: splunkdUrl,
64 | SPLUNKD_USER: splunkdUser,
65 | SPLUNKD_PASSWORD: `@${nowSplunkdPasswordSecret}`,
66 | },
67 | },
68 | null,
69 | 2
70 | )
71 | );
72 | cli.action.stop();
73 |
74 | await exec('vercel', ['secret', 'add', nowSplunkdPasswordSecret, new Secret(splunkdPassword)]);
75 | await exec('git', ['add', '.'], { cwd: destFolder });
76 | await exec('git', ['commit', '-m', 'initialized vercel project'], { cwd: destFolder });
77 |
78 | console.log(postInitInstructions({ folderName }));
79 | }
80 |
81 | module.exports = {
82 | initVercelProject,
83 | };
84 |
--------------------------------------------------------------------------------
/license_report.txt:
--------------------------------------------------------------------------------
1 | ├─ (BSD-2-Clause OR MIT OR Apache-2.0)
2 | │ └─ rc@1.2.8
3 | │ ├─ URL: https://github.com/dominictarr/rc.git
4 | │ ├─ VendorName: Dominic Tarr
5 | │ └─ VendorUrl: dominictarr.com
6 | ├─ (MIT OR CC0-1.0)
7 | │ └─ type-fest@0.8.1
8 | │ ├─ URL: https://github.com/sindresorhus/type-fest.git
9 | │ ├─ VendorName: Sindre Sorhus
10 | │ └─ VendorUrl: sindresorhus.com
11 | ├─ (MIT OR WTFPL)
12 | │ └─ expand-template@2.0.3
13 | │ ├─ URL: https://github.com/ralphtheninja/expand-template.git
14 | │ ├─ VendorName: LM
15 | │ └─ VendorUrl: https://github.com/ralphtheninja/expand-template
16 | ├─ Apache-2.0
17 | │ ├─ detect-libc@1.0.3
18 | │ │ ├─ URL: git://github.com/lovell/detect-libc
19 | │ │ └─ VendorName: Lovell Fuller
20 | │ ├─ human-signals@1.1.1
21 | │ │ ├─ URL: https://github.com/ehmicky/human-signals.git
22 | │ │ ├─ VendorName: ehmicky
23 | │ │ └─ VendorUrl: https://git.io/JeluP
24 | │ ├─ rxjs@5.5.12
25 | │ │ ├─ URL: git@github.com:ReactiveX/RxJS.git
26 | │ │ ├─ VendorName: Ben Lesh
27 | │ │ └─ VendorUrl: https://github.com/ReactiveX/RxJS
28 | │ ├─ rxjs@6.5.4
29 | │ │ ├─ URL: https://github.com/reactivex/rxjs.git
30 | │ │ ├─ VendorName: Ben Lesh
31 | │ │ └─ VendorUrl: https://github.com/ReactiveX/RxJS
32 | │ ├─ sharp@0.25.2
33 | │ │ ├─ URL: git://github.com/lovell/sharp
34 | │ │ ├─ VendorName: Lovell Fuller
35 | │ │ └─ VendorUrl: https://github.com/lovell/sharp
36 | │ ├─ tslib@1.10.0
37 | │ │ ├─ URL: https://github.com/Microsoft/tslib.git
38 | │ │ ├─ VendorName: Microsoft Corp.
39 | │ │ └─ VendorUrl: http://typescriptlang.org/
40 | │ └─ tunnel-agent@0.6.0
41 | │ ├─ URL: https://github.com/mikeal/tunnel-agent
42 | │ ├─ VendorName: Mikeal Rogers
43 | │ └─ VendorUrl: http://www.futurealoof.com
44 | ├─ BSD-2-Clause
45 | │ ├─ dotenv@8.2.0
46 | │ │ └─ URL: git://github.com/motdotla/dotenv.git
47 | │ └─ esprima@4.0.1
48 | │ ├─ URL: https://github.com/jquery/esprima.git
49 | │ ├─ VendorName: Ariya Hidayat
50 | │ └─ VendorUrl: http://esprima.org/
51 | ├─ BSD-3-Clause
52 | │ └─ sprintf-js@1.0.3
53 | │ ├─ URL: https://github.com/alexei/sprintf.js.git
54 | │ ├─ VendorName: Alexandru Marasteanu
55 | │ └─ VendorUrl: http://alexei.ro/
56 | ├─ ISC
57 | │ ├─ @oclif/linewrap@1.0.0
58 | │ │ ├─ URL: git+https://github.com/heroku/node-linewrap.git
59 | │ │ ├─ VendorName: Jeff Dickey
60 | │ │ └─ VendorUrl: https://github.com/heroku/node-linewrap#readme
61 | │ ├─ aproba@1.2.0
62 | │ │ ├─ URL: https://github.com/iarna/aproba
63 | │ │ ├─ VendorName: Rebecca Turner
64 | │ │ └─ VendorUrl: https://github.com/iarna/aproba
65 | │ ├─ are-we-there-yet@1.1.5
66 | │ │ ├─ URL: https://github.com/iarna/are-we-there-yet.git
67 | │ │ ├─ VendorName: Rebecca Turner
68 | │ │ └─ VendorUrl: https://github.com/iarna/are-we-there-yet
69 | │ ├─ at-least-node@1.0.0
70 | │ │ ├─ URL: git+https://github.com/RyanZim/at-least-node.git
71 | │ │ ├─ VendorName: Ryan Zimmerman
72 | │ │ └─ VendorUrl: https://github.com/RyanZim/at-least-node#readme
73 | │ ├─ chownr@1.1.3
74 | │ │ ├─ URL: git://github.com/isaacs/chownr.git
75 | │ │ ├─ VendorName: Isaac Z. Schlueter
76 | │ │ └─ VendorUrl: http://blog.izs.me/
77 | │ ├─ cli-width@2.2.0
78 | │ │ ├─ URL: git@github.com:knownasilya/cli-width.git
79 | │ │ ├─ VendorName: Ilya Radchenko
80 | │ │ └─ VendorUrl: https://github.com/knownasilya/cli-width
81 | │ ├─ console-control-strings@1.1.0
82 | │ │ ├─ URL: https://github.com/iarna/console-control-strings
83 | │ │ ├─ VendorName: Rebecca Turner
84 | │ │ └─ VendorUrl: http://re-becca.org/
85 | │ ├─ fs-minipass@2.0.0
86 | │ │ ├─ URL: git+https://github.com/npm/fs-minipass.git
87 | │ │ ├─ VendorName: Isaac Z. Schlueter
88 | │ │ └─ VendorUrl: https://github.com/npm/fs-minipass#readme
89 | │ ├─ gauge@2.7.4
90 | │ │ ├─ URL: https://github.com/iarna/gauge
91 | │ │ ├─ VendorName: Rebecca Turner
92 | │ │ └─ VendorUrl: https://github.com/iarna/gauge
93 | │ ├─ graceful-fs@4.2.3
94 | │ │ └─ URL: https://github.com/isaacs/node-graceful-fs
95 | │ ├─ has-unicode@2.0.1
96 | │ │ ├─ URL: https://github.com/iarna/has-unicode
97 | │ │ ├─ VendorName: Rebecca Turner
98 | │ │ └─ VendorUrl: https://github.com/iarna/has-unicode
99 | │ ├─ inherits@2.0.4
100 | │ │ └─ URL: git://github.com/isaacs/inherits
101 | │ ├─ ini@1.3.5
102 | │ │ ├─ URL: git://github.com/isaacs/ini.git
103 | │ │ ├─ VendorName: Isaac Z. Schlueter
104 | │ │ └─ VendorUrl: http://blog.izs.me/
105 | │ ├─ isexe@2.0.0
106 | │ │ ├─ URL: git+https://github.com/isaacs/isexe.git
107 | │ │ ├─ VendorName: Isaac Z. Schlueter
108 | │ │ └─ VendorUrl: https://github.com/isaacs/isexe#readme
109 | │ ├─ minipass@3.1.1
110 | │ │ ├─ URL: git+https://github.com/isaacs/minipass.git
111 | │ │ ├─ VendorName: Isaac Z. Schlueter
112 | │ │ └─ VendorUrl: http://blog.izs.me/
113 | │ ├─ mute-stream@0.0.7
114 | │ │ ├─ URL: git://github.com/isaacs/mute-stream
115 | │ │ ├─ VendorName: Isaac Z. Schlueter
116 | │ │ └─ VendorUrl: http://blog.izs.me/
117 | │ ├─ mute-stream@0.0.8
118 | │ │ ├─ URL: git://github.com/isaacs/mute-stream
119 | │ │ ├─ VendorName: Isaac Z. Schlueter
120 | │ │ └─ VendorUrl: http://blog.izs.me/
121 | │ ├─ npmlog@4.1.2
122 | │ │ ├─ URL: https://github.com/npm/npmlog.git
123 | │ │ ├─ VendorName: Isaac Z. Schlueter
124 | │ │ └─ VendorUrl: http://blog.izs.me/
125 | │ ├─ once@1.4.0
126 | │ │ ├─ URL: git://github.com/isaacs/once
127 | │ │ ├─ VendorName: Isaac Z. Schlueter
128 | │ │ └─ VendorUrl: http://blog.izs.me/
129 | │ ├─ sax@1.2.4
130 | │ │ ├─ URL: git://github.com/isaacs/sax-js.git
131 | │ │ ├─ VendorName: Isaac Z. Schlueter
132 | │ │ └─ VendorUrl: http://blog.izs.me/
133 | │ ├─ semver@5.7.1
134 | │ │ └─ URL: https://github.com/npm/node-semver
135 | │ ├─ semver@7.2.1
136 | │ │ └─ URL: https://github.com/npm/node-semver
137 | │ ├─ set-blocking@2.0.0
138 | │ │ ├─ URL: git+https://github.com/yargs/set-blocking.git
139 | │ │ ├─ VendorName: Ben Coe
140 | │ │ └─ VendorUrl: https://github.com/yargs/set-blocking#readme
141 | │ ├─ signal-exit@3.0.2
142 | │ │ ├─ URL: https://github.com/tapjs/signal-exit.git
143 | │ │ ├─ VendorName: Ben Coe
144 | │ │ └─ VendorUrl: https://github.com/tapjs/signal-exit
145 | │ ├─ tar@6.0.1
146 | │ │ ├─ URL: https://github.com/npm/node-tar.git
147 | │ │ ├─ VendorName: Isaac Z. Schlueter
148 | │ │ └─ VendorUrl: http://blog.izs.me/
149 | │ ├─ which@1.3.1
150 | │ │ ├─ URL: git://github.com/isaacs/node-which.git
151 | │ │ ├─ VendorName: Isaac Z. Schlueter
152 | │ │ └─ VendorUrl: http://blog.izs.me
153 | │ ├─ which@2.0.2
154 | │ │ ├─ URL: git://github.com/isaacs/node-which.git
155 | │ │ ├─ VendorName: Isaac Z. Schlueter
156 | │ │ └─ VendorUrl: http://blog.izs.me
157 | │ ├─ wide-align@1.1.3
158 | │ │ ├─ URL: https://github.com/iarna/wide-align
159 | │ │ ├─ VendorName: Rebecca Turner
160 | │ │ └─ VendorUrl: http://re-becca.org/
161 | │ ├─ wrappy@1.0.2
162 | │ │ ├─ URL: https://github.com/npm/wrappy
163 | │ │ ├─ VendorName: Isaac Z. Schlueter
164 | │ │ └─ VendorUrl: https://github.com/npm/wrappy
165 | │ └─ yallist@4.0.0
166 | │ ├─ URL: git+https://github.com/isaacs/yallist.git
167 | │ ├─ VendorName: Isaac Z. Schlueter
168 | │ └─ VendorUrl: http://blog.izs.me/
169 | ├─ MIT
170 | │ ├─ @oclif/command@1.5.19
171 | │ │ ├─ URL: https://github.com/oclif/command.git
172 | │ │ ├─ VendorName: Jeff Dickey @jdxcode
173 | │ │ └─ VendorUrl: https://github.com/oclif/command
174 | │ ├─ @oclif/config@1.13.3
175 | │ │ ├─ URL: https://github.com/oclif/config.git
176 | │ │ ├─ VendorName: Jeff Dickey @jdxcode
177 | │ │ └─ VendorUrl: https://github.com/oclif/config
178 | │ ├─ @oclif/errors@1.2.2
179 | │ │ ├─ URL: https://github.com/oclif/errors.git
180 | │ │ ├─ VendorName: Jeff Dickey @jdxcode
181 | │ │ └─ VendorUrl: https://github.com/oclif/errors
182 | │ ├─ @oclif/parser@3.8.4
183 | │ │ ├─ URL: https://github.com/oclif/parser.git
184 | │ │ ├─ VendorName: Jeff Dickey @jdxcode
185 | │ │ └─ VendorUrl: https://github.com/oclif/parser
186 | │ ├─ @oclif/plugin-help@2.2.3
187 | │ │ ├─ URL: https://github.com/oclif/plugin-help.git
188 | │ │ ├─ VendorName: Jeff Dickey @jdxcode
189 | │ │ └─ VendorUrl: https://github.com/oclif/plugin-help
190 | │ ├─ @oclif/screen@1.0.4
191 | │ │ ├─ URL: https://github.com/oclif/screen.git
192 | │ │ ├─ VendorName: Jeff Dickey @jdxcode
193 | │ │ └─ VendorUrl: https://github.com/oclif/screen
194 | │ ├─ @types/color-name@1.1.1
195 | │ │ └─ URL: https://github.com/DefinitelyTyped/DefinitelyTyped.git
196 | │ ├─ ansi-escapes@3.2.0
197 | │ │ ├─ URL: https://github.com/sindresorhus/ansi-escapes.git
198 | │ │ ├─ VendorName: Sindre Sorhus
199 | │ │ └─ VendorUrl: sindresorhus.com
200 | │ ├─ ansi-escapes@4.3.0
201 | │ │ ├─ URL: https://github.com/sindresorhus/ansi-escapes.git
202 | │ │ ├─ VendorName: Sindre Sorhus
203 | │ │ └─ VendorUrl: sindresorhus.com
204 | │ ├─ ansi-regex@2.1.1
205 | │ │ ├─ URL: https://github.com/chalk/ansi-regex.git
206 | │ │ ├─ VendorName: Sindre Sorhus
207 | │ │ └─ VendorUrl: sindresorhus.com
208 | │ ├─ ansi-regex@3.0.0
209 | │ │ ├─ URL: https://github.com/chalk/ansi-regex.git
210 | │ │ ├─ VendorName: Sindre Sorhus
211 | │ │ └─ VendorUrl: sindresorhus.com
212 | │ ├─ ansi-regex@4.1.0
213 | │ │ ├─ URL: https://github.com/chalk/ansi-regex.git
214 | │ │ ├─ VendorName: Sindre Sorhus
215 | │ │ └─ VendorUrl: sindresorhus.com
216 | │ ├─ ansi-regex@5.0.0
217 | │ │ ├─ URL: https://github.com/chalk/ansi-regex.git
218 | │ │ ├─ VendorName: Sindre Sorhus
219 | │ │ └─ VendorUrl: sindresorhus.com
220 | │ ├─ ansi-styles@3.2.1
221 | │ │ ├─ URL: https://github.com/chalk/ansi-styles.git
222 | │ │ ├─ VendorName: Sindre Sorhus
223 | │ │ └─ VendorUrl: sindresorhus.com
224 | │ ├─ ansi-styles@4.2.1
225 | │ │ ├─ URL: https://github.com/chalk/ansi-styles.git
226 | │ │ ├─ VendorName: Sindre Sorhus
227 | │ │ └─ VendorUrl: sindresorhus.com
228 | │ ├─ ansicolors@0.3.2
229 | │ │ ├─ URL: git://github.com/thlorenz/ansicolors.git
230 | │ │ ├─ VendorName: Thorsten Lorenz
231 | │ │ └─ VendorUrl: thlorenz.com
232 | │ ├─ argparse@1.0.10
233 | │ │ └─ URL: https://github.com/nodeca/argparse.git
234 | │ ├─ bl@3.0.1
235 | │ │ ├─ URL: https://github.com/rvagg/bl.git
236 | │ │ └─ VendorUrl: https://github.com/rvagg/bl
237 | │ ├─ cardinal@2.1.1
238 | │ │ ├─ URL: git://github.com/thlorenz/cardinal.git
239 | │ │ ├─ VendorName: Thorsten Lorenz
240 | │ │ └─ VendorUrl: thlorenz.com
241 | │ ├─ chalk@2.4.2
242 | │ │ └─ URL: https://github.com/chalk/chalk.git
243 | │ ├─ chalk@3.0.0
244 | │ │ └─ URL: https://github.com/chalk/chalk.git
245 | │ ├─ chardet@0.4.2
246 | │ │ ├─ URL: git@github.com:runk/node-chardet.git
247 | │ │ ├─ VendorName: Dmitry Shirokov
248 | │ │ └─ VendorUrl: https://github.com/runk/node-chardet
249 | │ ├─ chardet@0.7.0
250 | │ │ ├─ URL: git@github.com:runk/node-chardet.git
251 | │ │ ├─ VendorName: Dmitry Shirokov
252 | │ │ └─ VendorUrl: https://github.com/runk/node-chardet
253 | │ ├─ clean-stack@1.3.0
254 | │ │ ├─ URL: https://github.com/sindresorhus/clean-stack.git
255 | │ │ ├─ VendorName: Sindre Sorhus
256 | │ │ └─ VendorUrl: sindresorhus.com
257 | │ ├─ clean-stack@2.2.0
258 | │ │ ├─ URL: https://github.com/sindresorhus/clean-stack.git
259 | │ │ ├─ VendorName: Sindre Sorhus
260 | │ │ └─ VendorUrl: sindresorhus.com
261 | │ ├─ cli-cursor@2.1.0
262 | │ │ ├─ URL: https://github.com/sindresorhus/cli-cursor.git
263 | │ │ ├─ VendorName: Sindre Sorhus
264 | │ │ └─ VendorUrl: sindresorhus.com
265 | │ ├─ cli-cursor@3.1.0
266 | │ │ ├─ URL: https://github.com/sindresorhus/cli-cursor.git
267 | │ │ ├─ VendorName: Sindre Sorhus
268 | │ │ └─ VendorUrl: sindresorhus.com
269 | │ ├─ cli-progress@3.5.0
270 | │ │ ├─ URL: https://github.com/AndiDittrich/Node.CLI-Progress.git
271 | │ │ ├─ VendorName: Andi Dittrich
272 | │ │ └─ VendorUrl: https://github.com/AndiDittrich/Node.CLI-Progress
273 | │ ├─ cli-ux@5.4.5
274 | │ │ ├─ URL: https://github.com/oclif/cli-ux.git
275 | │ │ ├─ VendorName: Jeff Dickey @jdxcode
276 | │ │ └─ VendorUrl: https://github.com/oclif/cli-ux
277 | │ ├─ code-point-at@1.1.0
278 | │ │ ├─ URL: https://github.com/sindresorhus/code-point-at.git
279 | │ │ ├─ VendorName: Sindre Sorhus
280 | │ │ └─ VendorUrl: sindresorhus.com
281 | │ ├─ color-convert@1.9.3
282 | │ │ ├─ URL: https://github.com/Qix-/color-convert.git
283 | │ │ └─ VendorName: Heather Arthur
284 | │ ├─ color-convert@2.0.1
285 | │ │ ├─ URL: https://github.com/Qix-/color-convert.git
286 | │ │ └─ VendorName: Heather Arthur
287 | │ ├─ color-name@1.1.3
288 | │ │ ├─ URL: git@github.com:dfcreative/color-name.git
289 | │ │ ├─ VendorName: DY
290 | │ │ └─ VendorUrl: https://github.com/dfcreative/color-name
291 | │ ├─ color-name@1.1.4
292 | │ │ ├─ URL: git@github.com:colorjs/color-name.git
293 | │ │ ├─ VendorName: DY
294 | │ │ └─ VendorUrl: https://github.com/colorjs/color-name
295 | │ ├─ color-string@1.5.3
296 | │ │ ├─ URL: https://github.com/Qix-/color-string.git
297 | │ │ └─ VendorName: Heather Arthur
298 | │ ├─ color@3.1.2
299 | │ │ └─ URL: https://github.com/Qix-/color.git
300 | │ ├─ colors@1.4.0
301 | │ │ ├─ URL: http://github.com/Marak/colors.js.git
302 | │ │ ├─ VendorName: Marak Squires
303 | │ │ └─ VendorUrl: https://github.com/Marak/colors.js
304 | │ ├─ core-util-is@1.0.2
305 | │ │ ├─ URL: git://github.com/isaacs/core-util-is
306 | │ │ ├─ VendorName: Isaac Z. Schlueter
307 | │ │ └─ VendorUrl: http://blog.izs.me/
308 | │ ├─ cross-spawn@6.0.5
309 | │ │ ├─ URL: git@github.com:moxystudio/node-cross-spawn.git
310 | │ │ ├─ VendorName: André Cruz
311 | │ │ └─ VendorUrl: https://github.com/moxystudio/node-cross-spawn
312 | │ ├─ cross-spawn@7.0.1
313 | │ │ ├─ URL: git@github.com:moxystudio/node-cross-spawn.git
314 | │ │ ├─ VendorName: André Cruz
315 | │ │ └─ VendorUrl: https://github.com/moxystudio/node-cross-spawn
316 | │ ├─ debug@4.1.1
317 | │ │ ├─ URL: git://github.com/visionmedia/debug.git
318 | │ │ └─ VendorName: TJ Holowaychuk
319 | │ ├─ decompress-response@4.2.1
320 | │ │ ├─ URL: https://github.com/sindresorhus/decompress-response.git
321 | │ │ ├─ VendorName: Sindre Sorhus
322 | │ │ └─ VendorUrl: sindresorhus.com
323 | │ ├─ deep-extend@0.6.0
324 | │ │ ├─ URL: git://github.com/unclechu/node-deep-extend.git
325 | │ │ ├─ VendorName: Viacheslav Lotsmanov
326 | │ │ └─ VendorUrl: https://github.com/unclechu/node-deep-extend
327 | │ ├─ delegates@1.0.0
328 | │ │ └─ URL: https://github.com/visionmedia/node-delegates.git
329 | │ ├─ emoji-regex@7.0.3
330 | │ │ ├─ URL: https://github.com/mathiasbynens/emoji-regex.git
331 | │ │ ├─ VendorName: Mathias Bynens
332 | │ │ └─ VendorUrl: https://mths.be/emoji-regex
333 | │ ├─ emoji-regex@8.0.0
334 | │ │ ├─ URL: https://github.com/mathiasbynens/emoji-regex.git
335 | │ │ ├─ VendorName: Mathias Bynens
336 | │ │ └─ VendorUrl: https://mths.be/emoji-regex
337 | │ ├─ end-of-stream@1.4.4
338 | │ │ ├─ URL: git://github.com/mafintosh/end-of-stream.git
339 | │ │ ├─ VendorName: Mathias Buus
340 | │ │ └─ VendorUrl: https://github.com/mafintosh/end-of-stream
341 | │ ├─ escape-string-regexp@1.0.5
342 | │ │ ├─ URL: https://github.com/sindresorhus/escape-string-regexp.git
343 | │ │ ├─ VendorName: Sindre Sorhus
344 | │ │ └─ VendorUrl: sindresorhus.com
345 | │ ├─ execa@4.0.0
346 | │ │ ├─ URL: https://github.com/sindresorhus/execa.git
347 | │ │ ├─ VendorName: Sindre Sorhus
348 | │ │ └─ VendorUrl: sindresorhus.com
349 | │ ├─ external-editor@2.2.0
350 | │ │ ├─ URL: git+https://github.com/mrkmg/node-external-editor.git
351 | │ │ ├─ VendorName: Kevin Gravier
352 | │ │ └─ VendorUrl: https://github.com/mrkmg/node-external-editor#readme
353 | │ ├─ external-editor@3.1.0
354 | │ │ ├─ URL: git+https://github.com/mrkmg/node-external-editor.git
355 | │ │ ├─ VendorName: Kevin Gravier
356 | │ │ └─ VendorUrl: https://github.com/mrkmg/node-external-editor#readme
357 | │ ├─ extract-stack@1.0.0
358 | │ │ ├─ URL: https://github.com/sindresorhus/extract-stack.git
359 | │ │ ├─ VendorName: Sindre Sorhus
360 | │ │ └─ VendorUrl: sindresorhus.com
361 | │ ├─ figures@2.0.0
362 | │ │ ├─ URL: https://github.com/sindresorhus/figures.git
363 | │ │ ├─ VendorName: Sindre Sorhus
364 | │ │ └─ VendorUrl: sindresorhus.com
365 | │ ├─ figures@3.1.0
366 | │ │ ├─ URL: https://github.com/sindresorhus/figures.git
367 | │ │ ├─ VendorName: Sindre Sorhus
368 | │ │ └─ VendorUrl: sindresorhus.com
369 | │ ├─ fs-constants@1.0.0
370 | │ │ ├─ URL: https://github.com/mafintosh/fs-constants.git
371 | │ │ ├─ VendorName: Mathias Buus
372 | │ │ └─ VendorUrl: https://github.com/mafintosh/fs-constants
373 | │ ├─ fs-extra@7.0.1
374 | │ │ ├─ URL: https://github.com/jprichardson/node-fs-extra
375 | │ │ ├─ VendorName: JP Richardson
376 | │ │ └─ VendorUrl: https://github.com/jprichardson/node-fs-extra
377 | │ ├─ fs-extra@9.0.0
378 | │ │ ├─ URL: https://github.com/jprichardson/node-fs-extra
379 | │ │ ├─ VendorName: JP Richardson
380 | │ │ └─ VendorUrl: https://github.com/jprichardson/node-fs-extra
381 | │ ├─ get-stream@5.1.0
382 | │ │ ├─ URL: https://github.com/sindresorhus/get-stream.git
383 | │ │ ├─ VendorName: Sindre Sorhus
384 | │ │ └─ VendorUrl: sindresorhus.com
385 | │ ├─ github-from-package@0.0.0
386 | │ │ ├─ URL: git://github.com/substack/github-from-package.git
387 | │ │ ├─ VendorName: James Halliday
388 | │ │ └─ VendorUrl: https://github.com/substack/github-from-package
389 | │ ├─ has-flag@2.0.0
390 | │ │ ├─ URL: https://github.com/sindresorhus/has-flag.git
391 | │ │ ├─ VendorName: Sindre Sorhus
392 | │ │ └─ VendorUrl: sindresorhus.com
393 | │ ├─ has-flag@3.0.0
394 | │ │ ├─ URL: https://github.com/sindresorhus/has-flag.git
395 | │ │ ├─ VendorName: Sindre Sorhus
396 | │ │ └─ VendorUrl: sindresorhus.com
397 | │ ├─ has-flag@4.0.0
398 | │ │ ├─ URL: https://github.com/sindresorhus/has-flag.git
399 | │ │ ├─ VendorName: Sindre Sorhus
400 | │ │ └─ VendorUrl: sindresorhus.com
401 | │ ├─ hyperlinker@1.0.0
402 | │ │ ├─ URL: https://github.com/jamestalmage/hyperlinker.git
403 | │ │ ├─ VendorName: James Talmage
404 | │ │ └─ VendorUrl: github.com/jamestalmage
405 | │ ├─ iconv-lite@0.4.24
406 | │ │ ├─ URL: git://github.com/ashtuchkin/iconv-lite.git
407 | │ │ ├─ VendorName: Alexander Shtuchkin
408 | │ │ └─ VendorUrl: https://github.com/ashtuchkin/iconv-lite
409 | │ ├─ indent-string@3.2.0
410 | │ │ ├─ URL: https://github.com/sindresorhus/indent-string.git
411 | │ │ ├─ VendorName: Sindre Sorhus
412 | │ │ └─ VendorUrl: sindresorhus.com
413 | │ ├─ indent-string@4.0.0
414 | │ │ ├─ URL: https://github.com/sindresorhus/indent-string.git
415 | │ │ ├─ VendorName: Sindre Sorhus
416 | │ │ └─ VendorUrl: sindresorhus.com
417 | │ ├─ inquirer-checkbox-plus-prompt@1.0.1
418 | │ │ ├─ URL: https://github.com/faressoft/inquirer-checkbox-plus-prompt.git
419 | │ │ └─ VendorName: Mohammad Fares
420 | │ ├─ inquirer@5.2.0
421 | │ │ ├─ URL: https://github.com/SBoudrias/Inquirer.js.git
422 | │ │ └─ VendorName: Simon Boudrias
423 | │ ├─ inquirer@7.1.0
424 | │ │ ├─ URL: https://github.com/SBoudrias/Inquirer.js.git
425 | │ │ └─ VendorName: Simon Boudrias
426 | │ ├─ is-arrayish@0.3.2
427 | │ │ ├─ URL: https://github.com/qix-/node-is-arrayish.git
428 | │ │ ├─ VendorName: Qix
429 | │ │ └─ VendorUrl: http://github.com/qix-
430 | │ ├─ is-fullwidth-code-point@1.0.0
431 | │ │ ├─ URL: https://github.com/sindresorhus/is-fullwidth-code-point.git
432 | │ │ ├─ VendorName: Sindre Sorhus
433 | │ │ └─ VendorUrl: sindresorhus.com
434 | │ ├─ is-fullwidth-code-point@2.0.0
435 | │ │ ├─ URL: https://github.com/sindresorhus/is-fullwidth-code-point.git
436 | │ │ ├─ VendorName: Sindre Sorhus
437 | │ │ └─ VendorUrl: sindresorhus.com
438 | │ ├─ is-fullwidth-code-point@3.0.0
439 | │ │ ├─ URL: https://github.com/sindresorhus/is-fullwidth-code-point.git
440 | │ │ ├─ VendorName: Sindre Sorhus
441 | │ │ └─ VendorUrl: sindresorhus.com
442 | │ ├─ is-promise@2.1.0
443 | │ │ ├─ URL: https://github.com/then/is-promise.git
444 | │ │ └─ VendorName: ForbesLindesay
445 | │ ├─ is-stream@2.0.0
446 | │ │ ├─ URL: https://github.com/sindresorhus/is-stream.git
447 | │ │ ├─ VendorName: Sindre Sorhus
448 | │ │ └─ VendorUrl: sindresorhus.com
449 | │ ├─ is-wsl@1.1.0
450 | │ │ ├─ URL: https://github.com/sindresorhus/is-wsl.git
451 | │ │ ├─ VendorName: Sindre Sorhus
452 | │ │ └─ VendorUrl: sindresorhus.com
453 | │ ├─ isarray@1.0.0
454 | │ │ ├─ URL: git://github.com/juliangruber/isarray.git
455 | │ │ ├─ VendorName: Julian Gruber
456 | │ │ └─ VendorUrl: https://github.com/juliangruber/isarray
457 | │ ├─ js-yaml@3.13.1
458 | │ │ ├─ URL: https://github.com/nodeca/js-yaml.git
459 | │ │ ├─ VendorName: Vladimir Zapparov
460 | │ │ └─ VendorUrl: https://github.com/nodeca/js-yaml
461 | │ ├─ jsonfile@4.0.0
462 | │ │ ├─ URL: git@github.com:jprichardson/node-jsonfile.git
463 | │ │ └─ VendorName: JP Richardson
464 | │ ├─ jsonfile@6.0.1
465 | │ │ ├─ URL: git@github.com:jprichardson/node-jsonfile.git
466 | │ │ └─ VendorName: JP Richardson
467 | │ ├─ lodash._reinterpolate@3.0.0
468 | │ │ ├─ URL: https://github.com/lodash/lodash.git
469 | │ │ ├─ VendorName: John-David Dalton
470 | │ │ └─ VendorUrl: https://lodash.com/
471 | │ ├─ lodash.template@4.5.0
472 | │ │ ├─ URL: https://github.com/lodash/lodash.git
473 | │ │ ├─ VendorName: John-David Dalton
474 | │ │ └─ VendorUrl: https://lodash.com/
475 | │ ├─ lodash.templatesettings@4.2.0
476 | │ │ ├─ URL: https://github.com/lodash/lodash.git
477 | │ │ ├─ VendorName: John-David Dalton
478 | │ │ └─ VendorUrl: https://lodash.com/
479 | │ ├─ lodash@4.17.20
480 | │ │ ├─ URL: https://github.com/lodash/lodash.git
481 | │ │ ├─ VendorName: John-David Dalton
482 | │ │ └─ VendorUrl: https://lodash.com/
483 | │ ├─ merge-stream@2.0.0
484 | │ │ ├─ URL: https://github.com/grncdr/merge-stream.git
485 | │ │ └─ VendorName: Stephen Sugden
486 | │ ├─ mimic-fn@1.2.0
487 | │ │ ├─ URL: https://github.com/sindresorhus/mimic-fn.git
488 | │ │ ├─ VendorName: Sindre Sorhus
489 | │ │ └─ VendorUrl: sindresorhus.com
490 | │ ├─ mimic-fn@2.1.0
491 | │ │ ├─ URL: https://github.com/sindresorhus/mimic-fn.git
492 | │ │ ├─ VendorName: Sindre Sorhus
493 | │ │ └─ VendorUrl: sindresorhus.com
494 | │ ├─ mimic-response@2.0.0
495 | │ │ ├─ URL: https://github.com/sindresorhus/mimic-response.git
496 | │ │ ├─ VendorName: Sindre Sorhus
497 | │ │ └─ VendorUrl: sindresorhus.com
498 | │ ├─ minimist@0.0.8
499 | │ │ ├─ URL: git://github.com/substack/minimist.git
500 | │ │ ├─ VendorName: James Halliday
501 | │ │ └─ VendorUrl: https://github.com/substack/minimist
502 | │ ├─ minimist@1.2.0
503 | │ │ ├─ URL: git://github.com/substack/minimist.git
504 | │ │ ├─ VendorName: James Halliday
505 | │ │ └─ VendorUrl: https://github.com/substack/minimist
506 | │ ├─ minizlib@2.1.0
507 | │ │ ├─ URL: git+https://github.com/isaacs/minizlib.git
508 | │ │ ├─ VendorName: Isaac Z. Schlueter
509 | │ │ └─ VendorUrl: http://blog.izs.me/
510 | │ ├─ mkdirp@0.5.1
511 | │ │ ├─ URL: https://github.com/substack/node-mkdirp.git
512 | │ │ ├─ VendorName: James Halliday
513 | │ │ └─ VendorUrl: http://substack.net
514 | │ ├─ mkdirp@1.0.4
515 | │ │ └─ URL: https://github.com/isaacs/node-mkdirp.git
516 | │ ├─ ms@2.1.2
517 | │ │ └─ URL: https://github.com/zeit/ms.git
518 | │ ├─ napi-build-utils@1.0.1
519 | │ │ ├─ URL: git+https://github.com/inspiredware/napi-build-utils.git
520 | │ │ ├─ VendorName: Jim Schlight
521 | │ │ └─ VendorUrl: https://github.com/inspiredware/napi-build-utils#readme
522 | │ ├─ natural-orderby@2.0.3
523 | │ │ ├─ URL: https://github.com/yobacca/natural-orderby.git
524 | │ │ ├─ VendorName: Olaf Ennen
525 | │ │ └─ VendorUrl: https://yobacca.github.io/natural-orderby
526 | │ ├─ nice-try@1.0.5
527 | │ │ ├─ URL: https://github.com/electerious/nice-try.git
528 | │ │ └─ VendorUrl: https://github.com/electerious/nice-try
529 | │ ├─ node-abi@2.13.0
530 | │ │ ├─ URL: https://github.com/lgeiger/node-abi.git
531 | │ │ ├─ VendorName: Lukas Geiger
532 | │ │ └─ VendorUrl: https://github.com/lgeiger/node-abi#readme
533 | │ ├─ node-addon-api@2.0.0
534 | │ │ ├─ URL: git://github.com/nodejs/node-addon-api.git
535 | │ │ └─ VendorUrl: https://github.com/nodejs/node-addon-api
536 | │ ├─ node-fetch@2.6.1
537 | │ │ ├─ URL: https://github.com/bitinn/node-fetch.git
538 | │ │ ├─ VendorName: David Frank
539 | │ │ └─ VendorUrl: https://github.com/bitinn/node-fetch
540 | │ ├─ noop-logger@0.1.1
541 | │ │ └─ URL: git://github.com/segmentio/noop-logger.git
542 | │ ├─ npm-run-path@4.0.1
543 | │ │ ├─ URL: https://github.com/sindresorhus/npm-run-path.git
544 | │ │ ├─ VendorName: Sindre Sorhus
545 | │ │ └─ VendorUrl: sindresorhus.com
546 | │ ├─ number-is-nan@1.0.1
547 | │ │ ├─ URL: https://github.com/sindresorhus/number-is-nan.git
548 | │ │ ├─ VendorName: Sindre Sorhus
549 | │ │ └─ VendorUrl: sindresorhus.com
550 | │ ├─ object-assign@4.1.1
551 | │ │ ├─ URL: https://github.com/sindresorhus/object-assign.git
552 | │ │ ├─ VendorName: Sindre Sorhus
553 | │ │ └─ VendorUrl: sindresorhus.com
554 | │ ├─ onetime@2.0.1
555 | │ │ ├─ URL: https://github.com/sindresorhus/onetime.git
556 | │ │ ├─ VendorName: Sindre Sorhus
557 | │ │ └─ VendorUrl: sindresorhus.com
558 | │ ├─ onetime@5.1.0
559 | │ │ ├─ URL: https://github.com/sindresorhus/onetime.git
560 | │ │ ├─ VendorName: Sindre Sorhus
561 | │ │ └─ VendorUrl: sindresorhus.com
562 | │ ├─ os-tmpdir@1.0.2
563 | │ │ ├─ URL: https://github.com/sindresorhus/os-tmpdir.git
564 | │ │ ├─ VendorName: Sindre Sorhus
565 | │ │ └─ VendorUrl: sindresorhus.com
566 | │ ├─ path-key@2.0.1
567 | │ │ ├─ URL: https://github.com/sindresorhus/path-key.git
568 | │ │ ├─ VendorName: Sindre Sorhus
569 | │ │ └─ VendorUrl: sindresorhus.com
570 | │ ├─ path-key@3.1.1
571 | │ │ ├─ URL: https://github.com/sindresorhus/path-key.git
572 | │ │ ├─ VendorName: Sindre Sorhus
573 | │ │ └─ VendorUrl: sindresorhus.com
574 | │ ├─ prebuild-install@5.3.3
575 | │ │ ├─ URL: https://github.com/prebuild/prebuild-install.git
576 | │ │ ├─ VendorName: Mathias Buus
577 | │ │ └─ VendorUrl: https://github.com/prebuild/prebuild-install
578 | │ ├─ prettier@1.19.1
579 | │ │ ├─ URL: https://github.com/prettier/prettier.git
580 | │ │ ├─ VendorName: James Long
581 | │ │ └─ VendorUrl: https://prettier.io/
582 | │ ├─ process-nextick-args@2.0.1
583 | │ │ ├─ URL: https://github.com/calvinmetcalf/process-nextick-args.git
584 | │ │ └─ VendorUrl: https://github.com/calvinmetcalf/process-nextick-args
585 | │ ├─ pump@3.0.0
586 | │ │ ├─ URL: git://github.com/mafintosh/pump.git
587 | │ │ └─ VendorName: Mathias Buus Madsen
588 | │ ├─ querystring@0.2.0
589 | │ │ ├─ URL: git://github.com/Gozala/querystring.git
590 | │ │ └─ VendorName: Irakli Gozalishvili
591 | │ ├─ readable-stream@2.3.6
592 | │ │ └─ URL: git://github.com/nodejs/readable-stream
593 | │ ├─ readable-stream@3.6.0
594 | │ │ └─ URL: git://github.com/nodejs/readable-stream
595 | │ ├─ redeyed@2.1.1
596 | │ │ ├─ URL: git://github.com/thlorenz/redeyed.git
597 | │ │ ├─ VendorName: Thorsten Lorenz
598 | │ │ └─ VendorUrl: thlorenz.com
599 | │ ├─ restore-cursor@2.0.0
600 | │ │ ├─ URL: https://github.com/sindresorhus/restore-cursor.git
601 | │ │ ├─ VendorName: Sindre Sorhus
602 | │ │ └─ VendorUrl: sindresorhus.com
603 | │ ├─ restore-cursor@3.1.0
604 | │ │ ├─ URL: https://github.com/sindresorhus/restore-cursor.git
605 | │ │ ├─ VendorName: Sindre Sorhus
606 | │ │ └─ VendorUrl: sindresorhus.com
607 | │ ├─ run-async@2.3.0
608 | │ │ ├─ URL: https://github.com/SBoudrias/run-async.git
609 | │ │ └─ VendorName: Simon Boudrias
610 | │ ├─ run-async@2.4.0
611 | │ │ ├─ URL: https://github.com/SBoudrias/run-async.git
612 | │ │ └─ VendorName: Simon Boudrias
613 | │ ├─ safe-buffer@5.1.2
614 | │ │ ├─ URL: git://github.com/feross/safe-buffer.git
615 | │ │ ├─ VendorName: Feross Aboukhadijeh
616 | │ │ └─ VendorUrl: https://github.com/feross/safe-buffer
617 | │ ├─ safe-buffer@5.2.0
618 | │ │ ├─ URL: git://github.com/feross/safe-buffer.git
619 | │ │ ├─ VendorName: Feross Aboukhadijeh
620 | │ │ └─ VendorUrl: https://github.com/feross/safe-buffer
621 | │ ├─ safe-buffer@5.2.1
622 | │ │ ├─ URL: git://github.com/feross/safe-buffer.git
623 | │ │ ├─ VendorName: Feross Aboukhadijeh
624 | │ │ └─ VendorUrl: https://github.com/feross/safe-buffer
625 | │ ├─ safer-buffer@2.1.2
626 | │ │ ├─ URL: git+https://github.com/ChALkeR/safer-buffer.git
627 | │ │ ├─ VendorName: Nikita Skovoroda
628 | │ │ └─ VendorUrl: https://github.com/ChALkeR
629 | │ ├─ shebang-command@1.2.0
630 | │ │ ├─ URL: https://github.com/kevva/shebang-command.git
631 | │ │ ├─ VendorName: Kevin Martensson
632 | │ │ └─ VendorUrl: github.com/kevva
633 | │ ├─ shebang-command@2.0.0
634 | │ │ ├─ URL: https://github.com/kevva/shebang-command.git
635 | │ │ ├─ VendorName: Kevin Mårtensson
636 | │ │ └─ VendorUrl: github.com/kevva
637 | │ ├─ shebang-regex@1.0.0
638 | │ │ ├─ URL: https://github.com/sindresorhus/shebang-regex.git
639 | │ │ ├─ VendorName: Sindre Sorhus
640 | │ │ └─ VendorUrl: sindresorhus.com
641 | │ ├─ shebang-regex@3.0.0
642 | │ │ ├─ URL: https://github.com/sindresorhus/shebang-regex.git
643 | │ │ ├─ VendorName: Sindre Sorhus
644 | │ │ └─ VendorUrl: sindresorhus.com
645 | │ ├─ simple-concat@1.0.0
646 | │ │ ├─ URL: git://github.com/feross/simple-concat.git
647 | │ │ ├─ VendorName: Feross Aboukhadijeh
648 | │ │ └─ VendorUrl: https://github.com/feross/simple-concat
649 | │ ├─ simple-get@3.1.0
650 | │ │ ├─ URL: git://github.com/feross/simple-get.git
651 | │ │ ├─ VendorName: Feross Aboukhadijeh
652 | │ │ └─ VendorUrl: https://github.com/feross/simple-get
653 | │ ├─ simple-swizzle@0.2.2
654 | │ │ ├─ URL: https://github.com/qix-/node-simple-swizzle.git
655 | │ │ ├─ VendorName: Qix
656 | │ │ └─ VendorUrl: http://github.com/qix-
657 | │ ├─ string_decoder@1.1.1
658 | │ │ ├─ URL: git://github.com/nodejs/string_decoder.git
659 | │ │ └─ VendorUrl: https://github.com/nodejs/string_decoder
660 | │ ├─ string_decoder@1.3.0
661 | │ │ ├─ URL: git://github.com/nodejs/string_decoder.git
662 | │ │ └─ VendorUrl: https://github.com/nodejs/string_decoder
663 | │ ├─ string-width@1.0.2
664 | │ │ ├─ URL: https://github.com/sindresorhus/string-width.git
665 | │ │ ├─ VendorName: Sindre Sorhus
666 | │ │ └─ VendorUrl: sindresorhus.com
667 | │ ├─ string-width@2.1.1
668 | │ │ ├─ URL: https://github.com/sindresorhus/string-width.git
669 | │ │ ├─ VendorName: Sindre Sorhus
670 | │ │ └─ VendorUrl: sindresorhus.com
671 | │ ├─ string-width@3.1.0
672 | │ │ ├─ URL: https://github.com/sindresorhus/string-width.git
673 | │ │ ├─ VendorName: Sindre Sorhus
674 | │ │ └─ VendorUrl: sindresorhus.com
675 | │ ├─ string-width@4.2.0
676 | │ │ ├─ URL: https://github.com/sindresorhus/string-width.git
677 | │ │ ├─ VendorName: Sindre Sorhus
678 | │ │ └─ VendorUrl: sindresorhus.com
679 | │ ├─ strip-ansi@3.0.1
680 | │ │ ├─ URL: https://github.com/chalk/strip-ansi.git
681 | │ │ ├─ VendorName: Sindre Sorhus
682 | │ │ └─ VendorUrl: sindresorhus.com
683 | │ ├─ strip-ansi@4.0.0
684 | │ │ ├─ URL: https://github.com/chalk/strip-ansi.git
685 | │ │ ├─ VendorName: Sindre Sorhus
686 | │ │ └─ VendorUrl: sindresorhus.com
687 | │ ├─ strip-ansi@5.2.0
688 | │ │ ├─ URL: https://github.com/chalk/strip-ansi.git
689 | │ │ ├─ VendorName: Sindre Sorhus
690 | │ │ └─ VendorUrl: sindresorhus.com
691 | │ ├─ strip-ansi@6.0.0
692 | │ │ ├─ URL: https://github.com/chalk/strip-ansi.git
693 | │ │ ├─ VendorName: Sindre Sorhus
694 | │ │ └─ VendorUrl: sindresorhus.com
695 | │ ├─ strip-final-newline@2.0.0
696 | │ │ ├─ URL: https://github.com/sindresorhus/strip-final-newline.git
697 | │ │ ├─ VendorName: Sindre Sorhus
698 | │ │ └─ VendorUrl: sindresorhus.com
699 | │ ├─ strip-json-comments@2.0.1
700 | │ │ ├─ URL: https://github.com/sindresorhus/strip-json-comments.git
701 | │ │ ├─ VendorName: Sindre Sorhus
702 | │ │ └─ VendorUrl: sindresorhus.com
703 | │ ├─ supports-color@5.5.0
704 | │ │ ├─ URL: https://github.com/chalk/supports-color.git
705 | │ │ ├─ VendorName: Sindre Sorhus
706 | │ │ └─ VendorUrl: sindresorhus.com
707 | │ ├─ supports-color@7.1.0
708 | │ │ ├─ URL: https://github.com/chalk/supports-color.git
709 | │ │ ├─ VendorName: Sindre Sorhus
710 | │ │ └─ VendorUrl: sindresorhus.com
711 | │ ├─ supports-hyperlinks@1.0.1
712 | │ │ ├─ URL: https://github.com/jamestalmage/supports-hyperlinks.git
713 | │ │ ├─ VendorName: James Talmage
714 | │ │ └─ VendorUrl: github.com/jamestalmage
715 | │ ├─ symbol-observable@1.0.1
716 | │ │ ├─ URL: https://github.com/blesh/symbol-observable.git
717 | │ │ └─ VendorName: Ben Lesh
718 | │ ├─ tar-fs@2.0.0
719 | │ │ ├─ URL: https://github.com/mafintosh/tar-fs.git
720 | │ │ ├─ VendorName: Mathias Buus
721 | │ │ └─ VendorUrl: https://github.com/mafintosh/tar-fs
722 | │ ├─ tar-stream@2.1.0
723 | │ │ ├─ URL: git+https://github.com/mafintosh/tar-stream.git
724 | │ │ ├─ VendorName: Mathias Buus
725 | │ │ └─ VendorUrl: https://github.com/mafintosh/tar-stream
726 | │ ├─ through@2.3.8
727 | │ │ ├─ URL: https://github.com/dominictarr/through.git
728 | │ │ ├─ VendorName: Dominic Tarr
729 | │ │ └─ VendorUrl: https://github.com/dominictarr/through
730 | │ ├─ tmp@0.0.33
731 | │ │ ├─ URL: https://github.com/raszi/node-tmp.git
732 | │ │ ├─ VendorName: KARASZI István
733 | │ │ └─ VendorUrl: http://github.com/raszi/node-tmp
734 | │ ├─ treeify@1.1.0
735 | │ │ ├─ URL: https://github.com/notatestuser/treeify.git
736 | │ │ └─ VendorName: Luke Plaster
737 | │ ├─ universalify@0.1.2
738 | │ │ ├─ URL: git+https://github.com/RyanZim/universalify.git
739 | │ │ ├─ VendorName: Ryan Zimmerman
740 | │ │ └─ VendorUrl: https://github.com/RyanZim/universalify#readme
741 | │ ├─ universalify@1.0.0
742 | │ │ ├─ URL: git+https://github.com/RyanZim/universalify.git
743 | │ │ ├─ VendorName: Ryan Zimmerman
744 | │ │ └─ VendorUrl: https://github.com/RyanZim/universalify#readme
745 | │ ├─ util-deprecate@1.0.2
746 | │ │ ├─ URL: git://github.com/TooTallNate/util-deprecate.git
747 | │ │ ├─ VendorName: Nathan Rajlich
748 | │ │ └─ VendorUrl: https://github.com/TooTallNate/util-deprecate
749 | │ ├─ which-pm-runs@1.0.0
750 | │ │ ├─ URL: git+https://github.com/zkochan/which-pm-runs.git
751 | │ │ ├─ VendorName: Zoltan Kochan
752 | │ │ └─ VendorUrl: https://github.com/zkochan/which-pm-runs#readme
753 | │ ├─ widest-line@2.0.1
754 | │ │ ├─ URL: https://github.com/sindresorhus/widest-line.git
755 | │ │ ├─ VendorName: Sindre Sorhus
756 | │ │ └─ VendorUrl: sindresorhus.com
757 | │ ├─ wrap-ansi@4.0.0
758 | │ │ ├─ URL: https://github.com/chalk/wrap-ansi.git
759 | │ │ ├─ VendorName: Sindre Sorhus
760 | │ │ └─ VendorUrl: sindresorhus.com
761 | │ └─ xmldoc@1.1.2
762 | │ ├─ URL: git://github.com/nfarina/xmldoc.git
763 | │ ├─ VendorName: Nick Farina
764 | │ └─ VendorUrl: http://nfarina.com
765 | └─ WTFPL
766 | └─ password-prompt@1.1.2
767 | ├─ URL: https://github.com/jdxcode/password-prompt
768 | ├─ VendorName: Jeff Dickey @jdxcode
769 | └─ VendorUrl: https://github.com/jdxcode/password-prompt
770 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@splunk/dashpub",
3 | "version": "0.0.1-alpha5",
4 | "license": "Apache-2.0",
5 | "description": "Generate next.js apps to publish Splunk dashboards",
6 | "homepage": "https://github.com/splunk/dashpub",
7 | "repository": {
8 | "type": "git",
9 | "url": "https://github.com/splunk/dashpub.git"
10 | },
11 | "bin": {
12 | "dashpub": "./cli/cli.js"
13 | },
14 | "dependencies": {
15 | "cli-ux": "^5.4.5",
16 | "debug": "^4.1.1",
17 | "dotenv": "^8.2.0",
18 | "execa": "^4.0.0",
19 | "fs-extra": "^9.0.0",
20 | "inquirer": "^7.3.3",
21 | "inquirer-checkbox-plus-prompt": "^1.0.1",
22 | "node-fetch": "^2.6.1",
23 | "prettier": "^1.19.1",
24 | "querystring": "^0.2.0",
25 | "sharp": "^0.29.2",
26 | "xmldoc": "^1.1.2"
27 | },
28 | "scripts": {
29 | "update:license-report": "yarn licenses list > license_report.txt"
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/template/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env
17 | .vscode
18 |
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
23 | .now
24 | .next
25 | .vercel
26 |
--------------------------------------------------------------------------------
/template/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 140,
3 | "semi": true,
4 | "singleQuote": true,
5 | "tabWidth": 4,
6 | "trailingComma": "es5"
7 | }
8 |
--------------------------------------------------------------------------------
/template/next.config.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const fs = require('fs');
18 | const path = require('path');
19 | const settings = Object.assign({}, require('./package.json').dashpub.settings);
20 |
21 | module.exports = {
22 | webpack(config, { buildId, webpack }) {
23 | const snapshotPath = path.join(__dirname, 'src/pages/api/data/_snapshot.json');
24 | if (!fs.existsSync(snapshotPath)) {
25 | fs.writeFileSync(snapshotPath, '{}', { encoding: 'utf-8' });
26 | }
27 | if (settings.useDataSnapshots) {
28 | const contents = fs.readFileSync(snapshotPath, { encoding: 'utf-8' });
29 | if (contents === '{}') {
30 | throw new Error('Data snapshots are enabled, but snapshot is empty');
31 | }
32 | }
33 |
34 | config.plugins.push(
35 | new webpack.DefinePlugin({
36 | 'process.env.USE_DATA_SNAPSHOTS': JSON.stringify(settings.useDataSnapshots),
37 | 'process.env.DASHPUB_BUILD_ID': JSON.stringify(buildId),
38 | })
39 | );
40 |
41 | return config;
42 | },
43 | };
44 |
--------------------------------------------------------------------------------
/template/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "package-name",
3 | "private": true,
4 | "version": "1.0.0",
5 | "license": "UNLICENSED",
6 | "dependencies": {
7 | "@babel/runtime": "^7.9.2",
8 | "@splunk/charting-bundle": "24.5.0",
9 | "@splunk/dashboard-context": "24.5.0",
10 | "@splunk/dashboard-core": "24.5.0",
11 | "@splunk/dashboard-definition": "24.5.0",
12 | "@splunk/dashboard-event-handlers": "24.5.0",
13 | "@splunk/dashboard-icons": "24.5.0",
14 | "@splunk/dashboard-inputs": "24.5.0",
15 | "@splunk/dashboard-layouts": "24.5.0",
16 | "@splunk/dashboard-presets": "24.5.0",
17 | "@splunk/dashboard-telemetry": "24.5.0",
18 | "@splunk/dashboard-ui": "24.5.0",
19 | "@splunk/dashboard-utils": "24.5.0",
20 | "@splunk/dashboard-visualizations": "24.5.0",
21 | "@splunk/datasource-utils": "24.5.0",
22 | "@splunk/datasources": "24.5.0",
23 | "@splunk/react-icons": "3.2.0",
24 | "@splunk/react-ui": "4.7.0",
25 | "@splunk/visualization-color-palettes": "24.5.0",
26 | "@splunk/visualization-context": "24.5.0",
27 | "@splunk/visualization-encoding": "24.5.0",
28 | "@splunk/visualization-encoding-parsers": "24.5.0",
29 | "@splunk/visualization-icons": "24.5.0",
30 | "@splunk/visualization-themes": "24.5.0",
31 | "@splunk/visualizations": "24.5.0",
32 | "@splunk/visualizations-shared": "24.5.0",
33 | "fast-text-encoding": "^1.0.2",
34 | "next": "^9.3.6",
35 | "prettier": "^2.0.5",
36 | "querystring": "^0.2.0",
37 | "react": "16.14.0",
38 | "react-dom": "16.14.0",
39 | "react-full-screen": "^0.2.4",
40 | "styled-components": "^5.0.0"
41 | },
42 | "resolutions": {
43 | "@splunk/charting-bundle": "24.5.0",
44 | "@splunk/dashboard-context": "24.5.0",
45 | "@splunk/dashboard-core": "24.5.0",
46 | "@splunk/dashboard-definition": "24.5.0",
47 | "@splunk/dashboard-event-handlers": "24.5.0",
48 | "@splunk/dashboard-icons": "24.5.0",
49 | "@splunk/dashboard-inputs": "24.5.0",
50 | "@splunk/dashboard-layouts": "24.5.0",
51 | "@splunk/dashboard-presets": "24.5.0",
52 | "@splunk/dashboard-telemetry": "24.5.0",
53 | "@splunk/dashboard-ui": "24.5.0",
54 | "@splunk/dashboard-utils": "24.5.0",
55 | "@splunk/dashboard-visualizations": "24.5.0",
56 | "@splunk/datasource-utils": "24.5.0",
57 | "@splunk/datasources": "24.5.0",
58 | "@splunk/react-icons": "3.2.0",
59 | "@splunk/react-ui": "4.7.0",
60 | "@splunk/visualization-color-palettes": "24.5.0",
61 | "@splunk/visualization-context": "24.5.0",
62 | "@splunk/visualization-encoding": "24.5.0",
63 | "@splunk/visualization-encoding-parsers": "24.5.0",
64 | "@splunk/visualization-icons": "24.5.0",
65 | "@splunk/visualization-themes": "24.5.0",
66 | "@splunk/visualizations": "24.5.0",
67 | "@splunk/visualizations-shared": "24.5.0"
68 | },
69 | "scripts": {
70 | "dev": "next dev",
71 | "build": "next build",
72 | "start": "next start"
73 | },
74 | "eslintConfig": {
75 | "extends": "react-app"
76 | },
77 | "browserslist": {
78 | "production": [
79 | ">0.2%",
80 | "not dead",
81 | "not op_mini all"
82 | ],
83 | "development": [
84 | "last 1 chrome version",
85 | "last 1 firefox version",
86 | "last 1 safari version"
87 | ]
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/template/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/splunk/dashpub/602dc25f6b298764d6004f6b4b0c2140f5c23703/template/public/favicon.ico
--------------------------------------------------------------------------------
/template/public/fonts/inconsolata-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/splunk/dashpub/602dc25f6b298764d6004f6b4b0c2140f5c23703/template/public/fonts/inconsolata-regular.woff
--------------------------------------------------------------------------------
/template/public/fonts/proxima-bold-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/splunk/dashpub/602dc25f6b298764d6004f6b4b0c2140f5c23703/template/public/fonts/proxima-bold-webfont.woff
--------------------------------------------------------------------------------
/template/public/fonts/proxima-regular-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/splunk/dashpub/602dc25f6b298764d6004f6b4b0c2140f5c23703/template/public/fonts/proxima-regular-webfont.woff
--------------------------------------------------------------------------------
/template/public/fonts/proxima-semibold-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/splunk/dashpub/602dc25f6b298764d6004f6b4b0c2140f5c23703/template/public/fonts/proxima-semibold-webfont.woff
--------------------------------------------------------------------------------
/template/public/fonts/splunkdatasans-bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/splunk/dashpub/602dc25f6b298764d6004f6b4b0c2140f5c23703/template/public/fonts/splunkdatasans-bold.woff2
--------------------------------------------------------------------------------
/template/public/fonts/splunkdatasans-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/splunk/dashpub/602dc25f6b298764d6004f6b4b0c2140f5c23703/template/public/fonts/splunkdatasans-regular.woff2
--------------------------------------------------------------------------------
/template/public/fonts/splunkdatasans-semibold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/splunk/dashpub/602dc25f6b298764d6004f6b4b0c2140f5c23703/template/public/fonts/splunkdatasans-semibold.woff2
--------------------------------------------------------------------------------
/template/src/_version.json:
--------------------------------------------------------------------------------
1 | { "version": "dev" }
2 |
--------------------------------------------------------------------------------
/template/src/autoupdate.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const VERSION = process.env.DASHPUB_BUILD_ID || 'dev';
18 |
19 | export function startAutoUpdateCheck() {
20 | if (VERSION != null && VERSION !== 'dev') {
21 | console.log('Current version is', VERSION);
22 | setInterval(performUpdateCheck, 30 * 60000);
23 | }
24 | }
25 |
26 | async function performUpdateCheck() {
27 | try {
28 | const res = await fetch('/api/version');
29 | const { version } = await res.json();
30 | if (version && version !== VERSION) {
31 | console.log('DETECTED NEW VERSION %o (current version is %o)', version, VERSION);
32 | window.location.reload();
33 | } else {
34 | console.log('Version %o is still latest', VERSION);
35 | }
36 | } catch (e) {
37 | console.error('Update check failed', e);
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/template/src/components/dashboard.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | import { DashboardContextProvider } from '@splunk/dashboard-context';
18 | import GeoRegistry from '@splunk/dashboard-context/GeoRegistry';
19 | import GeoJsonProvider from '@splunk/dashboard-context/GeoJsonProvider';
20 | import DashboardCore from '@splunk/dashboard-core';
21 | import React, { Suspense, useMemo, useEffect, useRef } from 'react';
22 | import Loading from './loading';
23 | import defaultPreset from '../preset';
24 | import { SayCheese, registerScreenshotReadinessDep } from '../ready';
25 | import { testTileConfig } from '@splunk/visualization-context/MapContext';
26 |
27 | const mapTileConfig = { defaultTileConfig: testTileConfig };
28 |
29 |
30 | const PROD_SRC_PREFIXES = [
31 | // Add URL prefixes here that will be replaced with the page's current origin
32 | ];
33 |
34 | function updateAssetUrls(orig, { origin = window.location.origin } = {}) {
35 | const images = new Set();
36 | const def = JSON.parse(JSON.stringify(orig));
37 | const normalizeImageUrl = (url) => {
38 | if (url.startsWith('/')) {
39 | return `${origin}${url}`;
40 | }
41 | for (const prefix of PROD_SRC_PREFIXES) {
42 | if (url.startsWith(prefix)) {
43 | return `${origin}${url.slice(prefix.length)}`;
44 | }
45 | }
46 | return url;
47 | };
48 | // Convert server-relative URLs to absolute URLs before rendering
49 | for (const viz of Object.values(def.visualizations)) {
50 | if (viz.type === 'viz.singlevalueicon' && viz.options.icon) {
51 | viz.options.icon = normalizeImageUrl(viz.options.icon);
52 | images.add(viz.options.src);
53 | }
54 | if (viz.type === 'viz.img' && viz.options.src) {
55 | viz.options.src = normalizeImageUrl(viz.options.src);
56 | images.add(viz.options.src);
57 | }
58 | }
59 | if (def.layout.options.backgroundImage && def.layout.options.backgroundImage.src) {
60 | def.layout.options.backgroundImage.src = normalizeImageUrl(def.layout.options.backgroundImage.src);
61 | images.add(def.layout.options.backgroundImage.src);
62 | }
63 | if (!def.layout.options.backgroundColor) {
64 | def.layout.options.backgroundColor = '#ffffff';
65 | }
66 | delete def.theme;
67 | return [def, [...images].filter((img) => img != null)];
68 | }
69 |
70 | class Img {
71 | constructor(src) {
72 | this.src = src;
73 | this.image = new Image();
74 | this.promise = new Promise((resolve, reject) => {
75 | this.image.onload = resolve;
76 | this.image.onerror = reject;
77 | this.image.src = src;
78 | });
79 | }
80 | }
81 |
82 | function preloadImages(images) {
83 | useEffect(() => {
84 | const readyDef = registerScreenshotReadinessDep(`IMGs[${images.length}]`);
85 | const imgs = images.map((src) => new Img(src));
86 | Promise.all(imgs.map((img) => img.promise)).then(() => {
87 | readyDef.ready();
88 | });
89 | return () => {
90 | readyDef.remove();
91 | };
92 | }, [images]);
93 | }
94 |
95 | export default function Dashboard({ definition, preset, width = '100vw', height = '100vh' }) {
96 | const [processedDef, images] = useMemo(() => updateAssetUrls(definition), [definition]);
97 | preloadImages(images);
98 | const geoRegistry = useMemo(() => {
99 | const geoRegistry = GeoRegistry.create();
100 | geoRegistry.addDefaultProvider(new GeoJsonProvider());
101 | return geoRegistry;
102 | }, []);
103 |
104 | useEffect(() => {
105 | const readyDep = registerScreenshotReadinessDep('DASH');
106 | const t = setTimeout(() => readyDep.ready(), 500);
107 | return () => {
108 | clearTimeout(t);
109 | readyDep.remove();
110 | };
111 | }, []);
112 |
113 | return (
114 |
115 | }>
116 |
117 |
124 |
125 |
126 | );
127 | }
128 |
--------------------------------------------------------------------------------
/template/src/components/home.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | import React from 'react';
18 | import styled from 'styled-components';
19 | import { variables } from '@splunk/themes';
20 | import dashboardManifest from '../_dashboards.json';
21 |
22 | const Wrapper = styled.div`
23 | width: 100vw;
24 | height: 100vh;
25 | overflow: hidden;
26 | display: flex;
27 | align-items: center;
28 | justify-content: center;
29 | flex-direction: column;
30 | `;
31 |
32 | const DashLink = styled.a`
33 | display: flex;
34 | color: ${variables.textColor};
35 | text-decoration: none;
36 | display: flex;
37 | align-items: center;
38 | justify-content: center;
39 | text-align: center;
40 | width: 280px;
41 | height: 80px;
42 | border: 1px solid #eee;
43 | margin: 10px 10px 0 0;
44 | box-sizing: border-box;
45 | padding: 0 15px;
46 | line-height: 120%;
47 |
48 | &:hover {
49 | background: rgb(0, 0, 0, 0.2);
50 | }
51 | `;
52 |
53 | const Title = styled.h1`
54 | color: ${variables.textColor};
55 | `;
56 |
57 | export default function Home({ title = 'Dashboards' }) {
58 | return (
59 |
60 | Dashboards
61 | {Object.keys(dashboardManifest).map((k) => (
62 |
63 | {dashboardManifest[k]}
64 |
65 | ))}
66 |
67 | );
68 | }
69 |
--------------------------------------------------------------------------------
/template/src/components/loading.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | import React from 'react';
18 | import styled from 'styled-components';
19 |
20 | const Wrapper = styled.div`
21 | width: 100vw;
22 | height: 100vh;
23 | overflow: hidden;
24 | display: flex;
25 | align-items: center;
26 | justify-content: center;
27 | `;
28 | const Inner = styled.div`
29 | font-size: 24px;
30 | `;
31 |
32 | const Msg = styled.span`
33 | color: #333;
34 | `;
35 |
36 | export default function Loading() {
37 | return (
38 |
39 |
40 | Loading...
41 |
42 |
43 | );
44 | }
45 |
--------------------------------------------------------------------------------
/template/src/components/nossr.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | export default function NoSSR({ children }) {
18 | return process.browser ? children : null;
19 | }
20 |
--------------------------------------------------------------------------------
/template/src/components/page.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | import React, { useEffect } from 'react';
18 | import { createGlobalStyle } from 'styled-components';
19 | import Head from 'next/head';
20 | import { startAutoUpdateCheck } from '../autoupdate';
21 | import { SplunkThemeProvider, variables } from '@splunk/themes';
22 |
23 | const TITLE_SUFFIX = 'Splunk Dashboard';
24 |
25 | const GlobalBackgroundStyle = createGlobalStyle`
26 | html, body {
27 | background-color: ${(props) => props.backgroundColor || variables.backgroundColor(props)};
28 | }
29 | `;
30 |
31 | const fullUrl = (baseUrl, path) => {
32 | if (!baseUrl) {
33 | return path;
34 | }
35 | const u = new URL(baseUrl);
36 | u.pathname = path;
37 | return u.href;
38 | };
39 |
40 | export default function Page({
41 | title,
42 | description,
43 | theme = 'light',
44 | backgroundColor,
45 | imageUrl,
46 | imageSize = { width: 700, height: 340 },
47 | path,
48 | baseUrl,
49 | children,
50 | }) {
51 | useEffect(() => {
52 | startAutoUpdateCheck();
53 | }, []);
54 |
55 | return (
56 | <>
57 |
58 |
59 | {title} - {TITLE_SUFFIX}
60 |
61 | {description && }
62 |
63 |
64 | {description && }
65 | {imageUrl != null && baseUrl != null && (
66 | <>
67 |
68 |
69 |
70 | >
71 | )}
72 |
73 |
74 |
75 | {imageUrl != null && baseUrl != null && (
76 | <>
77 |
78 | >
79 | )}
80 |
81 |
82 |
83 |
84 | {children}
85 |
86 | >
87 | );
88 | }
89 |
--------------------------------------------------------------------------------
/template/src/datasource.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | import DataSource from '@splunk/datasources/DataSource';
18 | import DataSet from '@splunk/datasource-utils/DataSet';
19 | import { registerScreenshotReadinessDep } from './ready';
20 |
21 | const DEFAULT_REFRESH_TIME = 60000;
22 | const BACKGROUND_REFESH_TIME = 600 * 1000;
23 | const LAST_RESULTS = {};
24 |
25 | async function waitForRefresh(regularInterval, backgroundInterval) {
26 | if (document.visibilityState == null || document.visibilityState === 'visible') {
27 | return new Promise((resolve) => setTimeout(resolve, regularInterval));
28 | }
29 | return new Promise((resolve) => {
30 | let done, timer;
31 | const cb = () => {
32 | if (document.visibilityState === 'visible') {
33 | done();
34 | }
35 | };
36 | document.addEventListener('visibilitychange', cb);
37 | done = () => {
38 | clearTimeout(timer);
39 | document.removeEventListener('visibilitychange', cb);
40 | resolve();
41 | };
42 | timer = setTimeout(done, backgroundInterval);
43 | });
44 | }
45 |
46 | export function createDataSet(data, options = {}) {
47 | let transformedData = data;
48 | if (options.sort) {
49 | const sortField = Object.keys(options.sort)[0];
50 | const colIdx = data.fields.indexOf(sortField);
51 | if (colIdx > -1) {
52 | const column = data.columns[colIdx];
53 | const indexes = [...Array(column.length)].map((_, i) => i);
54 |
55 | const dirSortFactor = options.sort[sortField] === 'asc' ? 1 : -1;
56 | const numColumn = column.map((v) => (v != null ? parseFloat(v, 10) : 0));
57 | const isNumColumn = numColumn.every((v) => !isNaN(v));
58 | if (isNumColumn) {
59 | indexes.sort((a, b) => (numColumn[a] - numColumn[b]) * dirSortFactor);
60 | } else {
61 | indexes.sort((a, b) => (column[a] || '').localeCompare(column[b] || '') * dirSortFactor);
62 | }
63 | transformedData = {
64 | fields: data.fields,
65 | columns: data.columns.map((c) => indexes.map((i) => c[i])),
66 | };
67 | }
68 | }
69 | return DataSet.fromJSONCols(transformedData.fields, transformedData.columns);
70 | }
71 |
72 | function createNextPayload({ data, vizOptions }) {
73 | return {
74 | data,
75 | meta: {
76 | percentComplete: 100,
77 | status: 'done',
78 | totalCount: (data.columns[0] || []).length,
79 | lastUpdated: new Date().toISOString(),
80 | },
81 | vizOptions,
82 | };
83 | }
84 |
85 | export default class PublicDataSource extends DataSource {
86 | constructor(options = {}, context = {}, ...rest) {
87 | super(options, context);
88 | this.uri = options.uri;
89 | this.vizOptions = options.vizOptions;
90 | this.meta = options.meta;
91 | }
92 |
93 | request(options) {
94 | options = options || {};
95 | return (observer) => {
96 | let aborted = false;
97 | let readyDep = registerScreenshotReadinessDep('DS');
98 |
99 | (async () => {
100 | let initial = true;
101 |
102 | if (LAST_RESULTS[this.uri]) {
103 | const { ts, data } = LAST_RESULTS[this.uri];
104 | observer.next(
105 | createNextPayload({
106 | data: createDataSet(data, options),
107 | vizOptions: this.vizOptions,
108 | })
109 | );
110 | const wait = DEFAULT_REFRESH_TIME - (Date.now() - ts);
111 | if (wait > 0) {
112 | await waitForRefresh(wait, wait);
113 | }
114 | initial = false;
115 | }
116 |
117 | while (!aborted) {
118 | try {
119 | const res = await fetch(this.uri);
120 | if (aborted) {
121 | break;
122 | }
123 | if (res.status > 299) {
124 | throw new Error(`HTTP Status ${res.status}`);
125 | }
126 | const data = await res.json();
127 | if (data.error) {
128 | throw new Error(data.error);
129 | }
130 | LAST_RESULTS[this.uri] = {
131 | ts: Date.now(),
132 | data,
133 | };
134 | readyDep.ready();
135 | observer.next(
136 | createNextPayload({
137 | data: createDataSet(data, options),
138 | vizOptions: this.vizOptions,
139 | })
140 | );
141 | } catch (e) {
142 | if (aborted) {
143 | break;
144 | }
145 | if (initial) {
146 | observer.error({
147 | level: 'error',
148 | message: e.message || 'Unexpected error',
149 | });
150 | }
151 | observer.next(
152 | createNextPayload({
153 | data: DataSet.empty(),
154 | vizOptions: this.vizOptions,
155 | })
156 | );
157 | }
158 | initial = false;
159 | await waitForRefresh(DEFAULT_REFRESH_TIME, BACKGROUND_REFESH_TIME);
160 | }
161 | })();
162 |
163 | return () => {
164 | aborted = true;
165 | readyDep.remove();
166 | };
167 | };
168 | }
169 | }
170 |
--------------------------------------------------------------------------------
/template/src/drilldown.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const INTERNAL_LINK_PREFIX = '/en-US/app/search/';
18 |
19 | export default class DrilldownHandler {
20 | constructor(options = {}) {
21 | this.options = options;
22 | this.events = Array.isArray(options.events) ? options.events : ['any'];
23 | }
24 |
25 | canHandle(event) {
26 | return (
27 | event &&
28 | event.type !== 'range.select' &&
29 | this.options &&
30 | !!this.options.url &&
31 | (this.events.includes('any') || this.events.includes(event.type))
32 | );
33 | }
34 |
35 | handle() {
36 | const { url, newTab } = this.options;
37 |
38 | if (url.indexOf(INTERNAL_LINK_PREFIX) === 0) {
39 | const dashboard = url.slice(INTERNAL_LINK_PREFIX.length);
40 | return Promise.resolve([
41 | {
42 | type: 'linkTo',
43 | payload: {
44 | url: `/${dashboard}`,
45 | newTab: newTab,
46 | },
47 | },
48 | ]);
49 | }
50 |
51 | return Promise.resolve([
52 | {
53 | type: 'linkTo',
54 | payload: {
55 | url: url,
56 | newTab: newTab,
57 | },
58 | },
59 | ]);
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/template/src/pages/[dashboard].jsx:
--------------------------------------------------------------------------------
1 | import React, { lazy, Suspense } from 'react';
2 | import Loading from '../components/loading';
3 | import NoSSR from '../components/nossr';
4 | import Page from '../components/page';
5 |
6 | const Dashboard = lazy(() => import('../components/dashboard'));
7 |
8 | export default function DashboardPage({ definition, dashboardId, baseUrl }) {
9 | return (
10 |
19 |
20 | }>
21 |
22 |
23 |
24 |
25 | );
26 | }
27 |
28 | export async function getStaticProps({ params }) {
29 | const definition = require(`../dashboards/${params.dashboard}/definition.json`);
30 | return {
31 | props: {
32 | definition,
33 | dashboardId: params.dashboard,
34 | baseUrl: process.env.VERCEL_URL ? `https://${process.env.VERCEL_URL}` : null,
35 | },
36 | };
37 | }
38 |
39 | export async function getStaticPaths() {
40 | const dashboards = require('../_dashboards.json');
41 | return {
42 | paths: Object.keys(dashboards)
43 | .filter((d) => d !== 'timelapse')
44 | .map((d) => ({ params: { dashboard: d } })),
45 | fallback: false,
46 | };
47 | }
48 |
--------------------------------------------------------------------------------
/template/src/pages/_document.jsx:
--------------------------------------------------------------------------------
1 | import Document, { Main, Html, Head, NextScript } from 'next/document';
2 | import { ServerStyleSheet } from 'styled-components';
3 |
4 | export default class MyDocument extends Document {
5 | static async getInitialProps(ctx) {
6 | const sheet = new ServerStyleSheet();
7 | const originalRenderPage = ctx.renderPage;
8 |
9 | try {
10 | ctx.renderPage = () =>
11 | originalRenderPage({
12 | enhanceApp: App => props => sheet.collectStyles(),
13 | });
14 |
15 | const initialProps = await Document.getInitialProps(ctx);
16 | return {
17 | ...initialProps,
18 | styles: (
19 | <>
20 | {initialProps.styles}
21 | {sheet.getStyleElement()}
22 | >
23 | ),
24 | };
25 | } finally {
26 | sheet.seal();
27 | }
28 | }
29 |
30 | render() {
31 | return (
32 |
33 |
34 |
88 |
89 |
90 |
91 |
92 |
93 |
94 | );
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/template/src/pages/api/_version.json:
--------------------------------------------------------------------------------
1 | { "version": "dev" }
2 |
--------------------------------------------------------------------------------
/template/src/pages/api/data/[dsid].js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | const fetch = require('node-fetch');
18 | const qs = require('querystring');
19 | const DATASOURCES = require('./_datasources.json');
20 | const debug = require('debug')('datafn');
21 | debug.enabled = true;
22 |
23 | const USE_SNAPSHOT = process.env.USE_DATA_SNAPSHOTS;
24 | let SNAPSHOTS = USE_SNAPSHOT ? require('./_snapshot.json') : null;
25 |
26 | const qualifiedSearchString = (query) => (query.trim().startsWith('|') ? query : `search ${query}`);
27 | const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
28 |
29 | const MIN_REFRESH_TIME = 30;
30 | const agent = process.env.SPLUNKD_URL.startsWith('https')
31 | ? new (require('https').Agent)({
32 | rejectUnauthorized: false,
33 | })
34 | : undefined;
35 |
36 | export default async (req, res) => {
37 | const id = req.query.dsid;
38 | debug('Looking up datasource ID %o', id);
39 |
40 | if (id == null || !(id in DATASOURCES)) {
41 | debug('ERROR: No datasource with ID %o found', id);
42 | res.setHeader('cache-control', `s-maxage=3600`);
43 | res.json({ error: 'Datasource not found' });
44 | return;
45 | }
46 |
47 | const log = require('debug')(`debug:${id}`);
48 | log.enabled = true;
49 |
50 | const { search, app } = DATASOURCES[id];
51 | let query = search.query;
52 | const refresh = Math.min(MIN_REFRESH_TIME, search.refresh || 0);
53 | const resultMeta = {};
54 |
55 | try {
56 | if (USE_SNAPSHOT) {
57 | log('Looking for snapshot of datasource %s', id);
58 | const data = SNAPSHOTS[id];
59 |
60 | if (data) {
61 | res.setHeader('cache-control', `s-maxage=${refresh}, stale-while-revalidate`);
62 | const { columns, fields } = data;
63 | res.json({ fields, columns, ...resultMeta });
64 | } else {
65 | log('Error: no snapshot for datasource %s found', id);
66 | res.status(500);
67 | res.json({ error: 'Failed to fetch data' });
68 | }
69 | return;
70 | }
71 |
72 | log('Executing search for data fn', id);
73 | const SERVICE_PREFIX = `servicesNS/${encodeURIComponent(process.env.SPLUNKD_USER)}/${encodeURIComponent(app)}`;
74 | const r = await fetch(`${process.env.SPLUNKD_URL}/${SERVICE_PREFIX}/search/jobs`, {
75 | method: 'POST',
76 | headers: {
77 | Authorization: `Basic ${Buffer.from([process.env.SPLUNKD_USER, process.env.SPLUNKD_PASSWORD].join(':')).toString(
78 | 'base64'
79 | )}`,
80 | 'Content-Type': 'application/x-www-form-urlencoded',
81 | },
82 | body: qs.stringify({
83 | output_mode: 'json',
84 | earliest_time: (search.queryParameters || {}).earliest,
85 | latest_time: (search.queryParameters || {}).latest,
86 | search: qualifiedSearchString(query),
87 | reuse_max_seconds_ago: refresh,
88 | timeout: refresh * 2,
89 | }),
90 | agent,
91 | });
92 |
93 | if (r.status > 299) {
94 | throw new Error(`Failed to dispatch job, splunkd returned HTTP status ${r.status}`);
95 | }
96 | const { sid } = await r.json();
97 | log(`Received search job sid=${sid} - waiting for job to complete`);
98 |
99 | let complete = false;
100 | while (!complete) {
101 | const statusData = await fetch(
102 | `${process.env.SPLUNKD_URL}/${SERVICE_PREFIX}/search/jobs/${encodeURIComponent(sid)}?output_mode=json`,
103 | {
104 | headers: {
105 | Authorization: `Basic ${Buffer.from([process.env.SPLUNKD_USER, process.env.SPLUNKD_PASSWORD].join(':')).toString(
106 | 'base64'
107 | )}`,
108 | },
109 | agent,
110 | }
111 | ).then((r) => r.json());
112 |
113 | const jobStatus = statusData.entry[0].content;
114 | if (jobStatus.isFailed) {
115 | throw new Error('Search job failed');
116 | }
117 | complete = jobStatus.isDone;
118 | if (!complete) {
119 | await sleep(250);
120 | }
121 | }
122 |
123 | log('Search job sid=%s for data fn id=%s is complete', sid, id);
124 |
125 | const resultsQs = qs.stringify({
126 | output_mode: 'json_cols',
127 | count: 50000,
128 | offset: 0,
129 | search: search.postprocess,
130 | });
131 | const data = await fetch(`${process.env.SPLUNKD_URL}/${SERVICE_PREFIX}/search/jobs/${sid}/results?${resultsQs}`, {
132 | method: 'GET',
133 | headers: {
134 | Authorization: `Basic ${Buffer.from([process.env.SPLUNKD_USER, process.env.SPLUNKD_PASSWORD].join(':')).toString(
135 | 'base64'
136 | )}`,
137 | },
138 | agent,
139 | }).then((r) => r.json());
140 |
141 | log('Retrieved count=%d results from job sid=%s for data fn id=%s', data.columns.length, sid, id);
142 | res.setHeader('cache-control', `s-maxage=${refresh}, stale-while-revalidate`);
143 | const { columns, fields } = data;
144 | res.json({ fields, columns, ...resultMeta });
145 | } catch (e) {
146 | log('Error fetching data for data fn %s', id, e);
147 | res.status(500);
148 | res.json({ error: 'Failed to fetch data' });
149 | }
150 | };
151 |
--------------------------------------------------------------------------------
/template/src/pages/api/data/_snapshot.json:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/template/src/pages/api/data/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dashboards-data-api",
3 | "version": "1.0.0",
4 | "license": "UNLICENSED",
5 | "dependencies": {
6 | "debug": "^4.1.1",
7 | "node-fetch": "^2.6.0"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/template/src/pages/api/data/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | debug@^4.1.1:
6 | version "4.1.1"
7 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
8 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
9 | dependencies:
10 | ms "^2.1.1"
11 |
12 | ms@^2.1.1:
13 | version "2.1.2"
14 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
15 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
16 |
17 | node-fetch@^2.6.0:
18 | version "2.6.0"
19 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
20 | integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
21 |
--------------------------------------------------------------------------------
/template/src/pages/api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dashboards-api",
3 | "version": "1.0.0",
4 | "license": "UNLICENSED",
5 | "scripts": {
6 | "now-build": "cd .. && node scripts/compute-build-id.js"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/template/src/pages/api/version.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | export default async (req, res) => {
18 | res.setHeader('cache-control', `s-maxage=3600`);
19 | res.json({
20 | version: process.env.DASHPUB_BUILD_ID || 'dev',
21 | });
22 | };
23 |
--------------------------------------------------------------------------------
/template/src/pages/index.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Homepage from '../components/home';
3 | import Page from '../components/page';
4 |
5 | export default function Home({}) {
6 | return (
7 |
8 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/template/src/polyfills.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | export const polyfillTextDecoder = () => {
18 | if (typeof window !== 'undefined' && typeof window.TextDecoder !== 'function') {
19 | return import('fast-text-encoding');
20 | } else {
21 | return Promise.resolve();
22 | }
23 | };
24 |
--------------------------------------------------------------------------------
/template/src/preset.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | import React, { lazy } from 'react';
18 | import CdnDataSource from './datasource';
19 | import DrilldownHandler from './drilldown';
20 | import { polyfillTextDecoder } from './polyfills';
21 | import { DropdownInput, TimeRangeInput, MultiselectInput, TextInput, NumberInput } from '@splunk/dashboard-inputs';
22 |
23 | const fixRequestParams = (LazyComponent) => (props) => {
24 | if (props.dataSources.primary && !props.dataSources.primary.requestParams) {
25 | props.dataSources.primary.requestParams = { count: 100 };
26 | }
27 |
28 | return ;
29 | };
30 |
31 | const commonFlags = (LazyComponent) => {
32 | LazyComponent.showProgressBar = true;
33 | LazyComponent.showTitleAndDescription = true;
34 | LazyComponent.showLastUpdated = true;
35 | return LazyComponent;
36 | };
37 |
38 | const lazyViz = (fn) => {
39 | return lazy(fn);
40 | };
41 |
42 | const PRESET = {
43 | layouts: {
44 | absolute: lazyViz(() => import('@splunk/dashboard-layouts/AbsoluteLayoutViewer')),
45 | },
46 | dataSources: {
47 | 'ds.cdn': CdnDataSource,
48 | },
49 | eventHandlers: {
50 | 'drilldown.customUrl': DrilldownHandler,
51 | },
52 | visualizations: {
53 | // legacy
54 | 'abslayout.line': lazyViz(() => import('@splunk/dashboard-layouts/visualizations/ConnectedLine'), true),
55 | 'viz.area': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/Area'))),
56 | 'viz.bar': commonFlags(fixRequestParams(lazyViz(() => import('@splunk/dashboard-visualizations/Bar')))),
57 | 'viz.bubble': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/Bubble'))),
58 | 'viz.choropleth.svg': commonFlags(
59 | lazyViz(() => polyfillTextDecoder().then(() => import('@splunk/dashboard-visualizations/ChoroplethSvg')))
60 | ),
61 | 'viz.column': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/Column'))),
62 | 'viz.ellipse': lazyViz(() => import('@splunk/dashboard-visualizations/Ellipse')),
63 | 'viz.fillergauge': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/FillerGauge'))),
64 | 'viz.geojson.us': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/Choropleth'))),
65 | 'viz.geojson.world': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/Choropleth'))),
66 | 'viz.img': lazyViz(() => import('@splunk/dashboard-visualizations/Image'), true),
67 | 'viz.line': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/Line'))),
68 | 'viz.markdown': lazyViz(() => import('@splunk/dashboard-visualizations/Markdown'), true),
69 | 'viz.markergauge': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/MarkerGauge'))),
70 | 'viz.pie': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/Pie'))),
71 | 'viz.punchcard': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/Punchcard'))),
72 | 'viz.radialgauge': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/RadialGauge'))),
73 | 'viz.rectangle': lazyViz(() => import('@splunk/dashboard-visualizations/Rectangle')),
74 | 'viz.scatter': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/Scatter'))),
75 | 'viz.singlevalue': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/SingleValue'))),
76 | 'viz.singlevalueicon': lazyViz(() => import('@splunk/dashboard-visualizations/SingleValueIcon')),
77 | 'viz.singlevalueradial': commonFlags(lazyViz(() => import('@splunk/dashboard-visualizations/SingleValueRadial'))),
78 | 'viz.table': commonFlags(fixRequestParams(lazyViz(() => import('@splunk/dashboard-visualizations/Table')))),
79 | 'viz.text': lazyViz(() => import('@splunk/dashboard-visualizations/Text')),
80 |
81 | // default splunk visualizations
82 | 'splunk.area': commonFlags(lazyViz(() => import('@splunk/visualizations/Area'))),
83 | 'splunk.bar': commonFlags(lazyViz(() => import('@splunk/visualizations/Bar'))),
84 | 'splunk.bubble': commonFlags(lazyViz(() => import('@splunk/visualizations/Bubble'))),
85 | 'splunk.choropleth.svg': commonFlags(lazyViz(() => import('@splunk/visualizations/ChoroplethSvg'))),
86 | 'splunk.column': commonFlags(lazyViz(() => import('@splunk/visualizations/Column'))),
87 | 'splunk.ellipse': commonFlags(lazyViz(() => import('@splunk/visualizations/Ellipse'))),
88 | 'splunk.fillergauge': commonFlags(lazyViz(() => import('@splunk/visualizations/FillerGauge'))),
89 | 'splunk.image': commonFlags(lazyViz(() => import('@splunk/visualizations/Image'))),
90 | 'splunk.line': commonFlags(lazyViz(() => import('@splunk/visualizations/Line'))),
91 | 'splunk.linkgraph': commonFlags(lazyViz(() => import('@splunk/visualizations/LinkGraph'))),
92 | 'splunk.markdown': commonFlags(lazyViz(() => import('@splunk/visualizations/Markdown'))),
93 | 'splunk.markergauge': commonFlags(lazyViz(() => import('@splunk/visualizations/MarkerGauge'))),
94 | 'splunk.parallelcoordinates': commonFlags(lazyViz(() => import('@splunk/visualizations/ParallelCoordinates'))),
95 | 'splunk.pie': commonFlags(lazyViz(() => import('@splunk/visualizations/Pie'))),
96 | 'splunk.punchcard': commonFlags(lazyViz(() => import('@splunk/visualizations/Punchcard'))),
97 | 'splunk.rectangle': commonFlags(lazyViz(() => import('@splunk/visualizations/Rectangle'))),
98 | 'splunk.sankey': commonFlags(lazyViz(() => import('@splunk/visualizations/Sankey'))),
99 | 'splunk.scatter': commonFlags(lazyViz(() => import('@splunk/visualizations/Scatter'))),
100 | 'splunk.singlevalue': commonFlags(lazyViz(() => import('@splunk/visualizations/SingleValue'))),
101 | 'splunk.singlevalueicon': commonFlags(lazyViz(() => import('@splunk/visualizations/SingleValueIcon'))),
102 | 'splunk.singlevalueradial': commonFlags(lazyViz(() => import('@splunk/visualizations/SingleValueRadial'))),
103 | 'splunk.map': commonFlags(lazyViz(() => import('@splunk/visualizations/Map'))),
104 | 'splunk.table': commonFlags(lazyViz(() => import('@splunk/visualizations/Table'))),
105 | },
106 | inputs:{
107 | 'input.dropdown': DropdownInput,
108 | 'input.timerange': TimeRangeInput,
109 | 'input.text': TextInput,
110 | 'input.number': NumberInput,
111 | 'input.multiselect': MultiselectInput,
112 | },
113 | };
114 |
115 | export default PRESET;
116 |
--------------------------------------------------------------------------------
/template/src/ready.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | import React, { useEffect, useState } from 'react';
18 |
19 | class ReadyHandle {
20 | _ready = false;
21 | constructor(type) {
22 | this.type = type;
23 | }
24 | ready() {
25 | if (!this._ready) {
26 | this._ready = true;
27 | this.notify(this.type);
28 | }
29 | }
30 | isReady() {
31 | return this._ready;
32 | }
33 | remove() {
34 | this.onDelete();
35 | this.notify = null;
36 | }
37 | }
38 |
39 | let isReady = false;
40 | const readinessDeps = new Set();
41 | const readynessCallbacks = new Set();
42 |
43 | function trigger() {
44 | if (isReady) {
45 | return;
46 | }
47 | if ([...readinessDeps].every((d) => d.isReady())) {
48 | isReady = true;
49 | setTimeout(() => {
50 | for (const cb of readynessCallbacks) {
51 | cb();
52 | }
53 | }, 250);
54 | }
55 | }
56 |
57 | function sub(cb) {
58 | if (isReady) {
59 | cb();
60 | return () => {};
61 | } else {
62 | readynessCallbacks.add(cb);
63 | const fallbackTimer = setTimeout(trigger, 100);
64 | return () => {
65 | clearTimeout(fallbackTimer);
66 | readynessCallbacks.delete(cb);
67 | };
68 | }
69 | }
70 |
71 | export function registerScreenshotReadinessDep(type) {
72 | const handle = new ReadyHandle(type);
73 | readinessDeps.add(handle);
74 | handle.notify = trigger;
75 | handle.onDelete = () => {
76 | readinessDeps.delete(handle);
77 | };
78 | return handle;
79 | }
80 |
81 | export function useReadyForScreenshot() {
82 | const [ready, setReady] = useState(isReady);
83 | useEffect(
84 | () =>
85 | sub(() => {
86 | setReady(isReady);
87 | }),
88 | [setReady]
89 | );
90 | return ready;
91 | }
92 |
93 | export function SayCheese() {
94 | const ready = useReadyForScreenshot();
95 | return ready ? : null;
96 | }
97 |
--------------------------------------------------------------------------------
/template/src/styles.js:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2020 Splunk Inc.
3 |
4 | Licensed under the Apache License, Version 2.0 (the "License");
5 | you may not use this file except in compliance with the License.
6 | You may obtain a copy of the License at
7 |
8 | http://www.apache.org/licenses/LICENSE-2.0
9 |
10 | Unless required by applicable law or agreed to in writing, software
11 | distributed under the License is distributed on an "AS IS" BASIS,
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | See the License for the specific language governing permissions and
14 | limitations under the License.
15 | */
16 |
17 | import { createGlobalStyle } from 'styled-components';
18 |
19 | export const GlobalStyle = createGlobalStyle`
20 | html, body {
21 | margin: 0;
22 | padding: 0;
23 | }
24 | `;
25 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@oclif/command@^1.5.1", "@oclif/command@^1.5.13":
6 | version "1.5.19"
7 | resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.5.19.tgz#13f472450eb83bd6c6871a164c03eadb5e1a07ed"
8 | integrity sha512-6+iaCMh/JXJaB2QWikqvGE9//wLEVYYwZd5sud8aLoLKog1Q75naZh2vlGVtg5Mq/NqpqGQvdIjJb3Bm+64AUQ==
9 | dependencies:
10 | "@oclif/config" "^1"
11 | "@oclif/errors" "^1.2.2"
12 | "@oclif/parser" "^3.8.3"
13 | "@oclif/plugin-help" "^2"
14 | debug "^4.1.1"
15 | semver "^5.6.0"
16 |
17 | "@oclif/config@^1":
18 | version "1.13.3"
19 | resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.13.3.tgz#1b13e18d0e4242ddbd9cbd100f0eec819aa2bf8c"
20 | integrity sha512-qs5XvGRw+1M41abOKCjd0uoeHCgsMxa2MurD2g2K8CtQlzlMXl0rW5idVeimIg5208LLuxkfzQo8TKAhhRCWLg==
21 | dependencies:
22 | "@oclif/parser" "^3.8.0"
23 | debug "^4.1.1"
24 | tslib "^1.9.3"
25 |
26 | "@oclif/errors@^1.2.1", "@oclif/errors@^1.2.2":
27 | version "1.2.2"
28 | resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.2.2.tgz#9d8f269b15f13d70aa93316fed7bebc24688edc2"
29 | integrity sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg==
30 | dependencies:
31 | clean-stack "^1.3.0"
32 | fs-extra "^7.0.0"
33 | indent-string "^3.2.0"
34 | strip-ansi "^5.0.0"
35 | wrap-ansi "^4.0.0"
36 |
37 | "@oclif/linewrap@^1.0.0":
38 | version "1.0.0"
39 | resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91"
40 | integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw==
41 |
42 | "@oclif/parser@^3.8.0", "@oclif/parser@^3.8.3":
43 | version "3.8.4"
44 | resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.4.tgz#1a90fc770a42792e574fb896325618aebbe8c9e4"
45 | integrity sha512-cyP1at3l42kQHZtqDS3KfTeyMvxITGwXwH1qk9ktBYvqgMp5h4vHT+cOD74ld3RqJUOZY/+Zi9lb4Tbza3BtuA==
46 | dependencies:
47 | "@oclif/linewrap" "^1.0.0"
48 | chalk "^2.4.2"
49 | tslib "^1.9.3"
50 |
51 | "@oclif/plugin-help@^2":
52 | version "2.2.3"
53 | resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-2.2.3.tgz#b993041e92047f0e1762668aab04d6738ac06767"
54 | integrity sha512-bGHUdo5e7DjPJ0vTeRBMIrfqTRDBfyR5w0MP41u0n3r7YG5p14lvMmiCXxi6WDaP2Hw5nqx3PnkAIntCKZZN7g==
55 | dependencies:
56 | "@oclif/command" "^1.5.13"
57 | chalk "^2.4.1"
58 | indent-string "^4.0.0"
59 | lodash.template "^4.4.0"
60 | string-width "^3.0.0"
61 | strip-ansi "^5.0.0"
62 | widest-line "^2.0.1"
63 | wrap-ansi "^4.0.0"
64 |
65 | "@oclif/screen@^1.0.3":
66 | version "1.0.4"
67 | resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493"
68 | integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw==
69 |
70 | "@types/color-name@^1.1.1":
71 | version "1.1.1"
72 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
73 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
74 |
75 | ansi-escapes@^3.0.0, ansi-escapes@^3.1.0:
76 | version "3.2.0"
77 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
78 | integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
79 |
80 | ansi-escapes@^4.2.1:
81 | version "4.3.0"
82 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.0.tgz#a4ce2b33d6b214b7950d8595c212f12ac9cc569d"
83 | integrity sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==
84 | dependencies:
85 | type-fest "^0.8.1"
86 |
87 | ansi-regex@^2.0.0:
88 | version "2.1.1"
89 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
90 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
91 |
92 | ansi-regex@^3.0.0:
93 | version "3.0.0"
94 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
95 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
96 |
97 | ansi-regex@^4.1.0:
98 | version "4.1.0"
99 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
100 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
101 |
102 | ansi-regex@^5.0.0:
103 | version "5.0.0"
104 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
105 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
106 |
107 | ansi-styles@^3.2.0, ansi-styles@^3.2.1:
108 | version "3.2.1"
109 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
110 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
111 | dependencies:
112 | color-convert "^1.9.0"
113 |
114 | ansi-styles@^4.1.0:
115 | version "4.2.1"
116 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
117 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
118 | dependencies:
119 | "@types/color-name" "^1.1.1"
120 | color-convert "^2.0.1"
121 |
122 | ansicolors@~0.3.2:
123 | version "0.3.2"
124 | resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
125 | integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
126 |
127 | aproba@^1.0.3:
128 | version "1.2.0"
129 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
130 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
131 |
132 | are-we-there-yet@~1.1.2:
133 | version "1.1.5"
134 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
135 | integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==
136 | dependencies:
137 | delegates "^1.0.0"
138 | readable-stream "^2.0.6"
139 |
140 | argparse@^1.0.7:
141 | version "1.0.10"
142 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
143 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
144 | dependencies:
145 | sprintf-js "~1.0.2"
146 |
147 | at-least-node@^1.0.0:
148 | version "1.0.0"
149 | resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
150 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
151 |
152 | base64-js@^1.3.1:
153 | version "1.5.1"
154 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
155 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
156 |
157 | bl@^3.0.0:
158 | version "3.0.1"
159 | resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.1.tgz#1cbb439299609e419b5a74d7fce2f8b37d8e5c6f"
160 | integrity sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ==
161 | dependencies:
162 | readable-stream "^3.0.1"
163 |
164 | bl@^4.0.3:
165 | version "4.1.0"
166 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
167 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
168 | dependencies:
169 | buffer "^5.5.0"
170 | inherits "^2.0.4"
171 | readable-stream "^3.4.0"
172 |
173 | buffer@^5.5.0:
174 | version "5.7.1"
175 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
176 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
177 | dependencies:
178 | base64-js "^1.3.1"
179 | ieee754 "^1.1.13"
180 |
181 | cardinal@^2.1.1:
182 | version "2.1.1"
183 | resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505"
184 | integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU=
185 | dependencies:
186 | ansicolors "~0.3.2"
187 | redeyed "~2.1.0"
188 |
189 | chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2:
190 | version "2.4.2"
191 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
192 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
193 | dependencies:
194 | ansi-styles "^3.2.1"
195 | escape-string-regexp "^1.0.5"
196 | supports-color "^5.3.0"
197 |
198 | chalk@^3.0.0:
199 | version "3.0.0"
200 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
201 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
202 | dependencies:
203 | ansi-styles "^4.1.0"
204 | supports-color "^7.1.0"
205 |
206 | chardet@^0.4.0:
207 | version "0.4.2"
208 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
209 | integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=
210 |
211 | chardet@^0.7.0:
212 | version "0.7.0"
213 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
214 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
215 |
216 | chownr@^1.1.1:
217 | version "1.1.3"
218 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142"
219 | integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==
220 |
221 | clean-stack@^1.3.0:
222 | version "1.3.0"
223 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31"
224 | integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE=
225 |
226 | clean-stack@^2.0.0:
227 | version "2.2.0"
228 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
229 | integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
230 |
231 | cli-cursor@^2.1.0:
232 | version "2.1.0"
233 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
234 | integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
235 | dependencies:
236 | restore-cursor "^2.0.0"
237 |
238 | cli-cursor@^3.1.0:
239 | version "3.1.0"
240 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
241 | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
242 | dependencies:
243 | restore-cursor "^3.1.0"
244 |
245 | cli-progress@^3.4.0:
246 | version "3.5.0"
247 | resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.5.0.tgz#972517f3b71bb6d0ec74ceaeb392005376e9ca54"
248 | integrity sha512-S1wR4xfcfLWbVBH6RwYat1nMCm2UsuygxNoiRYVAXQsuWKjCRgWRZVohXLmsWfiuAK0FFf7t9OyZ2JBmDWaQGA==
249 | dependencies:
250 | colors "^1.1.2"
251 | string-width "^2.1.1"
252 |
253 | cli-ux@^5.4.5:
254 | version "5.4.5"
255 | resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-5.4.5.tgz#1b9e6648754307a1fa59a0c5a9c6be0ed899c2cd"
256 | integrity sha512-5A6FuU0wPUlfCWUjtizUvNIbXElp6jN9QUJsDibs6F9cVX1kTgaMR3m6KT0R3iriEXpMrmPKV6yYS8XICNuQ6Q==
257 | dependencies:
258 | "@oclif/command" "^1.5.1"
259 | "@oclif/errors" "^1.2.1"
260 | "@oclif/linewrap" "^1.0.0"
261 | "@oclif/screen" "^1.0.3"
262 | ansi-escapes "^3.1.0"
263 | ansi-styles "^3.2.1"
264 | cardinal "^2.1.1"
265 | chalk "^2.4.1"
266 | clean-stack "^2.0.0"
267 | cli-progress "^3.4.0"
268 | extract-stack "^1.0.0"
269 | fs-extra "^7.0.1"
270 | hyperlinker "^1.0.0"
271 | indent-string "^4.0.0"
272 | is-wsl "^1.1.0"
273 | js-yaml "^3.13.1"
274 | lodash "^4.17.11"
275 | natural-orderby "^2.0.1"
276 | password-prompt "^1.1.2"
277 | semver "^5.6.0"
278 | string-width "^3.1.0"
279 | strip-ansi "^5.1.0"
280 | supports-color "^5.5.0"
281 | supports-hyperlinks "^1.0.1"
282 | treeify "^1.1.0"
283 | tslib "^1.9.3"
284 |
285 | cli-width@^2.0.0:
286 | version "2.2.0"
287 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
288 | integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
289 |
290 | code-point-at@^1.0.0:
291 | version "1.1.0"
292 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
293 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
294 |
295 | color-convert@^1.9.0:
296 | version "1.9.3"
297 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
298 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
299 | dependencies:
300 | color-name "1.1.3"
301 |
302 | color-convert@^2.0.1:
303 | version "2.0.1"
304 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
305 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
306 | dependencies:
307 | color-name "~1.1.4"
308 |
309 | color-name@1.1.3:
310 | version "1.1.3"
311 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
312 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
313 |
314 | color-name@^1.0.0, color-name@~1.1.4:
315 | version "1.1.4"
316 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
317 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
318 |
319 | color-string@^1.6.0:
320 | version "1.6.0"
321 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312"
322 | integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==
323 | dependencies:
324 | color-name "^1.0.0"
325 | simple-swizzle "^0.2.2"
326 |
327 | color@^4.0.1:
328 | version "4.0.1"
329 | resolved "https://registry.yarnpkg.com/color/-/color-4.0.1.tgz#21df44cd10245a91b1ccf5ba031609b0e10e7d67"
330 | integrity sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==
331 | dependencies:
332 | color-convert "^2.0.1"
333 | color-string "^1.6.0"
334 |
335 | colors@^1.1.2:
336 | version "1.4.0"
337 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
338 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
339 |
340 | console-control-strings@^1.0.0, console-control-strings@~1.1.0:
341 | version "1.1.0"
342 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
343 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
344 |
345 | core-util-is@~1.0.0:
346 | version "1.0.2"
347 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
348 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
349 |
350 | cross-spawn@^6.0.5:
351 | version "6.0.5"
352 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
353 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
354 | dependencies:
355 | nice-try "^1.0.4"
356 | path-key "^2.0.1"
357 | semver "^5.5.0"
358 | shebang-command "^1.2.0"
359 | which "^1.2.9"
360 |
361 | cross-spawn@^7.0.0:
362 | version "7.0.1"
363 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
364 | integrity sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==
365 | dependencies:
366 | path-key "^3.1.0"
367 | shebang-command "^2.0.0"
368 | which "^2.0.1"
369 |
370 | debug@^4.1.1:
371 | version "4.1.1"
372 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
373 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
374 | dependencies:
375 | ms "^2.1.1"
376 |
377 | decompress-response@^4.2.0:
378 | version "4.2.1"
379 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
380 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
381 | dependencies:
382 | mimic-response "^2.0.0"
383 |
384 | deep-extend@^0.6.0:
385 | version "0.6.0"
386 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
387 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
388 |
389 | delegates@^1.0.0:
390 | version "1.0.0"
391 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
392 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
393 |
394 | detect-libc@^1.0.3:
395 | version "1.0.3"
396 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
397 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
398 |
399 | dotenv@^8.2.0:
400 | version "8.2.0"
401 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
402 | integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==
403 |
404 | emoji-regex@^7.0.1:
405 | version "7.0.3"
406 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
407 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
408 |
409 | emoji-regex@^8.0.0:
410 | version "8.0.0"
411 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
412 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
413 |
414 | end-of-stream@^1.1.0, end-of-stream@^1.4.1:
415 | version "1.4.4"
416 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
417 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
418 | dependencies:
419 | once "^1.4.0"
420 |
421 | escape-string-regexp@^1.0.5:
422 | version "1.0.5"
423 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
424 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
425 |
426 | esprima@^4.0.0, esprima@~4.0.0:
427 | version "4.0.1"
428 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
429 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
430 |
431 | execa@^4.0.0:
432 | version "4.0.0"
433 | resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.0.tgz#7f37d6ec17f09e6b8fc53288611695b6d12b9daf"
434 | integrity sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==
435 | dependencies:
436 | cross-spawn "^7.0.0"
437 | get-stream "^5.0.0"
438 | human-signals "^1.1.1"
439 | is-stream "^2.0.0"
440 | merge-stream "^2.0.0"
441 | npm-run-path "^4.0.0"
442 | onetime "^5.1.0"
443 | signal-exit "^3.0.2"
444 | strip-final-newline "^2.0.0"
445 |
446 | expand-template@^2.0.3:
447 | version "2.0.3"
448 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
449 | integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
450 |
451 | external-editor@^2.1.0:
452 | version "2.2.0"
453 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
454 | integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
455 | dependencies:
456 | chardet "^0.4.0"
457 | iconv-lite "^0.4.17"
458 | tmp "^0.0.33"
459 |
460 | external-editor@^3.0.3:
461 | version "3.1.0"
462 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
463 | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
464 | dependencies:
465 | chardet "^0.7.0"
466 | iconv-lite "^0.4.24"
467 | tmp "^0.0.33"
468 |
469 | extract-stack@^1.0.0:
470 | version "1.0.0"
471 | resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-1.0.0.tgz#b97acaf9441eea2332529624b732fc5a1c8165fa"
472 | integrity sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo=
473 |
474 | figures@^2.0.0:
475 | version "2.0.0"
476 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
477 | integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
478 | dependencies:
479 | escape-string-regexp "^1.0.5"
480 |
481 | figures@^3.0.0:
482 | version "3.1.0"
483 | resolved "https://registry.yarnpkg.com/figures/-/figures-3.1.0.tgz#4b198dd07d8d71530642864af2d45dd9e459c4ec"
484 | integrity sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==
485 | dependencies:
486 | escape-string-regexp "^1.0.5"
487 |
488 | fs-constants@^1.0.0:
489 | version "1.0.0"
490 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
491 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
492 |
493 | fs-extra@^7.0.0, fs-extra@^7.0.1:
494 | version "7.0.1"
495 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
496 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
497 | dependencies:
498 | graceful-fs "^4.1.2"
499 | jsonfile "^4.0.0"
500 | universalify "^0.1.0"
501 |
502 | fs-extra@^9.0.0:
503 | version "9.0.0"
504 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3"
505 | integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==
506 | dependencies:
507 | at-least-node "^1.0.0"
508 | graceful-fs "^4.2.0"
509 | jsonfile "^6.0.1"
510 | universalify "^1.0.0"
511 |
512 | gauge@~2.7.3:
513 | version "2.7.4"
514 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
515 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=
516 | dependencies:
517 | aproba "^1.0.3"
518 | console-control-strings "^1.0.0"
519 | has-unicode "^2.0.0"
520 | object-assign "^4.1.0"
521 | signal-exit "^3.0.0"
522 | string-width "^1.0.1"
523 | strip-ansi "^3.0.1"
524 | wide-align "^1.1.0"
525 |
526 | get-stream@^5.0.0:
527 | version "5.1.0"
528 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
529 | integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
530 | dependencies:
531 | pump "^3.0.0"
532 |
533 | github-from-package@0.0.0:
534 | version "0.0.0"
535 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
536 | integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
537 |
538 | graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
539 | version "4.2.3"
540 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
541 | integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==
542 |
543 | has-flag@^2.0.0:
544 | version "2.0.0"
545 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
546 | integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=
547 |
548 | has-flag@^3.0.0:
549 | version "3.0.0"
550 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
551 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
552 |
553 | has-flag@^4.0.0:
554 | version "4.0.0"
555 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
556 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
557 |
558 | has-unicode@^2.0.0:
559 | version "2.0.1"
560 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
561 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=
562 |
563 | human-signals@^1.1.1:
564 | version "1.1.1"
565 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
566 | integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
567 |
568 | hyperlinker@^1.0.0:
569 | version "1.0.0"
570 | resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e"
571 | integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ==
572 |
573 | iconv-lite@^0.4.17, iconv-lite@^0.4.24:
574 | version "0.4.24"
575 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
576 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
577 | dependencies:
578 | safer-buffer ">= 2.1.2 < 3"
579 |
580 | ieee754@^1.1.13:
581 | version "1.2.1"
582 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
583 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
584 |
585 | indent-string@^3.2.0:
586 | version "3.2.0"
587 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289"
588 | integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=
589 |
590 | indent-string@^4.0.0:
591 | version "4.0.0"
592 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
593 | integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
594 |
595 | inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
596 | version "2.0.4"
597 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
598 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
599 |
600 | ini@~1.3.0:
601 | version "1.3.5"
602 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
603 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
604 |
605 | inquirer-checkbox-plus-prompt@^1.0.1:
606 | version "1.0.1"
607 | resolved "https://registry.yarnpkg.com/inquirer-checkbox-plus-prompt/-/inquirer-checkbox-plus-prompt-1.0.1.tgz#54ff1ed09777a103538562276b5cf4521a31d16d"
608 | integrity sha1-VP8e0Jd3oQNThWIna1z0Uhox0W0=
609 | dependencies:
610 | cli-cursor "^2.1.0"
611 | figures "^2.0.0"
612 | inquirer "^5.1.0"
613 | lodash "^4.17.5"
614 |
615 | inquirer@^5.1.0:
616 | version "5.2.0"
617 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726"
618 | integrity sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==
619 | dependencies:
620 | ansi-escapes "^3.0.0"
621 | chalk "^2.0.0"
622 | cli-cursor "^2.1.0"
623 | cli-width "^2.0.0"
624 | external-editor "^2.1.0"
625 | figures "^2.0.0"
626 | lodash "^4.3.0"
627 | mute-stream "0.0.7"
628 | run-async "^2.2.0"
629 | rxjs "^5.5.2"
630 | string-width "^2.1.0"
631 | strip-ansi "^4.0.0"
632 | through "^2.3.6"
633 |
634 | inquirer@^7.1.0:
635 | version "7.1.0"
636 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
637 | integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==
638 | dependencies:
639 | ansi-escapes "^4.2.1"
640 | chalk "^3.0.0"
641 | cli-cursor "^3.1.0"
642 | cli-width "^2.0.0"
643 | external-editor "^3.0.3"
644 | figures "^3.0.0"
645 | lodash "^4.17.15"
646 | mute-stream "0.0.8"
647 | run-async "^2.4.0"
648 | rxjs "^6.5.3"
649 | string-width "^4.1.0"
650 | strip-ansi "^6.0.0"
651 | through "^2.3.6"
652 |
653 | is-arrayish@^0.3.1:
654 | version "0.3.2"
655 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
656 | integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
657 |
658 | is-fullwidth-code-point@^1.0.0:
659 | version "1.0.0"
660 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
661 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
662 | dependencies:
663 | number-is-nan "^1.0.0"
664 |
665 | is-fullwidth-code-point@^2.0.0:
666 | version "2.0.0"
667 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
668 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
669 |
670 | is-fullwidth-code-point@^3.0.0:
671 | version "3.0.0"
672 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
673 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
674 |
675 | is-promise@^2.1.0:
676 | version "2.1.0"
677 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
678 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
679 |
680 | is-stream@^2.0.0:
681 | version "2.0.0"
682 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
683 | integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
684 |
685 | is-wsl@^1.1.0:
686 | version "1.1.0"
687 | resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
688 | integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
689 |
690 | isarray@~1.0.0:
691 | version "1.0.0"
692 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
693 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
694 |
695 | isexe@^2.0.0:
696 | version "2.0.0"
697 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
698 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
699 |
700 | js-yaml@^3.13.1:
701 | version "3.13.1"
702 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
703 | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
704 | dependencies:
705 | argparse "^1.0.7"
706 | esprima "^4.0.0"
707 |
708 | jsonfile@^4.0.0:
709 | version "4.0.0"
710 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
711 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
712 | optionalDependencies:
713 | graceful-fs "^4.1.6"
714 |
715 | jsonfile@^6.0.1:
716 | version "6.0.1"
717 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179"
718 | integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==
719 | dependencies:
720 | universalify "^1.0.0"
721 | optionalDependencies:
722 | graceful-fs "^4.1.6"
723 |
724 | lodash._reinterpolate@^3.0.0:
725 | version "3.0.0"
726 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
727 | integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
728 |
729 | lodash.template@^4.4.0:
730 | version "4.5.0"
731 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
732 | integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==
733 | dependencies:
734 | lodash._reinterpolate "^3.0.0"
735 | lodash.templatesettings "^4.0.0"
736 |
737 | lodash.templatesettings@^4.0.0:
738 | version "4.2.0"
739 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33"
740 | integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==
741 | dependencies:
742 | lodash._reinterpolate "^3.0.0"
743 |
744 | lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.5, lodash@^4.3.0:
745 | version "4.17.20"
746 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
747 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
748 |
749 | lru-cache@^6.0.0:
750 | version "6.0.0"
751 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
752 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
753 | dependencies:
754 | yallist "^4.0.0"
755 |
756 | merge-stream@^2.0.0:
757 | version "2.0.0"
758 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
759 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
760 |
761 | mimic-fn@^1.0.0:
762 | version "1.2.0"
763 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
764 | integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
765 |
766 | mimic-fn@^2.1.0:
767 | version "2.1.0"
768 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
769 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
770 |
771 | mimic-response@^2.0.0:
772 | version "2.0.0"
773 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.0.0.tgz#996a51c60adf12cb8a87d7fb8ef24c2f3d5ebb46"
774 | integrity sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ==
775 |
776 | minimist@0.0.8:
777 | version "0.0.8"
778 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
779 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
780 |
781 | minimist@^1.2.0:
782 | version "1.2.0"
783 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
784 | integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
785 |
786 | minimist@^1.2.3:
787 | version "1.2.5"
788 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
789 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
790 |
791 | mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
792 | version "0.5.3"
793 | resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
794 | integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
795 |
796 | mkdirp@^0.5.1:
797 | version "0.5.1"
798 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
799 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
800 | dependencies:
801 | minimist "0.0.8"
802 |
803 | ms@^2.1.1:
804 | version "2.1.2"
805 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
806 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
807 |
808 | mute-stream@0.0.7:
809 | version "0.0.7"
810 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
811 | integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
812 |
813 | mute-stream@0.0.8:
814 | version "0.0.8"
815 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
816 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
817 |
818 | napi-build-utils@^1.0.1:
819 | version "1.0.1"
820 | resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508"
821 | integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA==
822 |
823 | natural-orderby@^2.0.1:
824 | version "2.0.3"
825 | resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016"
826 | integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==
827 |
828 | nice-try@^1.0.4:
829 | version "1.0.5"
830 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
831 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
832 |
833 | node-abi@^2.21.0:
834 | version "2.30.1"
835 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf"
836 | integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==
837 | dependencies:
838 | semver "^5.4.1"
839 |
840 | node-addon-api@^4.2.0:
841 | version "4.2.0"
842 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-4.2.0.tgz#117cbb5a959dff0992e1c586ae0393573e4d2a87"
843 | integrity sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==
844 |
845 | node-fetch@^2.6.1:
846 | version "2.6.1"
847 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
848 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
849 |
850 | npm-run-path@^4.0.0:
851 | version "4.0.1"
852 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
853 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
854 | dependencies:
855 | path-key "^3.0.0"
856 |
857 | npmlog@^4.0.1:
858 | version "4.1.2"
859 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
860 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
861 | dependencies:
862 | are-we-there-yet "~1.1.2"
863 | console-control-strings "~1.1.0"
864 | gauge "~2.7.3"
865 | set-blocking "~2.0.0"
866 |
867 | number-is-nan@^1.0.0:
868 | version "1.0.1"
869 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
870 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
871 |
872 | object-assign@^4.1.0:
873 | version "4.1.1"
874 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
875 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
876 |
877 | once@^1.3.1, once@^1.4.0:
878 | version "1.4.0"
879 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
880 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
881 | dependencies:
882 | wrappy "1"
883 |
884 | onetime@^2.0.0:
885 | version "2.0.1"
886 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
887 | integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
888 | dependencies:
889 | mimic-fn "^1.0.0"
890 |
891 | onetime@^5.1.0:
892 | version "5.1.0"
893 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
894 | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
895 | dependencies:
896 | mimic-fn "^2.1.0"
897 |
898 | os-tmpdir@~1.0.2:
899 | version "1.0.2"
900 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
901 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
902 |
903 | password-prompt@^1.1.2:
904 | version "1.1.2"
905 | resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.2.tgz#85b2f93896c5bd9e9f2d6ff0627fa5af3dc00923"
906 | integrity sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==
907 | dependencies:
908 | ansi-escapes "^3.1.0"
909 | cross-spawn "^6.0.5"
910 |
911 | path-key@^2.0.1:
912 | version "2.0.1"
913 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
914 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
915 |
916 | path-key@^3.0.0, path-key@^3.1.0:
917 | version "3.1.1"
918 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
919 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
920 |
921 | prebuild-install@^6.1.4:
922 | version "6.1.4"
923 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f"
924 | integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==
925 | dependencies:
926 | detect-libc "^1.0.3"
927 | expand-template "^2.0.3"
928 | github-from-package "0.0.0"
929 | minimist "^1.2.3"
930 | mkdirp-classic "^0.5.3"
931 | napi-build-utils "^1.0.1"
932 | node-abi "^2.21.0"
933 | npmlog "^4.0.1"
934 | pump "^3.0.0"
935 | rc "^1.2.7"
936 | simple-get "^3.0.3"
937 | tar-fs "^2.0.0"
938 | tunnel-agent "^0.6.0"
939 |
940 | prettier@^1.19.1:
941 | version "1.19.1"
942 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
943 | integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
944 |
945 | process-nextick-args@~2.0.0:
946 | version "2.0.1"
947 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
948 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
949 |
950 | pump@^3.0.0:
951 | version "3.0.0"
952 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
953 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
954 | dependencies:
955 | end-of-stream "^1.1.0"
956 | once "^1.3.1"
957 |
958 | querystring@^0.2.0:
959 | version "0.2.0"
960 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
961 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
962 |
963 | rc@^1.2.7:
964 | version "1.2.8"
965 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
966 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
967 | dependencies:
968 | deep-extend "^0.6.0"
969 | ini "~1.3.0"
970 | minimist "^1.2.0"
971 | strip-json-comments "~2.0.1"
972 |
973 | readable-stream@^2.0.6:
974 | version "2.3.6"
975 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
976 | integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
977 | dependencies:
978 | core-util-is "~1.0.0"
979 | inherits "~2.0.3"
980 | isarray "~1.0.0"
981 | process-nextick-args "~2.0.0"
982 | safe-buffer "~5.1.1"
983 | string_decoder "~1.1.1"
984 | util-deprecate "~1.0.1"
985 |
986 | readable-stream@^3.0.1, readable-stream@^3.1.1, readable-stream@^3.4.0:
987 | version "3.6.0"
988 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
989 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
990 | dependencies:
991 | inherits "^2.0.3"
992 | string_decoder "^1.1.1"
993 | util-deprecate "^1.0.1"
994 |
995 | redeyed@~2.1.0:
996 | version "2.1.1"
997 | resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b"
998 | integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=
999 | dependencies:
1000 | esprima "~4.0.0"
1001 |
1002 | restore-cursor@^2.0.0:
1003 | version "2.0.0"
1004 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
1005 | integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
1006 | dependencies:
1007 | onetime "^2.0.0"
1008 | signal-exit "^3.0.2"
1009 |
1010 | restore-cursor@^3.1.0:
1011 | version "3.1.0"
1012 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
1013 | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
1014 | dependencies:
1015 | onetime "^5.1.0"
1016 | signal-exit "^3.0.2"
1017 |
1018 | run-async@^2.2.0:
1019 | version "2.3.0"
1020 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
1021 | integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA=
1022 | dependencies:
1023 | is-promise "^2.1.0"
1024 |
1025 | run-async@^2.4.0:
1026 | version "2.4.0"
1027 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8"
1028 | integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==
1029 | dependencies:
1030 | is-promise "^2.1.0"
1031 |
1032 | rxjs@^5.5.2:
1033 | version "5.5.12"
1034 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc"
1035 | integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==
1036 | dependencies:
1037 | symbol-observable "1.0.1"
1038 |
1039 | rxjs@^6.5.3:
1040 | version "6.5.4"
1041 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
1042 | integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==
1043 | dependencies:
1044 | tslib "^1.9.0"
1045 |
1046 | safe-buffer@^5.0.1:
1047 | version "5.2.0"
1048 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
1049 | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
1050 |
1051 | safe-buffer@~5.1.0, safe-buffer@~5.1.1:
1052 | version "5.1.2"
1053 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
1054 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
1055 |
1056 | safe-buffer@~5.2.0:
1057 | version "5.2.1"
1058 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
1059 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
1060 |
1061 | "safer-buffer@>= 2.1.2 < 3":
1062 | version "2.1.2"
1063 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
1064 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1065 |
1066 | sax@^1.2.1:
1067 | version "1.2.4"
1068 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
1069 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
1070 |
1071 | semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
1072 | version "5.7.1"
1073 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
1074 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1075 |
1076 | semver@^7.3.5:
1077 | version "7.3.5"
1078 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
1079 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
1080 | dependencies:
1081 | lru-cache "^6.0.0"
1082 |
1083 | set-blocking@~2.0.0:
1084 | version "2.0.0"
1085 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
1086 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
1087 |
1088 | sharp@^0.29.2:
1089 | version "0.29.2"
1090 | resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.29.2.tgz#e8c003cd9cb321585b32dbda6eed3baa7d6f2308"
1091 | integrity sha512-XWRdiYLIJ3tDUejRyG24KERnJzMfIoyiJBntd2S6/uj3NEeNgRFRLgiBlvPxMa8aml14dKKD98yHinSNKp1xzQ==
1092 | dependencies:
1093 | color "^4.0.1"
1094 | detect-libc "^1.0.3"
1095 | node-addon-api "^4.2.0"
1096 | prebuild-install "^6.1.4"
1097 | semver "^7.3.5"
1098 | simple-get "^3.1.0"
1099 | tar-fs "^2.1.1"
1100 | tunnel-agent "^0.6.0"
1101 |
1102 | shebang-command@^1.2.0:
1103 | version "1.2.0"
1104 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
1105 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
1106 | dependencies:
1107 | shebang-regex "^1.0.0"
1108 |
1109 | shebang-command@^2.0.0:
1110 | version "2.0.0"
1111 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
1112 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
1113 | dependencies:
1114 | shebang-regex "^3.0.0"
1115 |
1116 | shebang-regex@^1.0.0:
1117 | version "1.0.0"
1118 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
1119 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
1120 |
1121 | shebang-regex@^3.0.0:
1122 | version "3.0.0"
1123 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
1124 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
1125 |
1126 | signal-exit@^3.0.0, signal-exit@^3.0.2:
1127 | version "3.0.2"
1128 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
1129 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
1130 |
1131 | simple-concat@^1.0.0:
1132 | version "1.0.0"
1133 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6"
1134 | integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=
1135 |
1136 | simple-get@^3.0.3, simple-get@^3.1.0:
1137 | version "3.1.0"
1138 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
1139 | integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
1140 | dependencies:
1141 | decompress-response "^4.2.0"
1142 | once "^1.3.1"
1143 | simple-concat "^1.0.0"
1144 |
1145 | simple-swizzle@^0.2.2:
1146 | version "0.2.2"
1147 | resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
1148 | integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=
1149 | dependencies:
1150 | is-arrayish "^0.3.1"
1151 |
1152 | sprintf-js@~1.0.2:
1153 | version "1.0.3"
1154 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
1155 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
1156 |
1157 | string-width@^1.0.1:
1158 | version "1.0.2"
1159 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
1160 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
1161 | dependencies:
1162 | code-point-at "^1.0.0"
1163 | is-fullwidth-code-point "^1.0.0"
1164 | strip-ansi "^3.0.0"
1165 |
1166 | "string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1:
1167 | version "2.1.1"
1168 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
1169 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
1170 | dependencies:
1171 | is-fullwidth-code-point "^2.0.0"
1172 | strip-ansi "^4.0.0"
1173 |
1174 | string-width@^3.0.0, string-width@^3.1.0:
1175 | version "3.1.0"
1176 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
1177 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
1178 | dependencies:
1179 | emoji-regex "^7.0.1"
1180 | is-fullwidth-code-point "^2.0.0"
1181 | strip-ansi "^5.1.0"
1182 |
1183 | string-width@^4.1.0:
1184 | version "4.2.0"
1185 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
1186 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
1187 | dependencies:
1188 | emoji-regex "^8.0.0"
1189 | is-fullwidth-code-point "^3.0.0"
1190 | strip-ansi "^6.0.0"
1191 |
1192 | string_decoder@^1.1.1:
1193 | version "1.3.0"
1194 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
1195 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
1196 | dependencies:
1197 | safe-buffer "~5.2.0"
1198 |
1199 | string_decoder@~1.1.1:
1200 | version "1.1.1"
1201 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
1202 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
1203 | dependencies:
1204 | safe-buffer "~5.1.0"
1205 |
1206 | strip-ansi@^3.0.0, strip-ansi@^3.0.1:
1207 | version "3.0.1"
1208 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
1209 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
1210 | dependencies:
1211 | ansi-regex "^2.0.0"
1212 |
1213 | strip-ansi@^4.0.0:
1214 | version "4.0.0"
1215 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
1216 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
1217 | dependencies:
1218 | ansi-regex "^3.0.0"
1219 |
1220 | strip-ansi@^5.0.0, strip-ansi@^5.1.0:
1221 | version "5.2.0"
1222 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
1223 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
1224 | dependencies:
1225 | ansi-regex "^4.1.0"
1226 |
1227 | strip-ansi@^6.0.0:
1228 | version "6.0.0"
1229 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
1230 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
1231 | dependencies:
1232 | ansi-regex "^5.0.0"
1233 |
1234 | strip-final-newline@^2.0.0:
1235 | version "2.0.0"
1236 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
1237 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
1238 |
1239 | strip-json-comments@~2.0.1:
1240 | version "2.0.1"
1241 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
1242 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
1243 |
1244 | supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.5.0:
1245 | version "5.5.0"
1246 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1247 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1248 | dependencies:
1249 | has-flag "^3.0.0"
1250 |
1251 | supports-color@^7.1.0:
1252 | version "7.1.0"
1253 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
1254 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
1255 | dependencies:
1256 | has-flag "^4.0.0"
1257 |
1258 | supports-hyperlinks@^1.0.1:
1259 | version "1.0.1"
1260 | resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7"
1261 | integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==
1262 | dependencies:
1263 | has-flag "^2.0.0"
1264 | supports-color "^5.0.0"
1265 |
1266 | symbol-observable@1.0.1:
1267 | version "1.0.1"
1268 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
1269 | integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=
1270 |
1271 | tar-fs@^2.0.0:
1272 | version "2.0.0"
1273 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad"
1274 | integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==
1275 | dependencies:
1276 | chownr "^1.1.1"
1277 | mkdirp "^0.5.1"
1278 | pump "^3.0.0"
1279 | tar-stream "^2.0.0"
1280 |
1281 | tar-fs@^2.1.1:
1282 | version "2.1.1"
1283 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
1284 | integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
1285 | dependencies:
1286 | chownr "^1.1.1"
1287 | mkdirp-classic "^0.5.2"
1288 | pump "^3.0.0"
1289 | tar-stream "^2.1.4"
1290 |
1291 | tar-stream@^2.0.0:
1292 | version "2.1.0"
1293 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3"
1294 | integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==
1295 | dependencies:
1296 | bl "^3.0.0"
1297 | end-of-stream "^1.4.1"
1298 | fs-constants "^1.0.0"
1299 | inherits "^2.0.3"
1300 | readable-stream "^3.1.1"
1301 |
1302 | tar-stream@^2.1.4:
1303 | version "2.2.0"
1304 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
1305 | integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
1306 | dependencies:
1307 | bl "^4.0.3"
1308 | end-of-stream "^1.4.1"
1309 | fs-constants "^1.0.0"
1310 | inherits "^2.0.3"
1311 | readable-stream "^3.1.1"
1312 |
1313 | through@^2.3.6:
1314 | version "2.3.8"
1315 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
1316 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
1317 |
1318 | tmp@^0.0.33:
1319 | version "0.0.33"
1320 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
1321 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
1322 | dependencies:
1323 | os-tmpdir "~1.0.2"
1324 |
1325 | treeify@^1.1.0:
1326 | version "1.1.0"
1327 | resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8"
1328 | integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==
1329 |
1330 | tslib@^1.9.0, tslib@^1.9.3:
1331 | version "1.10.0"
1332 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
1333 | integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
1334 |
1335 | tunnel-agent@^0.6.0:
1336 | version "0.6.0"
1337 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
1338 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
1339 | dependencies:
1340 | safe-buffer "^5.0.1"
1341 |
1342 | type-fest@^0.8.1:
1343 | version "0.8.1"
1344 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
1345 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
1346 |
1347 | universalify@^0.1.0:
1348 | version "0.1.2"
1349 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
1350 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
1351 |
1352 | universalify@^1.0.0:
1353 | version "1.0.0"
1354 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d"
1355 | integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==
1356 |
1357 | util-deprecate@^1.0.1, util-deprecate@~1.0.1:
1358 | version "1.0.2"
1359 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
1360 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
1361 |
1362 | which@^1.2.9:
1363 | version "1.3.1"
1364 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
1365 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
1366 | dependencies:
1367 | isexe "^2.0.0"
1368 |
1369 | which@^2.0.1:
1370 | version "2.0.2"
1371 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
1372 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
1373 | dependencies:
1374 | isexe "^2.0.0"
1375 |
1376 | wide-align@^1.1.0:
1377 | version "1.1.3"
1378 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
1379 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==
1380 | dependencies:
1381 | string-width "^1.0.2 || 2"
1382 |
1383 | widest-line@^2.0.1:
1384 | version "2.0.1"
1385 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
1386 | integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
1387 | dependencies:
1388 | string-width "^2.1.1"
1389 |
1390 | wrap-ansi@^4.0.0:
1391 | version "4.0.0"
1392 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-4.0.0.tgz#b3570d7c70156159a2d42be5cc942e957f7b1131"
1393 | integrity sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg==
1394 | dependencies:
1395 | ansi-styles "^3.2.0"
1396 | string-width "^2.1.1"
1397 | strip-ansi "^4.0.0"
1398 |
1399 | wrappy@1:
1400 | version "1.0.2"
1401 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1402 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
1403 |
1404 | xmldoc@^1.1.2:
1405 | version "1.1.2"
1406 | resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.1.2.tgz#6666e029fe25470d599cd30e23ff0d1ed50466d7"
1407 | integrity sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==
1408 | dependencies:
1409 | sax "^1.2.1"
1410 |
1411 | yallist@^4.0.0:
1412 | version "4.0.0"
1413 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
1414 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
1415 |
--------------------------------------------------------------------------------