├── .erb
├── mocks
│ └── fileMock.js
├── img
│ ├── erb-logo.png
│ └── erb-banner.svg
├── configs
│ ├── .eslintrc
│ ├── webpack.config.eslint.ts
│ ├── webpack.paths.ts
│ ├── webpack.config.base.ts
│ ├── webpack.config.renderer.dev.dll.ts
│ ├── webpack.config.main.prod.ts
│ ├── webpack.config.renderer.prod.ts
│ └── webpack.config.renderer.dev.ts
└── scripts
│ ├── .eslintrc
│ ├── delete-source-maps.js
│ ├── link-modules.ts
│ ├── check-node-env.js
│ ├── clean.js
│ ├── check-port-in-use.js
│ ├── electron-rebuild.js
│ ├── check-build-exists.ts
│ ├── notarize.js
│ └── check-native-dep.js
├── .husky
└── pre-commit
├── assets
├── icon.icns
├── icon.ico
├── icon.png
├── icons
│ ├── 16x16.png
│ ├── 24x24.png
│ ├── 32x32.png
│ ├── 48x48.png
│ ├── 64x64.png
│ ├── 96x96.png
│ ├── 128x128.png
│ ├── 256x256.png
│ ├── 512x512.png
│ └── 1024x1024.png
├── entitlements.mac.plist
├── assets.d.ts
└── icon.svg
├── .vscode
├── extensions.json
├── settings.json
├── tasks.json
└── launch.json
├── src
├── renderer
│ ├── index.tsx
│ ├── index.ejs
│ ├── App.css
│ └── App.tsx
├── __tests__
│ └── App.test.tsx
└── main
│ ├── util.ts
│ ├── preload.js
│ ├── main.ts
│ └── menu.ts
├── .github
├── config.yml
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── 3-Feature_request.md
│ ├── 2-Question.md
│ └── 1-Bug_report.md
├── stale.yml
└── workflows
│ ├── test.yml
│ └── publish.yml
├── .editorconfig
├── .gitattributes
├── .gitignore
├── .eslintignore
├── tsconfig.json
├── release
└── app
│ ├── package.json
│ └── package-lock.json
├── .eslintrc.js
├── LICENSE
├── README.md
├── CODE_OF_CONDUCT.md
├── package.json
└── CHANGELOG.md
/.erb/mocks/fileMock.js:
--------------------------------------------------------------------------------
1 | export default 'test-file-stub';
2 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | . "$(dirname "$0")/_/husky.sh"
3 |
4 | npx lint-staged
5 |
--------------------------------------------------------------------------------
/assets/icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icon.icns
--------------------------------------------------------------------------------
/assets/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icon.ico
--------------------------------------------------------------------------------
/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icon.png
--------------------------------------------------------------------------------
/.erb/img/erb-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/.erb/img/erb-logo.png
--------------------------------------------------------------------------------
/assets/icons/16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/16x16.png
--------------------------------------------------------------------------------
/assets/icons/24x24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/24x24.png
--------------------------------------------------------------------------------
/assets/icons/32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/32x32.png
--------------------------------------------------------------------------------
/assets/icons/48x48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/48x48.png
--------------------------------------------------------------------------------
/assets/icons/64x64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/64x64.png
--------------------------------------------------------------------------------
/assets/icons/96x96.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/96x96.png
--------------------------------------------------------------------------------
/assets/icons/128x128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/128x128.png
--------------------------------------------------------------------------------
/assets/icons/256x256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/256x256.png
--------------------------------------------------------------------------------
/assets/icons/512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/512x512.png
--------------------------------------------------------------------------------
/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | "recommendations": ["dbaeumer.vscode-eslint", "EditorConfig.EditorConfig"]
3 | }
4 |
--------------------------------------------------------------------------------
/assets/icons/1024x1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amilajack/erb-sqlite-example/HEAD/assets/icons/1024x1024.png
--------------------------------------------------------------------------------
/src/renderer/index.tsx:
--------------------------------------------------------------------------------
1 | import { render } from 'react-dom';
2 | import App from './App';
3 |
4 | render(, document.getElementById('root'));
5 |
--------------------------------------------------------------------------------
/.github/config.yml:
--------------------------------------------------------------------------------
1 | requiredHeaders:
2 | - Prerequisites
3 | - Expected Behavior
4 | - Current Behavior
5 | - Possible Solution
6 | - Your Environment
7 |
--------------------------------------------------------------------------------
/.erb/configs/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "no-console": "off",
4 | "global-require": "off",
5 | "import/no-dynamic-require": "off"
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/.erb/configs/webpack.config.eslint.ts:
--------------------------------------------------------------------------------
1 | /* eslint import/no-unresolved: off, import/no-self-import: off */
2 |
3 | module.exports = require('./webpack.config.renderer.dev').default;
4 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [electron-react-boilerplate, amilajack]
4 | patreon: amilajack
5 | open_collective: electron-react-boilerplate-594
6 |
--------------------------------------------------------------------------------
/.erb/scripts/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "rules": {
3 | "no-console": "off",
4 | "global-require": "off",
5 | "import/no-dynamic-require": "off",
6 | "import/no-extraneous-dependencies": "off"
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | indent_style = space
5 | indent_size = 2
6 | end_of_line = lf
7 | charset = utf-8
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
11 | [*.md]
12 | trim_trailing_whitespace = false
13 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | * text eol=lf
2 | *.exe binary
3 | *.png binary
4 | *.jpg binary
5 | *.jpeg binary
6 | *.ico binary
7 | *.icns binary
8 | *.eot binary
9 | *.otf binary
10 | *.ttf binary
11 | *.woff binary
12 | *.woff2 binary
13 |
--------------------------------------------------------------------------------
/src/__tests__/App.test.tsx:
--------------------------------------------------------------------------------
1 | import '@testing-library/jest-dom';
2 | import { render } from '@testing-library/react';
3 | import App from '../renderer/App';
4 |
5 | describe('App', () => {
6 | it('should render', () => {
7 | expect(render()).toBeTruthy();
8 | });
9 | });
10 |
--------------------------------------------------------------------------------
/.erb/scripts/delete-source-maps.js:
--------------------------------------------------------------------------------
1 | import path from 'path';
2 | import rimraf from 'rimraf';
3 | import webpackPaths from '../configs/webpack.paths';
4 |
5 | export default function deleteSourceMaps() {
6 | rimraf.sync(path.join(webpackPaths.distMainPath, '*.js.map'));
7 | rimraf.sync(path.join(webpackPaths.distRendererPath, '*.js.map'));
8 | }
9 |
--------------------------------------------------------------------------------
/assets/entitlements.mac.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.cs.allow-unsigned-executable-memory
6 |
7 | com.apple.security.cs.allow-jit
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.erb/scripts/link-modules.ts:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 | import webpackPaths from '../configs/webpack.paths';
3 |
4 | const srcNodeModulesPath = webpackPaths.srcNodeModulesPath;
5 | const appNodeModulesPath = webpackPaths.appNodeModulesPath
6 |
7 | if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) {
8 | fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction');
9 | }
10 |
--------------------------------------------------------------------------------
/src/renderer/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Hello Electron React!
6 |
7 |
8 |
9 |
10 |
18 |
19 |
--------------------------------------------------------------------------------
/.erb/scripts/check-node-env.js:
--------------------------------------------------------------------------------
1 | import chalk from 'chalk';
2 |
3 | export default function checkNodeEnv(expectedEnv) {
4 | if (!expectedEnv) {
5 | throw new Error('"expectedEnv" not set');
6 | }
7 |
8 | if (process.env.NODE_ENV !== expectedEnv) {
9 | console.log(
10 | chalk.whiteBright.bgRed.bold(
11 | `"process.env.NODE_ENV" must be "${expectedEnv}" to use this webpack config`
12 | )
13 | );
14 | process.exit(2);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/3-Feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: You want something added to the boilerplate. 🎉
4 | labels: 'enhancement'
5 | ---
6 |
7 |
16 |
--------------------------------------------------------------------------------
/.erb/scripts/clean.js:
--------------------------------------------------------------------------------
1 | import rimraf from 'rimraf';
2 | import webpackPaths from '../configs/webpack.paths.ts';
3 | import process from 'process';
4 |
5 | const args = process.argv.slice(2);
6 | const commandMap = {
7 | dist: webpackPaths.distPath,
8 | release: webpackPaths.releasePath,
9 | dll: webpackPaths.dllPath,
10 | };
11 |
12 | args.forEach((x) => {
13 | const pathToRemove = commandMap[x];
14 | if (pathToRemove !== undefined) {
15 | rimraf.sync(pathToRemove);
16 | }
17 | });
18 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/2-Question.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Question
3 | about: Ask a question.❓
4 | labels: 'question'
5 | ---
6 |
7 | ## Summary
8 |
9 |
10 |
11 |
20 |
--------------------------------------------------------------------------------
/.erb/scripts/check-port-in-use.js:
--------------------------------------------------------------------------------
1 | import chalk from 'chalk';
2 | import detectPort from 'detect-port';
3 |
4 | const port = process.env.PORT || '1212';
5 |
6 | detectPort(port, (err, availablePort) => {
7 | if (port !== String(availablePort)) {
8 | throw new Error(
9 | chalk.whiteBright.bgRed.bold(
10 | `Port "${port}" on "localhost" is already in use. Please use another port. ex: PORT=4343 npm start`
11 | )
12 | );
13 | } else {
14 | process.exit(0);
15 | }
16 | });
17 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Coverage directory used by tools like istanbul
11 | coverage
12 | .eslintcache
13 |
14 | # Dependency directory
15 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
16 | node_modules
17 |
18 | # OSX
19 | .DS_Store
20 |
21 | release/app/dist
22 | release/build
23 | .erb/dll
24 |
25 | .idea
26 | npm-debug.log.*
27 | *.css.d.ts
28 | *.sass.d.ts
29 | *.scss.d.ts
30 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Coverage directory used by tools like istanbul
11 | coverage
12 | .eslintcache
13 |
14 | # Dependency directory
15 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
16 | node_modules
17 |
18 | # OSX
19 | .DS_Store
20 |
21 | release/app/dist
22 | release/build
23 | .erb/dll
24 |
25 | .idea
26 | npm-debug.log.*
27 | *.css.d.ts
28 | *.sass.d.ts
29 | *.scss.d.ts
30 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "files.associations": {
3 | ".eslintrc": "jsonc",
4 | ".prettierrc": "jsonc",
5 | ".eslintignore": "ignore"
6 | },
7 |
8 | "javascript.validate.enable": false,
9 | "javascript.format.enable": false,
10 | "typescript.format.enable": false,
11 |
12 | "search.exclude": {
13 | ".git": true,
14 | ".eslintcache": true,
15 | ".erb/dll": true,
16 | "release/{build,app/dist}": true,
17 | "node_modules": true,
18 | "npm-debug.log.*": true,
19 | "test/**/__snapshots__": true,
20 | "package-lock.json": true,
21 | "*.{css,sass,scss}.d.ts": true
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/assets/assets.d.ts:
--------------------------------------------------------------------------------
1 | type Styles = Record;
2 |
3 | declare module '*.svg' {
4 | const content: string;
5 | export default content;
6 | }
7 |
8 | declare module '*.png' {
9 | const content: string;
10 | export default content;
11 | }
12 |
13 | declare module '*.jpg' {
14 | const content: string;
15 | export default content;
16 | }
17 |
18 | declare module '*.scss' {
19 | const content: Styles;
20 | export default content;
21 | }
22 |
23 | declare module '*.sass' {
24 | const content: Styles;
25 | export default content;
26 | }
27 |
28 | declare module '*.css' {
29 | const content: Styles;
30 | export default content;
31 | }
32 |
--------------------------------------------------------------------------------
/src/main/util.ts:
--------------------------------------------------------------------------------
1 | /* eslint import/prefer-default-export: off, import/no-mutable-exports: off */
2 | import { URL } from 'url';
3 | import path from 'path';
4 |
5 | export let resolveHtmlPath: (htmlFileName: string) => string;
6 |
7 | if (process.env.NODE_ENV === 'development') {
8 | const port = process.env.PORT || 1212;
9 | resolveHtmlPath = (htmlFileName: string) => {
10 | const url = new URL(`http://localhost:${port}`);
11 | url.pathname = htmlFileName;
12 | return url.href;
13 | };
14 | } else {
15 | resolveHtmlPath = (htmlFileName: string) => {
16 | return `file://${path.resolve(__dirname, '../renderer/', htmlFileName)}`;
17 | };
18 | }
19 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0.0",
3 | "tasks": [
4 | {
5 | "type": "npm",
6 | "label": "Start Webpack Dev",
7 | "script": "start:renderer",
8 | "options": {
9 | "cwd": "${workspaceFolder}"
10 | },
11 | "isBackground": true,
12 | "problemMatcher": {
13 | "owner": "custom",
14 | "pattern": {
15 | "regexp": "____________"
16 | },
17 | "background": {
18 | "activeOnStart": true,
19 | "beginsPattern": "Compiling\\.\\.\\.$",
20 | "endsPattern": "(Compiled successfully|Failed to compile)\\.$"
21 | }
22 | }
23 | }
24 | ]
25 | }
26 |
--------------------------------------------------------------------------------
/.erb/scripts/electron-rebuild.js:
--------------------------------------------------------------------------------
1 | import path from 'path';
2 | import { execSync } from 'child_process';
3 | import fs from 'fs';
4 | import { dependencies } from '../../release/app/package.json';
5 | import webpackPaths from '../configs/webpack.paths';
6 |
7 | if (
8 | Object.keys(dependencies || {}).length > 0 &&
9 | fs.existsSync(webpackPaths.appNodeModulesPath)
10 | ) {
11 | const electronRebuildCmd =
12 | '../../node_modules/.bin/electron-rebuild --parallel --force --types prod,dev,optional --module-dir .';
13 | const cmd =
14 | process.platform === 'win32'
15 | ? electronRebuildCmd.replace(/\//g, '\\')
16 | : electronRebuildCmd;
17 | execSync(cmd, {
18 | cwd: webpackPaths.appPath,
19 | stdio: 'inherit',
20 | });
21 | }
22 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | # Number of days of inactivity before an issue becomes stale
2 | daysUntilStale: 60
3 | # Number of days of inactivity before a stale issue is closed
4 | daysUntilClose: 7
5 | # Issues with these labels will never be considered stale
6 | exemptLabels:
7 | - discussion
8 | - security
9 | # Label to use when marking an issue as stale
10 | staleLabel: wontfix
11 | # Comment to post when marking an issue as stale. Set to `false` to disable
12 | markComment: >
13 | This issue has been automatically marked as stale because it has not had
14 | recent activity. It will be closed if no further activity occurs. Thank you
15 | for your contributions.
16 | # Comment to post when closing a stale issue. Set to `false` to disable
17 | closeComment: false
18 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es2021",
4 | "module": "commonjs",
5 | "lib": ["dom", "esnext"],
6 | "declaration": true,
7 | "declarationMap": true,
8 | "jsx": "react-jsx",
9 | "strict": true,
10 | "pretty": true,
11 | "sourceMap": true,
12 | "baseUrl": "./src",
13 | "noUnusedLocals": true,
14 | "noUnusedParameters": true,
15 | "noImplicitReturns": true,
16 | "noFallthroughCasesInSwitch": true,
17 | "moduleResolution": "node",
18 | "esModuleInterop": true,
19 | "allowSyntheticDefaultImports": true,
20 | "resolveJsonModule": true,
21 | "allowJs": true,
22 | "outDir": "release/app/dist"
23 | },
24 | "exclude": ["test", "release/build", "release/app/dist", ".erb/dll"]
25 | }
26 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.2.0",
3 | "configurations": [
4 | {
5 | "name": "Electron: Main",
6 | "type": "node",
7 | "request": "launch",
8 | "protocol": "inspector",
9 | "runtimeExecutable": "npm",
10 | "runtimeArgs": [
11 | "run start:main --inspect=5858 --remote-debugging-port=9223"
12 | ],
13 | "preLaunchTask": "Start Webpack Dev"
14 | },
15 | {
16 | "name": "Electron: Renderer",
17 | "type": "chrome",
18 | "request": "attach",
19 | "port": 9223,
20 | "webRoot": "${workspaceFolder}",
21 | "timeout": 15000
22 | }
23 | ],
24 | "compounds": [
25 | {
26 | "name": "Electron: All",
27 | "configurations": ["Electron: Main", "Electron: Renderer"]
28 | }
29 | ]
30 | }
31 |
--------------------------------------------------------------------------------
/.github/workflows/test.yml:
--------------------------------------------------------------------------------
1 | name: Test
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | release:
7 | runs-on: ${{ matrix.os }}
8 |
9 | strategy:
10 | matrix:
11 | os: [macos-latest, windows-latest, ubuntu-latest]
12 |
13 | steps:
14 | - name: Check out Git repository
15 | uses: actions/checkout@v2
16 |
17 | - name: Install Node.js and NPM
18 | uses: actions/setup-node@v2
19 | with:
20 | node-version: 16
21 | cache: npm
22 |
23 | - name: npm install
24 | run: |
25 | npm install
26 |
27 | - name: npm test
28 | env:
29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
30 | run: |
31 | npm run package
32 | npm run lint
33 | npm exec tsc
34 | npm test
35 |
--------------------------------------------------------------------------------
/.erb/scripts/check-build-exists.ts:
--------------------------------------------------------------------------------
1 | // Check if the renderer and main bundles are built
2 | import path from 'path';
3 | import chalk from 'chalk';
4 | import fs from 'fs';
5 | import webpackPaths from '../configs/webpack.paths';
6 |
7 | const mainPath = path.join(webpackPaths.distMainPath, 'main.js');
8 | const rendererPath = path.join(webpackPaths.distRendererPath, 'renderer.js');
9 |
10 | if (!fs.existsSync(mainPath)) {
11 | throw new Error(
12 | chalk.whiteBright.bgRed.bold(
13 | 'The main process is not built yet. Build it by running "npm run build:main"'
14 | )
15 | );
16 | }
17 |
18 | if (!fs.existsSync(rendererPath)) {
19 | throw new Error(
20 | chalk.whiteBright.bgRed.bold(
21 | 'The renderer process is not built yet. Build it by running "npm run build:renderer"'
22 | )
23 | );
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/preload.js:
--------------------------------------------------------------------------------
1 | const { contextBridge, ipcRenderer } = require('electron');
2 |
3 | contextBridge.exposeInMainWorld('electron', {
4 | ipcRenderer: {
5 | myPing() {
6 | ipcRenderer.send('ipc-example', 'ping');
7 | },
8 | on(channel, func) {
9 | const validChannels = ['ipc-example'];
10 | if (validChannels.includes(channel)) {
11 | // Deliberately strip event as it includes `sender`
12 | ipcRenderer.on(channel, (event, ...args) => func(...args));
13 | }
14 | },
15 | once(channel, func) {
16 | const validChannels = ['ipc-example'];
17 | if (validChannels.includes(channel)) {
18 | // Deliberately strip event as it includes `sender`
19 | ipcRenderer.once(channel, (event, ...args) => func(...args));
20 | }
21 | },
22 | },
23 | });
24 |
--------------------------------------------------------------------------------
/release/app/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "electron-react-boilerplate",
3 | "version": "4.4.0",
4 | "description": "Electron application boilerplate based on React, React Router, Webpack, React Hot Loader for rapid application development",
5 | "main": "./dist/main/main.js",
6 | "author": {
7 | "name": "Electron React Boilerplate Maintainers",
8 | "email": "electronreactboilerplate@gmail.com",
9 | "url": "https://github.com/electron-react-boilerplate"
10 | },
11 | "scripts": {
12 | "electron-rebuild": "node -r ts-node/register ../../.erb/scripts/electron-rebuild.js",
13 | "link-modules": "node -r ts-node/register ../../.erb/scripts/link-modules.ts",
14 | "postinstall": "npm run electron-rebuild && npm run link-modules"
15 | },
16 | "license": "MIT",
17 | "dependencies": {
18 | "sqlite3": "^5.0.2"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: 'erb',
3 | rules: {
4 | // A temporary hack related to IDE not resolving correct package.json
5 | 'import/no-extraneous-dependencies': 'off',
6 | // Since React 17 and typescript 4.1 you can safely disable the rule
7 | 'react/react-in-jsx-scope': 'off',
8 | },
9 | parserOptions: {
10 | ecmaVersion: 2020,
11 | sourceType: 'module',
12 | project: './tsconfig.json',
13 | tsconfigRootDir: __dirname,
14 | createDefaultProgram: true,
15 | },
16 | settings: {
17 | 'import/resolver': {
18 | // See https://github.com/benmosher/eslint-plugin-import/issues/1396#issuecomment-575727774 for line below
19 | node: {},
20 | webpack: {
21 | config: require.resolve('./.erb/configs/webpack.config.eslint.ts'),
22 | },
23 | },
24 | 'import/parsers': {
25 | '@typescript-eslint/parser': ['.ts', '.tsx'],
26 | },
27 | },
28 | };
29 |
--------------------------------------------------------------------------------
/.erb/scripts/notarize.js:
--------------------------------------------------------------------------------
1 | const { notarize } = require('electron-notarize');
2 | const { build } = require('../../package.json');
3 |
4 | exports.default = async function notarizeMacos(context) {
5 | const { electronPlatformName, appOutDir } = context;
6 | if (electronPlatformName !== 'darwin') {
7 | return;
8 | }
9 |
10 | if (!process.env.CI) {
11 | console.warn('Skipping notarizing step. Packaging is not running in CI');
12 | return;
13 | }
14 |
15 | if (!('APPLE_ID' in process.env && 'APPLE_ID_PASS' in process.env)) {
16 | console.warn('Skipping notarizing step. APPLE_ID and APPLE_ID_PASS env variables must be set');
17 | return;
18 | }
19 |
20 | const appName = context.packager.appInfo.productFilename;
21 |
22 | await notarize({
23 | appBundleId: build.appId,
24 | appPath: `${appOutDir}/${appName}.app`,
25 | appleId: process.env.APPLE_ID,
26 | appleIdPassword: process.env.APPLE_ID_PASS,
27 | });
28 | };
29 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015-present Electron React Boilerplate
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.erb/configs/webpack.paths.ts:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | const rootPath = path.join(__dirname, '../..');
4 |
5 | const dllPath = path.join(__dirname, '../dll');
6 |
7 | const srcPath = path.join(rootPath, 'src');
8 | const srcMainPath = path.join(srcPath, 'main');
9 | const srcRendererPath = path.join(srcPath, 'renderer');
10 |
11 | const releasePath = path.join(rootPath, 'release');
12 | const appPath = path.join(releasePath, 'app');
13 | const appPackagePath = path.join(appPath, 'package.json');
14 | const appNodeModulesPath = path.join(appPath, 'node_modules');
15 | const srcNodeModulesPath = path.join(srcPath, 'node_modules');
16 |
17 | const distPath = path.join(appPath, 'dist');
18 | const distMainPath = path.join(distPath, 'main');
19 | const distRendererPath = path.join(distPath, 'renderer');
20 |
21 | const buildPath = path.join(releasePath, 'build');
22 |
23 | export default {
24 | rootPath,
25 | dllPath,
26 | srcPath,
27 | srcMainPath,
28 | srcRendererPath,
29 | releasePath,
30 | appPath,
31 | appPackagePath,
32 | appNodeModulesPath,
33 | srcNodeModulesPath,
34 | distPath,
35 | distMainPath,
36 | distRendererPath,
37 | buildPath,
38 | };
39 |
--------------------------------------------------------------------------------
/src/renderer/App.css:
--------------------------------------------------------------------------------
1 | /*
2 | * @NOTE: Prepend a `~` to css file paths that are in your node_modules
3 | * See https://github.com/webpack-contrib/sass-loader#imports
4 | */
5 | body {
6 | position: relative;
7 | color: white;
8 | height: 100vh;
9 | background: linear-gradient(
10 | 200.96deg,
11 | #fedc2a -29.09%,
12 | #dd5789 51.77%,
13 | #7a2c9e 129.35%
14 | );
15 | font-family: sans-serif;
16 | overflow-y: hidden;
17 | display: flex;
18 | justify-content: center;
19 | align-items: center;
20 | }
21 |
22 | button {
23 | background-color: white;
24 | padding: 10px 20px;
25 | border-radius: 10px;
26 | border: none;
27 | appearance: none;
28 | font-size: 1.3rem;
29 | box-shadow: 0px 8px 28px -6px rgba(24, 39, 75, 0.12),
30 | 0px 18px 88px -4px rgba(24, 39, 75, 0.14);
31 | transition: all ease-in 0.1s;
32 | cursor: pointer;
33 | opacity: 0.9;
34 | }
35 |
36 | button:hover {
37 | transform: scale(1.05);
38 | opacity: 1;
39 | }
40 |
41 | li {
42 | list-style: none;
43 | }
44 |
45 | a {
46 | text-decoration: none;
47 | height: fit-content;
48 | width: fit-content;
49 | margin: 10px;
50 | }
51 |
52 | a:hover {
53 | opacity: 1;
54 | text-decoration: none;
55 | }
56 |
57 | .Hello {
58 | display: flex;
59 | justify-content: center;
60 | align-items: center;
61 | margin: 20px 0;
62 | }
63 |
--------------------------------------------------------------------------------
/src/renderer/App.tsx:
--------------------------------------------------------------------------------
1 | import { MemoryRouter as Router, Routes, Route } from 'react-router-dom';
2 | import icon from '../../assets/icon.svg';
3 | import './App.css';
4 |
5 | const Hello = () => {
6 | return (
7 |
8 |
9 |

10 |
11 |
electron-react-boilerplate
12 |
38 |
39 | );
40 | };
41 |
42 | export default function App() {
43 | return (
44 |
45 |
46 | } />
47 |
48 |
49 | );
50 | }
51 |
--------------------------------------------------------------------------------
/.erb/configs/webpack.config.base.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Base webpack config used across other specific configs
3 | */
4 |
5 | import webpack from 'webpack';
6 | import webpackPaths from './webpack.paths';
7 | import { dependencies as externals } from '../../release/app/package.json';
8 |
9 | const configuration: webpack.Configuration = {
10 | externals: [...Object.keys(externals || {})],
11 |
12 | stats: 'errors-only',
13 |
14 | module: {
15 | rules: [
16 | {
17 | test: /\.[jt]sx?$/,
18 | exclude: /node_modules/,
19 | use: {
20 | loader: 'ts-loader',
21 | options: {
22 | // Remove this line to enable type checking in webpack builds
23 | transpileOnly: true,
24 | },
25 | },
26 | },
27 | ],
28 | },
29 |
30 | output: {
31 | path: webpackPaths.srcPath,
32 | // https://github.com/webpack/webpack/issues/1114
33 | library: {
34 | type: 'commonjs2',
35 | },
36 | },
37 |
38 | /**
39 | * Determine the array of extensions that should be used to resolve modules.
40 | */
41 | resolve: {
42 | extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'],
43 | modules: [webpackPaths.srcPath, 'node_modules'],
44 | },
45 |
46 | plugins: [
47 | new webpack.EnvironmentPlugin({
48 | NODE_ENV: 'production',
49 | }),
50 | ],
51 | };
52 |
53 | export default configuration;
54 |
--------------------------------------------------------------------------------
/.github/workflows/publish.yml:
--------------------------------------------------------------------------------
1 | name: Publish
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 |
8 | jobs:
9 | publish:
10 | # To enable auto publishing to github, update your electron publisher
11 | # config in package.json > "build" and remove the conditional below
12 | if: ${{ github.repository_owner == 'electron-react-boilerplate' }}
13 |
14 | runs-on: ${{ matrix.os }}
15 |
16 | strategy:
17 | matrix:
18 | os: [macos-latest]
19 |
20 | steps:
21 | - name: Checkout git repo
22 | uses: actions/checkout@v2
23 |
24 | - name: Install Node and NPM
25 | uses: actions/setup-node@v2
26 | with:
27 | node-version: 16
28 |
29 | - name: Install dependencies
30 | run: |
31 | npm install
32 |
33 | - name: Publish releases
34 | env:
35 | # These values are used for auto updates signing
36 | APPLE_ID: ${{ secrets.APPLE_ID }}
37 | APPLE_ID_PASS: ${{ secrets.APPLE_ID_PASS }}
38 | CSC_LINK: ${{ secrets.CSC_LINK }}
39 | CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
40 | # This is used for uploading release assets to github
41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
42 | run: |
43 | npm run postinstall
44 | npm run build
45 | npm exec electron-builder -- --publish always --win --mac --linux
46 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # erb-sqlite-example
2 |
3 | [](https://github.com/amilajack/erb-sqlite-example/actions/workflows/test.yml)
4 |
5 | **An example of erb with native dependencies (sqlite3 in this case)**
6 |
7 | ## Setup
8 |
9 | ```bash
10 | git clone https://github.com/amilajack/erb-sqlite-example.git
11 | cd erb-sqlite-example
12 | npm i
13 | npm start
14 | ```
15 |
16 | ## How it works
17 |
18 | `sqlite3` is a native dependency that needs to be compiled before it is used (therefore it is consiered 'native dependency'). `sqlite3` and any other depencencies in `./build/app/package.json` are imported as an [externals](https://webpack.js.org/configuration/externals/), which means that webpack doesn't process them. The dependency will be imported with normal `require()` calls.
19 |
20 | Some native dependencies have issues with how webpack bundles code. One solution to these kinds of issues is to add those native dependencies to your `./build/app/package.json`. These dependencies are automatically rebuilt against electron's node version after installing (see the postinstall script in `./build/app/package.json`). [electron-builder](https://github.com/electron-userland/electron-builder) will also rebuild dependencies just before packaging your app.
21 |
22 | You **must** install the dependencies as `dependencies` **and not** `devDepencencies`. Make sure to install like so for npm: `npm install my-cool-depencency` and like so for npm: `npm i my-cool-dependency`.
23 |
24 | ## Notes
25 |
26 | **These changes that were made to ERB:**
27 |
28 | ```bash
29 | cd build/app
30 | npm i sqlite3
31 | ```
32 |
--------------------------------------------------------------------------------
/.erb/configs/webpack.config.renderer.dev.dll.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Builds the DLL for development electron renderer process
3 | */
4 |
5 | import webpack from 'webpack';
6 | import path from 'path';
7 | import { merge } from 'webpack-merge';
8 | import baseConfig from './webpack.config.base';
9 | import webpackPaths from './webpack.paths';
10 | import { dependencies } from '../../package.json';
11 | import checkNodeEnv from '../scripts/check-node-env';
12 |
13 | checkNodeEnv('development');
14 |
15 | const dist = webpackPaths.dllPath;
16 |
17 | const configuration: webpack.Configuration = {
18 | context: webpackPaths.rootPath,
19 |
20 | devtool: 'eval',
21 |
22 | mode: 'development',
23 |
24 | target: 'electron-renderer',
25 |
26 | externals: ['fsevents', 'crypto-browserify'],
27 |
28 | /**
29 | * Use `module` from `webpack.config.renderer.dev.js`
30 | */
31 | module: require('./webpack.config.renderer.dev').default.module,
32 |
33 | entry: {
34 | renderer: Object.keys(dependencies || {}),
35 | },
36 |
37 | output: {
38 | path: dist,
39 | filename: '[name].dev.dll.js',
40 | library: {
41 | name: 'renderer',
42 | type: 'var',
43 | },
44 | },
45 |
46 | plugins: [
47 | new webpack.DllPlugin({
48 | path: path.join(dist, '[name].json'),
49 | name: '[name]',
50 | }),
51 |
52 | /**
53 | * Create global constants which can be configured at compile time.
54 | *
55 | * Useful for allowing different behaviour between development builds and
56 | * release builds
57 | *
58 | * NODE_ENV should be production so that modules do not perform certain
59 | * development checks
60 | */
61 | new webpack.EnvironmentPlugin({
62 | NODE_ENV: 'development',
63 | }),
64 |
65 | new webpack.LoaderOptionsPlugin({
66 | debug: true,
67 | options: {
68 | context: webpackPaths.srcPath,
69 | output: {
70 | path: webpackPaths.dllPath,
71 | },
72 | },
73 | }),
74 | ],
75 | };
76 |
77 | export default merge(baseConfig, configuration);
78 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/1-Bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: You're having technical issues. 🐞
4 | labels: 'bug'
5 | ---
6 |
7 |
8 |
9 | ## Prerequisites
10 |
11 |
12 |
13 | - [ ] Using npm
14 | - [ ] Using an up-to-date [`main` branch](https://github.com/electron-react-boilerplate/electron-react-boilerplate/tree/main)
15 | - [ ] Using latest version of devtools. [Check the docs for how to update](https://electron-react-boilerplate.js.org/docs/dev-tools/)
16 | - [ ] Tried solutions mentioned in [#400](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/400)
17 | - [ ] For issue in production release, add devtools output of `DEBUG_PROD=true npm run build && npm start`
18 |
19 | ## Expected Behavior
20 |
21 |
22 |
23 | ## Current Behavior
24 |
25 |
26 |
27 | ## Steps to Reproduce
28 |
29 |
30 |
31 |
32 | 1.
33 |
34 | 2.
35 |
36 | 3.
37 |
38 | 4.
39 |
40 | ## Possible Solution (Not obligatory)
41 |
42 |
43 |
44 | ## Context
45 |
46 |
47 |
48 |
49 |
50 | ## Your Environment
51 |
52 |
53 |
54 | - Node version :
55 | - electron-react-boilerplate version or branch :
56 | - Operating System and version :
57 | - Link to your project :
58 |
59 |
68 |
--------------------------------------------------------------------------------
/.erb/scripts/check-native-dep.js:
--------------------------------------------------------------------------------
1 | import fs from 'fs';
2 | import chalk from 'chalk';
3 | import { execSync } from 'child_process';
4 | import { dependencies } from '../../package.json';
5 |
6 | if (dependencies) {
7 | const dependenciesKeys = Object.keys(dependencies);
8 | const nativeDeps = fs
9 | .readdirSync('node_modules')
10 | .filter((folder) => fs.existsSync(`node_modules/${folder}/binding.gyp`));
11 | if (nativeDeps.length === 0) {
12 | process.exit(0);
13 | }
14 | try {
15 | // Find the reason for why the dependency is installed. If it is installed
16 | // because of a devDependency then that is okay. Warn when it is installed
17 | // because of a dependency
18 | const { dependencies: dependenciesObject } = JSON.parse(
19 | execSync(`npm ls ${nativeDeps.join(' ')} --json`).toString()
20 | );
21 | const rootDependencies = Object.keys(dependenciesObject);
22 | const filteredRootDependencies = rootDependencies.filter((rootDependency) =>
23 | dependenciesKeys.includes(rootDependency)
24 | );
25 | if (filteredRootDependencies.length > 0) {
26 | const plural = filteredRootDependencies.length > 1;
27 | console.log(`
28 | ${chalk.whiteBright.bgYellow.bold(
29 | 'Webpack does not work with native dependencies.'
30 | )}
31 | ${chalk.bold(filteredRootDependencies.join(', '))} ${
32 | plural ? 'are native dependencies' : 'is a native dependency'
33 | } and should be installed inside of the "./release/app" folder.
34 | First, uninstall the packages from "./package.json":
35 | ${chalk.whiteBright.bgGreen.bold('npm uninstall your-package')}
36 | ${chalk.bold(
37 | 'Then, instead of installing the package to the root "./package.json":'
38 | )}
39 | ${chalk.whiteBright.bgRed.bold('npm install your-package')}
40 | ${chalk.bold('Install the package to "./release/app/package.json"')}
41 | ${chalk.whiteBright.bgGreen.bold('cd ./release/app && npm install your-package')}
42 | Read more about native dependencies at:
43 | ${chalk.bold(
44 | 'https://electron-react-boilerplate.js.org/docs/adding-dependencies/#module-structure'
45 | )}
46 | `);
47 | process.exit(1);
48 | }
49 | } catch (e) {
50 | console.log('Native dependencies could not be checked');
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/.erb/configs/webpack.config.main.prod.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Webpack config for production electron main process
3 | */
4 |
5 | import path from 'path';
6 | import webpack from 'webpack';
7 | import { merge } from 'webpack-merge';
8 | import TerserPlugin from 'terser-webpack-plugin';
9 | import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
10 | import baseConfig from './webpack.config.base';
11 | import webpackPaths from './webpack.paths';
12 | import checkNodeEnv from '../scripts/check-node-env';
13 | import deleteSourceMaps from '../scripts/delete-source-maps';
14 |
15 | checkNodeEnv('production');
16 | deleteSourceMaps();
17 |
18 | const devtoolsConfig =
19 | process.env.DEBUG_PROD === 'true'
20 | ? {
21 | devtool: 'source-map',
22 | }
23 | : {};
24 |
25 | const configuration: webpack.Configuration = {
26 | ...devtoolsConfig,
27 |
28 | mode: 'production',
29 |
30 | target: 'electron-main',
31 |
32 | entry: {
33 | main: path.join(webpackPaths.srcMainPath, 'main.ts'),
34 | preload: path.join(webpackPaths.srcMainPath, 'preload.js'),
35 | },
36 |
37 | output: {
38 | path: webpackPaths.distMainPath,
39 | filename: '[name].js',
40 | },
41 |
42 | optimization: {
43 | minimizer: [
44 | new TerserPlugin({
45 | parallel: true,
46 | }),
47 | ],
48 | },
49 |
50 | plugins: [
51 | new BundleAnalyzerPlugin({
52 | analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
53 | }),
54 |
55 | /**
56 | * Create global constants which can be configured at compile time.
57 | *
58 | * Useful for allowing different behaviour between development builds and
59 | * release builds
60 | *
61 | * NODE_ENV should be production so that modules do not perform certain
62 | * development checks
63 | */
64 | new webpack.EnvironmentPlugin({
65 | NODE_ENV: 'production',
66 | DEBUG_PROD: false,
67 | START_MINIMIZED: false,
68 | }),
69 | ],
70 |
71 | /**
72 | * Disables webpack processing of __dirname and __filename.
73 | * If you run the bundle in node.js it falls back to these values of node.js.
74 | * https://github.com/webpack/webpack/issues/2010
75 | */
76 | node: {
77 | __dirname: false,
78 | __filename: false,
79 | },
80 | };
81 |
82 | export default merge(baseConfig, configuration);
83 |
--------------------------------------------------------------------------------
/assets/icon.svg:
--------------------------------------------------------------------------------
1 |
24 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, sex characteristics, gender identity and expression,
9 | level of experience, education, socio-economic status, nationality, personal
10 | appearance, race, religion, or sexual identity and orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Enforcement
56 |
57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
58 | reported by contacting the project team at electronreactboilerplate@gmail.com. All
59 | complaints will be reviewed and investigated and will result in a response that
60 | is deemed necessary and appropriate to the circumstances. The project team is
61 | obligated to maintain confidentiality with regard to the reporter of an incident.
62 | Further details of specific enforcement policies may be posted separately.
63 |
64 | Project maintainers who do not follow or enforce the Code of Conduct in good
65 | faith may face temporary or permanent repercussions as determined by other
66 | members of the project's leadership.
67 |
68 | ## Attribution
69 |
70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72 |
73 | [homepage]: https://www.contributor-covenant.org
74 |
75 | For answers to common questions about this code of conduct, see
76 | https://www.contributor-covenant.org/faq
77 |
--------------------------------------------------------------------------------
/.erb/configs/webpack.config.renderer.prod.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Build config for electron renderer process
3 | */
4 |
5 | import path from 'path';
6 | import webpack from 'webpack';
7 | import HtmlWebpackPlugin from 'html-webpack-plugin';
8 | import MiniCssExtractPlugin from 'mini-css-extract-plugin';
9 | import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
10 | import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
11 | import { merge } from 'webpack-merge';
12 | import TerserPlugin from 'terser-webpack-plugin';
13 | import baseConfig from './webpack.config.base';
14 | import webpackPaths from './webpack.paths';
15 | import checkNodeEnv from '../scripts/check-node-env';
16 | import deleteSourceMaps from '../scripts/delete-source-maps';
17 |
18 | checkNodeEnv('production');
19 | deleteSourceMaps();
20 |
21 | const devtoolsConfig =
22 | process.env.DEBUG_PROD === 'true'
23 | ? {
24 | devtool: 'source-map',
25 | }
26 | : {};
27 |
28 | const configuration: webpack.Configuration = {
29 | ...devtoolsConfig,
30 |
31 | mode: 'production',
32 |
33 | target: ['web', 'electron-renderer'],
34 |
35 | entry: [
36 | 'core-js',
37 | 'regenerator-runtime/runtime',
38 | path.join(webpackPaths.srcRendererPath, 'index.tsx'),
39 | ],
40 |
41 | output: {
42 | path: webpackPaths.distRendererPath,
43 | publicPath: './',
44 | filename: 'renderer.js',
45 | library: {
46 | type: 'umd',
47 | },
48 | },
49 |
50 | module: {
51 | rules: [
52 | {
53 | test: /\.s?(a|c)ss$/,
54 | use: [
55 | MiniCssExtractPlugin.loader,
56 | {
57 | loader: 'css-loader',
58 | options: {
59 | modules: true,
60 | sourceMap: true,
61 | importLoaders: 1,
62 | },
63 | },
64 | 'sass-loader',
65 | ],
66 | include: /\.module\.s?(c|a)ss$/,
67 | },
68 | {
69 | test: /\.s?(a|c)ss$/,
70 | use: [MiniCssExtractPlugin.loader, 'css-loader', 'sass-loader'],
71 | exclude: /\.module\.s?(c|a)ss$/,
72 | },
73 | // Fonts
74 | {
75 | test: /\.(woff|woff2|eot|ttf|otf)$/i,
76 | type: 'asset/resource',
77 | },
78 | // Images
79 | {
80 | test: /\.(png|svg|jpg|jpeg|gif)$/i,
81 | type: 'asset/resource',
82 | },
83 | ],
84 | },
85 |
86 | optimization: {
87 | minimize: true,
88 | minimizer: [
89 | new TerserPlugin({
90 | parallel: true,
91 | }),
92 | new CssMinimizerPlugin(),
93 | ],
94 | },
95 |
96 | plugins: [
97 | /**
98 | * Create global constants which can be configured at compile time.
99 | *
100 | * Useful for allowing different behaviour between development builds and
101 | * release builds
102 | *
103 | * NODE_ENV should be production so that modules do not perform certain
104 | * development checks
105 | */
106 | new webpack.EnvironmentPlugin({
107 | NODE_ENV: 'production',
108 | DEBUG_PROD: false,
109 | }),
110 |
111 | new MiniCssExtractPlugin({
112 | filename: 'style.css',
113 | }),
114 |
115 | new BundleAnalyzerPlugin({
116 | analyzerMode: process.env.ANALYZE === 'true' ? 'server' : 'disabled',
117 | }),
118 |
119 | new HtmlWebpackPlugin({
120 | filename: 'index.html',
121 | template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
122 | minify: {
123 | collapseWhitespace: true,
124 | removeAttributeQuotes: true,
125 | removeComments: true,
126 | },
127 | isBrowser: false,
128 | isDevelopment: process.env.NODE_ENV !== 'production',
129 | }),
130 | ],
131 | };
132 |
133 | export default merge(baseConfig, configuration);
134 |
--------------------------------------------------------------------------------
/src/main/main.ts:
--------------------------------------------------------------------------------
1 | /* eslint global-require: off, no-console: off, promise/always-return: off */
2 |
3 | /**
4 | * This module executes inside of electron's main process. You can start
5 | * electron renderer process from here and communicate with the other processes
6 | * through IPC.
7 | *
8 | * When running `npm run build` or `npm run build:main`, this file is compiled to
9 | * `./src/main.js` using webpack. This gives us some performance wins.
10 | */
11 | import 'core-js/stable';
12 | import 'regenerator-runtime/runtime';
13 | import path from 'path';
14 | import { app, BrowserWindow, shell, ipcMain } from 'electron';
15 | import { autoUpdater } from 'electron-updater';
16 | import log from 'electron-log';
17 | import sqlite from 'sqlite3';
18 | import MenuBuilder from './menu';
19 | import { resolveHtmlPath } from './util';
20 |
21 | export default class AppUpdater {
22 | constructor() {
23 | log.transports.file.level = 'info';
24 | autoUpdater.logger = log;
25 | autoUpdater.checkForUpdatesAndNotify();
26 | }
27 | }
28 |
29 | const sqlite3 = sqlite.verbose();
30 | const db = new sqlite3.Database(':memory:');
31 |
32 | db.serialize(() => {
33 | db.run('CREATE TABLE lorem (info TEXT)');
34 |
35 | const stmt = db.prepare('INSERT INTO lorem VALUES (?)');
36 | for (let i = 0; i < 10; i += 1) {
37 | stmt.run(`Ipsum ${i}`);
38 | }
39 | stmt.finalize();
40 |
41 | db.each('SELECT rowid AS id, info FROM lorem', (_err, row) => {
42 | console.log(`${row.id}: ${row.info}`);
43 | });
44 | });
45 |
46 | db.close();
47 |
48 | let mainWindow: BrowserWindow | null = null;
49 |
50 | ipcMain.on('ipc-example', async (event, arg) => {
51 | const msgTemplate = (pingPong: string) => `IPC test: ${pingPong}`;
52 | console.log(msgTemplate(arg));
53 | event.reply('ipc-example', msgTemplate('pong'));
54 | });
55 |
56 | if (process.env.NODE_ENV === 'production') {
57 | const sourceMapSupport = require('source-map-support');
58 | sourceMapSupport.install();
59 | }
60 |
61 | const isDevelopment =
62 | process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true';
63 |
64 | if (isDevelopment) {
65 | require('electron-debug')();
66 | }
67 |
68 | const installExtensions = async () => {
69 | const installer = require('electron-devtools-installer');
70 | const forceDownload = !!process.env.UPGRADE_EXTENSIONS;
71 | const extensions = ['REACT_DEVELOPER_TOOLS'];
72 |
73 | return installer
74 | .default(
75 | extensions.map((name) => installer[name]),
76 | forceDownload
77 | )
78 | .catch(console.log);
79 | };
80 |
81 | const createWindow = async () => {
82 | if (isDevelopment) {
83 | await installExtensions();
84 | }
85 |
86 | const RESOURCES_PATH = app.isPackaged
87 | ? path.join(process.resourcesPath, 'assets')
88 | : path.join(__dirname, '../../assets');
89 |
90 | const getAssetPath = (...paths: string[]): string => {
91 | return path.join(RESOURCES_PATH, ...paths);
92 | };
93 |
94 | mainWindow = new BrowserWindow({
95 | show: false,
96 | width: 1024,
97 | height: 728,
98 | icon: getAssetPath('icon.png'),
99 | webPreferences: {
100 | preload: path.join(__dirname, 'preload.js'),
101 | },
102 | });
103 |
104 | mainWindow.loadURL(resolveHtmlPath('index.html'));
105 |
106 | mainWindow.on('ready-to-show', () => {
107 | if (!mainWindow) {
108 | throw new Error('"mainWindow" is not defined');
109 | }
110 | if (process.env.START_MINIMIZED) {
111 | mainWindow.minimize();
112 | } else {
113 | mainWindow.show();
114 | }
115 | });
116 |
117 | mainWindow.on('closed', () => {
118 | mainWindow = null;
119 | });
120 |
121 | const menuBuilder = new MenuBuilder(mainWindow);
122 | menuBuilder.buildMenu();
123 |
124 | // Open urls in the user's browser
125 | mainWindow.webContents.on('new-window', (event, url) => {
126 | event.preventDefault();
127 | shell.openExternal(url);
128 | });
129 |
130 | // Remove this if your app does not use auto updates
131 | // eslint-disable-next-line
132 | new AppUpdater();
133 | };
134 |
135 | /**
136 | * Add event listeners...
137 | */
138 |
139 | app.on('window-all-closed', () => {
140 | // Respect the OSX convention of having the application in memory even
141 | // after all windows have been closed
142 | if (process.platform !== 'darwin') {
143 | app.quit();
144 | }
145 | });
146 |
147 | app
148 | .whenReady()
149 | .then(() => {
150 | createWindow();
151 | app.on('activate', () => {
152 | // On macOS it's common to re-create a window in the app when the
153 | // dock icon is clicked and there are no other windows open.
154 | if (mainWindow === null) createWindow();
155 | });
156 | })
157 | .catch(console.log);
158 |
--------------------------------------------------------------------------------
/.erb/configs/webpack.config.renderer.dev.ts:
--------------------------------------------------------------------------------
1 | import path from 'path';
2 | import fs from 'fs';
3 | import webpack from 'webpack';
4 | import HtmlWebpackPlugin from 'html-webpack-plugin';
5 | import chalk from 'chalk';
6 | import { merge } from 'webpack-merge';
7 | import { spawn, execSync } from 'child_process';
8 | import baseConfig from './webpack.config.base';
9 | import webpackPaths from './webpack.paths';
10 | import checkNodeEnv from '../scripts/check-node-env';
11 | import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
12 |
13 | // When an ESLint server is running, we can't set the NODE_ENV so we'll check if it's
14 | // at the dev webpack config is not accidentally run in a production environment
15 | if (process.env.NODE_ENV === 'production') {
16 | checkNodeEnv('development');
17 | }
18 |
19 | const port = process.env.PORT || 1212;
20 | const manifest = path.resolve(webpackPaths.dllPath, 'renderer.json');
21 | const requiredByDLLConfig = module.parent.filename.includes(
22 | 'webpack.config.renderer.dev.dll'
23 | );
24 |
25 | /**
26 | * Warn if the DLL is not built
27 | */
28 | if (
29 | !requiredByDLLConfig &&
30 | !(fs.existsSync(webpackPaths.dllPath) && fs.existsSync(manifest))
31 | ) {
32 | console.log(
33 | chalk.black.bgYellow.bold(
34 | 'The DLL files are missing. Sit back while we build them for you with "npm run build-dll"'
35 | )
36 | );
37 | execSync('npm run postinstall');
38 | }
39 |
40 | const configuration: webpack.Configuration = {
41 | devtool: 'inline-source-map',
42 |
43 | mode: 'development',
44 |
45 | target: ['web', 'electron-renderer'],
46 |
47 | entry: [
48 | `webpack-dev-server/client?http://localhost:${port}/dist`,
49 | 'webpack/hot/only-dev-server',
50 | 'core-js',
51 | 'regenerator-runtime/runtime',
52 | path.join(webpackPaths.srcRendererPath, 'index.tsx'),
53 | ],
54 |
55 | output: {
56 | path: webpackPaths.distRendererPath,
57 | publicPath: '/',
58 | filename: 'renderer.dev.js',
59 | library: {
60 | type: 'umd',
61 | },
62 | },
63 |
64 | module: {
65 | rules: [
66 | {
67 | test: /\.s?css$/,
68 | use: [
69 | 'style-loader',
70 | {
71 | loader: 'css-loader',
72 | options: {
73 | modules: true,
74 | sourceMap: true,
75 | importLoaders: 1,
76 | },
77 | },
78 | 'sass-loader',
79 | ],
80 | include: /\.module\.s?(c|a)ss$/,
81 | },
82 | {
83 | test: /\.s?css$/,
84 | use: ['style-loader', 'css-loader', 'sass-loader'],
85 | exclude: /\.module\.s?(c|a)ss$/,
86 | },
87 | // Fonts
88 | {
89 | test: /\.(woff|woff2|eot|ttf|otf)$/i,
90 | type: 'asset/resource',
91 | },
92 | // Images
93 | {
94 | test: /\.(png|svg|jpg|jpeg|gif)$/i,
95 | type: 'asset/resource',
96 | },
97 | ],
98 | },
99 | plugins: [
100 | requiredByDLLConfig
101 | ? null
102 | : new webpack.DllReferencePlugin({
103 | context: webpackPaths.dllPath,
104 | manifest: require(manifest),
105 | sourceType: 'var',
106 | }),
107 |
108 | new webpack.NoEmitOnErrorsPlugin(),
109 |
110 | /**
111 | * Create global constants which can be configured at compile time.
112 | *
113 | * Useful for allowing different behaviour between development builds and
114 | * release builds
115 | *
116 | * NODE_ENV should be production so that modules do not perform certain
117 | * development checks
118 | *
119 | * By default, use 'development' as NODE_ENV. This can be overriden with
120 | * 'staging', for example, by changing the ENV variables in the npm scripts
121 | */
122 | new webpack.EnvironmentPlugin({
123 | NODE_ENV: 'development',
124 | }),
125 |
126 | new webpack.LoaderOptionsPlugin({
127 | debug: true,
128 | }),
129 |
130 | new ReactRefreshWebpackPlugin(),
131 |
132 | new HtmlWebpackPlugin({
133 | filename: path.join('index.html'),
134 | template: path.join(webpackPaths.srcRendererPath, 'index.ejs'),
135 | minify: {
136 | collapseWhitespace: true,
137 | removeAttributeQuotes: true,
138 | removeComments: true,
139 | },
140 | isBrowser: false,
141 | env: process.env.NODE_ENV,
142 | isDevelopment: process.env.NODE_ENV !== 'production',
143 | nodeModules: webpackPaths.appNodeModulesPath,
144 | }),
145 | ],
146 |
147 | node: {
148 | __dirname: false,
149 | __filename: false,
150 | },
151 |
152 | devServer: {
153 | port,
154 | compress: true,
155 | hot: true,
156 | headers: { 'Access-Control-Allow-Origin': '*' },
157 | static: {
158 | publicPath: '/',
159 | },
160 | historyApiFallback: {
161 | verbose: true,
162 | },
163 | onBeforeSetupMiddleware() {
164 | console.log('Starting Main Process...');
165 | spawn('npm', ['run', 'start:main'], {
166 | shell: true,
167 | env: process.env,
168 | stdio: 'inherit',
169 | })
170 | .on('close', (code) => process.exit(code))
171 | .on('error', (spawnError) => console.error(spawnError));
172 | },
173 | },
174 | };
175 |
176 | export default merge(baseConfig, configuration);
177 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "electron-react-boilerplate",
3 | "description": "Electron application boilerplate based on React, React Router, Webpack, React Fast Refresh for rapid application development",
4 | "scripts": {
5 | "build": "concurrently \"npm run build:main\" \"npm run build:renderer\"",
6 | "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts",
7 | "build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts",
8 | "rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir src",
9 | "lint": "cross-env NODE_ENV=development eslint . --cache --ext .js,.jsx,.ts,.tsx",
10 | "package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never",
11 | "postinstall": "ts-node .erb/scripts/check-native-dep.js && electron-builder install-app-deps && cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.dev.dll.ts && opencollective-postinstall",
12 | "start": "ts-node ./.erb/scripts/check-port-in-use.js && npm run start:renderer",
13 | "start:main": "cross-env NODE_ENV=development electron -r ts-node/register/transpile-only ./src/main/main.ts",
14 | "start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts",
15 | "test": "jest",
16 | "prepare": "husky install"
17 | },
18 | "lint-staged": {
19 | "*.{js,jsx,ts,tsx}": [
20 | "cross-env NODE_ENV=development eslint --cache"
21 | ],
22 | "*.json,.{eslintrc,prettierrc}": [
23 | "prettier --ignore-path .eslintignore --parser json --write"
24 | ],
25 | "*.{css,scss}": [
26 | "prettier --ignore-path .eslintignore --single-quote --write"
27 | ],
28 | "*.{html,md,yml}": [
29 | "prettier --ignore-path .eslintignore --single-quote --write"
30 | ]
31 | },
32 | "build": {
33 | "productName": "ElectronReact",
34 | "appId": "org.erb.ElectronReact",
35 | "asar": true,
36 | "asarUnpack": "**\\*.{node,dll}",
37 | "files": [
38 | "dist",
39 | "node_modules",
40 | "package.json"
41 | ],
42 | "afterSign": ".erb/scripts/notarize.js",
43 | "mac": {
44 | "target": {
45 | "target": "default",
46 | "arch": [
47 | "arm64",
48 | "x64"
49 | ]
50 | },
51 | "type": "distribution",
52 | "hardenedRuntime": true,
53 | "entitlements": "assets/entitlements.mac.plist",
54 | "entitlementsInherit": "assets/entitlements.mac.plist",
55 | "gatekeeperAssess": false
56 | },
57 | "dmg": {
58 | "contents": [
59 | {
60 | "x": 130,
61 | "y": 220
62 | },
63 | {
64 | "x": 410,
65 | "y": 220,
66 | "type": "link",
67 | "path": "/Applications"
68 | }
69 | ]
70 | },
71 | "win": {
72 | "target": [
73 | "nsis"
74 | ]
75 | },
76 | "linux": {
77 | "target": [
78 | "AppImage"
79 | ],
80 | "category": "Development"
81 | },
82 | "directories": {
83 | "app": "release/app",
84 | "buildResources": "assets",
85 | "output": "release/build"
86 | },
87 | "extraResources": [
88 | "./assets/**"
89 | ],
90 | "publish": {
91 | "provider": "github",
92 | "owner": "electron-react-boilerplate",
93 | "repo": "electron-react-boilerplate"
94 | }
95 | },
96 | "repository": {
97 | "type": "git",
98 | "url": "git+https://github.com/electron-react-boilerplate/electron-react-boilerplate.git"
99 | },
100 | "author": {
101 | "name": "Electron React Boilerplate Maintainers",
102 | "email": "electronreactboilerplate@gmail.com",
103 | "url": "https://electron-react-boilerplate.js.org"
104 | },
105 | "contributors": [
106 | {
107 | "name": "Amila Welihinda",
108 | "email": "amilajack@gmail.com",
109 | "url": "https://github.com/amilajack"
110 | },
111 | {
112 | "name": "John Tran",
113 | "email": "jptran318@gmail.com",
114 | "url": "https://github.com/jooohhn"
115 | }
116 | ],
117 | "license": "MIT",
118 | "bugs": {
119 | "url": "https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues"
120 | },
121 | "keywords": [
122 | "electron",
123 | "boilerplate",
124 | "react",
125 | "typescript",
126 | "ts",
127 | "sass",
128 | "webpack",
129 | "hot",
130 | "reload"
131 | ],
132 | "homepage": "https://github.com/electron-react-boilerplate/electron-react-boilerplate#readme",
133 | "jest": {
134 | "testURL": "http://localhost/",
135 | "testEnvironment": "jsdom",
136 | "transform": {
137 | "\\.(ts|tsx|js|jsx)$": "ts-jest"
138 | },
139 | "moduleNameMapper": {
140 | "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/.erb/mocks/fileMock.js",
141 | "\\.(css|less|sass|scss)$": "identity-obj-proxy"
142 | },
143 | "moduleFileExtensions": [
144 | "js",
145 | "jsx",
146 | "ts",
147 | "tsx",
148 | "json"
149 | ],
150 | "moduleDirectories": [
151 | "node_modules",
152 | "release/app/node_modules"
153 | ],
154 | "testPathIgnorePatterns": [
155 | "release/app/dist"
156 | ],
157 | "setupFiles": [
158 | "./.erb/scripts/check-build-exists.ts"
159 | ]
160 | },
161 | "devDependencies": {
162 | "@pmmmwh/react-refresh-webpack-plugin": "0.5.4",
163 | "@teamsupercell/typings-for-css-modules-loader": "^2.5.1",
164 | "@testing-library/jest-dom": "^5.16.1",
165 | "@testing-library/react": "^12.1.2",
166 | "@types/jest": "^27.0.3",
167 | "@types/node": "17.0.5",
168 | "@types/react": "^17.0.38",
169 | "@types/react-dom": "^17.0.11",
170 | "@types/react-test-renderer": "^17.0.1",
171 | "@types/sqlite3": "^3.1.8",
172 | "@types/terser-webpack-plugin": "^5.0.4",
173 | "@types/webpack-env": "^1.16.3",
174 | "@typescript-eslint/eslint-plugin": "^5.8.1",
175 | "browserslist-config-erb": "^0.0.3",
176 | "chalk": "^4.1.2",
177 | "concurrently": "^6.5.1",
178 | "core-js": "^3.20.1",
179 | "cross-env": "^7.0.3",
180 | "css-loader": "^6.5.1",
181 | "css-minimizer-webpack-plugin": "^3.3.1",
182 | "detect-port": "^1.3.0",
183 | "electron": "^16.0.5",
184 | "electron-builder": "^22.14.5",
185 | "electron-devtools-installer": "^3.2.0",
186 | "electron-notarize": "^1.1.1",
187 | "electron-rebuild": "^3.2.5",
188 | "eslint": "^8.5.0",
189 | "eslint-config-airbnb-base": "^15.0.0",
190 | "eslint-config-erb": "^4.0.3",
191 | "eslint-plugin-compat": "^4.0.0",
192 | "eslint-plugin-import": "^2.25.3",
193 | "eslint-plugin-jest": "^25.3.2",
194 | "eslint-plugin-jsx-a11y": "^6.5.1",
195 | "eslint-plugin-promise": "^6.0.0",
196 | "eslint-plugin-react": "^7.28.0",
197 | "eslint-plugin-react-hooks": "^4.3.0",
198 | "file-loader": "^6.2.0",
199 | "html-webpack-plugin": "^5.5.0",
200 | "husky": "^7.0.4",
201 | "identity-obj-proxy": "^3.0.0",
202 | "jest": "^27.4.5",
203 | "lint-staged": "^12.1.4",
204 | "mini-css-extract-plugin": "^2.4.5",
205 | "opencollective-postinstall": "^2.0.3",
206 | "prettier": "^2.5.1",
207 | "react-refresh": "^0.11.0",
208 | "react-refresh-typescript": "^2.0.3",
209 | "react-test-renderer": "^17.0.2",
210 | "rimraf": "^3.0.2",
211 | "sass": "^1.45.1",
212 | "sass-loader": "^12.4.0",
213 | "style-loader": "^3.3.1",
214 | "terser-webpack-plugin": "^5.3.0",
215 | "ts-jest": "^27.1.2",
216 | "ts-loader": "^9.2.6",
217 | "ts-node": "^10.4.0",
218 | "typescript": "^4.5.4",
219 | "url-loader": "^4.1.1",
220 | "webpack": "^5.65.0",
221 | "webpack-bundle-analyzer": "^4.5.0",
222 | "webpack-cli": "^4.9.1",
223 | "webpack-dev-server": "^4.7.1",
224 | "webpack-merge": "^5.8.0"
225 | },
226 | "dependencies": {
227 | "electron-debug": "^3.2.0",
228 | "electron-log": "^4.4.4",
229 | "electron-updater": "^4.6.4",
230 | "history": "5.x.x",
231 | "react": "^17.0.2",
232 | "react-dom": "^17.0.2",
233 | "react-router-dom": "^6.2.1",
234 | "regenerator-runtime": "^0.13.9"
235 | },
236 | "devEngines": {
237 | "node": ">=14.x",
238 | "npm": ">=7.x"
239 | },
240 | "collective": {
241 | "url": "https://opencollective.com/electron-react-boilerplate-594"
242 | },
243 | "browserslist": [],
244 | "prettier": {
245 | "overrides": [
246 | {
247 | "files": [
248 | ".prettierrc",
249 | ".eslintrc"
250 | ],
251 | "options": {
252 | "parser": "json"
253 | }
254 | }
255 | ],
256 | "singleQuote": true
257 | }
258 | }
259 |
--------------------------------------------------------------------------------
/src/main/menu.ts:
--------------------------------------------------------------------------------
1 | import {
2 | app,
3 | Menu,
4 | shell,
5 | BrowserWindow,
6 | MenuItemConstructorOptions,
7 | } from 'electron';
8 |
9 | interface DarwinMenuItemConstructorOptions extends MenuItemConstructorOptions {
10 | selector?: string;
11 | submenu?: DarwinMenuItemConstructorOptions[] | Menu;
12 | }
13 |
14 | export default class MenuBuilder {
15 | mainWindow: BrowserWindow;
16 |
17 | constructor(mainWindow: BrowserWindow) {
18 | this.mainWindow = mainWindow;
19 | }
20 |
21 | buildMenu(): Menu {
22 | if (
23 | process.env.NODE_ENV === 'development' ||
24 | process.env.DEBUG_PROD === 'true'
25 | ) {
26 | this.setupDevelopmentEnvironment();
27 | }
28 |
29 | const template =
30 | process.platform === 'darwin'
31 | ? this.buildDarwinTemplate()
32 | : this.buildDefaultTemplate();
33 |
34 | const menu = Menu.buildFromTemplate(template);
35 | Menu.setApplicationMenu(menu);
36 |
37 | return menu;
38 | }
39 |
40 | setupDevelopmentEnvironment(): void {
41 | this.mainWindow.webContents.on('context-menu', (_, props) => {
42 | const { x, y } = props;
43 |
44 | Menu.buildFromTemplate([
45 | {
46 | label: 'Inspect element',
47 | click: () => {
48 | this.mainWindow.webContents.inspectElement(x, y);
49 | },
50 | },
51 | ]).popup({ window: this.mainWindow });
52 | });
53 | }
54 |
55 | buildDarwinTemplate(): MenuItemConstructorOptions[] {
56 | const subMenuAbout: DarwinMenuItemConstructorOptions = {
57 | label: 'Electron',
58 | submenu: [
59 | {
60 | label: 'About ElectronReact',
61 | selector: 'orderFrontStandardAboutPanel:',
62 | },
63 | { type: 'separator' },
64 | { label: 'Services', submenu: [] },
65 | { type: 'separator' },
66 | {
67 | label: 'Hide ElectronReact',
68 | accelerator: 'Command+H',
69 | selector: 'hide:',
70 | },
71 | {
72 | label: 'Hide Others',
73 | accelerator: 'Command+Shift+H',
74 | selector: 'hideOtherApplications:',
75 | },
76 | { label: 'Show All', selector: 'unhideAllApplications:' },
77 | { type: 'separator' },
78 | {
79 | label: 'Quit',
80 | accelerator: 'Command+Q',
81 | click: () => {
82 | app.quit();
83 | },
84 | },
85 | ],
86 | };
87 | const subMenuEdit: DarwinMenuItemConstructorOptions = {
88 | label: 'Edit',
89 | submenu: [
90 | { label: 'Undo', accelerator: 'Command+Z', selector: 'undo:' },
91 | { label: 'Redo', accelerator: 'Shift+Command+Z', selector: 'redo:' },
92 | { type: 'separator' },
93 | { label: 'Cut', accelerator: 'Command+X', selector: 'cut:' },
94 | { label: 'Copy', accelerator: 'Command+C', selector: 'copy:' },
95 | { label: 'Paste', accelerator: 'Command+V', selector: 'paste:' },
96 | {
97 | label: 'Select All',
98 | accelerator: 'Command+A',
99 | selector: 'selectAll:',
100 | },
101 | ],
102 | };
103 | const subMenuViewDev: MenuItemConstructorOptions = {
104 | label: 'View',
105 | submenu: [
106 | {
107 | label: 'Reload',
108 | accelerator: 'Command+R',
109 | click: () => {
110 | this.mainWindow.webContents.reload();
111 | },
112 | },
113 | {
114 | label: 'Toggle Full Screen',
115 | accelerator: 'Ctrl+Command+F',
116 | click: () => {
117 | this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen());
118 | },
119 | },
120 | {
121 | label: 'Toggle Developer Tools',
122 | accelerator: 'Alt+Command+I',
123 | click: () => {
124 | this.mainWindow.webContents.toggleDevTools();
125 | },
126 | },
127 | ],
128 | };
129 | const subMenuViewProd: MenuItemConstructorOptions = {
130 | label: 'View',
131 | submenu: [
132 | {
133 | label: 'Toggle Full Screen',
134 | accelerator: 'Ctrl+Command+F',
135 | click: () => {
136 | this.mainWindow.setFullScreen(!this.mainWindow.isFullScreen());
137 | },
138 | },
139 | ],
140 | };
141 | const subMenuWindow: DarwinMenuItemConstructorOptions = {
142 | label: 'Window',
143 | submenu: [
144 | {
145 | label: 'Minimize',
146 | accelerator: 'Command+M',
147 | selector: 'performMiniaturize:',
148 | },
149 | { label: 'Close', accelerator: 'Command+W', selector: 'performClose:' },
150 | { type: 'separator' },
151 | { label: 'Bring All to Front', selector: 'arrangeInFront:' },
152 | ],
153 | };
154 | const subMenuHelp: MenuItemConstructorOptions = {
155 | label: 'Help',
156 | submenu: [
157 | {
158 | label: 'Learn More',
159 | click() {
160 | shell.openExternal('https://electronjs.org');
161 | },
162 | },
163 | {
164 | label: 'Documentation',
165 | click() {
166 | shell.openExternal(
167 | 'https://github.com/electron/electron/tree/main/docs#readme'
168 | );
169 | },
170 | },
171 | {
172 | label: 'Community Discussions',
173 | click() {
174 | shell.openExternal('https://www.electronjs.org/community');
175 | },
176 | },
177 | {
178 | label: 'Search Issues',
179 | click() {
180 | shell.openExternal('https://github.com/electron/electron/issues');
181 | },
182 | },
183 | ],
184 | };
185 |
186 | const subMenuView =
187 | process.env.NODE_ENV === 'development' ||
188 | process.env.DEBUG_PROD === 'true'
189 | ? subMenuViewDev
190 | : subMenuViewProd;
191 |
192 | return [subMenuAbout, subMenuEdit, subMenuView, subMenuWindow, subMenuHelp];
193 | }
194 |
195 | buildDefaultTemplate() {
196 | const templateDefault = [
197 | {
198 | label: '&File',
199 | submenu: [
200 | {
201 | label: '&Open',
202 | accelerator: 'Ctrl+O',
203 | },
204 | {
205 | label: '&Close',
206 | accelerator: 'Ctrl+W',
207 | click: () => {
208 | this.mainWindow.close();
209 | },
210 | },
211 | ],
212 | },
213 | {
214 | label: '&View',
215 | submenu:
216 | process.env.NODE_ENV === 'development' ||
217 | process.env.DEBUG_PROD === 'true'
218 | ? [
219 | {
220 | label: '&Reload',
221 | accelerator: 'Ctrl+R',
222 | click: () => {
223 | this.mainWindow.webContents.reload();
224 | },
225 | },
226 | {
227 | label: 'Toggle &Full Screen',
228 | accelerator: 'F11',
229 | click: () => {
230 | this.mainWindow.setFullScreen(
231 | !this.mainWindow.isFullScreen()
232 | );
233 | },
234 | },
235 | {
236 | label: 'Toggle &Developer Tools',
237 | accelerator: 'Alt+Ctrl+I',
238 | click: () => {
239 | this.mainWindow.webContents.toggleDevTools();
240 | },
241 | },
242 | ]
243 | : [
244 | {
245 | label: 'Toggle &Full Screen',
246 | accelerator: 'F11',
247 | click: () => {
248 | this.mainWindow.setFullScreen(
249 | !this.mainWindow.isFullScreen()
250 | );
251 | },
252 | },
253 | ],
254 | },
255 | {
256 | label: 'Help',
257 | submenu: [
258 | {
259 | label: 'Learn More',
260 | click() {
261 | shell.openExternal('https://electronjs.org');
262 | },
263 | },
264 | {
265 | label: 'Documentation',
266 | click() {
267 | shell.openExternal(
268 | 'https://github.com/electron/electron/tree/main/docs#readme'
269 | );
270 | },
271 | },
272 | {
273 | label: 'Community Discussions',
274 | click() {
275 | shell.openExternal('https://www.electronjs.org/community');
276 | },
277 | },
278 | {
279 | label: 'Search Issues',
280 | click() {
281 | shell.openExternal('https://github.com/electron/electron/issues');
282 | },
283 | },
284 | ],
285 | },
286 | ];
287 |
288 | return templateDefault;
289 | }
290 | }
291 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # 2.1.0
2 |
3 | - Migrate to `css-minifier-webpack-plugin`
4 |
5 | # 2.0.1
6 |
7 | ## Fixes
8 |
9 | - Fix broken css linking in production build
10 |
11 | # 2.0.0
12 |
13 | ## Breaking Changes
14 |
15 | - drop redux
16 | - remove counter example app
17 | - simplify directory structure
18 | - move `dll` dir to `.erb` dir
19 | - fix icon/font import paths
20 | - migrate to `react-refresh` from `react-hot-loader`
21 | - migrate to webpack@5
22 | - migrate to electron@11
23 | - remove e2e tests and testcafe integration
24 | - rename `app` dir to more conventional `src` dir
25 | - rename `resources` dir to `assets`
26 | - simplify npm scripts
27 | - drop stylelint
28 | - simplify styling of boilerplate app
29 | - remove `START_HOT` env variable
30 | - notarize support
31 | - landing page boilerplate
32 | - docs updates
33 | - restore removed debugging support
34 |
35 | # 1.4.0
36 |
37 | - Migrate to `eslint-config-erb@2`
38 | - Rename `dev` npm script to `start`
39 | - GitHub Actions: only publish GitHub releases when on master branch
40 |
41 | # 1.3.1
42 |
43 | - Fix sass building bug ([#2540](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2540))
44 | - Fix CI bug related to E2E tests and network timeouts
45 | - Move automated dependency PRs to `next` ([#2554](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2554))
46 | - Bump dependencies to patch semver
47 |
48 | # 1.3.0
49 |
50 | - Fixes E2E tests ([#2516](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2516))
51 | - Fixes preload entrypoint ([#2503](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2503))
52 | - Downgrade to `electron@8`
53 | - Bump dependencies to latest semver
54 |
55 | # 1.2.0
56 |
57 | - Migrate to redux toolkit
58 | - Lazy load routes with react suspense
59 | - Drop support for azure-pipelines and use only github actions
60 | - Bump all deps to latest semver
61 | - Remove `test-e2e` script from tests (blocked on release of https://github.com/DevExpress/testcafe-browser-provider-electron/pull/65)
62 | - Swap `typed-css-modules-webpack-plugin` for `typings-for-css-modules-loader`
63 | - Use latest version of `eslint-config-erb`
64 | - Remove unnecessary file extensions from ts exclude
65 | - Add experimental support for vscode debugging
66 | - Revert https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2365 as default for users, provide as opt in option
67 |
68 | # 1.1.0
69 |
70 | - Fix #2402
71 | - Simplify configs (https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2406)
72 |
73 | # 1.0.0
74 |
75 | - Migrate to TypeScript from Flow ([#2363](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2363))
76 | - Use browserslist for `@babel/preset-env` targets ([#2368](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2368))
77 | - Use preload script, disable `nodeIntegration` in renderer process for [improved security](https://www.electronjs.org/docs/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content) ([#2365](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2365))
78 | - Add support for azure pipelines ([#2369](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2369))
79 | - Disable sourcemaps in production
80 |
81 | # 0.18.1 (2019.12.12)
82 |
83 | - Fix HMR env bug ([#2343](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2343))
84 | - Bump all deps to latest semver
85 | - Bump to `electron@7`
86 |
87 | # 0.18.0 (2019.11.19)
88 |
89 | - Bump electron to `electron@6` (`electron@7` introduces breaking changes to testcafe end to end tests)
90 | - Revert back to [two `package.json` structure](https://www.electron.build/tutorials/two-package-structure)
91 | - Bump all deps to latest semver
92 |
93 | # 0.17.1 (2018.11.20)
94 |
95 | - Fix `yarn test-e2e` and testcafe for single package.json structure
96 | - Fixes incorrect path in `yarn start` script
97 | - Bumped deps
98 | - Bump g++ in travis
99 | - Change clone arguments to clone only master
100 | - Change babel config to target current electron version
101 |
102 | For full change list, see https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/2021
103 |
104 | # 0.17.0 (2018.10.30)
105 |
106 | - upgraded to `babel@7` (thanks to @vikr01 🎉🎉🎉)
107 | - migrated from [two `package.json` structure](https://www.electron.build/tutorials/two-package-structure) (thanks to @HyperSprite!)
108 | - initial auto update support (experimental)
109 | - migrate from greenkeeper to [renovate](https://renovatebot.com)
110 | - added issue template
111 | - use `babel-preset-env` to target current electron version
112 | - add [opencollective](https://opencollective.com/electron-react-boilerplate-594) banner message display in postinstall script (help support ERB 🙏)
113 | - fix failing ci issues
114 |
115 | # 0.16.0 (2018.10.3)
116 |
117 | - removed unused dependencies
118 | - migrate from `react-redux-router` to `connect-react-router`
119 | - move webpack configs to `./webpack` dir
120 | - use `g++` on travis when testing linux
121 | - migrate from `spectron` to `testcafe` for e2e tests
122 | - add linting support for config styles
123 | - changed stylelint config
124 | - temporarily disabled flow in appveyor to make ci pass
125 | - added necessary infra to publish releases from ci
126 |
127 | # 0.15.0 (2018.8.25)
128 |
129 | - Performance: cache webpack uglify results
130 | - Feature: add start minimized feature
131 | - Feature: lint and fix styles with prettier and stylelint
132 | - Feature: add greenkeeper support
133 |
134 | # 0.14.0 (2018.5.24)
135 |
136 | - Improved CI timings
137 | - Migrated README commands to yarn from npm
138 | - Improved vscode config
139 | - Updated all dependencies to latest semver
140 | - Fix `electron-rebuild` script bug
141 | - Migrated to `mini-css-extract-plugin` from `extract-text-plugin`
142 | - Added `optimize-css-assets-webpack-plugin`
143 | - Run `prettier` on json, css, scss, and more filetypes
144 |
145 | # 0.13.3 (2018.5.24)
146 |
147 | - Add git precommit hook, when git commit will use `prettier` to format git add code
148 | - Add format code function in `lint-fix` npm script which can use `prettier` to format project js code
149 |
150 | # 0.13.2 (2018.1.31)
151 |
152 | - Hot Module Reload (HMR) fixes
153 | - Bumped all dependencies to latest semver
154 | - Prevent error propagation of `CheckNativeDeps` script
155 |
156 | # 0.13.1 (2018.1.13)
157 |
158 | - Hot Module Reload (HMR) fixes
159 | - Bumped all dependencies to latest semver
160 | - Fixed electron-rebuild script
161 | - Fixed tests scripts to run on all platforms
162 | - Skip redux logs in console in test ENV
163 |
164 | # 0.13.0 (2018.1.6)
165 |
166 | #### Additions
167 |
168 | - Add native dependencies check on postinstall
169 | - Updated all dependencies to latest semver
170 |
171 | # 0.12.0 (2017.7.8)
172 |
173 | #### Misc
174 |
175 | - Removed `babel-polyfill`
176 | - Renamed and alphabetized npm scripts
177 |
178 | #### Breaking
179 |
180 | - Changed node dev `__dirname` and `__filename` to node built in fn's (https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/1035)
181 | - Renamed `src/bundle.js` to `src/renderer.prod.js` for consistency
182 | - Renamed `dll/vendor.js` to `dll/renderer.dev.dll.js` for consistency
183 |
184 | #### Additions
185 |
186 | - Enable node_modules cache on CI
187 |
188 | # 0.11.2 (2017.5.1)
189 |
190 | Yay! Another patch release. This release mostly includes refactorings and router bug fixes. Huge thanks to @anthonyraymond!
191 |
192 | ⚠️ Windows electron builds are failing because of [this issue](https://github.com/electron/electron/issues/9321). This is not an issue with the boilerplate ⚠️
193 |
194 | #### Breaking
195 |
196 | - **Renamed `./src/main.development.js` => `./src/main.{dev,prod}.js`:** [#963](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/963)
197 |
198 | #### Fixes
199 |
200 | - **Fixed reloading when not on `/` path:** [#958](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/958) [#949](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/949)
201 |
202 | #### Additions
203 |
204 | - **Added support for stylefmt:** [#960](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/960)
205 |
206 | # 0.11.1 (2017.4.23)
207 |
208 | You can now debug the production build with devtools like so:
209 |
210 | ```
211 | DEBUG_PROD=true npm run package
212 | ```
213 |
214 | 🎉🎉🎉
215 |
216 | #### Additions
217 |
218 | - **Added support for debugging production build:** [#fab245a](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/941/commits/fab245a077d02a09630f74270806c0c534a4ff95)
219 |
220 | #### Bug Fixes
221 |
222 | - **Fixed bug related to importing native dependencies:** [#933](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/933)
223 |
224 | #### Improvements
225 |
226 | - **Updated all deps to latest semver**
227 |
228 | # 0.11.0 (2017.4.19)
229 |
230 | Here's the most notable changes since `v0.10.0`. Its been about a year since a release has been pushed. Expect a new release to be published every 3-4 weeks.
231 |
232 | #### Breaking Changes
233 |
234 | - **Dropped support for node < 6**
235 | - **Refactored webpack config files**
236 | - **Migrate to two-package.json project structure**
237 | - **Updated all devDeps to latest semver**
238 | - **Migrated to Jest:** [#768](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/768)
239 | - **Migrated to `react-router@4`**
240 | - **Migrated to `electron-builder@4`**
241 | - **Migrated to `webpack@2`**
242 | - **Migrated to `react-hot-loader@3`**
243 | - **Changed default live reload server PORT to `1212` from `3000`**
244 |
245 | #### Additions
246 |
247 | - **Added support for Yarn:** [#451](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/451)
248 | - **Added support for Flow:** [#425](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/425)
249 | - **Added support for stylelint:** [#911](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/911)
250 | - **Added support for electron-builder:** [#876](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/876)
251 | - **Added optional support for SASS:** [#880](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/880)
252 | - **Added support for eslint-plugin-flowtype:** [#911](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/911)
253 | - **Added support for appveyor:** [#280](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/280)
254 | - **Added support for webpack dlls:** [#860](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/860)
255 | - **Route based code splitting:** [#884](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/884)
256 | - **Added support for Webpack Bundle Analyzer:** [#922](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/922)
257 |
258 | #### Improvements
259 |
260 | - **Parallelize renderer and main build processes when running `npm run build`**
261 | - **Dynamically generate electron app menu**
262 | - **Improved vscode integration:** [#856](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/856)
263 |
264 | #### Bug Fixes
265 |
266 | - **Fixed hot module replacement race condition bug:** [#917](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/917) [#920](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/920)
267 |
268 | # 0.10.0 (2016.4.18)
269 |
270 | #### Improvements
271 |
272 | - **Use Babel in main process with Webpack build:** [#201](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/201)
273 | - **Change targets to built-in support by webpack:** [#197](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/197)
274 | - **use es2015 syntax for webpack configs:** [#195](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/195)
275 | - **Open application when webcontent is loaded:** [#192](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/192)
276 | - **Upgraded dependencies**
277 |
278 | #### Bug fixed
279 |
280 | - **Fix `npm list electron-prebuilt` in package.js:** [#188](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/188)
281 |
282 | # 0.9.0 (2016.3.23)
283 |
284 | #### Improvements
285 |
286 | - **Added [redux-logger](https://github.com/fcomb/redux-logger)**
287 | - **Upgraded [react-router-redux](https://github.com/reactjs/react-router-redux) to v4**
288 | - **Upgraded dependencies**
289 | - **Added `npm run dev` command:** [#162](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/162)
290 | - **electron to v0.37.2**
291 |
292 | #### Breaking Changes
293 |
294 | - **css module as default:** [#154](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/154).
295 | - **set default NODE_ENV to production:** [#140](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/140)
296 |
297 | # 0.8.0 (2016.2.17)
298 |
299 | #### Bug fixed
300 |
301 | - **Fix lint errors**
302 | - **Fix Webpack publicPath for production builds**: [#119](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/119).
303 | - **package script now chooses correct OS icon extension**
304 |
305 | #### Improvements
306 |
307 | - **babel 6**
308 | - **Upgrade Dependencies**
309 | - **Enable CSS source maps**
310 | - **Add json-loader**: [#128](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/128).
311 | - **react-router 2.0 and react-router-redux 3.0**
312 |
313 | # 0.7.1 (2015.12.27)
314 |
315 | #### Bug fixed
316 |
317 | - **Fixed npm script on windows 10:** [#103](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/103).
318 | - **history and react-router version bump**: [#109](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/109), [#110](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/110).
319 |
320 | #### Improvements
321 |
322 | - **electron 0.36**
323 |
324 | # 0.7.0 (2015.12.16)
325 |
326 | #### Bug fixed
327 |
328 | - **Fixed process.env.NODE_ENV variable in webpack:** [#74](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/74).
329 | - **add missing object-assign**: [#76](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/76).
330 | - **packaging in npm@3:** [#77](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/77).
331 | - **compatibility in windows:** [#100](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/100).
332 | - **disable chrome debugger in production env:** [#102](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/102).
333 |
334 | #### Improvements
335 |
336 | - **redux**
337 | - **css-modules**
338 | - **upgrade to react-router 1.x**
339 | - **unit tests**
340 | - **e2e tests**
341 | - **travis-ci**
342 | - **upgrade to electron 0.35.x**
343 | - **use es2015**
344 | - **check dev engine for node and npm**
345 |
346 | # 0.6.5 (2015.11.7)
347 |
348 | #### Improvements
349 |
350 | - **Bump style-loader to 0.13**
351 | - **Bump css-loader to 0.22**
352 |
353 | # 0.6.4 (2015.10.27)
354 |
355 | #### Improvements
356 |
357 | - **Bump electron-debug to 0.3**
358 |
359 | # 0.6.3 (2015.10.26)
360 |
361 | #### Improvements
362 |
363 | - **Initialize ExtractTextPlugin once:** [#64](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/64).
364 |
365 | # 0.6.2 (2015.10.18)
366 |
367 | #### Bug fixed
368 |
369 | - **Babel plugins production env not be set properly:** [#57](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/57).
370 |
371 | # 0.6.1 (2015.10.17)
372 |
373 | #### Improvements
374 |
375 | - **Bump electron to v0.34.0**
376 |
377 | # 0.6.0 (2015.10.16)
378 |
379 | #### Breaking Changes
380 |
381 | - **From react-hot-loader to react-transform**
382 |
383 | # 0.5.2 (2015.10.15)
384 |
385 | #### Improvements
386 |
387 | - **Run tests with babel-register:** [#29](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/29).
388 |
389 | # 0.5.1 (2015.10.12)
390 |
391 | #### Bug fixed
392 |
393 | - **Fix #51:** use `path.join(__dirname` instead of `./`.
394 |
395 | # 0.5.0 (2015.10.11)
396 |
397 | #### Improvements
398 |
399 | - **Simplify webpack config** see [#50](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/50).
400 |
401 | #### Breaking Changes
402 |
403 | - **webpack configs**
404 | - **port changed:** changed default port from 2992 to 3000.
405 | - **npm scripts:** remove `start-dev` and `dev-server`. rename `hot-dev-server` to `hot-server`.
406 |
407 | # 0.4.3 (2015.9.22)
408 |
409 | #### Bug fixed
410 |
411 | - **Fix #45 zeromq crash:** bump version of `electron-prebuilt`.
412 |
413 | # 0.4.2 (2015.9.15)
414 |
415 | #### Bug fixed
416 |
417 | - **run start-hot breaks chrome refresh(CTRL+R) (#42)**: bump `electron-debug` to `0.2.1`
418 |
419 | # 0.4.1 (2015.9.11)
420 |
421 | #### Improvements
422 |
423 | - **use electron-prebuilt version for packaging (#33)**
424 |
425 | # 0.4.0 (2015.9.5)
426 |
427 | #### Improvements
428 |
429 | - **update dependencies**
430 |
431 | # 0.3.0 (2015.8.31)
432 |
433 | #### Improvements
434 |
435 | - **eslint-config-airbnb**
436 |
437 | # 0.2.10 (2015.8.27)
438 |
439 | #### Features
440 |
441 | - **custom placeholder icon**
442 |
443 | #### Improvements
444 |
445 | - **electron-renderer as target:** via [webpack-target-electron-renderer](https://github.com/chentsulin/webpack-target-electron-renderer)
446 |
447 | # 0.2.9 (2015.8.18)
448 |
449 | #### Bug fixed
450 |
451 | - **Fix hot-reload**
452 |
453 | # 0.2.8 (2015.8.13)
454 |
455 | #### Improvements
456 |
457 | - **bump electron-debug**
458 | - **babelrc**
459 | - **organize webpack scripts**
460 |
461 | # 0.2.7 (2015.7.9)
462 |
463 | #### Bug fixed
464 |
465 | - **defaultProps:** fix typos.
466 |
467 | # 0.2.6 (2015.7.3)
468 |
469 | #### Features
470 |
471 | - **menu**
472 |
473 | #### Bug fixed
474 |
475 | - **package.js:** include webpack build.
476 |
477 | # 0.2.5 (2015.7.1)
478 |
479 | #### Features
480 |
481 | - **NPM Script:** support multi-platform
482 | - **package:** `--all` option
483 |
484 | # 0.2.4 (2015.6.9)
485 |
486 | #### Bug fixed
487 |
488 | - **Eslint:** typo, [#17](https://github.com/electron-react-boilerplate/electron-react-boilerplate/issues/17) and improve `.eslintrc`
489 |
490 | # 0.2.3 (2015.6.3)
491 |
492 | #### Features
493 |
494 | - **Package Version:** use latest release electron version as default
495 | - **Ignore Large peerDependencies**
496 |
497 | #### Bug fixed
498 |
499 | - **Npm Script:** typo, [#6](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/6)
500 | - **Missing css:** [#7](https://github.com/electron-react-boilerplate/electron-react-boilerplate/pull/7)
501 |
502 | # 0.2.2 (2015.6.2)
503 |
504 | #### Features
505 |
506 | - **electron-debug**
507 |
508 | #### Bug fixed
509 |
510 | - **Webpack:** add `.json` and `.node` to extensions for imitating node require.
511 | - **Webpack:** set `node_modules` to externals for native module support.
512 |
513 | # 0.2.1 (2015.5.30)
514 |
515 | #### Bug fixed
516 |
517 | - **Webpack:** #1, change build target to `atom`.
518 |
519 | # 0.2.0 (2015.5.30)
520 |
521 | #### Features
522 |
523 | - **Ignore:** `test`, `tools`, `release` folder and devDependencies in `package.json`.
524 | - **Support asar**
525 | - **Support icon**
526 |
527 | # 0.1.0 (2015.5.27)
528 |
529 | #### Features
530 |
531 | - **Webpack:** babel, react-hot, ...
532 | - **Flux:** actions, api, components, containers, stores..
533 | - **Package:** darwin (osx), linux and win32 (windows) platform.
534 |
--------------------------------------------------------------------------------
/.erb/img/erb-banner.svg:
--------------------------------------------------------------------------------
1 |
33 |
--------------------------------------------------------------------------------
/release/app/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "electron-react-boilerplate",
3 | "version": "4.4.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "electron-react-boilerplate",
9 | "version": "4.4.0",
10 | "hasInstallScript": true,
11 | "license": "MIT",
12 | "dependencies": {
13 | "sqlite3": "^5.0.2"
14 | }
15 | },
16 | "node_modules/abbrev": {
17 | "version": "1.1.1",
18 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
19 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
20 | },
21 | "node_modules/ajv": {
22 | "version": "6.12.6",
23 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
24 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
25 | "optional": true,
26 | "dependencies": {
27 | "fast-deep-equal": "^3.1.1",
28 | "fast-json-stable-stringify": "^2.0.0",
29 | "json-schema-traverse": "^0.4.1",
30 | "uri-js": "^4.2.2"
31 | },
32 | "funding": {
33 | "type": "github",
34 | "url": "https://github.com/sponsors/epoberezkin"
35 | }
36 | },
37 | "node_modules/ansi-regex": {
38 | "version": "2.1.1",
39 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
40 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
41 | "engines": {
42 | "node": ">=0.10.0"
43 | }
44 | },
45 | "node_modules/aproba": {
46 | "version": "1.2.0",
47 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
48 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
49 | },
50 | "node_modules/are-we-there-yet": {
51 | "version": "1.1.7",
52 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
53 | "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
54 | "dependencies": {
55 | "delegates": "^1.0.0",
56 | "readable-stream": "^2.0.6"
57 | }
58 | },
59 | "node_modules/asn1": {
60 | "version": "0.2.6",
61 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
62 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
63 | "optional": true,
64 | "dependencies": {
65 | "safer-buffer": "~2.1.0"
66 | }
67 | },
68 | "node_modules/assert-plus": {
69 | "version": "1.0.0",
70 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
71 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
72 | "optional": true,
73 | "engines": {
74 | "node": ">=0.8"
75 | }
76 | },
77 | "node_modules/asynckit": {
78 | "version": "0.4.0",
79 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
80 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
81 | "optional": true
82 | },
83 | "node_modules/aws-sign2": {
84 | "version": "0.7.0",
85 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
86 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
87 | "optional": true,
88 | "engines": {
89 | "node": "*"
90 | }
91 | },
92 | "node_modules/aws4": {
93 | "version": "1.11.0",
94 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
95 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
96 | "optional": true
97 | },
98 | "node_modules/balanced-match": {
99 | "version": "1.0.2",
100 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
101 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
102 | },
103 | "node_modules/bcrypt-pbkdf": {
104 | "version": "1.0.2",
105 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
106 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
107 | "optional": true,
108 | "dependencies": {
109 | "tweetnacl": "^0.14.3"
110 | }
111 | },
112 | "node_modules/block-stream": {
113 | "version": "0.0.9",
114 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
115 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
116 | "optional": true,
117 | "dependencies": {
118 | "inherits": "~2.0.0"
119 | },
120 | "engines": {
121 | "node": "0.4 || >=0.5.8"
122 | }
123 | },
124 | "node_modules/brace-expansion": {
125 | "version": "1.1.11",
126 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
127 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
128 | "dependencies": {
129 | "balanced-match": "^1.0.0",
130 | "concat-map": "0.0.1"
131 | }
132 | },
133 | "node_modules/caseless": {
134 | "version": "0.12.0",
135 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
136 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
137 | "optional": true
138 | },
139 | "node_modules/chownr": {
140 | "version": "1.1.4",
141 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
142 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
143 | },
144 | "node_modules/code-point-at": {
145 | "version": "1.1.0",
146 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
147 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
148 | "engines": {
149 | "node": ">=0.10.0"
150 | }
151 | },
152 | "node_modules/combined-stream": {
153 | "version": "1.0.8",
154 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
155 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
156 | "optional": true,
157 | "dependencies": {
158 | "delayed-stream": "~1.0.0"
159 | },
160 | "engines": {
161 | "node": ">= 0.8"
162 | }
163 | },
164 | "node_modules/concat-map": {
165 | "version": "0.0.1",
166 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
167 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
168 | },
169 | "node_modules/console-control-strings": {
170 | "version": "1.1.0",
171 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
172 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
173 | },
174 | "node_modules/core-util-is": {
175 | "version": "1.0.3",
176 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
177 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
178 | },
179 | "node_modules/dashdash": {
180 | "version": "1.14.1",
181 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
182 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
183 | "optional": true,
184 | "dependencies": {
185 | "assert-plus": "^1.0.0"
186 | },
187 | "engines": {
188 | "node": ">=0.10"
189 | }
190 | },
191 | "node_modules/debug": {
192 | "version": "3.2.7",
193 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
194 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
195 | "dependencies": {
196 | "ms": "^2.1.1"
197 | }
198 | },
199 | "node_modules/deep-extend": {
200 | "version": "0.6.0",
201 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
202 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
203 | "engines": {
204 | "node": ">=4.0.0"
205 | }
206 | },
207 | "node_modules/delayed-stream": {
208 | "version": "1.0.0",
209 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
210 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
211 | "optional": true,
212 | "engines": {
213 | "node": ">=0.4.0"
214 | }
215 | },
216 | "node_modules/delegates": {
217 | "version": "1.0.0",
218 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
219 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
220 | },
221 | "node_modules/detect-libc": {
222 | "version": "1.0.3",
223 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
224 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
225 | "bin": {
226 | "detect-libc": "bin/detect-libc.js"
227 | },
228 | "engines": {
229 | "node": ">=0.10"
230 | }
231 | },
232 | "node_modules/ecc-jsbn": {
233 | "version": "0.1.2",
234 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
235 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
236 | "optional": true,
237 | "dependencies": {
238 | "jsbn": "~0.1.0",
239 | "safer-buffer": "^2.1.0"
240 | }
241 | },
242 | "node_modules/extend": {
243 | "version": "3.0.2",
244 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
245 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
246 | "optional": true
247 | },
248 | "node_modules/extsprintf": {
249 | "version": "1.3.0",
250 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
251 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
252 | "engines": [
253 | "node >=0.6.0"
254 | ],
255 | "optional": true
256 | },
257 | "node_modules/fast-deep-equal": {
258 | "version": "3.1.3",
259 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
260 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
261 | "optional": true
262 | },
263 | "node_modules/fast-json-stable-stringify": {
264 | "version": "2.1.0",
265 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
266 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
267 | "optional": true
268 | },
269 | "node_modules/forever-agent": {
270 | "version": "0.6.1",
271 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
272 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
273 | "optional": true,
274 | "engines": {
275 | "node": "*"
276 | }
277 | },
278 | "node_modules/form-data": {
279 | "version": "2.3.3",
280 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
281 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
282 | "optional": true,
283 | "dependencies": {
284 | "asynckit": "^0.4.0",
285 | "combined-stream": "^1.0.6",
286 | "mime-types": "^2.1.12"
287 | },
288 | "engines": {
289 | "node": ">= 0.12"
290 | }
291 | },
292 | "node_modules/fs-minipass": {
293 | "version": "1.2.7",
294 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
295 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
296 | "dependencies": {
297 | "minipass": "^2.6.0"
298 | }
299 | },
300 | "node_modules/fs.realpath": {
301 | "version": "1.0.0",
302 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
303 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
304 | },
305 | "node_modules/fstream": {
306 | "version": "1.0.12",
307 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
308 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
309 | "optional": true,
310 | "dependencies": {
311 | "graceful-fs": "^4.1.2",
312 | "inherits": "~2.0.0",
313 | "mkdirp": ">=0.5 0",
314 | "rimraf": "2"
315 | },
316 | "engines": {
317 | "node": ">=0.6"
318 | }
319 | },
320 | "node_modules/gauge": {
321 | "version": "2.7.4",
322 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
323 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
324 | "dependencies": {
325 | "aproba": "^1.0.3",
326 | "console-control-strings": "^1.0.0",
327 | "has-unicode": "^2.0.0",
328 | "object-assign": "^4.1.0",
329 | "signal-exit": "^3.0.0",
330 | "string-width": "^1.0.1",
331 | "strip-ansi": "^3.0.1",
332 | "wide-align": "^1.1.0"
333 | }
334 | },
335 | "node_modules/getpass": {
336 | "version": "0.1.7",
337 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
338 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
339 | "optional": true,
340 | "dependencies": {
341 | "assert-plus": "^1.0.0"
342 | }
343 | },
344 | "node_modules/glob": {
345 | "version": "7.2.0",
346 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
347 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
348 | "dependencies": {
349 | "fs.realpath": "^1.0.0",
350 | "inflight": "^1.0.4",
351 | "inherits": "2",
352 | "minimatch": "^3.0.4",
353 | "once": "^1.3.0",
354 | "path-is-absolute": "^1.0.0"
355 | },
356 | "engines": {
357 | "node": "*"
358 | },
359 | "funding": {
360 | "url": "https://github.com/sponsors/isaacs"
361 | }
362 | },
363 | "node_modules/graceful-fs": {
364 | "version": "4.2.8",
365 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
366 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
367 | "optional": true
368 | },
369 | "node_modules/har-schema": {
370 | "version": "2.0.0",
371 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
372 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
373 | "optional": true,
374 | "engines": {
375 | "node": ">=4"
376 | }
377 | },
378 | "node_modules/har-validator": {
379 | "version": "5.1.5",
380 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
381 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
382 | "deprecated": "this library is no longer supported",
383 | "optional": true,
384 | "dependencies": {
385 | "ajv": "^6.12.3",
386 | "har-schema": "^2.0.0"
387 | },
388 | "engines": {
389 | "node": ">=6"
390 | }
391 | },
392 | "node_modules/has-unicode": {
393 | "version": "2.0.1",
394 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
395 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
396 | },
397 | "node_modules/http-signature": {
398 | "version": "1.2.0",
399 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
400 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
401 | "optional": true,
402 | "dependencies": {
403 | "assert-plus": "^1.0.0",
404 | "jsprim": "^1.2.2",
405 | "sshpk": "^1.7.0"
406 | },
407 | "engines": {
408 | "node": ">=0.8",
409 | "npm": ">=1.3.7"
410 | }
411 | },
412 | "node_modules/iconv-lite": {
413 | "version": "0.4.24",
414 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
415 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
416 | "dependencies": {
417 | "safer-buffer": ">= 2.1.2 < 3"
418 | },
419 | "engines": {
420 | "node": ">=0.10.0"
421 | }
422 | },
423 | "node_modules/ignore-walk": {
424 | "version": "3.0.4",
425 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
426 | "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
427 | "dependencies": {
428 | "minimatch": "^3.0.4"
429 | }
430 | },
431 | "node_modules/inflight": {
432 | "version": "1.0.6",
433 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
434 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
435 | "dependencies": {
436 | "once": "^1.3.0",
437 | "wrappy": "1"
438 | }
439 | },
440 | "node_modules/inherits": {
441 | "version": "2.0.4",
442 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
443 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
444 | },
445 | "node_modules/ini": {
446 | "version": "1.3.8",
447 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
448 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
449 | },
450 | "node_modules/is-fullwidth-code-point": {
451 | "version": "1.0.0",
452 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
453 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
454 | "dependencies": {
455 | "number-is-nan": "^1.0.0"
456 | },
457 | "engines": {
458 | "node": ">=0.10.0"
459 | }
460 | },
461 | "node_modules/is-typedarray": {
462 | "version": "1.0.0",
463 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
464 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
465 | "optional": true
466 | },
467 | "node_modules/isarray": {
468 | "version": "1.0.0",
469 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
470 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
471 | },
472 | "node_modules/isexe": {
473 | "version": "2.0.0",
474 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
475 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
476 | "optional": true
477 | },
478 | "node_modules/isstream": {
479 | "version": "0.1.2",
480 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
481 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
482 | "optional": true
483 | },
484 | "node_modules/jsbn": {
485 | "version": "0.1.1",
486 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
487 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
488 | "optional": true
489 | },
490 | "node_modules/json-schema": {
491 | "version": "0.4.0",
492 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
493 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
494 | "optional": true
495 | },
496 | "node_modules/json-schema-traverse": {
497 | "version": "0.4.1",
498 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
499 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
500 | "optional": true
501 | },
502 | "node_modules/json-stringify-safe": {
503 | "version": "5.0.1",
504 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
505 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
506 | "optional": true
507 | },
508 | "node_modules/jsprim": {
509 | "version": "1.4.2",
510 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
511 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
512 | "optional": true,
513 | "dependencies": {
514 | "assert-plus": "1.0.0",
515 | "extsprintf": "1.3.0",
516 | "json-schema": "0.4.0",
517 | "verror": "1.10.0"
518 | },
519 | "engines": {
520 | "node": ">=0.6.0"
521 | }
522 | },
523 | "node_modules/mime-db": {
524 | "version": "1.51.0",
525 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
526 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
527 | "optional": true,
528 | "engines": {
529 | "node": ">= 0.6"
530 | }
531 | },
532 | "node_modules/mime-types": {
533 | "version": "2.1.34",
534 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
535 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
536 | "optional": true,
537 | "dependencies": {
538 | "mime-db": "1.51.0"
539 | },
540 | "engines": {
541 | "node": ">= 0.6"
542 | }
543 | },
544 | "node_modules/minimatch": {
545 | "version": "3.0.4",
546 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
547 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
548 | "dependencies": {
549 | "brace-expansion": "^1.1.7"
550 | },
551 | "engines": {
552 | "node": "*"
553 | }
554 | },
555 | "node_modules/minimist": {
556 | "version": "1.2.5",
557 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
558 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
559 | },
560 | "node_modules/minipass": {
561 | "version": "2.9.0",
562 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
563 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
564 | "dependencies": {
565 | "safe-buffer": "^5.1.2",
566 | "yallist": "^3.0.0"
567 | }
568 | },
569 | "node_modules/minizlib": {
570 | "version": "1.3.3",
571 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
572 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
573 | "dependencies": {
574 | "minipass": "^2.9.0"
575 | }
576 | },
577 | "node_modules/mkdirp": {
578 | "version": "0.5.5",
579 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
580 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
581 | "dependencies": {
582 | "minimist": "^1.2.5"
583 | },
584 | "bin": {
585 | "mkdirp": "bin/cmd.js"
586 | }
587 | },
588 | "node_modules/ms": {
589 | "version": "2.1.3",
590 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
591 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
592 | },
593 | "node_modules/needle": {
594 | "version": "2.9.1",
595 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
596 | "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
597 | "dependencies": {
598 | "debug": "^3.2.6",
599 | "iconv-lite": "^0.4.4",
600 | "sax": "^1.2.4"
601 | },
602 | "bin": {
603 | "needle": "bin/needle"
604 | },
605 | "engines": {
606 | "node": ">= 4.4.x"
607 | }
608 | },
609 | "node_modules/node-addon-api": {
610 | "version": "3.2.1",
611 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
612 | "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="
613 | },
614 | "node_modules/node-gyp": {
615 | "version": "3.8.0",
616 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
617 | "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
618 | "optional": true,
619 | "dependencies": {
620 | "fstream": "^1.0.0",
621 | "glob": "^7.0.3",
622 | "graceful-fs": "^4.1.2",
623 | "mkdirp": "^0.5.0",
624 | "nopt": "2 || 3",
625 | "npmlog": "0 || 1 || 2 || 3 || 4",
626 | "osenv": "0",
627 | "request": "^2.87.0",
628 | "rimraf": "2",
629 | "semver": "~5.3.0",
630 | "tar": "^2.0.0",
631 | "which": "1"
632 | },
633 | "bin": {
634 | "node-gyp": "bin/node-gyp.js"
635 | },
636 | "engines": {
637 | "node": ">= 0.8.0"
638 | }
639 | },
640 | "node_modules/node-pre-gyp": {
641 | "version": "0.11.0",
642 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
643 | "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
644 | "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future",
645 | "dependencies": {
646 | "detect-libc": "^1.0.2",
647 | "mkdirp": "^0.5.1",
648 | "needle": "^2.2.1",
649 | "nopt": "^4.0.1",
650 | "npm-packlist": "^1.1.6",
651 | "npmlog": "^4.0.2",
652 | "rc": "^1.2.7",
653 | "rimraf": "^2.6.1",
654 | "semver": "^5.3.0",
655 | "tar": "^4"
656 | },
657 | "bin": {
658 | "node-pre-gyp": "bin/node-pre-gyp"
659 | }
660 | },
661 | "node_modules/node-pre-gyp/node_modules/nopt": {
662 | "version": "4.0.3",
663 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
664 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
665 | "dependencies": {
666 | "abbrev": "1",
667 | "osenv": "^0.1.4"
668 | },
669 | "bin": {
670 | "nopt": "bin/nopt.js"
671 | }
672 | },
673 | "node_modules/node-pre-gyp/node_modules/safe-buffer": {
674 | "version": "5.2.1",
675 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
676 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
677 | "funding": [
678 | {
679 | "type": "github",
680 | "url": "https://github.com/sponsors/feross"
681 | },
682 | {
683 | "type": "patreon",
684 | "url": "https://www.patreon.com/feross"
685 | },
686 | {
687 | "type": "consulting",
688 | "url": "https://feross.org/support"
689 | }
690 | ]
691 | },
692 | "node_modules/node-pre-gyp/node_modules/tar": {
693 | "version": "4.4.19",
694 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz",
695 | "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==",
696 | "dependencies": {
697 | "chownr": "^1.1.4",
698 | "fs-minipass": "^1.2.7",
699 | "minipass": "^2.9.0",
700 | "minizlib": "^1.3.3",
701 | "mkdirp": "^0.5.5",
702 | "safe-buffer": "^5.2.1",
703 | "yallist": "^3.1.1"
704 | },
705 | "engines": {
706 | "node": ">=4.5"
707 | }
708 | },
709 | "node_modules/nopt": {
710 | "version": "3.0.6",
711 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
712 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
713 | "optional": true,
714 | "dependencies": {
715 | "abbrev": "1"
716 | },
717 | "bin": {
718 | "nopt": "bin/nopt.js"
719 | }
720 | },
721 | "node_modules/npm-bundled": {
722 | "version": "1.1.2",
723 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
724 | "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
725 | "dependencies": {
726 | "npm-normalize-package-bin": "^1.0.1"
727 | }
728 | },
729 | "node_modules/npm-normalize-package-bin": {
730 | "version": "1.0.1",
731 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
732 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
733 | },
734 | "node_modules/npm-packlist": {
735 | "version": "1.4.8",
736 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
737 | "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
738 | "dependencies": {
739 | "ignore-walk": "^3.0.1",
740 | "npm-bundled": "^1.0.1",
741 | "npm-normalize-package-bin": "^1.0.1"
742 | }
743 | },
744 | "node_modules/npmlog": {
745 | "version": "4.1.2",
746 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
747 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
748 | "dependencies": {
749 | "are-we-there-yet": "~1.1.2",
750 | "console-control-strings": "~1.1.0",
751 | "gauge": "~2.7.3",
752 | "set-blocking": "~2.0.0"
753 | }
754 | },
755 | "node_modules/number-is-nan": {
756 | "version": "1.0.1",
757 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
758 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
759 | "engines": {
760 | "node": ">=0.10.0"
761 | }
762 | },
763 | "node_modules/oauth-sign": {
764 | "version": "0.9.0",
765 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
766 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
767 | "optional": true,
768 | "engines": {
769 | "node": "*"
770 | }
771 | },
772 | "node_modules/object-assign": {
773 | "version": "4.1.1",
774 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
775 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
776 | "engines": {
777 | "node": ">=0.10.0"
778 | }
779 | },
780 | "node_modules/once": {
781 | "version": "1.4.0",
782 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
783 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
784 | "dependencies": {
785 | "wrappy": "1"
786 | }
787 | },
788 | "node_modules/os-homedir": {
789 | "version": "1.0.2",
790 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
791 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
792 | "engines": {
793 | "node": ">=0.10.0"
794 | }
795 | },
796 | "node_modules/os-tmpdir": {
797 | "version": "1.0.2",
798 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
799 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
800 | "engines": {
801 | "node": ">=0.10.0"
802 | }
803 | },
804 | "node_modules/osenv": {
805 | "version": "0.1.5",
806 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
807 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
808 | "dependencies": {
809 | "os-homedir": "^1.0.0",
810 | "os-tmpdir": "^1.0.0"
811 | }
812 | },
813 | "node_modules/path-is-absolute": {
814 | "version": "1.0.1",
815 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
816 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
817 | "engines": {
818 | "node": ">=0.10.0"
819 | }
820 | },
821 | "node_modules/performance-now": {
822 | "version": "2.1.0",
823 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
824 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
825 | "optional": true
826 | },
827 | "node_modules/process-nextick-args": {
828 | "version": "2.0.1",
829 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
830 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
831 | },
832 | "node_modules/psl": {
833 | "version": "1.8.0",
834 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
835 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
836 | "optional": true
837 | },
838 | "node_modules/punycode": {
839 | "version": "2.1.1",
840 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
841 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
842 | "optional": true,
843 | "engines": {
844 | "node": ">=6"
845 | }
846 | },
847 | "node_modules/qs": {
848 | "version": "6.5.2",
849 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
850 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
851 | "optional": true,
852 | "engines": {
853 | "node": ">=0.6"
854 | }
855 | },
856 | "node_modules/rc": {
857 | "version": "1.2.8",
858 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
859 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
860 | "dependencies": {
861 | "deep-extend": "^0.6.0",
862 | "ini": "~1.3.0",
863 | "minimist": "^1.2.0",
864 | "strip-json-comments": "~2.0.1"
865 | },
866 | "bin": {
867 | "rc": "cli.js"
868 | }
869 | },
870 | "node_modules/readable-stream": {
871 | "version": "2.3.7",
872 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
873 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
874 | "dependencies": {
875 | "core-util-is": "~1.0.0",
876 | "inherits": "~2.0.3",
877 | "isarray": "~1.0.0",
878 | "process-nextick-args": "~2.0.0",
879 | "safe-buffer": "~5.1.1",
880 | "string_decoder": "~1.1.1",
881 | "util-deprecate": "~1.0.1"
882 | }
883 | },
884 | "node_modules/request": {
885 | "version": "2.88.2",
886 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
887 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
888 | "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
889 | "optional": true,
890 | "dependencies": {
891 | "aws-sign2": "~0.7.0",
892 | "aws4": "^1.8.0",
893 | "caseless": "~0.12.0",
894 | "combined-stream": "~1.0.6",
895 | "extend": "~3.0.2",
896 | "forever-agent": "~0.6.1",
897 | "form-data": "~2.3.2",
898 | "har-validator": "~5.1.3",
899 | "http-signature": "~1.2.0",
900 | "is-typedarray": "~1.0.0",
901 | "isstream": "~0.1.2",
902 | "json-stringify-safe": "~5.0.1",
903 | "mime-types": "~2.1.19",
904 | "oauth-sign": "~0.9.0",
905 | "performance-now": "^2.1.0",
906 | "qs": "~6.5.2",
907 | "safe-buffer": "^5.1.2",
908 | "tough-cookie": "~2.5.0",
909 | "tunnel-agent": "^0.6.0",
910 | "uuid": "^3.3.2"
911 | },
912 | "engines": {
913 | "node": ">= 6"
914 | }
915 | },
916 | "node_modules/rimraf": {
917 | "version": "2.7.1",
918 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
919 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
920 | "dependencies": {
921 | "glob": "^7.1.3"
922 | },
923 | "bin": {
924 | "rimraf": "bin.js"
925 | }
926 | },
927 | "node_modules/safe-buffer": {
928 | "version": "5.1.2",
929 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
930 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
931 | },
932 | "node_modules/safer-buffer": {
933 | "version": "2.1.2",
934 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
935 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
936 | },
937 | "node_modules/sax": {
938 | "version": "1.2.4",
939 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
940 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
941 | },
942 | "node_modules/semver": {
943 | "version": "5.3.0",
944 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
945 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
946 | "bin": {
947 | "semver": "bin/semver"
948 | }
949 | },
950 | "node_modules/set-blocking": {
951 | "version": "2.0.0",
952 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
953 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
954 | },
955 | "node_modules/signal-exit": {
956 | "version": "3.0.6",
957 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
958 | "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ=="
959 | },
960 | "node_modules/sqlite3": {
961 | "version": "5.0.2",
962 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.2.tgz",
963 | "integrity": "sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA==",
964 | "hasInstallScript": true,
965 | "dependencies": {
966 | "node-addon-api": "^3.0.0",
967 | "node-pre-gyp": "^0.11.0"
968 | },
969 | "optionalDependencies": {
970 | "node-gyp": "3.x"
971 | },
972 | "peerDependencies": {
973 | "node-gyp": "3.x"
974 | },
975 | "peerDependenciesMeta": {
976 | "node-gyp": {
977 | "optional": true
978 | }
979 | }
980 | },
981 | "node_modules/sshpk": {
982 | "version": "1.16.1",
983 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
984 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
985 | "optional": true,
986 | "dependencies": {
987 | "asn1": "~0.2.3",
988 | "assert-plus": "^1.0.0",
989 | "bcrypt-pbkdf": "^1.0.0",
990 | "dashdash": "^1.12.0",
991 | "ecc-jsbn": "~0.1.1",
992 | "getpass": "^0.1.1",
993 | "jsbn": "~0.1.0",
994 | "safer-buffer": "^2.0.2",
995 | "tweetnacl": "~0.14.0"
996 | },
997 | "bin": {
998 | "sshpk-conv": "bin/sshpk-conv",
999 | "sshpk-sign": "bin/sshpk-sign",
1000 | "sshpk-verify": "bin/sshpk-verify"
1001 | },
1002 | "engines": {
1003 | "node": ">=0.10.0"
1004 | }
1005 | },
1006 | "node_modules/string_decoder": {
1007 | "version": "1.1.1",
1008 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1009 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1010 | "dependencies": {
1011 | "safe-buffer": "~5.1.0"
1012 | }
1013 | },
1014 | "node_modules/string-width": {
1015 | "version": "1.0.2",
1016 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1017 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1018 | "dependencies": {
1019 | "code-point-at": "^1.0.0",
1020 | "is-fullwidth-code-point": "^1.0.0",
1021 | "strip-ansi": "^3.0.0"
1022 | },
1023 | "engines": {
1024 | "node": ">=0.10.0"
1025 | }
1026 | },
1027 | "node_modules/strip-ansi": {
1028 | "version": "3.0.1",
1029 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1030 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1031 | "dependencies": {
1032 | "ansi-regex": "^2.0.0"
1033 | },
1034 | "engines": {
1035 | "node": ">=0.10.0"
1036 | }
1037 | },
1038 | "node_modules/strip-json-comments": {
1039 | "version": "2.0.1",
1040 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1041 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1042 | "engines": {
1043 | "node": ">=0.10.0"
1044 | }
1045 | },
1046 | "node_modules/tar": {
1047 | "version": "2.2.2",
1048 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
1049 | "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
1050 | "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.",
1051 | "optional": true,
1052 | "dependencies": {
1053 | "block-stream": "*",
1054 | "fstream": "^1.0.12",
1055 | "inherits": "2"
1056 | }
1057 | },
1058 | "node_modules/tough-cookie": {
1059 | "version": "2.5.0",
1060 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1061 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1062 | "optional": true,
1063 | "dependencies": {
1064 | "psl": "^1.1.28",
1065 | "punycode": "^2.1.1"
1066 | },
1067 | "engines": {
1068 | "node": ">=0.8"
1069 | }
1070 | },
1071 | "node_modules/tunnel-agent": {
1072 | "version": "0.6.0",
1073 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1074 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1075 | "optional": true,
1076 | "dependencies": {
1077 | "safe-buffer": "^5.0.1"
1078 | },
1079 | "engines": {
1080 | "node": "*"
1081 | }
1082 | },
1083 | "node_modules/tweetnacl": {
1084 | "version": "0.14.5",
1085 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1086 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
1087 | "optional": true
1088 | },
1089 | "node_modules/uri-js": {
1090 | "version": "4.4.1",
1091 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1092 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1093 | "optional": true,
1094 | "dependencies": {
1095 | "punycode": "^2.1.0"
1096 | }
1097 | },
1098 | "node_modules/util-deprecate": {
1099 | "version": "1.0.2",
1100 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1101 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1102 | },
1103 | "node_modules/uuid": {
1104 | "version": "3.4.0",
1105 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1106 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
1107 | "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
1108 | "optional": true,
1109 | "bin": {
1110 | "uuid": "bin/uuid"
1111 | }
1112 | },
1113 | "node_modules/verror": {
1114 | "version": "1.10.0",
1115 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1116 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1117 | "engines": [
1118 | "node >=0.6.0"
1119 | ],
1120 | "optional": true,
1121 | "dependencies": {
1122 | "assert-plus": "^1.0.0",
1123 | "core-util-is": "1.0.2",
1124 | "extsprintf": "^1.2.0"
1125 | }
1126 | },
1127 | "node_modules/verror/node_modules/core-util-is": {
1128 | "version": "1.0.2",
1129 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1130 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
1131 | "optional": true
1132 | },
1133 | "node_modules/which": {
1134 | "version": "1.3.1",
1135 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1136 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1137 | "optional": true,
1138 | "dependencies": {
1139 | "isexe": "^2.0.0"
1140 | },
1141 | "bin": {
1142 | "which": "bin/which"
1143 | }
1144 | },
1145 | "node_modules/wide-align": {
1146 | "version": "1.1.5",
1147 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
1148 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
1149 | "dependencies": {
1150 | "string-width": "^1.0.2 || 2 || 3 || 4"
1151 | }
1152 | },
1153 | "node_modules/wrappy": {
1154 | "version": "1.0.2",
1155 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1156 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1157 | },
1158 | "node_modules/yallist": {
1159 | "version": "3.1.1",
1160 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
1161 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
1162 | }
1163 | },
1164 | "dependencies": {
1165 | "abbrev": {
1166 | "version": "1.1.1",
1167 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
1168 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
1169 | },
1170 | "ajv": {
1171 | "version": "6.12.6",
1172 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1173 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1174 | "optional": true,
1175 | "requires": {
1176 | "fast-deep-equal": "^3.1.1",
1177 | "fast-json-stable-stringify": "^2.0.0",
1178 | "json-schema-traverse": "^0.4.1",
1179 | "uri-js": "^4.2.2"
1180 | }
1181 | },
1182 | "ansi-regex": {
1183 | "version": "2.1.1",
1184 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1185 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
1186 | },
1187 | "aproba": {
1188 | "version": "1.2.0",
1189 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
1190 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
1191 | },
1192 | "are-we-there-yet": {
1193 | "version": "1.1.7",
1194 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
1195 | "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
1196 | "requires": {
1197 | "delegates": "^1.0.0",
1198 | "readable-stream": "^2.0.6"
1199 | }
1200 | },
1201 | "asn1": {
1202 | "version": "0.2.6",
1203 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
1204 | "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
1205 | "optional": true,
1206 | "requires": {
1207 | "safer-buffer": "~2.1.0"
1208 | }
1209 | },
1210 | "assert-plus": {
1211 | "version": "1.0.0",
1212 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
1213 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
1214 | "optional": true
1215 | },
1216 | "asynckit": {
1217 | "version": "0.4.0",
1218 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1219 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
1220 | "optional": true
1221 | },
1222 | "aws-sign2": {
1223 | "version": "0.7.0",
1224 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
1225 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
1226 | "optional": true
1227 | },
1228 | "aws4": {
1229 | "version": "1.11.0",
1230 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
1231 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
1232 | "optional": true
1233 | },
1234 | "balanced-match": {
1235 | "version": "1.0.2",
1236 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1237 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
1238 | },
1239 | "bcrypt-pbkdf": {
1240 | "version": "1.0.2",
1241 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
1242 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
1243 | "optional": true,
1244 | "requires": {
1245 | "tweetnacl": "^0.14.3"
1246 | }
1247 | },
1248 | "block-stream": {
1249 | "version": "0.0.9",
1250 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
1251 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
1252 | "optional": true,
1253 | "requires": {
1254 | "inherits": "~2.0.0"
1255 | }
1256 | },
1257 | "brace-expansion": {
1258 | "version": "1.1.11",
1259 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1260 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1261 | "requires": {
1262 | "balanced-match": "^1.0.0",
1263 | "concat-map": "0.0.1"
1264 | }
1265 | },
1266 | "caseless": {
1267 | "version": "0.12.0",
1268 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
1269 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
1270 | "optional": true
1271 | },
1272 | "chownr": {
1273 | "version": "1.1.4",
1274 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
1275 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
1276 | },
1277 | "code-point-at": {
1278 | "version": "1.1.0",
1279 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
1280 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
1281 | },
1282 | "combined-stream": {
1283 | "version": "1.0.8",
1284 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1285 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1286 | "optional": true,
1287 | "requires": {
1288 | "delayed-stream": "~1.0.0"
1289 | }
1290 | },
1291 | "concat-map": {
1292 | "version": "0.0.1",
1293 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1294 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
1295 | },
1296 | "console-control-strings": {
1297 | "version": "1.1.0",
1298 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
1299 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
1300 | },
1301 | "core-util-is": {
1302 | "version": "1.0.3",
1303 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
1304 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
1305 | },
1306 | "dashdash": {
1307 | "version": "1.14.1",
1308 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
1309 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
1310 | "optional": true,
1311 | "requires": {
1312 | "assert-plus": "^1.0.0"
1313 | }
1314 | },
1315 | "debug": {
1316 | "version": "3.2.7",
1317 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
1318 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
1319 | "requires": {
1320 | "ms": "^2.1.1"
1321 | }
1322 | },
1323 | "deep-extend": {
1324 | "version": "0.6.0",
1325 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
1326 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
1327 | },
1328 | "delayed-stream": {
1329 | "version": "1.0.0",
1330 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1331 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
1332 | "optional": true
1333 | },
1334 | "delegates": {
1335 | "version": "1.0.0",
1336 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
1337 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
1338 | },
1339 | "detect-libc": {
1340 | "version": "1.0.3",
1341 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
1342 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
1343 | },
1344 | "ecc-jsbn": {
1345 | "version": "0.1.2",
1346 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
1347 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
1348 | "optional": true,
1349 | "requires": {
1350 | "jsbn": "~0.1.0",
1351 | "safer-buffer": "^2.1.0"
1352 | }
1353 | },
1354 | "extend": {
1355 | "version": "3.0.2",
1356 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1357 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
1358 | "optional": true
1359 | },
1360 | "extsprintf": {
1361 | "version": "1.3.0",
1362 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
1363 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
1364 | "optional": true
1365 | },
1366 | "fast-deep-equal": {
1367 | "version": "3.1.3",
1368 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1369 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1370 | "optional": true
1371 | },
1372 | "fast-json-stable-stringify": {
1373 | "version": "2.1.0",
1374 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1375 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1376 | "optional": true
1377 | },
1378 | "forever-agent": {
1379 | "version": "0.6.1",
1380 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
1381 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
1382 | "optional": true
1383 | },
1384 | "form-data": {
1385 | "version": "2.3.3",
1386 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
1387 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
1388 | "optional": true,
1389 | "requires": {
1390 | "asynckit": "^0.4.0",
1391 | "combined-stream": "^1.0.6",
1392 | "mime-types": "^2.1.12"
1393 | }
1394 | },
1395 | "fs-minipass": {
1396 | "version": "1.2.7",
1397 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
1398 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==",
1399 | "requires": {
1400 | "minipass": "^2.6.0"
1401 | }
1402 | },
1403 | "fs.realpath": {
1404 | "version": "1.0.0",
1405 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1406 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
1407 | },
1408 | "fstream": {
1409 | "version": "1.0.12",
1410 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
1411 | "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
1412 | "optional": true,
1413 | "requires": {
1414 | "graceful-fs": "^4.1.2",
1415 | "inherits": "~2.0.0",
1416 | "mkdirp": ">=0.5 0",
1417 | "rimraf": "2"
1418 | }
1419 | },
1420 | "gauge": {
1421 | "version": "2.7.4",
1422 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
1423 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
1424 | "requires": {
1425 | "aproba": "^1.0.3",
1426 | "console-control-strings": "^1.0.0",
1427 | "has-unicode": "^2.0.0",
1428 | "object-assign": "^4.1.0",
1429 | "signal-exit": "^3.0.0",
1430 | "string-width": "^1.0.1",
1431 | "strip-ansi": "^3.0.1",
1432 | "wide-align": "^1.1.0"
1433 | }
1434 | },
1435 | "getpass": {
1436 | "version": "0.1.7",
1437 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
1438 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
1439 | "optional": true,
1440 | "requires": {
1441 | "assert-plus": "^1.0.0"
1442 | }
1443 | },
1444 | "glob": {
1445 | "version": "7.2.0",
1446 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
1447 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
1448 | "requires": {
1449 | "fs.realpath": "^1.0.0",
1450 | "inflight": "^1.0.4",
1451 | "inherits": "2",
1452 | "minimatch": "^3.0.4",
1453 | "once": "^1.3.0",
1454 | "path-is-absolute": "^1.0.0"
1455 | }
1456 | },
1457 | "graceful-fs": {
1458 | "version": "4.2.8",
1459 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
1460 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
1461 | "optional": true
1462 | },
1463 | "har-schema": {
1464 | "version": "2.0.0",
1465 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
1466 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
1467 | "optional": true
1468 | },
1469 | "har-validator": {
1470 | "version": "5.1.5",
1471 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
1472 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
1473 | "optional": true,
1474 | "requires": {
1475 | "ajv": "^6.12.3",
1476 | "har-schema": "^2.0.0"
1477 | }
1478 | },
1479 | "has-unicode": {
1480 | "version": "2.0.1",
1481 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
1482 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
1483 | },
1484 | "http-signature": {
1485 | "version": "1.2.0",
1486 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1487 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
1488 | "optional": true,
1489 | "requires": {
1490 | "assert-plus": "^1.0.0",
1491 | "jsprim": "^1.2.2",
1492 | "sshpk": "^1.7.0"
1493 | }
1494 | },
1495 | "iconv-lite": {
1496 | "version": "0.4.24",
1497 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1498 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1499 | "requires": {
1500 | "safer-buffer": ">= 2.1.2 < 3"
1501 | }
1502 | },
1503 | "ignore-walk": {
1504 | "version": "3.0.4",
1505 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz",
1506 | "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==",
1507 | "requires": {
1508 | "minimatch": "^3.0.4"
1509 | }
1510 | },
1511 | "inflight": {
1512 | "version": "1.0.6",
1513 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1514 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1515 | "requires": {
1516 | "once": "^1.3.0",
1517 | "wrappy": "1"
1518 | }
1519 | },
1520 | "inherits": {
1521 | "version": "2.0.4",
1522 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1523 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1524 | },
1525 | "ini": {
1526 | "version": "1.3.8",
1527 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
1528 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
1529 | },
1530 | "is-fullwidth-code-point": {
1531 | "version": "1.0.0",
1532 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1533 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1534 | "requires": {
1535 | "number-is-nan": "^1.0.0"
1536 | }
1537 | },
1538 | "is-typedarray": {
1539 | "version": "1.0.0",
1540 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1541 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1542 | "optional": true
1543 | },
1544 | "isarray": {
1545 | "version": "1.0.0",
1546 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1547 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
1548 | },
1549 | "isexe": {
1550 | "version": "2.0.0",
1551 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1552 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1553 | "optional": true
1554 | },
1555 | "isstream": {
1556 | "version": "0.1.2",
1557 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
1558 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
1559 | "optional": true
1560 | },
1561 | "jsbn": {
1562 | "version": "0.1.1",
1563 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1564 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
1565 | "optional": true
1566 | },
1567 | "json-schema": {
1568 | "version": "0.4.0",
1569 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
1570 | "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
1571 | "optional": true
1572 | },
1573 | "json-schema-traverse": {
1574 | "version": "0.4.1",
1575 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1576 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1577 | "optional": true
1578 | },
1579 | "json-stringify-safe": {
1580 | "version": "5.0.1",
1581 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1582 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
1583 | "optional": true
1584 | },
1585 | "jsprim": {
1586 | "version": "1.4.2",
1587 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
1588 | "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
1589 | "optional": true,
1590 | "requires": {
1591 | "assert-plus": "1.0.0",
1592 | "extsprintf": "1.3.0",
1593 | "json-schema": "0.4.0",
1594 | "verror": "1.10.0"
1595 | }
1596 | },
1597 | "mime-db": {
1598 | "version": "1.51.0",
1599 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
1600 | "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
1601 | "optional": true
1602 | },
1603 | "mime-types": {
1604 | "version": "2.1.34",
1605 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
1606 | "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
1607 | "optional": true,
1608 | "requires": {
1609 | "mime-db": "1.51.0"
1610 | }
1611 | },
1612 | "minimatch": {
1613 | "version": "3.0.4",
1614 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1615 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1616 | "requires": {
1617 | "brace-expansion": "^1.1.7"
1618 | }
1619 | },
1620 | "minimist": {
1621 | "version": "1.2.5",
1622 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1623 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
1624 | },
1625 | "minipass": {
1626 | "version": "2.9.0",
1627 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
1628 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==",
1629 | "requires": {
1630 | "safe-buffer": "^5.1.2",
1631 | "yallist": "^3.0.0"
1632 | }
1633 | },
1634 | "minizlib": {
1635 | "version": "1.3.3",
1636 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
1637 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==",
1638 | "requires": {
1639 | "minipass": "^2.9.0"
1640 | }
1641 | },
1642 | "mkdirp": {
1643 | "version": "0.5.5",
1644 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1645 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1646 | "requires": {
1647 | "minimist": "^1.2.5"
1648 | }
1649 | },
1650 | "ms": {
1651 | "version": "2.1.3",
1652 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1653 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1654 | },
1655 | "needle": {
1656 | "version": "2.9.1",
1657 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
1658 | "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
1659 | "requires": {
1660 | "debug": "^3.2.6",
1661 | "iconv-lite": "^0.4.4",
1662 | "sax": "^1.2.4"
1663 | }
1664 | },
1665 | "node-addon-api": {
1666 | "version": "3.2.1",
1667 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz",
1668 | "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A=="
1669 | },
1670 | "node-gyp": {
1671 | "version": "3.8.0",
1672 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
1673 | "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
1674 | "optional": true,
1675 | "requires": {
1676 | "fstream": "^1.0.0",
1677 | "glob": "^7.0.3",
1678 | "graceful-fs": "^4.1.2",
1679 | "mkdirp": "^0.5.0",
1680 | "nopt": "2 || 3",
1681 | "npmlog": "0 || 1 || 2 || 3 || 4",
1682 | "osenv": "0",
1683 | "request": "^2.87.0",
1684 | "rimraf": "2",
1685 | "semver": "~5.3.0",
1686 | "tar": "^2.0.0",
1687 | "which": "1"
1688 | }
1689 | },
1690 | "node-pre-gyp": {
1691 | "version": "0.11.0",
1692 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz",
1693 | "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==",
1694 | "requires": {
1695 | "detect-libc": "^1.0.2",
1696 | "mkdirp": "^0.5.1",
1697 | "needle": "^2.2.1",
1698 | "nopt": "^4.0.1",
1699 | "npm-packlist": "^1.1.6",
1700 | "npmlog": "^4.0.2",
1701 | "rc": "^1.2.7",
1702 | "rimraf": "^2.6.1",
1703 | "semver": "^5.3.0",
1704 | "tar": "^4"
1705 | },
1706 | "dependencies": {
1707 | "nopt": {
1708 | "version": "4.0.3",
1709 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
1710 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
1711 | "requires": {
1712 | "abbrev": "1",
1713 | "osenv": "^0.1.4"
1714 | }
1715 | },
1716 | "safe-buffer": {
1717 | "version": "5.2.1",
1718 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1719 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1720 | },
1721 | "tar": {
1722 | "version": "4.4.19",
1723 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz",
1724 | "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==",
1725 | "requires": {
1726 | "chownr": "^1.1.4",
1727 | "fs-minipass": "^1.2.7",
1728 | "minipass": "^2.9.0",
1729 | "minizlib": "^1.3.3",
1730 | "mkdirp": "^0.5.5",
1731 | "safe-buffer": "^5.2.1",
1732 | "yallist": "^3.1.1"
1733 | }
1734 | }
1735 | }
1736 | },
1737 | "nopt": {
1738 | "version": "3.0.6",
1739 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
1740 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
1741 | "optional": true,
1742 | "requires": {
1743 | "abbrev": "1"
1744 | }
1745 | },
1746 | "npm-bundled": {
1747 | "version": "1.1.2",
1748 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
1749 | "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
1750 | "requires": {
1751 | "npm-normalize-package-bin": "^1.0.1"
1752 | }
1753 | },
1754 | "npm-normalize-package-bin": {
1755 | "version": "1.0.1",
1756 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
1757 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
1758 | },
1759 | "npm-packlist": {
1760 | "version": "1.4.8",
1761 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz",
1762 | "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==",
1763 | "requires": {
1764 | "ignore-walk": "^3.0.1",
1765 | "npm-bundled": "^1.0.1",
1766 | "npm-normalize-package-bin": "^1.0.1"
1767 | }
1768 | },
1769 | "npmlog": {
1770 | "version": "4.1.2",
1771 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
1772 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
1773 | "requires": {
1774 | "are-we-there-yet": "~1.1.2",
1775 | "console-control-strings": "~1.1.0",
1776 | "gauge": "~2.7.3",
1777 | "set-blocking": "~2.0.0"
1778 | }
1779 | },
1780 | "number-is-nan": {
1781 | "version": "1.0.1",
1782 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1783 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
1784 | },
1785 | "oauth-sign": {
1786 | "version": "0.9.0",
1787 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1788 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
1789 | "optional": true
1790 | },
1791 | "object-assign": {
1792 | "version": "4.1.1",
1793 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1794 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1795 | },
1796 | "once": {
1797 | "version": "1.4.0",
1798 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1799 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1800 | "requires": {
1801 | "wrappy": "1"
1802 | }
1803 | },
1804 | "os-homedir": {
1805 | "version": "1.0.2",
1806 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1807 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
1808 | },
1809 | "os-tmpdir": {
1810 | "version": "1.0.2",
1811 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1812 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
1813 | },
1814 | "osenv": {
1815 | "version": "0.1.5",
1816 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
1817 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
1818 | "requires": {
1819 | "os-homedir": "^1.0.0",
1820 | "os-tmpdir": "^1.0.0"
1821 | }
1822 | },
1823 | "path-is-absolute": {
1824 | "version": "1.0.1",
1825 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1826 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1827 | },
1828 | "performance-now": {
1829 | "version": "2.1.0",
1830 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1831 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1832 | "optional": true
1833 | },
1834 | "process-nextick-args": {
1835 | "version": "2.0.1",
1836 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1837 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1838 | },
1839 | "psl": {
1840 | "version": "1.8.0",
1841 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
1842 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
1843 | "optional": true
1844 | },
1845 | "punycode": {
1846 | "version": "2.1.1",
1847 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1848 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1849 | "optional": true
1850 | },
1851 | "qs": {
1852 | "version": "6.5.2",
1853 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
1854 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
1855 | "optional": true
1856 | },
1857 | "rc": {
1858 | "version": "1.2.8",
1859 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1860 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1861 | "requires": {
1862 | "deep-extend": "^0.6.0",
1863 | "ini": "~1.3.0",
1864 | "minimist": "^1.2.0",
1865 | "strip-json-comments": "~2.0.1"
1866 | }
1867 | },
1868 | "readable-stream": {
1869 | "version": "2.3.7",
1870 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1871 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1872 | "requires": {
1873 | "core-util-is": "~1.0.0",
1874 | "inherits": "~2.0.3",
1875 | "isarray": "~1.0.0",
1876 | "process-nextick-args": "~2.0.0",
1877 | "safe-buffer": "~5.1.1",
1878 | "string_decoder": "~1.1.1",
1879 | "util-deprecate": "~1.0.1"
1880 | }
1881 | },
1882 | "request": {
1883 | "version": "2.88.2",
1884 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1885 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1886 | "optional": true,
1887 | "requires": {
1888 | "aws-sign2": "~0.7.0",
1889 | "aws4": "^1.8.0",
1890 | "caseless": "~0.12.0",
1891 | "combined-stream": "~1.0.6",
1892 | "extend": "~3.0.2",
1893 | "forever-agent": "~0.6.1",
1894 | "form-data": "~2.3.2",
1895 | "har-validator": "~5.1.3",
1896 | "http-signature": "~1.2.0",
1897 | "is-typedarray": "~1.0.0",
1898 | "isstream": "~0.1.2",
1899 | "json-stringify-safe": "~5.0.1",
1900 | "mime-types": "~2.1.19",
1901 | "oauth-sign": "~0.9.0",
1902 | "performance-now": "^2.1.0",
1903 | "qs": "~6.5.2",
1904 | "safe-buffer": "^5.1.2",
1905 | "tough-cookie": "~2.5.0",
1906 | "tunnel-agent": "^0.6.0",
1907 | "uuid": "^3.3.2"
1908 | }
1909 | },
1910 | "rimraf": {
1911 | "version": "2.7.1",
1912 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
1913 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
1914 | "requires": {
1915 | "glob": "^7.1.3"
1916 | }
1917 | },
1918 | "safe-buffer": {
1919 | "version": "5.1.2",
1920 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1921 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1922 | },
1923 | "safer-buffer": {
1924 | "version": "2.1.2",
1925 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1926 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1927 | },
1928 | "sax": {
1929 | "version": "1.2.4",
1930 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
1931 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
1932 | },
1933 | "semver": {
1934 | "version": "5.3.0",
1935 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
1936 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8="
1937 | },
1938 | "set-blocking": {
1939 | "version": "2.0.0",
1940 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1941 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
1942 | },
1943 | "signal-exit": {
1944 | "version": "3.0.6",
1945 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
1946 | "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ=="
1947 | },
1948 | "sqlite3": {
1949 | "version": "5.0.2",
1950 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.2.tgz",
1951 | "integrity": "sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA==",
1952 | "requires": {
1953 | "node-addon-api": "^3.0.0",
1954 | "node-gyp": "3.x",
1955 | "node-pre-gyp": "^0.11.0"
1956 | }
1957 | },
1958 | "sshpk": {
1959 | "version": "1.16.1",
1960 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
1961 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
1962 | "optional": true,
1963 | "requires": {
1964 | "asn1": "~0.2.3",
1965 | "assert-plus": "^1.0.0",
1966 | "bcrypt-pbkdf": "^1.0.0",
1967 | "dashdash": "^1.12.0",
1968 | "ecc-jsbn": "~0.1.1",
1969 | "getpass": "^0.1.1",
1970 | "jsbn": "~0.1.0",
1971 | "safer-buffer": "^2.0.2",
1972 | "tweetnacl": "~0.14.0"
1973 | }
1974 | },
1975 | "string_decoder": {
1976 | "version": "1.1.1",
1977 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1978 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1979 | "requires": {
1980 | "safe-buffer": "~5.1.0"
1981 | }
1982 | },
1983 | "string-width": {
1984 | "version": "1.0.2",
1985 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1986 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1987 | "requires": {
1988 | "code-point-at": "^1.0.0",
1989 | "is-fullwidth-code-point": "^1.0.0",
1990 | "strip-ansi": "^3.0.0"
1991 | }
1992 | },
1993 | "strip-ansi": {
1994 | "version": "3.0.1",
1995 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1996 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1997 | "requires": {
1998 | "ansi-regex": "^2.0.0"
1999 | }
2000 | },
2001 | "strip-json-comments": {
2002 | "version": "2.0.1",
2003 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
2004 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
2005 | },
2006 | "tar": {
2007 | "version": "2.2.2",
2008 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
2009 | "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
2010 | "optional": true,
2011 | "requires": {
2012 | "block-stream": "*",
2013 | "fstream": "^1.0.12",
2014 | "inherits": "2"
2015 | }
2016 | },
2017 | "tough-cookie": {
2018 | "version": "2.5.0",
2019 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
2020 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
2021 | "optional": true,
2022 | "requires": {
2023 | "psl": "^1.1.28",
2024 | "punycode": "^2.1.1"
2025 | }
2026 | },
2027 | "tunnel-agent": {
2028 | "version": "0.6.0",
2029 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2030 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
2031 | "optional": true,
2032 | "requires": {
2033 | "safe-buffer": "^5.0.1"
2034 | }
2035 | },
2036 | "tweetnacl": {
2037 | "version": "0.14.5",
2038 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
2039 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
2040 | "optional": true
2041 | },
2042 | "uri-js": {
2043 | "version": "4.4.1",
2044 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2045 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2046 | "optional": true,
2047 | "requires": {
2048 | "punycode": "^2.1.0"
2049 | }
2050 | },
2051 | "util-deprecate": {
2052 | "version": "1.0.2",
2053 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2054 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
2055 | },
2056 | "uuid": {
2057 | "version": "3.4.0",
2058 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
2059 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
2060 | "optional": true
2061 | },
2062 | "verror": {
2063 | "version": "1.10.0",
2064 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2065 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2066 | "optional": true,
2067 | "requires": {
2068 | "assert-plus": "^1.0.0",
2069 | "core-util-is": "1.0.2",
2070 | "extsprintf": "^1.2.0"
2071 | },
2072 | "dependencies": {
2073 | "core-util-is": {
2074 | "version": "1.0.2",
2075 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
2076 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
2077 | "optional": true
2078 | }
2079 | }
2080 | },
2081 | "which": {
2082 | "version": "1.3.1",
2083 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2084 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2085 | "optional": true,
2086 | "requires": {
2087 | "isexe": "^2.0.0"
2088 | }
2089 | },
2090 | "wide-align": {
2091 | "version": "1.1.5",
2092 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
2093 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
2094 | "requires": {
2095 | "string-width": "^1.0.2 || 2 || 3 || 4"
2096 | }
2097 | },
2098 | "wrappy": {
2099 | "version": "1.0.2",
2100 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2101 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
2102 | },
2103 | "yallist": {
2104 | "version": "3.1.1",
2105 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2106 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
2107 | }
2108 | }
2109 | }
2110 |
--------------------------------------------------------------------------------