@ginlink/chrome-webstore-meta
Version:
Get chrome extension item meta from Web Store.
59 lines (49 loc) • 1.81 kB
text/typescript
import { Requester } from '../requester';
import { ChromeWebstoreMetaResult, IConverter } from '../types';
import { DomHandler, Parser, DomUtils } from 'htmlparser2';
export class Converter implements IConverter {
private requester: Requester;
constructor(requester: Requester) {
this.requester = requester;
}
public async run() {
const detailHtml = await this.requester.get();
const itemProps: Record<string, any> = {};
const handler = new DomHandler(null);
new Parser(handler).end(detailHtml);
// parse meta
DomUtils.getElementsByTagName('meta', handler.dom, true).forEach(
function (el) {
const property = DomUtils.getAttributeValue(el, 'property');
const contentValue = DomUtils.getAttributeValue(el, 'content');
// A meta tag beginning with og:
if (property && property.indexOf('og:') === 0) {
let nameValue = property.replace('og:', '');
nameValue = nameValue.replace('title', 'name'); // title -> name
itemProps[nameValue.toLowerCase()] = contentValue;
return;
}
}
);
// parse version
const regex = /<div[^>]*>([\d.]+)<\/div>/;
const versionMatch = detailHtml.match(regex);
let version = null;
if (versionMatch && versionMatch.length > 1) {
version = versionMatch[1];
}
itemProps['version'] = version;
if (Object.keys(itemProps).length === 0) {
throw new Error('meta property not found');
}
if (
!Object.prototype.hasOwnProperty.call(itemProps, 'url') ||
!itemProps['url']
) {
throw new Error('url in response is required');
}
const splitUrl = itemProps.url.split('/');
itemProps['id'] = splitUrl[splitUrl.length - 1];
return itemProps as ChromeWebstoreMetaResult;
}
}