Browse Source

ref: migrate to nanoevents lib

Sv443 1 year ago
parent
commit
2347e347ce
5 changed files with 66 additions and 70 deletions
  1. 1 1
      README.md
  2. 47 44
      package-lock.json
  3. 2 2
      package.json
  4. 11 21
      src/events.ts
  5. 5 2
      src/index.ts

+ 1 - 1
README.md

@@ -83,7 +83,7 @@ Note: the tab needs to stay open on Firefox or the script will not update itself
 
 ### Attributions:
 This userscript depends on these runtime libraries:
-- [@billjs/event-emitter](https://npmjs.org/package/@billjs/event-emitter)
+- [nanoevents](https://npmjs.org/package/nanoevents)
 - [@sv443-network/userutils](https://github.com/Sv443-Network/UserUtils)
   
 For development dependencies, please refer to `devDependencies` in [`package.json`](./package.json)

+ 47 - 44
package-lock.json

@@ -9,8 +9,8 @@
       "version": "1.0.0",
       "license": "MIT",
       "dependencies": {
-        "@billjs/event-emitter": "^1.0.3",
-        "@sv443-network/userutils": "^1.1.1"
+        "@sv443-network/userutils": "^1.1.2",
+        "nanoevents": "^8.0.0"
       },
       "devDependencies": {
         "@types/express": "^4.17.17",
@@ -58,21 +58,21 @@
       }
     },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz",
-      "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==",
+      "version": "7.22.20",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+      "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.22.13",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz",
-      "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==",
+      "version": "7.22.20",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
+      "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.20",
         "chalk": "^2.4.2",
         "js-tokens": "^4.0.0"
       },
@@ -163,11 +163,6 @@
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@billjs/event-emitter": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@billjs/event-emitter/-/event-emitter-1.0.3.tgz",
-      "integrity": "sha512-ZvzKYD/Gk9HSq42jCHFlTXb3oJztspH7WTdlVU6WdW3MKk6Jja/wWhxRSpT07aDkU69pqdUl9zx6lpG6/qxO6g=="
-    },
     "node_modules/@cspotcode/source-map-support": {
       "version": "0.8.1",
       "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
@@ -401,9 +396,9 @@
       "dev": true
     },
     "node_modules/@sv443-network/userutils": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@sv443-network/userutils/-/userutils-1.1.1.tgz",
