{ "name": "feishin", "productName": "Feishin", "description": "Feishin music server", "version": "0.12.0", "scripts": { "build": "concurrently \"npm run build:main\" \"npm run build:renderer\" \"npm run build:remote\"", "build:main": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.main.prod.ts", "build:remote": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.remote.prod.ts", "build:renderer": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.renderer.prod.ts", "build:web": "cross-env NODE_ENV=production TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.web.prod.ts", "build:docker": "docker build -t jeffvli/feishin .", "rebuild": "electron-rebuild --parallel --types prod,dev,optional --module-dir release/app", "lint": "concurrently \"npm run lint:code\" \"npm run lint:styles\"", "lint:code": "cross-env NODE_ENV=development eslint . --ext .js,.jsx,.ts,.tsx --fix", "lint:styles": "npx stylelint **/*.tsx --fix", "package": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never", "package:pr": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --win --mac --linux", "package:dev": "node --import tsx ./.erb/scripts/clean.js dist && npm run build && electron-builder build --publish never --dir", "postinstall": "node --import tsx .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": "node --import tsx ./.erb/scripts/check-port-in-use.js && npm run start:renderer", "start:main": "cross-env NODE_ENV=development NODE_OPTIONS=\"--import tsx\" 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:remote": "cross-env NODE_ENV=developemnt TS_NODE_TRANSPILE_ONLY=true webpack --config ./.erb/configs/webpack.config.remote.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/i18n/i18next-parser.config.js", "prod:buildserver": "pwsh -c \"./scripts/server-build.ps1\"", "prod:publishserver": "pwsh -c \"./scripts/server-publish.ps1\"" }, "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": "Feishin", "appId": "org.jeffvli.feishin", "artifactName": "${productName}-${version}-${os}-${arch}.${ext}", "asar": true, "asarUnpack": "**\\*.{node,dll}", "files": [ "dist", "node_modules", "package.json" ], "afterSign": ".erb/scripts/notarize.js", "electronVersion": "31.2.0", "mac": { "target": { "target": "default", "arch": [ "arm64", "x64" ] }, "icon": "assets/icons/icon.icns", "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" ], "icon": "assets/icons/icon.ico" }, "deb": { "depends": [ "libgssapi_krb5.so.2", "libavahi-common.so.3", "libavahi-client.so.3", "libkrb5.so.3", "libkrb5support.so.0", "libkeyutils.so.1", "libcups.so.2" ] }, "rpm": { "depends": [ "libgssapi_krb5.so.2", "libavahi-common.so.3", "libavahi-client.so.3", "libkrb5.so.3", "libkrb5support.so.0", "libkeyutils.so.1", "libcups.so.2" ] }, "freebsd": { "depends": [ "libgssapi_krb5.so.2", "libavahi-common.so.3", "libavahi-client.so.3", "libkrb5.so.3", "libkrb5support.so.0", "libkeyutils.so.1", "libcups.so.2" ] }, "linux": { "target": [ "AppImage", "tar.xz" ], "icon": "assets/icons/icon.png", "category": "AudioVideo;Audio;Player" }, "directories": { "app": "release/app", "buildResources": "assets", "output": "release/build" }, "extraResources": [ "./assets/**" ], "publish": { "provider": "github", "owner": "jeffvli", "repo": "feishin" } }, "repository": { "type": "git", "url": "git+https://github.com/jeffvli/feishin.git" }, "author": { "name": "jeffvli", "url": "https://github.com/jeffvli/" }, "contributors": [], "license": "GPL-3.0", "bugs": { "url": "https://github.com/jeffvli/feishin/issues" }, "keywords": [ "subsonic", "navidrome", "airsonic", "jellyfin", "react", "electron" ], "homepage": "https://github.com/jeffvli/feishin", "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": { "@electron/rebuild": "^3.6.0", "@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/dompurify": "^3.0.5", "@types/electron-localshortcut": "^3.1.0", "@types/jest": "^27.4.1", "@types/lodash": "^4.14.188", "@types/md5": "^2.3.2", "@types/node": "^17.0.23", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.8", "@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.26", "@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.47.0", "@typescript-eslint/parser": "^5.47.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": "^31.2.0", "electron-builder": "^24.13.3", "electron-devtools-installer": "^3.2.0", "electron-notarize": "^1.2.1", "electronmon": "^2.0.2", "eslint": "^8.30.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.2.0", "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": "^9.0.2", "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-styled-syntax": "^0.5.0", "postcss-syntax": "^0.36.2", "prettier": "^3.3.3", "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": "^15.10.3", "stylelint-config-css-modules": "^4.3.0", "stylelint-config-recess-order": "^4.3.0", "stylelint-config-standard": "^34.0.0", "stylelint-config-standard-scss": "^4.0.0", "stylelint-config-styled-components": "^0.1.1", "terser-webpack-plugin": "^5.3.1", "ts-jest": "^27.1.4", "ts-loader": "^9.2.8", "ts-node": "^10.9.2", "tsconfig-paths-webpack-plugin": "^4.0.0", "tsx": "^4.16.2", "typescript": "^5.2.2", "typescript-plugin-styled-components": "^3.0.0", "url-loader": "^4.1.1", "webpack": "^5.94.0", "webpack-bundle-analyzer": "^4.5.0", "webpack-cli": "^4.9.2", "webpack-dev-server": "^4.8.0", "webpack-merge": "^5.8.0" }, "dependencies": { "@ag-grid-community/client-side-row-model": "^28.2.1", "@ag-grid-community/core": "^28.2.1", "@ag-grid-community/infinite-row-model": "^28.2.1", "@ag-grid-community/react": "^28.2.1", "@ag-grid-community/styles": "^28.2.1", "@emotion/react": "^11.10.4", "@mantine/core": "^6.0.17", "@mantine/dates": "^6.0.17", "@mantine/form": "^6.0.17", "@mantine/hooks": "^6.0.17", "@mantine/modals": "^6.0.17", "@mantine/notifications": "^6.0.17", "@mantine/utils": "^6.0.17", "@tanstack/react-query": "^4.32.1", "@tanstack/react-query-devtools": "^4.32.1", "@tanstack/react-query-persist-client": "^4.32.1", "@ts-rest/core": "^3.23.0", "@xhayper/discord-rpc": "^1.0.24", "audiomotion-analyzer": "^4.5.0", "auto-text-size": "^0.2.3", "axios": "^1.6.0", "clsx": "^2.0.0", "cmdk": "^0.2.0", "dayjs": "^1.11.6", "dompurify": "^3.1.6", "electron-debug": "^3.2.0", "electron-localshortcut": "^3.2.1", "electron-log": "^5.1.1", "electron-store": "^8.1.0", "electron-updater": "^6.3.1", "fast-average-color": "^9.3.0", "format-duration": "^2.0.0", "framer-motion": "^11.0.0", "fuse.js": "^6.6.2", "history": "^5.3.0", "i18next": "^21.10.0", "idb-keyval": "^6.2.1", "immer": "^9.0.21", "is-electron": "^2.2.2", "lodash": "^4.17.21", "md5": "^2.3.0", "memoize-one": "^6.0.0", "nanoid": "^3.3.3", "net": "^1.0.2", "node-mpv": "github:jeffvli/Node-MPV#32b4d64395289ad710c41d481d2707a7acfc228f", "overlayscrollbars": "^2.2.1", "overlayscrollbars-react": "^0.5.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-error-boundary": "^3.1.4", "react-i18next": "^11.18.6", "react-icons": "^4.10.1", "react-player": "^2.11.0", "react-router": "^6.16.0", "react-router-dom": "^6.16.0", "react-simple-img": "^3.0.0", "react-virtualized-auto-sizer": "^1.0.17", "react-window": "^1.8.9", "react-window-infinite-loader": "^1.0.9", "semver": "^7.5.4", "styled-components": "^6.0.8", "swiper": "^9.3.1", "zod": "^3.22.3", "zustand": "^4.3.9" }, "resolutions": { "styled-components": "^6" }, "devEngines": { "runtime": { "name": "node", "version": ">=18.x", "onFail": "error" }, "packageManager": { "name": "npm", "version": ">=7.x", "onFail": "error" } }, "browserslist": [], "electronmon": { "patterns": [ "!server", "!src/renderer" ] } }