{ "name": "sonixd", "productName": "Sonixd", "description": "A full-featured Subsonic/Jellyfin compatible music player", "scripts": { "build": "concurrently \"npm run build:main\" \"npm run build:renderer\"", "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts", "build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts", "rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app", "lint": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx", "lint:styles": "npx stylelint **/*.tsx", "package": "ts-node ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never", "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", "start": "ts-node ./.erb/scripts/check-port-in-use.js && npm run start:renderer", "start:main": "cross-env NODE_ENV=development electron -r ts-node/register/transpile-only ./src/main/main.ts", "start:preload": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.preload.dev.ts", "start:renderer": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.dev.ts", "start:web": "cross-env NODE_ENV=development TS_NODE_TRANSPILE_ONLY=true webpack serve --config ./.erb/configs/webpack.config.renderer.web.ts", "test": "jest", "prepare": "husky install", "i18next": "i18next -c src/renderer/i18n/i18next-parser.config.js", "docker:up": "docker compose --file docker-compose.dev.yml --env-file .env.dev up --detach && docker compose --file docker-compose.dev.yml --env-file .env.dev logs -f", "docker:down": "docker compose --file docker-compose.dev.yml --env-file .env.dev down && docker image rm sonixd_prisma", "docker:migrate": "cd src/server && npx prisma generate && docker exec -ti sonixd_server sh -c \"npx prisma generate && npx prisma db push\"", "docker:reset": "docker exec -ti sonixd_server sh -c \"npx prisma migrate reset && npx prisma db push && npx ts-node prisma/seed.ts\"" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ "cross-env NODE_ENV=development eslint --cache" ], "*.json,.{eslintrc,prettierrc}": [ "prettier --ignore-path .eslintignore --parser json --write" ], "*.{css,scss}": [ "prettier --ignore-path .eslintignore --single-quote --write" ], "*.{html,md,yml}": [ "prettier --ignore-path .eslintignore --single-quote --write" ] }, "build": { "productName": "Sonixd", "appId": "org.erb.sonixd", "artifactName": "${productName}-${version}-${os}-${arch}.${ext}", "asar": true, "asarUnpack": "**\\*.{node,dll}", "files": [ "dist", "node_modules", "package.json" ], "afterSign": ".erb/scripts/notarize.js", "mac": { "target": { "target": "default", "arch": [ "arm64", "x64" ] }, "type": "distribution", "hardenedRuntime": true, "entitlements": "assets/entitlements.mac.plist", "entitlementsInherit": "assets/entitlements.mac.plist", "gatekeeperAssess": false }, "dmg": { "contents": [ { "x": 130, "y": 220 }, { "x": 410, "y": 220, "type": "link", "path": "/Applications" } ] }, "win": { "target": [ "nsis", "zip" ] }, "linux": { "target": [ "AppImage", "tar.xz" ], "icon": "assets/icons/placeholder.png", "category": "Development" }, "directories": { "app": "release/app", "buildResources": "assets", "output": "release/build" }, "extraResources": [ "./assets/**" ], "publish": { "provider": "github", "owner": "jeffvli", "repo": "sonixd" } }, "repository": { "type": "git", "url": "git+https://github.com/jeffvli/sonixd.git" }, "author": { "name": "jeffvli", "url": "https://github.com/jeffvli/" }, "contributors": [], "license": "GPL-3.0", "bugs": { "url": "https://github.com/jeffvli/sonixd/issues" }, "keywords": [ "subsonic", "navidrome", "airsonic", "jellyfin", "react", "electron" ], "homepage": "https://github.com/jeffvli/sonixd", "jest": { "testURL": "http://localhost/", "testEnvironment": "jsdom", "transform": { "\\.(ts|tsx|js|jsx)$": "ts-jest" }, "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/.erb/mocks/fileMock.js", "\\.(css|less|sass|scss)$": "identity-obj-proxy" }, "moduleFileExtensions": [ "js", "jsx", "ts", "tsx", "json" ], "moduleDirectories": [ "node_modules", "release/app/node_modules" ], "testPathIgnorePatterns": [ "release/app/dist" ], "setupFiles": [ "./.erb/scripts/check-build-exists.ts" ] }, "devDependencies": { "@pmmmwh/react-refresh-webpack-plugin": "0.5.5", "@stylelint/postcss-css-in-js": "^0.38.0", "@teamsupercell/typings-for-css-modules-loader": "^2.5.1", "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.0.0", "@types/jest": "^27.4.1", "@types/lodash": "^4.14.182", "@types/md5": "^2.3.2", "@types/node": "^17.0.23", "@types/react": "^17.0.43", "@types/react-dom": "^17.0.14", "@types/react-lazy-load-image-component": "^1.5.2", "@types/react-slider": "^1.3.1", "@types/react-test-renderer": "^17.0.1", "@types/react-virtualized-auto-sizer": "^1.0.1", "@types/react-window": "^1.8.5", "@types/react-window-infinite-loader": "^1.0.6", "@types/styled-components": "^5.1.25", "@types/terser-webpack-plugin": "^5.0.4", "@types/webpack-bundle-analyzer": "^4.4.1", "@types/webpack-env": "^1.16.3", "@typescript-eslint/eslint-plugin": "^5.18.0", "@typescript-eslint/parser": "^5.18.0", "browserslist-config-erb": "^0.0.3", "chalk": "^4.1.2", "concurrently": "^7.1.0", "core-js": "^3.21.1", "cross-env": "^7.0.3", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", "detect-port": "^1.3.0", "electron": "^18.0.1", "electron-builder": "^23.0.3", "electron-devtools-installer": "^3.2.0", "electron-notarize": "^1.2.1", "electron-rebuild": "^3.2.7", "electronmon": "^2.0.2", "eslint": "^8.12.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-erb": "^4.0.3", "eslint-import-resolver-typescript": "^2.7.1", "eslint-import-resolver-webpack": "^0.13.2", "eslint-plugin-compat": "^4.0.2", "eslint-plugin-import": "^2.26.0", "eslint-plugin-jest": "^26.1.3", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-promise": "^6.0.0", "eslint-plugin-react": "^7.29.4", "eslint-plugin-react-hooks": "^4.4.0", "eslint-plugin-sort-keys-fix": "^1.1.2", "eslint-plugin-typescript-sort-keys": "^2.1.0", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.5.0", "husky": "^7.0.4", "i18next-parser": "^6.3.0", "identity-obj-proxy": "^3.0.0", "jest": "^27.5.1", "lint-staged": "^12.3.7", "mini-css-extract-plugin": "^2.6.0", "postcss-scss": "^4.0.4", "postcss-syntax": "^0.36.2", "prettier": "^2.6.2", "react-refresh": "^0.12.0", "react-refresh-typescript": "^2.0.4", "react-test-renderer": "^18.0.0", "rimraf": "^3.0.2", "sass": "^1.49.11", "sass-loader": "^12.6.0", "style-loader": "^3.3.1", "stylelint": "^14.9.1", "stylelint-config-rational-order": "^0.1.2", "stylelint-config-standard-scss": "^4.0.0", "stylelint-config-styled-components": "^0.1.1", "stylelint-order": "^5.0.0", "stylelint-processor-styled-components": "^1.10.0", "terser-webpack-plugin": "^5.3.1", "ts-jest": "^27.1.4", "ts-loader": "^9.2.8", "ts-node": "^10.7.0", "typescript": "^4.6.4", "typescript-plugin-styled-components": "^2.0.0", "url-loader": "^4.1.1", "webpack": "^5.71.0", "webpack-bundle-analyzer": "^4.5.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.8.0", "webpack-merge": "^5.8.0" }, "dependencies": { "@jellyfin/client-axios": "^10.7.8", "@mantine/core": "^5.0.0", "@mantine/form": "^5.0.0", "@mantine/hooks": "^5.0.0", "axios": "^0.26.1", "electron-debug": "^3.2.0", "electron-log": "^4.4.6", "electron-updater": "^4.6.5", "format-duration": "^2.0.0", "framer-motion": "^6.4.2", "history": "^5.3.0", "i18next": "^21.6.16", "immer": "^9.0.15", "is-electron": "^2.2.1", "lodash": "^4.17.21", "md5": "^2.3.0", "nanoid": "^3.3.3", "net": "^1.0.2", "node-mpv": "^2.0.0-beta.2", "react": "^18.0.0", "react-dom": "^18.0.0", "react-helmet-async": "^1.3.0", "react-i18next": "^11.16.7", "react-lazy-load-image-component": "^1.5.4", "react-player": "^2.10.0", "react-query": "^4.0.0-beta.23", "react-router": "^6.3.0", "react-router-dom": "^6.3.0", "react-slider": "^2.0.0", "react-spaces": "^0.3.4", "react-use": "^17.3.2", "react-virtualized-auto-sizer": "^1.0.6", "react-window": "^1.8.7", "react-window-infinite-loader": "^1.0.8", "styled-components": "^5.3.5", "tabler-icons-react": "^1.46.0", "zustand": "^4.0.0-rc.1" }, "resolutions": { "styled-components": "^5" }, "devEngines": { "node": ">=14.x", "npm": ">=7.x" }, "browserslist": [], "prettier": { "overrides": [ { "files": [ ".prettierrc", ".eslintrc" ], "options": { "parser": "json" } } ], "singleQuote": true } }