@remark-embedder/transformer-oembed
Version:
@remark-embedder transformer for oEmbed supported links
73 lines (68 loc) • 2.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _url = require("url");
// eslint-disable-next-line @typescript-eslint/no-namespace
async function getProviders() {
if (!getProviders.cache) {
const res = await fetch('https://oembed.com/providers.json');
getProviders.cache = await res.json();
}
return getProviders.cache;
}
// TODO: Support providers that do not have schemes
async function getProviderEndpointURLForURL(url) {
const providers = await getProviders();
for (const provider of providers) {
for (const endpoint of provider.endpoints) {
var _endpoint$schemes;
if ((_endpoint$schemes = endpoint.schemes) != null && _endpoint$schemes.some(scheme => new RegExp(scheme.replace(/\*/g, '(.*)')).test(url))) {
return {
provider,
endpoint: endpoint.url
};
}
}
}
return null;
}
const transformer = {
name: '@remark-embedder/transformer-oembed',
shouldTransform: async url => {
const result = await getProviderEndpointURLForURL(url);
return Boolean(result);
},
getHTML: async (urlString, getConfig = {}) => {
const result = await getProviderEndpointURLForURL(urlString);
// istanbul ignore if (shouldTransform prevents this, but if someone calls this directly then this would save them)
if (!result) return null;
const {
provider,
endpoint
} = result;
const url = new _url.URL(endpoint);
url.searchParams.set('url', urlString);
let config = getConfig;
if (typeof getConfig === 'function') {
var _getConfig;
// I really have no idea what's happening here:
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
config = (_getConfig = getConfig({
url: urlString,
provider
})) != null ? _getConfig : {};
}
for (const [key, value] of Object.entries((_config$params = config.params) != null ? _config$params : {})) {
var _config$params;
url.searchParams.set(key, String(value));
}
// format has to be json so it is not configurable
url.searchParams.set('format', 'json');
const res = await fetch(url.toString());
const data = await res.json();
return data.html;
}
};
var _default = exports.default = transformer;