webextension-store-meta
Version:
Get browser extension(webextension) item meta from Chrome Web Store and Firefox add-ons.
107 lines (91 loc) • 2.55 kB
text/typescript
import type { Node } from "domhandler";
import { findOne, getText, queryOne } from "../utils/dom";
import { parseNum, parseVersion } from "../utils/parse";
export class SourceDOM {
public constructor(
/** @internal */
private readonly dom: Node[],
) {}
public name(): string | null {
const title = queryOne(this.dom, "AddonTitle");
if (title) {
return getText(title.children[0]) || null;
}
return null;
}
public description(): string | null {
let des = getText(queryOne(this.dom, "Addon-summary"));
if (des) return des;
const desElem = queryOne(this.dom, "Description");
if (desElem) {
des = getText(desElem);
if (des) return des;
}
return null;
}
public ratingValue(): number | null {
if (this.badges) {
const elm = findOne(
(elem) => elem.attribs["data-testid"]?.startsWith("badge-star-"),
this.badges,
);
if (elm) {
return parseNum(getText(elm)?.replace(/\([^)]+\)/, ""));
}
}
return null;
}
public ratingCount(): number | null {
if (this.badges) {
const elm = findOne(
(elem) => elem.attribs["data-testid"]?.startsWith("badge-star-"),
this.badges,
);
if (elm) {
return parseNum(getText(elm)?.match(/\(([^)]+)\)/)?.[1]);
}
}
return null;
}
public users(): number | null {
if (this.badges) {
const elm = findOne(
(elem) => elem.attribs["data-testid"]?.startsWith("badge-user-"),
this.badges,
);
if (elm) {
return parseNum(getText(elm));
}
}
return null;
}
public version(): string | null {
return parseVersion(getText(queryOne(this.dom, "AddonMoreInfo-version")));
}
public url(): string | null {
return (
findOne(
(elem) => elem.name === "link" && elem.attribs.rel === "canonical",
this.dom,
)?.attribs.href || null
);
}
public image(): string | null {
return queryOne(this.dom, "ScreenShots-image", "img")?.attribs.src || null;
}
public size(): string | null {
return getText(queryOne(this.dom, "AddonMoreInfo-filesize")) || null;
}
public lastUpdated(): string | null {
return getText(queryOne(this.dom, "AddonMoreInfo-last-updated")) || null;
}
/** @internal */
private _badges?: Node | null;
/** @internal */
private get badges(): Node | null {
if (this._badges === undefined) {
this._badges = queryOne(this.dom, "AddonBadges");
}
return this._badges;
}
}