UNPKG

@remark-embedder/transformer-oembed

Version:

@remark-embedder transformer for oEmbed supported links

73 lines (68 loc) 2.33 kB
"use strict"; 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;