├── .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 | icon 10 |
11 |

electron-react-boilerplate

12 |
13 | 18 | 24 | 25 | 30 | 36 | 37 |
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 | [![Test](https://github.com/amilajack/erb-sqlite-example/actions/workflows/test.yml/badge.svg)](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 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 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 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 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 | --------------------------------------------------------------------------------