An easy-to-use platform for EEG experimentation in the classroom
1{
2 "name": "brainwaves",
3 "productName": "BrainWaves",
4 "version": "1.0.0",
5 "description": "EEG Experiment Desktop Application",
6 "main": "./out/main/index.js",
7 "scripts": {
8 "dev": "node internals/scripts/patchDeps.mjs && electron-vite dev",
9 "build": "electron-vite build",
10 "postbuild": "node internals/scripts/BuildViewers.mjs",
11 "preview": "electron-vite preview",
12 "package": "npm run build && electron-builder build --publish never",
13 "package-all": "npm run build && electron-builder build --mac --win --linux",
14 "package-ci": "npm run build && electron-builder build --publish always",
15 "package-mac": "npm run build && electron-builder build --mac",
16 "package-linux": "npm run build && electron-builder build --linux",
17 "package-win": "npm run build && electron-builder build --win --x64",
18 "postinstall": "electron-builder install-app-deps && node internals/scripts/InstallPyodide.mjs && node internals/scripts/InstallMNE.mjs && node internals/scripts/patchDeps.mjs",
19 "install-pyodide": "node internals/scripts/InstallPyodide.mjs && node internals/scripts/InstallMNE.mjs",
20 "lint": "cross-env NODE_ENV=development eslint . --cache",
21 "lint-fix": "npm run lint -- --fix",
22 "lint-styles": "stylelint '**/*.*(css|scss)'",
23 "lint-styles-fix": "npm run lint-styles -- --fix; exit 0",
24 "postlint-fix": "prettier --single-quote --write '**/*.{ts,tsx,js,jsx,json,html,css,less,scss,yml}'",
25 "postlint-styles-fix": "prettier --single-quote --write '**/*.{css,scss}'",
26 "test": "vitest run",
27 "test:watch": "vitest",
28 "test-all": "npm run lint && npm run lint-styles && npm run typecheck && npm run build && npm test",
29 "tsc": "tsc --noEmit",
30 "typecheck": "tsc --noEmit"
31 },
32 "lint-staged": {
33 "*.{js,jsx,ts,tsx}": [
34 "cross-env NODE_ENV=development eslint --cache"
35 ],
36 "{*.json,.{prettierrc,stylelintrc}}": [
37 "prettier --parser json --write"
38 ],
39 "*.{css,scss}": [
40 "stylelint --fix",
41 "prettier --single-quote --write"
42 ],
43 "*.{html,md,yml}": [
44 "prettier --single-quote --write"
45 ]
46 },
47 "build": {
48 "productName": "BrainWaves",
49 "appId": "com.electron.brainwaves",
50 "asar": true,
51 "files": [
52 "out/**/*",
53 "node_modules/**/*",
54 "package.json"
55 ],
56 "dmg": {
57 "contents": [
58 {
59 "x": 130,
60 "y": 220
61 },
62 {
63 "x": 410,
64 "y": 220,
65 "type": "link",
66 "path": "/Applications"
67 }
68 ]
69 },
70 "win": {
71 "target": [
72 "nsis",
73 "msi"
74 ]
75 },
76 "linux": {
77 "target": [
78 "deb",
79 "rpm",
80 "AppImage"
81 ],
82 "category": "Education"
83 },
84 "directories": {
85 "buildResources": "resources",
86 "output": "release"
87 },
88 "publish": {
89 "provider": "github",
90 "owner": "makebrainwaves",
91 "repo": "brainwaves",
92 "private": false
93 },
94 "extraResources": [
95 {
96 "from": "./src/renderer/experiments/",
97 "to": "experiments",
98 "filter": "**/*"
99 },
100 {
101 "from": "./src/renderer/utils/webworker/src/",
102 "to": "pyodide",
103 "filter": "**/*"
104 }
105 ]
106 },
107 "repository": {
108 "type": "git",
109 "url": "git+https://github.com/makebrainwaves/BrainWaves"
110 },
111 "author": {
112 "name": "Dano Morrison",
113 "email": "dano@neurotechx.com",
114 "url": "https://github.com/makebrainwaves"
115 },
116 "contributors": [
117 {
118 "name": "Teon L Brooks",
119 "url": "https://teonbrooks.com"
120 },
121 {
122 "name": "Yury Shevchenko",
123 "url": "https://yuryshevchenko.com/"
124 }
125 ],
126 "license": "MIT",
127 "keywords": [
128 "eeg",
129 "electron",
130 "react",
131 "redux",
132 "redux-observable",
133 "muse",
134 "emotiv",
135 "pyodide",
136 "wasm",
137 "lab.js"
138 ],
139 "homepage": "https://github.com/makebrainwaves/BrainWaves/",
140 "devDependencies": {
141 "@babel/plugin-proposal-class-properties": "^7.10.4",
142 "@babel/plugin-proposal-decorators": "^7.10.5",
143 "@testing-library/dom": "^10.4.1",
144 "@testing-library/jest-dom": "^6.4.0",
145 "@testing-library/react": "^16.0.0",
146 "@types/node": "^22.12.0",
147 "@types/react": "^18.x",
148 "@types/react-dom": "^18.x",
149 "@types/react-plotly.js": "^2.6.4",
150 "@types/redux-logger": "^3.0.8",
151 "@typescript-eslint/eslint-plugin": "^8.56.0",
152 "@typescript-eslint/parser": "^8.56.0",
153 "@vitejs/plugin-react": "^4.0.0",
154 "autoprefixer": "^10.4.0",
155 "chalk": "^4.1.0",
156 "cross-env": "^7.0.0",
157 "electron": "^39.6.1",
158 "electron-builder": "^26.8.1",
159 "electron-vite": "^5.0.0",
160 "eslint": "^9.39.2",
161 "eslint-config-prettier": "^10.1.8",
162 "eslint-plugin-import": "^2.32.0",
163 "eslint-plugin-jsx-a11y": "^6.10.2",
164 "eslint-plugin-prettier": "^5.5.5",
165 "eslint-plugin-react": "^7.37.5",
166 "eslint-plugin-react-hooks": "^5.2.0",
167 "husky": "^8.0.0",
168 "jsdom": "^25.0.0",
169 "lint-staged": "^16.2.7",
170 "postcss": "^8.4.0",
171 "prettier": "^3.8.1",
172 "redux-logger": "^3.0.6",
173 "rimraf": "^6.1.3",
174 "sass": "^1.50.0",
175 "stylelint": "^17.3.0",
176 "stylelint-config-standard": "^40.0.0",
177 "tailwindcss": "^3.4.0",
178 "tar-fs": "^2.1.4",
179 "typescript": "^5.0.0",
180 "unbzip2-stream": "1.4.2",
181 "vite": "^7.3.1",
182 "vitest": "^3.0.0"
183 },
184 "dependencies": {
185 "@electron-toolkit/preload": "^3.0.2",
186 "@electron-toolkit/utils": "^4.0.0",
187 "@fortawesome/fontawesome-free": "^5.13.0",
188 "@neurosity/pipes": "^5.2.1",
189 "@radix-ui/react-dialog": "^1.1.0",
190 "@radix-ui/react-dropdown-menu": "^2.1.0",
191 "@radix-ui/react-select": "^2.2.6",
192 "@radix-ui/react-slot": "^1.1.0",
193 "@reduxjs/toolkit": "^2.11.2",
194 "ajv": "^8.18.0",
195 "caniuse-lite": "^1.0.30001241",
196 "class-variance-authority": "^0.7.0",
197 "clsx": "^2.1.0",
198 "d3": "^7.9.0",
199 "dayjs": "^1.11.19",
200 "electron-log": "^5.4.3",
201 "electron-updater": "^6.8.3",
202 "events": "^3.3.0",
203 "lab.js": "23.0.0-alpha4",
204 "lodash": "^4.17.15",
205 "mkdirp": "^1.0.4",
206 "mousetrap": "^1.6.5",
207 "muse-js": "^3.1.0",
208 "papaparse": "^5.5.3",
209 "pathe": "^2.0.3",
210 "plotly.js": "^3.4.0",
211 "pyodide": "^0.29.3",
212 "rc-slider": "9.2.4",
213 "react": "^18.x",
214 "react-dom": "^18.x",
215 "react-plotly.js": "^2.6.0",
216 "react-redux": "^9.2.0",
217 "react-router-dom": "^6.26.0",
218 "react-toastify": "^11.x",
219 "redux": "^5.x",
220 "redux-observable": "^2.0.0-rc.2",
221 "redux-thunk": "^2.3.0",
222 "rxjs": "^7.8.2",
223 "simple-statistics": "^7.1.0",
224 "simplify-js": "^1.2.4",
225 "tailwind-merge": "^2.3.0",
226 "typesafe-actions": "^5.1.0",
227 "ws": "^8.19.0"
228 },
229 "overrides": {
230 "react": "^18.x",
231 "react-dom": "^18.x",
232 "yauzl": "^3.2.1"
233 },
234 "engines": {
235 "node": "^20.19.0 || >=22.12.0",
236 "npm": ">=8.x"
237 },
238 "prettier": {
239 "singleQuote": true,
240 "trailingComma": "es5"
241 },
242 "stylelint": {
243 "extends": [
244 "stylelint-config-standard"
245 ]
246 }
247}