offload now calls + generation to 11ty; add activity feed; cleanup

This commit is contained in:
Cory Dransfeldt 2023-03-16 13:25:57 -07:00
parent 4bd059bc90
commit 4dd6cc9313
No known key found for this signature in database
18 changed files with 192 additions and 93 deletions

View file

@ -10,6 +10,9 @@ const dateFilters = require('./config/dateFilters.js')
const mediaFilters = require('./config/mediaFilters.js') const mediaFilters = require('./config/mediaFilters.js')
const now = String(Date.now()) const now = String(Date.now())
// load .env
require('dotenv-flow').config()
module.exports = function (eleventyConfig) { module.exports = function (eleventyConfig) {
// plugins // plugins
eleventyConfig.addPlugin(syntaxHighlight) eleventyConfig.addPlugin(syntaxHighlight)

2
.env
View file

@ -4,4 +4,4 @@ API_KEY_WEBMENTIONS_CORYD_DEV=
API_KEY_MASTODON= API_KEY_MASTODON=
VERCEL_SYNDICATE_KEY= VERCEL_SYNDICATE_KEY=
TOKEN_CORYDDEV_GISTS= TOKEN_CORYDDEV_GISTS=
GITHUB_TOKEN= GITHUB_TOKEN=

View file

@ -1,4 +1,4 @@
name: manual-build name: Manual Vercel build
env: env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}

View file

@ -1,4 +1,4 @@
name: scheduled-build name: Scheduled Vercel build
env: env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}

View file

