[READ-ONLY] Mirror of https://github.com/FoxxMD/multi-scrobbler. Scrobble plays from multiple sources to multiple clients docs.multi-scrobbler.app
deezer docker jellyfin koito lastfm listenbrainz maloja mopidy mpris music music-assistant plex scrobble self-hosted spotify subsonic tautulli youtube-music
0

Configure Feed

Select the types of activity you want to include in your feed.

stage import rule from eslint-plugin-import-x

FoxxMD (Jul 15, 2026, 7:08 PM UTC) a7b35933 76ef9940

+63 -5
+12 -4
eslint.config.js
··· 2 2 import storybook from "eslint-plugin-storybook"; 3 3 import boundaries from 'eslint-plugin-boundaries'; 4 4 import unusedImports from 'eslint-plugin-unused-imports'; 5 + import { importX } from 'eslint-plugin-import-x' 5 6 6 7 import { defineConfig, globalIgnores } from "eslint/config"; 7 8 ··· 73 74 js, 74 75 'unused-imports': unusedImports, 75 76 unicorn, 77 + 'import-x': importX, 76 78 }, 77 79 rules: { 78 80 ...defaultRules, ··· 103 105 // https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/consistent-type-specifier-style.md 104 106 // -- this enforces that type-only imports are fixed to top-level type imports IE 105 107 // import {type Foo, type Bar} from 'a'; => import type { Foo, Bar} from 'a'; 106 - // "import/consistent-type-specifier-style": [ 107 - // "error", "prefer-top-level-if-only-type-imports" 108 - // ] 108 + // 109 + // USE eslint-plugin-import-x since its more actively developed? 110 + // waiting on the status of this for supporting mixed inline types 111 + // https://github.com/un-ts/eslint-plugin-import-x/issues/501 112 + // "import-x/consistent-type-specifier-style": [ 113 + // "error", "prefer-top-level" 114 + // ], 109 115 "unicorn/prefer-then-catch": "error", 110 116 "unicorn/consistent-destructuring": "warn", 111 117 "unicorn/consistent-function-scoping": "warn", ··· 134 140 languageOptions: { 135 141 globals: { 136 142 ...globals.node, 137 - } 143 + }, 144 + ecmaVersion: 'latest', 145 + sourceType: 'module', 138 146 }, 139 147 files: ['src/**/*.ts','src/**/*.tsx'] 140 148 },
+48
package-lock.json
··· 171 171 "eslint": "^10.6.0", 172 172 "eslint-import-resolver-typescript": "^4.4.5", 173 173 "eslint-plugin-boundaries": "^7.0.2", 174 + "eslint-plugin-import-x": "^4.17.1", 174 175 "eslint-plugin-mocha": "^11.3.0", 175 176 "eslint-plugin-prefer-arrow-functions": "^3.2.4", 176 177 "eslint-plugin-react-hooks": "^7.1.1", ··· 8895 8896 "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 8896 8897 "license": "MIT" 8897 8898 }, 8899 + "node_modules/comment-parser": { 8900 + "version": "1.4.7", 8901 + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.7.tgz", 8902 + "integrity": "sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==", 8903 + "dev": true, 8904 + "license": "MIT", 8905 + "engines": { 8906 + "node": ">= 12.0.0" 8907 + } 8908 + }, 8898 8909 "node_modules/common-tags": { 8899 8910 "version": "1.8.2", 8900 8911 "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", ··· 10584 10595 }, 10585 10596 "peerDependencies": { 10586 10597 "eslint": ">=6.0.0" 10598 + } 10599 + }, 10600 + "node_modules/eslint-plugin-import-x": { 10601 + "version": "4.17.1", 10602 + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.17.1.tgz", 10603 + "integrity": "sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==", 10604 + "dev": true, 10605 + "license": "MIT", 10606 + "dependencies": { 10607 + "@typescript-eslint/types": "^8.56.0", 10608 + "comment-parser": "^1.4.1", 10609 + "debug": "^4.4.1", 10610 + "eslint-import-context": "^0.1.9", 10611 + "is-glob": "^4.0.3", 10612 + "minimatch": "^9.0.3 || ^10.1.2", 10613 + "semver": "^7.7.2", 10614 + "stable-hash-x": "^0.2.0", 10615 + "unrs-resolver": "^1.9.2" 10616 + }, 10617 + "engines": { 10618 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 10619 + }, 10620 + "funding": { 10621 + "url": "https://opencollective.com/eslint-plugin-import-x" 10622 + }, 10623 + "peerDependencies": { 10624 + "@typescript-eslint/utils": "^8.56.0", 10625 + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", 10626 + "eslint-import-resolver-node": "*" 10627 + }, 10628 + "peerDependenciesMeta": { 10629 + "@typescript-eslint/utils": { 10630 + "optional": true 10631 + }, 10632 + "eslint-import-resolver-node": { 10633 + "optional": true 10634 + } 10587 10635 } 10588 10636 }, 10589 10637 "node_modules/eslint-plugin-mocha": {
+1
package.json
··· 211 211 "eslint": "^10.6.0", 212 212 "eslint-import-resolver-typescript": "^4.4.5", 213 213 "eslint-plugin-boundaries": "^7.0.2", 214 + "eslint-plugin-import-x": "^4.17.1", 214 215 "eslint-plugin-mocha": "^11.3.0", 215 216 "eslint-plugin-prefer-arrow-functions": "^3.2.4", 216 217 "eslint-plugin-react-hooks": "^7.1.1",
+2 -1
src/backend/common/infrastructure/Atomic.ts
··· 3 3 import type { Request, Response } from "express"; 4 4 import type { NextFunction, ParamsDictionary, Query } from "express-serve-static-core"; 5 5 import type { FixedSizeList } from 'fixed-size-list'; 6 - import { type DeviceId, type ErrorLike, isPlayObject, type PlayMeta, type PlayObject, type PlayObjectMinimal, type PlayPlatformId, type PlayUserId, type UnixTimestamp } from "../../../core/Atomic.ts"; 6 + import { isPlayObject } from "../../../core/Atomic.ts"; 7 + import type {DeviceId, ErrorLike, PlayMeta, PlayObject, PlayObjectMinimal, PlayPlatformId, PlayUserId, UnixTimestamp} from "../../../core/Atomic.ts"; 7 8 import type TupleMap from "../TupleMap.ts"; 8 9 import type { MusicBrainzApi } from 'musicbrainz-api'; 9 10 import type { ReportedPlayerStatus, SourceType } from "../../../core/Atomic.ts";