-      "integrity": "sha512-vrE1fhijnLLtk6XdcOxY8Nt2JC8L5u2xy1j+hENft5xGjU4W/IbnFB/2MPq5KqgoXmumDmeXr+OyYzZyaXMuVg=="
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@sv443-network/userutils/-/userutils-1.1.2.tgz",
+      "integrity": "sha512-WABBRGnwj1U8GVWB6WsEb6Lz1NUMHsSuxeqItKvWH8GcuBpoM3UGjvbjErW+Fhbsi/2BmHccZWBikTP6U15HAA=="
     },
     "node_modules/@trysound/sax": {
       "version": "0.2.0",
@@ -439,9 +434,9 @@
       "dev": true
     },
     "node_modules/@types/body-parser": {
-      "version": "1.19.2",
-      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
-      "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+      "version": "1.19.3",
+      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz",
+      "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==",
       "dev": true,
       "dependencies": {
         "@types/connect": "*",
@@ -517,9 +512,9 @@
       "dev": true
     },
     "node_modules/@types/http-errors": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
-      "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz",
+      "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==",
       "dev": true
     },
     "node_modules/@types/istanbul-lib-coverage": {
@@ -547,9 +542,9 @@
       }
     },
     "node_modules/@types/json-schema": {
-      "version": "7.0.12",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
-      "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==",
+      "version": "7.0.13",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz",
+      "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==",
       "dev": true
     },
     "node_modules/@types/mime": {
@@ -559,9 +554,9 @@
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "20.6.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz",
-      "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==",
+      "version": "20.6.2",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz",
+      "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==",
       "dev": true
     },
     "node_modules/@types/qs": {
@@ -577,9 +572,9 @@
       "dev": true
     },
     "node_modules/@types/semver": {
-      "version": "7.5.1",
-      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz",
-      "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==",
+      "version": "7.5.2",
+      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz",
+      "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==",
       "dev": true
     },
     "node_modules/@types/send": {
@@ -1398,9 +1393,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001533",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001533.tgz",
-      "integrity": "sha512-9aY/b05NKU4Yl2sbcJhn4A7MsGwR1EPfW/nrqsnqVA0Oq50wpmPaGI+R1Z0UKlUl96oxUkGEOILWtOHck0eCWw==",
+      "version": "1.0.30001534",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz",
+      "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==",
       "dev": true,
       "funding": [
         {
@@ -2083,9 +2078,9 @@
       "dev": true
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.516",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.516.tgz",
-      "integrity": "sha512-A8xs6nie7jw/9GFRrCPrrE+maux1M3gSnFe1HVstK6ubH+7v5hMDFq3qoNxTRssYyz6jdzk/1wLebT+9tisLKA==",
+      "version": "1.4.523",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.523.tgz",
+      "integrity": "sha512-9AreocSUWnzNtvLcbpng6N+GkXnCcBR80IQkxRC9Dfdyg4gaWNUPBujAHUpKkiUkoSoR9UlhA4zD/IgBklmhzg==",
       "dev": true
     },
     "node_modules/emoji-regex": {
@@ -2620,9 +2615,9 @@
       }
     },
     "node_modules/flatted": {
-      "version": "3.2.7",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
-      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+      "version": "3.2.9",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+      "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
       "dev": true
     },
     "node_modules/forwarded": {
@@ -3444,6 +3439,14 @@
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
+    "node_modules/nanoevents": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/nanoevents/-/nanoevents-8.0.0.tgz",
+      "integrity": "sha512-bYYwNCdNc5ea6/Lwh1uioU1/7aaKa3EPmNQ2weTm8PWSpbWrsaWHePe0Zq4SF+D3F3JX3cn+QdktOPCf1meOqw==",
+      "engines": {
+        "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
+      }
+    },
     "node_modules/nanoid": {
       "version": "3.3.6",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@@ -4511,9 +4514,9 @@
       }
     },
     "node_modules/resolve": {
-      "version": "1.22.4",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
-      "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
+      "version": "1.22.6",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz",
+      "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==",
       "dev": true,
       "dependencies": {
         "is-core-module": "^2.13.0",

+ 2 - 2
package.json

@@ -34,8 +34,8 @@
     "url": "https://github.com/Sv443/BetterYTM/issues"
   },
   "dependencies": {
-    "@billjs/event-emitter": "^1.0.3",
-    "@sv443-network/userutils": "^1.1.1"
+    "@sv443-network/userutils": "^1.1.2",
+    "nanoevents": "^8.0.0"
   },
   "devDependencies": {
     "@types/express": "^4.17.17",

+ 11 - 21
src/events.ts

@@ -1,29 +1,19 @@
-import { Event as EventParam, EventEmitter, EventHandler } from "@billjs/event-emitter";
+import { createNanoEvents } from "nanoevents";
 import { error, info } from "./utils";
 
-interface SiteEvents extends EventEmitter {
+export interface SiteEventsMap {
   /** Emitted whenever child nodes are added to or removed from the song queue */
-  on(event: "queueChanged", listener: EventHandler): boolean;
+  queueChanged: (queueElement: HTMLElement) => void;
   /** Emitted whenever child nodes are added to or removed from the autoplay queue underneath the song queue */
-  on(event: "autoplayQueueChanged", listener: EventHandler): boolean;
+  autoplayQueueChanged: (queueElement: HTMLElement) => void;
   /** Emitted whenever carousel shelf containers are added or removed from their parent container */
-  on(event: "carouselShelvesChanged", listener: EventHandler): boolean;
+  carouselShelvesChanged: (elementMutations: Record<"addedNodes" | "removedNodes", NodeListOf<HTMLElement> | null>) => void;
   /** Emitted once the home page is filled with content */
-  on(event: "homePageLoaded", listener: EventHandler): boolean;
+  homePageLoaded: () => void;
 }
 
 /** EventEmitter instance that is used to detect changes to the site */
-export const siteEvents = new EventEmitter() as SiteEvents;
-
-/**
- * Returns the data of an event from the `@billjs/event-emitter` library.
- * This function is used as a shorthand to extract the data and assert it with the type passed in `<T>`
- * @param evt Event object from the `.on()` or `.once()` method
- * @template T Type of the data passed by `.fire(type: string, data: T)`
- */
-export function getEvtData<T>(evt: EventParam): T {
-  return evt.data as T;
-}
+export const siteEvents = createNanoEvents<SiteEventsMap>();
 
 let observers: MutationObserver[] = [];
 
@@ -44,7 +34,7 @@ export async function initSiteEvents() {
     const queueObs = new MutationObserver(([ { addedNodes, removedNodes, target } ]) => {
       if(addedNodes.length > 0 || removedNodes.length > 0) {
         info(`Detected queue change - added nodes: ${[...addedNodes.values()].length} - removed nodes: ${[...removedNodes.values()].length}`);
-        siteEvents.fire("queueChanged", target);
+        siteEvents.emit("queueChanged", target as HTMLElement);
       }
     });
 
@@ -56,7 +46,7 @@ export async function initSiteEvents() {
     const autoplayObs = new MutationObserver(([ { addedNodes, removedNodes, target } ]) => {
       if(addedNodes.length > 0 || removedNodes.length > 0) {
         info(`Detected autoplay queue change - added nodes: ${[...addedNodes.values()].length} - removed nodes: ${[...removedNodes.values()].length}`);
-        siteEvents.fire("autoplayQueueChanged", target);
+        siteEvents.emit("autoplayQueueChanged", target as HTMLElement);
       }
     });
 
@@ -99,7 +89,7 @@ async function initHomeObservers() {
     });
   }
 
-  siteEvents.fire("homePageLoaded");
+  siteEvents.emit("homePageLoaded");
 
   info("Initialized home page observers");
 
@@ -107,7 +97,7 @@ async function initHomeObservers() {
   const shelfContainerObs = new MutationObserver(([ { addedNodes, removedNodes } ]) => {
     if(addedNodes.length > 0 || removedNodes.length > 0) {
       info("Detected carousel shelf container change - added nodes:", addedNodes.length, "- removed nodes:", removedNodes.length);
-      siteEvents.fire("carouselShelvesChanged", { addedNodes, removedNodes });
+      siteEvents.emit("carouselShelvesChanged", { addedNodes, removedNodes } as Record<"addedNodes" | "removedNodes", NodeListOf<HTMLElement> | null>);
     }
   });
 

+ 5 - 2
src/index.ts

@@ -13,7 +13,7 @@ import {
   // input
   initArrowKeySkip, initSiteSwitch, addAnchorImprovements,
   // menu
-  initMenu, addMenu, initBeforeUnloadHook, addConfigMenuOption, disableBeforeUnload,
+  initMenu, addMenu, initBeforeUnloadHook, addConfigMenuOption, disableBeforeUnload, removeShareTrackingParam,
 } from "./features/index";
 
 {
@@ -33,7 +33,7 @@ import {
     "─ lots of ambition",
     `─ my song metadata API: ${geniUrlBase}`,
     "─ my userscript utility library: https://github.com/Sv443-Network/UserUtils",
-    "─ this tiny event listener library: https://github.com/billjs/event-emitter",
+    "─ this tiny event listener library: https://github.com/ai/nanoevents",
   ].join("\n"));
   console.log();
 }
@@ -121,6 +121,9 @@ async function onDomLoad() {
       if(features.closeToastsTimeout > 0)
         initAutoCloseToasts();
 
+      if(features.removeShareTrackingParam)
+        removeShareTrackingParam();
+
       initVolumeFeatures();
     }