@ -28,11 +28,14 @@
"sanitize-html": "^2.10.0" "sanitize-html": "^2.10.0"
}, },
"dependencies": { "dependencies": {
"@11ty/eleventy-activity-feed": "^1.0.9",
"@11ty/eleventy-fetch": "^3.0.0", "@11ty/eleventy-fetch": "^3.0.0",
"@11ty/eleventy-img": "^3.0.0", "@11ty/eleventy-img": "^3.0.0",
"@extractus/feed-extractor": "^6.2.1",
"@sherby/eleventy-plugin-files-minifier": "^1.1.1", "@sherby/eleventy-plugin-files-minifier": "^1.1.1",
"@tailwindcss/typography": "^0.5.1", "@tailwindcss/typography": "^0.5.1",
"autoprefixer": "^10.4.2", "autoprefixer": "^10.4.2",
"dotenv-flow": "^3.2.0",
"eleventy-plugin-unfurl": "^1.0.0", "eleventy-plugin-unfurl": "^1.0.0",
"liquidjs": "^10.6.1", "liquidjs": "^10.6.1",
"markdown-it": "^13.0.1", "markdown-it": "^13.0.1",

12
src/_data/albums.js Normal file
View file

@ -0,0 +1,12 @@
const EleventyFetch = require('@11ty/eleventy-fetch')
module.exports = async function () {
const MUSIC_KEY = process.env.API_KEY_LASTFM
const url = `http://ws.audioscrobbler.com/2.0/?method=user.gettopalbums&user=cdme_&api_key=${MUSIC_KEY}&limit=8&format=json&period=7day`
const res = EleventyFetch(url, {
duration: '1h',
type: 'json',
})
const albums = await res
return albums.topalbums.album
}

12
src/_data/artists.js Normal file
View file

@ -0,0 +1,12 @@
const EleventyFetch = require('@11ty/eleventy-fetch')
module.exports = async function () {
const MUSIC_KEY = process.env.API_KEY_LASTFM
const url = `http://ws.audioscrobbler.com/2.0/?method=user.gettopartists&user=cdme_&api_key=${MUSIC_KEY}&limit=8&format=json&period=7day`
const res = EleventyFetch(url, {
duration: '1h',
type: 'json',
})
const artists = await res
return artists.topartists.artist
}

12
src/_data/books.js Normal file
View file

@ -0,0 +1,12 @@
const { extract } = require('@extractus/feed-extractor')
const { AssetCache } = require('@11ty/eleventy-fetch')
module.exports = async function () {
const url = 'https://oku.club/rss/collection/POaRa'
const asset = new AssetCache('books_data')
if (asset.isCacheValid('1h')) return await asset.getCachedValue()
const res = await extract(url).catch((error) => {})
const data = res.entries
await asset.save(data, 'json')
return data
}

12
src/_data/movies.js Normal file
View file

@ -0,0 +1,12 @@
const { extract } = require('@extractus/feed-extractor')
const { AssetCache } = require('@11ty/eleventy-fetch')
module.exports = async function () {
const url = 'https://letterboxd.com/cdme/rss'
const asset = new AssetCache('movies_data')
if (asset.isCacheValid('1h')) return await asset.getCachedValue()
const res = await extract(url).catch((error) => {})
const data = res.entries.splice(0, 5)
await asset.save(data, 'json')
return data
}

View file

@ -1,17 +0,0 @@
const EleventyFetch = require('@11ty/eleventy-fetch')
module.exports = async function () {
const url = 'https://utils.coryd.dev/api/now?endpoints=artists,albums,books,movies,tv'
const res = EleventyFetch(url, {
duration: '1h',
type: 'json',
})
const now = await res
return {
artists: now.artists,
albums: now.albums,
books: now.books,
movies: now.movies,
tv: now.tv,
}
}

View file

@ -1,15 +0,0 @@
const EleventyFetch = require('@11ty/eleventy-fetch')
module.exports = async function () {
const url = 'https://utils.coryd.dev/api/music?limit=1'
const res = EleventyFetch(url, {
duration: '3m',
type: 'json',
})
const music = await res
return {
artist: music.recenttracks.track[0].artist['#text'],
title: music.recenttracks.track[0].name,
url: music.recenttracks.track[0].url,
}
}

13
src/_data/tv.js Normal file
View file

@ -0,0 +1,13 @@
const { extract } = require('@extractus/feed-extractor')
const { AssetCache } = require('@11ty/eleventy-fetch')
module.exports = async function () {
const TV_KEY = process.env.API_KEY_TRAKT
const url = `https://trakt.tv/users/cdransf/history.atom?slurm=${TV_KEY}`
const asset = new AssetCache('tv_data')
if (asset.isCacheValid('1h')) return await asset.getCachedValue()
const res = await extract(url).catch((error) => {})
const data = res.entries.splice(0, 5)
await asset.save(data, 'json')
return data
}

View file

@ -1,7 +1,8 @@
const EleventyFetch = require('@11ty/eleventy-fetch') const EleventyFetch = require('@11ty/eleventy-fetch')
module.exports = async function () { module.exports = async function () {
const url = 'https://utils.coryd.dev/api/webmentions' const KEY_CORYD = process.env.API_KEY_WEBMENTIONS_CORYD_DEV
const url = `https://webmention.io/api/mentions.jf2?token=${KEY_CORYD}&per-page=1000`
const res = EleventyFetch(url, { const res = EleventyFetch(url, {
duration: '1h', duration: '1h',
type: 'json', type: 'json',

View file

@ -23,6 +23,7 @@
<link rel="pingback" href="https://webmention.io/coryd.dev/xmlrpc" /> <link rel="pingback" href="https://webmention.io/coryd.dev/xmlrpc" />
<link type="application/atom+xml" rel="alternate" title="Cory Dransfeldt" href="/feed.xml"> <link type="application/atom+xml" rel="alternate" title="Cory Dransfeldt" href="/feed.xml">
<link rel="alternate" type="application/json" title="Cory Dransfeldt" href="/feed.json" /> <link rel="alternate" type="application/json" title="Cory Dransfeldt" href="/feed.json" />
<link rel="alternate" href="/follow.xml" title="Cory Dransfeldt's activity feed" type="application/rss+xml">
<script> <script>
const isDarkMode = () => localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches); const isDarkMode = () => localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches);
if (isDarkMode()) { if (isDarkMode()) {
@ -44,43 +45,6 @@
document.documentElement.classList.add('dark') document.documentElement.classList.add('dark')
} }
}); });
;(function () {
const nowPlayingWrapper = document.getElementById("now-playing");
if (nowPlayingWrapper) {
try {
const localStorageKey = "CD_NOW_PLAYING";
const cachedTemplate = localStorage.getItem(localStorageKey);
if (window.localStorage && cachedTemplate) {
nowPlayingWrapper.innerHTML = "";
nowPlayingWrapper.insertAdjacentHTML("beforeEnd", cachedTemplate);
}
fetch("https://utils.coryd.dev/api/music?limit=1")
.then((response) => response.json())
.then((data) => {
const track = data.recenttracks.track[0];
const artistName = track.artist["#text"];
const template = `<a href="${
track.url
}" class="no-underline dark:text-white text-gray-800 font-normal">${
track.name
}</a> by <a href="https://ddg.gg?q=!rym ${encodeURIComponent(
artistName
)}" class="no-underline dark:text-white text-gray-800 font-normal">${artistName}</a>`;
if (window.localStorage)
localStorage.setItem(localStorageKey, template);
nowPlayingWrapper.innerHTML = "";
nowPlayingWrapper.insertAdjacentHTML("beforeEnd", template);
});
} catch (e) {
nowPlayingWrapper.innerHTML = "";
}
}
})();
</script> </script>
</body> </body>
</html> </html>

View file

@ -1,13 +1,5 @@
<div class="border-b border-gray-200 pb-8 dark:border-gray-700 mb-8 pb-8 dark:text-white text-gray-800"> <div class="border-b border-gray-200 pb-8 dark:border-gray-700 mb-8 pb-8 dark:text-white text-gray-800">
<a class="no-underline" href="/now"><h2 class="m-0 text-xl font-black leading-tight tracking-normal md:text-2xl text-primary-500 hover:text-primary-400 mb-4">Now</h2></a> <a class="no-underline" href="/now"><h2 class="m-0 text-xl font-black leading-tight tracking-normal md:text-2xl text-primary-500 hover:text-primary-400 mb-4">Now</h2></a>
<p>I'm a software developer in Camarillo, California. I enjoy hanging out with my beautiful family and 4 rescue dogs, technology, automation, music, writing, reading and tv and movies.</p> <p>I'm a software developer in Camarillo, California. I enjoy hanging out with my beautiful family and 4 rescue dogs, technology, automation, music, writing, reading and tv and movies.</p>
<p>{{ status.emoji }} {{ status.content }}</p> <p class="mb-0">{{ status.emoji }} {{ status.content }}</p>
<p class="mb-0">
<span class="icon-inline">
{% heroicon "solid" "music-note" "Now playing" "width=20 height=20" %}
</span>
<span id="now-playing">
<span class="blur-md">Loading track</span>
</span>
</p>
</div> </div>

View file

@ -29,7 +29,7 @@ layout: main
<div class="pl-4 md:pl-8"> <div class="pl-4 md:pl-8">
<p class="my-2"><span class="icon-inline mr-1">{% heroicon "solid" "terminal" "Terminal" "width=20 height=20" %}</span> Hacking away on random projects like this page, my <a href="/">blog</a>, and whatever else I can find time for.</p> <p class="my-2"><span class="icon-inline mr-1">{% heroicon "solid" "terminal" "Terminal" "width=20 height=20" %}</span> Hacking away on random projects like this page, my <a href="/">blog</a>, and whatever else I can find time for.</p>
</div> </div>
{% if now.artists %} {% if artists %}
<h2 <h2
class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-8 mb-4" class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-8 mb-4"
> >
@ -37,7 +37,7 @@ layout: main
</h2> </h2>
<div> <div>
<div class="grid grid-cols-2 gap-2 md:grid-cols-4 not-prose"> <div class="grid grid-cols-2 gap-2 md:grid-cols-4 not-prose">
{% for artist in now.artists %} {% for artist in artists %}
<a href="{{artist.url}}" title="{{artist.name | escape}}"> <a href="{{artist.url}}" title="{{artist.name | escape}}">
<div class="relative block"> <div class="relative block">
<div class="absolute left-0 top-0 h-full w-full rounded-lg border border-primary-500 bg-cover-gradient dark:border-gray-500"></div> <div class="absolute left-0 top-0 h-full w-full rounded-lg border border-primary-500 bg-cover-gradient dark:border-gray-500"></div>
@ -61,7 +61,7 @@ layout: main
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% if now.albums %} {% if albums %}
<h2 <h2
class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-8 mb-4" class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-8 mb-4"
> >
@ -69,7 +69,7 @@ layout: main
</h2> </h2>
<div> <div>
<div class="grid grid-cols-2 gap-2 md:grid-cols-4 not-prose"> <div class="grid grid-cols-2 gap-2 md:grid-cols-4 not-prose">
{% for album in now.albums %} {% for album in albums %}
<a href="{{album.url}}" title="{{album.name | escape}}"> <a href="{{album.url}}" title="{{album.name | escape}}">
<div class="relative block"> <div class="relative block">
<div class="absolute left-0 top-0 h-full w-full rounded-lg border border-primary-500 bg-cover-gradient dark:border-gray-500"></div> <div class="absolute left-0 top-0 h-full w-full rounded-lg border border-primary-500 bg-cover-gradient dark:border-gray-500"></div>
@ -94,7 +94,7 @@ layout: main
</div> </div>
</div> </div>
{% endif %} {% endif %}
{% if now.books %} {% if books %}
<h2 <h2
class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-6 mb-4" class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-6 mb-4"
> >
@ -102,7 +102,7 @@ layout: main
</h2> </h2>
<div> <div>
<ul class="list-inside list-disc pl-5 md:pl-10"> <ul class="list-inside list-disc pl-5 md:pl-10">
{% for book in now.books %} {% for book in books %}
<li class="mt-1.5 mb-2"> <li class="mt-1.5 mb-2">
<a href="{{book.link}}" title="{{book.title | escape}}"> <a href="{{book.link}}" title="{{book.title | escape}}">
{{book.title}} {{book.title}}
@ -112,7 +112,7 @@ layout: main
</ul> </ul>
</div> </div>
{% endif %} {% endif %}
{% if now.movies %} {% if movies %}
<h2 <h2
class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-6 mb-4" class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-6 mb-4"
> >
@ -120,7 +120,7 @@ layout: main
</h2> </h2>
<div> <div>
<ul class="list-inside list-disc pl-5 md:pl-10"> <ul class="list-inside list-disc pl-5 md:pl-10">
{% for movie in now.movies %} {% for movie in movies %}
<li class="mt-1.5 mb-2"> <li class="mt-1.5 mb-2">
<a href="{{movie.link}}" title="{{movie.title | escape}}"> <a href="{{movie.link}}" title="{{movie.title | escape}}">
{{movie.title}} {{movie.title}}
@ -130,7 +130,7 @@ layout: main
</ul> </ul>
</div> </div>
{% endif %} {% endif %}
{% if now.tv %} {% if tv %}
<h2 <h2
class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-6 mb-4" class="m-0 text-xl font-black leading-tight tracking-normal dark:text-gray-200 md:text-2xl mt-6 mb-4"
> >
@ -138,7 +138,7 @@ layout: main
</h2> </h2>
<div> <div>
<ul class="list-inside list-disc pl-5 md:pl-10"> <ul class="list-inside list-disc pl-5 md:pl-10">
{% for show in now.tv %} {% for show in tv %}
<li class="mt-1.5 mb-2"> <li class="mt-1.5 mb-2">
<a href="{{show.link}}" title="{{show.title | escape}}"> <a href="{{show.link}}" title="{{show.title | escape}}">
{{show.title}} {{show.title}}

25
src/follow-feed.11ty.js Normal file
View file

@ -0,0 +1,25 @@
module.exports = class {
data() {
return {
permalink: '/follow.xml',
}
}
async render() {
const { ActivityFeed } = await import('@11ty/eleventy-activity-feed')
const feed = new ActivityFeed()
feed.setCacheDuration('1h')
feed.addSource('atom', 'Blog', 'https://coryd.dev/feed.xml')
feed.addSource('rss', 'Letterboxd', 'https://letterboxd.com/cdme/rss')
feed.addSource('rss', 'Glass', 'https://glass.photo/coryd/rss')
feed.addSource('rss', 'Oku', 'https://oku.club/rss/collection/NvEmF')
return feed.toRssFeed({
title: "Cory Dransfeldt's activity feed",
language: 'en',
url: 'https://coryd.dev/follow/',
subtitle: "Cory Dransfeldt's activity across the web.",
})
}
}

View file

@ -7,6 +7,16 @@
resolved "https://registry.yarnpkg.com/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz#b3c8fa6c91c4a29257e70dd19d26cca75cde89d2" resolved "https://registry.yarnpkg.com/@11ty/dependency-tree/-/dependency-tree-2.0.1.tgz#b3c8fa6c91c4a29257e70dd19d26cca75cde89d2"
integrity sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg== integrity sha512-5R+DsT9LJ9tXiSQ4y+KLFppCkQyXhzAm1AIuBWE/sbU0hSXY5pkhoqQYEcPJQFg/nglL+wD55iv2j+7O96UAvg==
"@11ty/eleventy-activity-feed@^1.0.9":
version "1.0.9"
resolved "https://registry.yarnpkg.com/@11ty/eleventy-activity-feed/-/eleventy-activity-feed-1.0.9.tgz#20021b30c2012e26c0eedf59d38aa5bb3d658787"
integrity sha512-iKRPzoXAuA+vOWVC6Plk4s1jYyT57korx/23DwnVWeQNDsm2QY0phFjYEVjoIn/PFTgf/iWM6SG5cEOcE5CuDw==
dependencies:
"@11ty/eleventy-fetch" "^3.0.0"
"@11ty/eleventy-plugin-rss" "^1.2.0"
dotenv "^16.0.3"
fast-xml-parser "^4.0.14"
"@11ty/eleventy-dev-server@^1.0.3": "@11ty/eleventy-dev-server@^1.0.3":
version "1.0.4" version "1.0.4"
resolved "https://registry.yarnpkg.com/@11ty/eleventy-dev-server/-/eleventy-dev-server-1.0.4.tgz#87c2cf182ed22f90ac2793e1e1337a0d9e32b318" resolved "https://registry.yarnpkg.com/@11ty/eleventy-dev-server/-/eleventy-dev-server-1.0.4.tgz#87c2cf182ed22f90ac2793e1e1337a0d9e32b318"
@ -46,6 +56,15 @@
p-queue "^6.6.2" p-queue "^6.6.2"
sharp "^0.31.3" sharp "^0.31.3"
"@11ty/eleventy-plugin-rss@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-1.2.0.tgz#06d9901adcd3bcbd912c32427adfb751e596b7e9"
integrity sha512-YzFnSH/5pObcFnqZ2sAQ782WmpOZHj1+xB9ydY/0j7BZ2jUNahn53VmwCB/sBRwXA/Fbwwj90q1MLo01Ru0UaQ==
dependencies:
debug "^4.3.4"
posthtml "^0.16.6"
posthtml-urls "1.0.0"
"@11ty/eleventy-plugin-syntaxhighlight@^4.2.0": "@11ty/eleventy-plugin-syntaxhighlight@^4.2.0":
version "4.2.0" version "4.2.0"
resolved "https://registry.yarnpkg.com/@11ty/eleventy-plugin-syntaxhighlight/-/eleventy-plugin-syntaxhighlight-4.2.0.tgz#f0c2d059ce4daabce06af4ae4c48f0084c7c9f20" resolved "https://registry.yarnpkg.com/@11ty/eleventy-plugin-syntaxhighlight/-/eleventy-plugin-syntaxhighlight-4.2.0.tgz#f0c2d059ce4daabce06af4ae4c48f0084c7c9f20"
@ -203,6 +222,16 @@
resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe" resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe"
integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg== integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==
"@extractus/feed-extractor@^6.2.1":
version "6.2.1"
resolved "https://registry.yarnpkg.com/@extractus/feed-extractor/-/feed-extractor-6.2.1.tgz#9f9295a4c997f7711a068afe7d7fdb7ef6bce863"
integrity sha512-zCIcvp4CDhgqdX17MJenBCXXm4NMVFJyKmvVMzl3LwOyFUEmpO4WGjtzXhxw1XN1Mjj5gvPclJNPgRBGlom2zA==
dependencies:
bellajs "^11.1.1"
cross-fetch "^3.1.5"
fast-xml-parser "^4.0.13"
html-entities "^2.3.3"
"@fontsource/inter@^4.5.15": "@fontsource/inter@^4.5.15":
version "4.5.15" version "4.5.15"
resolved "https://registry.yarnpkg.com/@fontsource/inter/-/inter-4.5.15.tgz#eed1873d68755d3b52d6fcfcfa3493118430a512" resolved "https://registry.yarnpkg.com/@fontsource/inter/-/inter-4.5.15.tgz#eed1873d68755d3b52d6fcfcfa3493118430a512"
@ -545,6 +574,11 @@ bcp-47@^1.0.0:
is-alphanumerical "^1.0.0" is-alphanumerical "^1.0.0"
is-decimal "^1.0.0" is-decimal "^1.0.0"
bellajs@^11.1.1:
version "11.1.2"
resolved "https://registry.yarnpkg.com/bellajs/-/bellajs-11.1.2.tgz#1b7d5660bd7f34158349e76b1451461d938f1d50"
integrity sha512-2Fy3Km5JKyIy/KunW3oica2gZtkjD2qSqti2Q3xPhHvXXdMbc+32pEMOPG+xrSat0BXVhRjHIx++lzxIPK0GqQ==
binary-extensions@^2.0.0: binary-extensions@^2.0.0:
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
@ -872,6 +906,13 @@ cors@~2.8.5:
object-assign "^4" object-assign "^4"
vary "^1" vary "^1"
cross-fetch@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
dependencies:
node-fetch "2.6.7"
cross-spawn@^7.0.2, cross-spawn@^7.0.3: cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3" version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@ -1071,6 +1112,23 @@ domutils@^3.0.1:
domelementtype "^2.3.0" domelementtype "^2.3.0"
domhandler "^5.0.1" domhandler "^5.0.1"
dotenv-flow@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/dotenv-flow/-/dotenv-flow-3.2.0.tgz#a5d79dd60ddb6843d457a4874aaf122cf659a8b7"
integrity sha512-GEB6RrR4AbqDJvNSFrYHqZ33IKKbzkvLYiD5eo4+9aFXr4Y4G+QaFrB/fNp0y6McWBmvaPn3ZNjIufnj8irCtg==
dependencies:
dotenv "^8.0.0"
dotenv@^16.0.3:
version "16.0.3"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07"
integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==
dotenv@^8.0.0:
version "8.6.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b"
integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
easy-extender@^2.3.4: easy-extender@^2.3.4:
version "2.3.4" version "2.3.4"
resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f"
@ -1383,6 +1441,13 @@ fast-levenshtein@^2.0.6:
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
fast-xml-parser@^4.0.13, fast-xml-parser@^4.0.14:
version "4.1.3"
resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.1.3.tgz#0254ad0d4d27f07e6b48254b068c0c137488dd97"
integrity sha512-LsNDahCiCcJPe8NO7HijcnukHB24tKbfDDA5IILx9dmW3Frb52lhbeX6MPNUSvyGNfav2VTYpJ/OqkRoVLrh2Q==
dependencies:
strnum "^1.0.5"
fastq@^1.6.0: fastq@^1.6.0:
version "1.15.0" version "1.15.0"
resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a"
@ -1631,6 +1696,11 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
html-entities@^2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46"
integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==
html-escaper@^3.0.3: html-escaper@^3.0.3:
version "3.0.3" version "3.0.3"
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-3.0.3.tgz#4d336674652beb1dcbc29ef6b6ba7f6be6fdfed6"
@ -2360,6 +2430,13 @@ node-addon-api@^5.0.0:
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762"
integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
node-fetch@2.6.7:
version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
dependencies:
whatwg-url "^5.0.0"
node-fetch@^2.6.7: node-fetch@^2.6.7:
version "2.6.9" version "2.6.9"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
@ -2653,7 +2730,7 @@ posthtml-render@^3.0.0:
dependencies: dependencies:
is-json "^2.0.1" is-json "^2.0.1"
posthtml-urls@^1.0.0: posthtml-urls@1.0.0, posthtml-urls@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/posthtml-urls/-/posthtml-urls-1.0.0.tgz#3102d7b9e5c2fbdf19c8ec7ca825600dad3b9164" resolved "https://registry.yarnpkg.com/posthtml-urls/-/posthtml-urls-1.0.0.tgz#3102d7b9e5c2fbdf19c8ec7ca825600dad3b9164"
integrity sha512-CMJ0L009sGQVUuYM/g6WJdscsq6ooAwhUuF6CDlYPMLxKp2rmCYVebEU+wZGxnQstGJhZPMvXsRhtqekILd5/w== integrity sha512-CMJ0L009sGQVUuYM/g6WJdscsq6ooAwhUuF6CDlYPMLxKp2rmCYVebEU+wZGxnQstGJhZPMvXsRhtqekILd5/w==
@ -3337,6 +3414,11 @@ strip-json-comments@~2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
strnum@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db"
integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==
supports-color@^7.1.0: supports-color@^7.1.0:
version "7.2.0" version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"