Compare commits

..

5 commits

Author SHA1 Message Date
Hippo
8926493a2b Make CSS styles more ereader-friendly
Using tricks from https://friendsofepub.github.io/eBookTricks/
although they don't seem to really work; at least the small caps
aren't becoming small caps :/
2021-04-13 21:17:47 +05:30
Hippo
98ac5a8884 Lowercase titles while rendering
CSS lowercasing doesn't work in ereaders, so we have to do it
manually
2021-04-13 20:58:46 +05:30
Hippo
1ddc5f4e7c Add fonts and styling for articles
Note: Due to nodepub limitations, the fonts are only named, but
not actually embedded. To embed them, you'll have to do something
roundabout like opening the ePub in the Calibre ePub Editor and
embedding them from there. Hopefully this will get resolved at
some point :/
2021-04-03 22:02:21 +05:30
Hippo
d475a5bde9 ePub: download and insert article images before rendering
This includes the feature image as well as other inline images.
2021-04-03 22:01:02 +05:30
Hippo
d5fd82e421 Allow basic Ghost -> ePub collation!
This doesn't include images and stuff, but hey, at least we've
got the basics covered!
2021-04-02 20:59:22 +05:30
7 changed files with 587 additions and 231 deletions

View file

@ -40,15 +40,10 @@ files, and for your Ghost API interface. The parameters to set are:
* `WEBDAV_SERVER_URL` - location of your WebDAV server * `WEBDAV_SERVER_URL` - location of your WebDAV server
* `WEBDAV_USERNAME` - username for signing in * `WEBDAV_USERNAME` - username for signing in
* `WEBDAV_PASSWORD` - password, likewise * `WEBDAV_PASSWORD` - password, likewise
* `WEBDAV_PATH_PREFIX` - prefix to add to all WebDAV paths: no uploads * `WEBDAV_UPLOADED_PATH` - path where uploaded images will be served (it
will happen outside of this path could end up being different from `WEBDAV_SERVER_URL`: say you go to
* `UPLOADED_PATH_PREFIX` - path where uploaded images will be `https://myhost.com:1234/dav/[folder]` to upload, but the public sees
served (it could end up being different from `WEBDAV_SERVER_URL`: say it as `https://media.mysite.com/[folder]`.
you go to `https://myhost.com:1234/dav/[folder]` to upload, but the
public sees it as `https://media.mysite.com/[folder]`—or, more
significantly, when you're doing a local-directory upload!
* `LOCAL_UPLOAD_PATH_PREFIX` - path where uploaded images will be copied
locally, if you choose not to use WebDAV
* `GHOST_URL` - URL of your Ghost installation * `GHOST_URL` - URL of your Ghost installation
* `GHOST_VERSION` - 'v2' or 'v3' depending on which version you're using * `GHOST_VERSION` - 'v2' or 'v3' depending on which version you're using
* `GHOST_ADMIN_KEY` - 'Admi API key for Ghost' * `GHOST_ADMIN_KEY` - 'Admi API key for Ghost'
@ -56,11 +51,7 @@ files, and for your Ghost API interface. The parameters to set are:
In case you're wondering about the WebDAV server: that's the setup we In case you're wondering about the WebDAV server: that's the setup we
use at Snipette. We'd like to eventually let you upload directly through use at Snipette. We'd like to eventually let you upload directly through
Ghost as well, but we're prioritising our setup first to get running Ghost as well, but we're prioritising our setup first to get running
before we think of anything else. before we think of anything else. Pull requests are welcome!
Now, we've got a "local upload" option as well which basically copies
the file to a specified directory on the system. Pull requests for
anything else are welcome!
## Pull a post from Medium ## Pull a post from Medium

114
cli.js
View file

@ -42,82 +42,39 @@ program.command('setup')
'\n\nWe\'re going to take you through some steps' + '\n\nWe\'re going to take you through some steps' +
' to set up your system.\n' ' to set up your system.\n'
) )
console.log('First up: WebDAV details.')
console.log(
'Please enter your server url (including the port), ' +
'username, and password\n'
)
var res var res
prompt.start() prompt.start()
console.log('First up: File uploads.')
console.log(
'Would you like to upload your files via WebDAV, or just ' +
'copy them to a local folder on your filesystem? Type ' +
'"webdav" or "local" to choose.\n'
)
res = await prompt.get([ res = await prompt.get([
{ { name: 'server_url', default: config.webdav.server_url || '' },
name: 'upload_mode', { name: 'username', default: config.webdav.username || '' },
default: 'webdav', { name: 'password', default: config.webdav.password || '' , hidden: true},
pattern: /^(webdav|local)$/ig,
message: 'Please enter "webdav" or "local"',
},
]) ])
config.webdav.server_url = res.server_url
config.webdav.username = res.username
config.webdav.password = res.password
console.log(`\nOkay. So we have ${config.webdav.username} on ${config.webdav.server_url} with [ the password you set]`)
if (res.upload_mode == 'webdav') { console.log(
'\nA couple more settings for your WebDAV: ' +
console.log('You\'re going with WebDAV? Awesome!') 'we need to know the path prefix and the uploaded path prefix.\n' +
console.log( 'The path prefix is the subfolder to which you upload, like ' +
'Please enter your server url (including the port), ' + '`/seance-uploads`, while the uploaded path prefix is what '+
'username, and password\n' 'you\'d stick in front of the filename after uploading ' +
) '(like `https://media.mysite.com/seance-uploads`).\n'
)
res = await prompt.get([ res = await prompt.get([
{ name: 'server_url', default: config.webdav.server_url || '' }, { name: 'path_prefix', default: config.webdav.path_prefix || '' },
{ name: 'username', default: config.webdav.username || '' }, { name: 'uploaded_path_prefix', default: config.webdav.uploaded_path_prefix || '' },
{ name: 'password', default: config.webdav.password || '' , hidden: true}, ])
]) config.webdav.path_prefix = res.path_prefix
config.webdav.server_url = res.server_url config.webdav.uploaded_path_prefix = res.uploaded_path_prefix
config.webdav.username = res.username console.log(`Cool. So uploads to ${config.webdav.path_prefix} will go to ${config.webdav.uploaded_path_prefix}.`)
config.webdav.password = res.password
console.log(`\nOkay. So we have ${config.webdav.username} on ${config.webdav.server_url} with [ the password you set]`)
console.log(
'\nA couple more settings for your WebDAV: ' +
'we need to know the path prefix and the uploaded path prefix.\n' +
'The path prefix is the subfolder to which you upload, like ' +
'`/seance-uploads`, while the uploaded path prefix is what '+
'you\'d stick in front of the filename after uploading ' +
'(like `https://media.mysite.com/seance-uploads`).\n'
)
res = await prompt.get([
{ name: 'path_prefix', default: config.webdav.path_prefix || '' },
{
name: 'uploaded_path_prefix',
default: config.uploaded_path_prefix || config.webdav.uploaded_path_prefix || ''
},
])
config.webdav.path_prefix = res.path_prefix
config.uploaded_path_prefix = res.uploaded_path_prefix
console.log(`Cool. So uploads to ${config.webdav.path_prefix} will be visible at ${config.uploaded_path_prefix}.`)
} else if (res.upload_mode == 'local') {
console.log('You\'re saving files locally? Smart!')
console.log(
'Two settings we need to know to get things running ' +
'smoothly: we need the local path/folder where you\'ll be ' +
'uploading the files, and the uploaded path prefix.\n' +
'The local path is the folder to which you upload, like ' +
'`/var/www/seance-uploads`, while the uploaded path prefix ' +
'is what you\'d stick in front of the filename after ' +
'uploading (like `https://media.mysite.com/seance-uploads`).\n'
)
res = await prompt.get([
{ name: 'path_prefix', default: config.local_upload.path_prefix || '' },
{ name: 'uploaded_path_prefix', default: config.uploaded_path_prefix || '' },
])
config.local_upload.path_prefix = res.path_prefix
config.uploaded_path_prefix = res.uploaded_path_prefix
console.log(`Cool. So uploads to ${config.local_upload.path_prefix} will be visible at ${config.uploaded_path_prefix}.`)
}
console.log('\n\nNext up: Ghost settings.') console.log('\n\nNext up: Ghost settings.')
console.log( console.log(
@ -230,6 +187,23 @@ program.command('webdav-test <file>')
new seance.uploadDav(dir_path, file); new seance.uploadDav(dir_path, file);
}); });
program.command('fetch-epub [postSlugs...]')
.description('fetch posts from Ghost and collate them into a ePub')
.option('-t, --title <title>', 'title of the final book')
.option('-a, --author <author>', 'author of the book')
.option('-g, --genre <genre>', 'genre of the book', 'Unknown')
.option('-c, --cover-image <file>', 'what to use as the epub cover')
.option('-O, --output-folder <path>', 'where to output the file', '.')
.action(async (postSlug, o) => {
await seance.fetchToEpub(postSlug, {
title: o.title,
author: o.author,
genre: o.genre,
coverImage: o.coverImage,
outputFolder: o.outputFolder,
})
})
program.command('check-scissors <file>') program.command('check-scissors <file>')
.description('[test command] check if an image matches the set separator') .description('[test command] check if an image matches the set separator')
.action(async (file) => { .action(async (file) => {

View file

@ -1,36 +1,26 @@
// load configuraton from .env file (if exists) // load configuraton from .env file (if exists)
require('dotenv').config() require('dotenv').config()
const convict = require('convict') const convict = require('convict')
const convict_format_with_validator = require('convict-format-with-validator')
const os = require('os') const os = require('os')
const path = require('path') const path = require('path')
const yaml = require('js-yaml') const yaml = require('js-yaml')
const fs = require('fs') const fs = require('fs')
convict.addFormats(convict_format_with_validator)
convict.addParser({ extension: ['yml', 'yaml'], parse: yaml.safeLoad }) convict.addParser({ extension: ['yml', 'yaml'], parse: yaml.safeLoad })
let config = convict({ let config = convict({
uploaded_path_prefix: {
doc: 'URL where files are uploaded (eg. https://mysitem.com/media)',
format: 'url',
env: 'UPLOADED_PATH_PREFIX',
default: null,
},
webdav: { webdav: {
server_url: { server_url: {
doc: 'WebDAV server URL (eg. https://myhost.com:2078)', doc: 'WebDAV server URL (eg. https://myhost.com:2078)',
format: 'url', format: 'url',
env: 'WEBDAV_SERVER_URL', env: 'WEBDAV_SERVER_URL',
default: null, default: null,
nullable: true,
}, },
username: { username: {
doc: 'Username for WebDAV server', doc: 'Username for WebDAV server',
format: 'String', format: 'String',
env: 'WEBDAV_USERNAME', env: 'WEBDAV_USERNAME',
default: null, default: null,
nullable: true,
}, },
password: { password: {
doc: 'Password for WebDAV server', doc: 'Password for WebDAV server',
@ -38,21 +28,18 @@ let config = convict({
env: 'WEBDAV_PASSWORD', env: 'WEBDAV_PASSWORD',
default: null, default: null,
sensitive: true, sensitive: true,
nullable: true,
}, },
path_prefix: { path_prefix: {
doc: 'Where to upload files (eg. /seance-uploads)', doc: 'Where to upload files (eg. /seance-uploads)',
format: 'String', format: 'String',
env: 'WEBDAV_PATH_PREFIX', env: 'WEBDAV_PATH_PREFIX',
default: null, default: null,
nullable: true,
}, },
uploaded_path_prefix: { // FIXME: Deprecated; remove uploaded_path_prefix: {
doc: 'URL where files are uploaded (eg. https://mysitem.com/media)', doc: 'URL where files are uploaded (eg. https://mysitem.com/media)',
format: 'url', format: 'url',
env: 'WEBDAV_UPLOADED_PATH_PREFIX', env: 'WEBDAV_UPLOADED_PATH_PREFIX',
default: null, default: null,
nullable: true,
}, },
use_digest: { use_digest: {
doc: 'Whether to use digest authentication', doc: 'Whether to use digest authentication',
@ -61,14 +48,6 @@ let config = convict({
default: false, default: false,
} }
}, },
local_upload: {
path_prefix: {
doc: 'Where to upload files locally (eg. /media/seance-uploads)',
format: 'String',
env: 'LOCAL_UPLOAD_PATH_PREFIX',
default: null,
},
},
ghost: { ghost: {
url: { url: {
doc: 'URL of Ghost installation', doc: 'URL of Ghost installation',
@ -94,7 +73,7 @@ let config = convict({
format: '*', // TODO: validate by checking path format: '*', // TODO: validate by checking path
env: 'SEPARATOR_IMAGE', env: 'SEPARATOR_IMAGE',
default: null, default: null,
}, }
}) })
// Load configs from home directory, if present // Load configs from home directory, if present
@ -119,17 +98,6 @@ try {
validated = false validated = false
} }
// Update deprecated value: config.webdav.uploaded_path_prefix
if (!!config.webdav && !!config.webdav.uploaded_path_prefix) {
console.warn(
'Warning: config.webdav.uploaded_path_prefix and the ' +
'WEBDAV_UPLOADED_PATH_PREFIX environment variable are ' +
'deprecated! Please use config.uploaded_path_prefix or ' +
'the UPLOADED_PATH_PREFIX environment variable instead.'
)
config.uploaded_path_prefix = config.webdav.uploaded_path_prefix
}
allConf = config.getProperties() allConf = config.getProperties()
allConf.validated = validated allConf.validated = validated

View file

@ -20,9 +20,9 @@
"babel-preset-env": "^1.7.0", "babel-preset-env": "^1.7.0",
"body-parser": "^1.19.0", "body-parser": "^1.19.0",
"bulma": "^0.8.2", "bulma": "^0.8.2",
"cheerio": "^1.0.0-rc.5",
"commander": "^3.0.2", "commander": "^3.0.2",
"convict": "6", "convict": "^5.2.0",
"convict-format-with-validator": "^6.2.0",
"css-loader": "^3.5.3", "css-loader": "^3.5.3",
"dotenv": "^8.2.0", "dotenv": "^8.2.0",
"express": "^4.17.1", "express": "^4.17.1",
@ -32,6 +32,7 @@
"mediumexporter": "github:badrihippo/mediumexporter#seance-latest", "mediumexporter": "github:badrihippo/mediumexporter#seance-latest",
"mini-css-extract-plugin": "^0.9.0", "mini-css-extract-plugin": "^0.9.0",
"node-sass": "^4.14.1", "node-sass": "^4.14.1",
"nodepub": "^3.0.1",
"postcss-loader": "^3.0.0", "postcss-loader": "^3.0.0",
"prompt-async": "^0.9.9", "prompt-async": "^0.9.9",
"r2": "^2.0.1", "r2": "^2.0.1",
@ -47,6 +48,6 @@
"webpack-node-externals": "^1.7.2" "webpack-node-externals": "^1.7.2"
}, },
"engines": { "engines": {
"node": ">=12.x" "node": "12.x"
} }
} }

BIN
random-cover.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

279
seance.js
View file

@ -9,7 +9,10 @@ const readline = require('readline')
const { markdown } = require('markdown') const { markdown } = require('markdown')
const GhostAdminAPI = require('@tryghost/admin-api') const GhostAdminAPI = require('@tryghost/admin-api')
const { Canvas, Image } = require('canvas') const { Canvas, Image } = require('canvas')
const slugify = require('underscore.string/slugify')
const Rembrandt = require('rembrandt') const Rembrandt = require('rembrandt')
const nodepub = require('nodepub')
const cheerio = require('cheerio')
const config = require('./config') const config = require('./config')
@ -116,7 +119,7 @@ class Seance {
* @param {Boolean} options.noUpload Skip uploading of images * @param {Boolean} options.noUpload Skip uploading of images
* @param {Boolean} options.noPush Skip pushing to Ghost; just generate the file * @param {Boolean} options.noPush Skip pushing to Ghost; just generate the file
* @param {Boolean} options.dryRun Combination of noUpload and noPush * @param {Boolean} options.dryRun Combination of noUpload and noPush
* @returns [string] status * @returns [object] object containing details of the uploaded Ghost post
*/ */
async pushToGhost (postSlug, options={}) { async pushToGhost (postSlug, options={}) {
this.emit('update', { this.emit('update', {
@ -159,7 +162,7 @@ class Seance {
return false return false
} }
// Decide file/WebDAV upload path // Decide WebDAV upload path
var current_date = new Date() var current_date = new Date()
const uploadPath = path.join( const uploadPath = path.join(
@ -168,9 +171,12 @@ class Seance {
postSlug postSlug
) )
// Public path to upload those files (eg. https://example.com:2078) // Path where WebDAV files will be placed (eg. https://example.com:2078)
const davPath = path.join(config.webdav.path_prefix, uploadPath)
// Public path to upload those files (eg. https://media.example.com/uploads)
// We'll do it directly since path.join mangles the protocol // We'll do it directly since path.join mangles the protocol
const uploadedPath = config.uploaded_path_prefix + '/' + uploadPath const uploadedPath = config.webdav.uploaded_path_prefix + '/' + uploadPath
// load metadata file // load metadata file
this.emit('update', { this.emit('update', {
@ -267,7 +273,7 @@ class Seance {
// Let's wait for the upload, just to avoid conflicts // Let's wait for the upload, just to avoid conflicts
if (!options.noUpload) { if (!options.noUpload) {
await this.upload(uploadPath, imagePath) await this.uploadDav(davPath, imagePath)
} }
newLine = '![' + imageAlt + '](' + uploadedPath + '/' + imageName + ')' newLine = '![' + imageAlt + '](' + uploadedPath + '/' + imageName + ')'
@ -317,7 +323,7 @@ class Seance {
}) })
if (!options.noUpload) { if (!options.noUpload) {
this.upload(uploadPath, imagePath) this.uploadDav(davPath, imagePath)
} }
featuredImagePath = uploadedPath + '/' + imageName featuredImagePath = uploadedPath + '/' + imageName
@ -564,7 +570,8 @@ class Seance {
loglevel: 'info' loglevel: 'info'
}) })
await this.upload('avatars', filePath) await this.uploadDav(path.join(config.webdav.path_prefix,'avatars'),
filePath)
// Generate Ghost JSON // Generate Ghost JSON
@ -577,7 +584,7 @@ class Seance {
bio: json.payload.user.bio, bio: json.payload.user.bio,
email: email, email: email,
name: json.payload.user.name, name: json.payload.user.name,
profile_image: config.uploaded_path_prefix + '/avatars/' + fileName profile_image: config.webdav.uploaded_path_prefix + '/avatars/' + fileName
} }
] ]
}, },
@ -676,9 +683,6 @@ class Seance {
* @returns [string] status * @returns [string] status
*/ */
async uploadDav (dirPath, filePath) { async uploadDav (dirPath, filePath) {
// Set uploadPath
// We'll do it directly since path.join mangles the protocol
let uploadPath = path.join(config.webdav.path_prefix, dirPath)
// connect to webdav // connect to webdav
const client = createClient( const client = createClient(
@ -691,7 +695,7 @@ class Seance {
// create directory if not exists // create directory if not exists
console.debug(`[dav-upload] Loading ${dirPath}`) console.debug(`[dav-upload] Loading ${dirPath}`)
if (!await this.createDirIfNotExist(client, uploadPath)) { if (!await this.createDirIfNotExist(client, dirPath)) {
console.error(`[dav-upload] Could not upload ${path.basename(filePath)} :(`) console.error(`[dav-upload] Could not upload ${path.basename(filePath)} :(`)
return false return false
} }
@ -699,7 +703,7 @@ class Seance {
// upload a file // upload a file
console.debug('Uploading file') console.debug('Uploading file')
const outStream = client.createWriteStream( const outStream = client.createWriteStream(
path.join(uploadPath, path.basename(filePath)) path.join(dirPath, path.basename(filePath))
) )
outStream.on('finish', () => console.debug('Uploaded successfully.')) outStream.on('finish', () => console.debug('Uploaded successfully.'))
@ -711,88 +715,197 @@ class Seance {
/** /**
* function [exists] * function [fetchToEpub]
* @returns [boolean] * @description fetches posts from Ghost and packs them into an epub
* * @options.id unique ID for the generated epub
* check if the given file exists or not * @options.title title of the generated epub
*/ * @options.author author of the generated epub
async fsExists (path) { * @options.language language of the book
try { * @genre genre of the book
await fs.promises.access(path) * @cover cover image to use
return true
} catch {
return false
}
}
/**
* function [uploadLocal]
* @returns [string] status * @returns [string] status
*
* upload to a local file path. This should technically be
* called "copy" and not "upload", but the equivalent
* WebDAV one is actually an upload so ¯\_()_/¯
*/ */
async uploadLocal (dirPath, filePath) { async fetchToEpub (postSlugs, options = {}) {
// Set uploadPath if (!options.title) options.title = 'Seance Collection'
// We'll do it directly since path.join mangles the protocol if (!options.author) options.author = 'Seance'
let uploadPath = path.join(config.local_upload.path_prefix, dirPath) if (!options.language) options.language = 'en'
if (!options.genre) options.genre = 'Unknown'
if (!options.coverImage) options.coverImage = 'random-cover.jpg'
if (!options.outputFolder) options.outputFolder = '.'
// safety: don't touch directories outside LOCAL_UPLOAD_PATH_PREFIX
if (!uploadPath.startsWith(config.local_upload.path_prefix)) { console.log(`Fetching: ${postSlugs}`)
console.error(`[local-upload] Cannot create directories outside ${config.local_upload.path_prefix}`) let allPosts = []
return false
// first, fetch all the posts
for (let slug of postSlugs) {
console.log(`Fetching: ${slug}`)
let post = await this.ghostAdmin.posts.read({slug: slug}, {formats: ['html']})
allPosts.push(post)
} }
// create directory if not exists // prepare for image downloads, starting with the scissors!
console.debug(`[local-upload] Loading ${uploadPath}`) let pics = [path.join(__dirname, 'scissors.png')]
if ( let picFolder = path.join(options.outputFolder, 'seance-images')
!(await this.fsExists(uploadPath)) || if (!fs.existsSync(picFolder)) {
!(await fs.promises.lstat(uploadPath)).isDirectory() fs.mkdirSync(picFolder, { recursive: true })
) { }
if (!(await fs.promises.mkdir(uploadPath,
{ recursive: true }))) { // prepare array to collect processed posts
console.error(`[local-upload] Could not upload ${path.basename(filePath)} :(`) let processedPosts = []
return false
for (let post of allPosts) {
// decide a post slug, for future files
let postSlug = slugify(post.title)
// get the cover pic
let featurePicTag
if (!!post.feature_image) {
let imgUrl = post.feature_image
if (/^\/\//i.test(imgUrl)) {
imgUrl = 'https:' + imgUrl
} else if (!/^https?:\/\//i.test(imgUrl)) {
imgUrl = 'https://' + imgUrl
}
let response = await (await r2.get(imgUrl).response).buffer()
let ext = post.feature_image.split('.').pop()
await await fs.promises.writeFile(path.join(picFolder, `${postSlug}.${ext}`), response, 'base64')
featurePicTag = `<img src="../images/${postSlug}.${ext}"/>`
pics.push(`${picFolder}/${postSlug}.${ext}`)
} }
let c = cheerio.load(`${featurePicTag}<h1>${post.title.toLowerCase()}</h1>${post.html}`)
// hunt for other pics
// TODO: make asynchronous
let picCounter = 0
c('img').each(async function() {
// skip if it's a local image
if (c(this).attr('src').indexOf('../images') == 0) {
return
}
// first, process the url
let imgUrl = c(this).attr('src')
console.log('Downloading:', imgUrl)
if (/^\/\//i.test(imgUrl)) {
imgUrl = 'https:' + imgUrl
} else if (!/^https?:\/\//i.test(imgUrl)) {
imgUrl = 'https://' + imgUrl
}
// now decide an output name
let ext = c(this).attr('src').split('.').pop()
let imageFile = path.join(picFolder, `${postSlug}-insert-${picCounter}.${ext}`)
// note down our calculations
c(this).attr('src', `../images/${postSlug}-insert-${picCounter}.${ext}`)
pics.push(imageFile)
picCounter = picCounter + 1
// finally, download the images
let response = await (await r2.get(imgUrl).response).buffer()
await fs.promises.writeFile(imageFile, response, 'base64')
console.log('Downloaded to:', imageFile)
})
processedPosts.push({
title: post.title,
body: c.html(),
})
} }
// actually do the copying // decide metadata
console.debug('Uploading file') let metadata = {
try { id: 'seance-test', // FIXME
await fs.promises.copyFile(filePath, title: options.title,
path.join(uploadPath, path.basename(filePath))) author: options.author,
} catch (err) { language: options.language,
console.error(`Upload error: ${err}`) contents: 'Table of Contents',
genre: options.genre,
cover: options.coverImage,
images: pics,
} }
return true // create the ePub
let epub = nodepub.document(metadata)
// add the documents
for (let post of processedPosts) {
epub.addSection(post.title, post.body)
}
// add the styles
epub.addCSS(`
img {
width: 100%;
height: auto;
object-fit: contain;
}
h1 {
font-family: "Abhaya Libre Extrabold";
text-transform: lowercase;
text-align: center;
font-size: 2em;
line-height: 1em;
margin-bottom: 0;
}
h1 + h2 {
font-family: "Open Sans Light";
font-variant: small-caps;
text-align: center;
font-size: 1.2em;
line-height: 1em;
margin-bottom: 1.2em;
}
@supports not (font-variant-caps: small-caps) {
h1 + h2 {
font-variant: normal;
font-feature-settings: "smcp", "onum", "pnum";
}
}
@supports (font-variant-caps: small-caps) {
h1 + h2 {
font-variant: normal;
font-variant-caps: small-caps;
}
}
p {
font-family: "Crimson Text Regular";
font-size: 1em;
line-height: 1.2em;
}
hr {
display: block;
border: 0px;
height: 1em;
background-image:url('../images/scissors.png');
background-size: contain;
background-repeat: no-repeat;
background-position: 50%;
margin-top: 1.5em;
margin-bottom: 1.5em;
page-break-inside: avoid;
break-inside: avoid;
}
@supports not ((page-break-inside: avoid) and (break-inside: avoid)) {
hr {
-webkit-column-break-inside: avoid;
}
}
`)
// generate it!
await epub.writeEPUB(options.outputFolder, options.title)
} }
/**
* function [upload]
* @returns [boolean] status
*
* upload to WebDAV or a local folder, whichever is configured.
* If both are considered, WebDAV will be preferred.
*/
async upload (dirPath, filePath) {
if (
!!config.webdav &&
!!config.webdav.server_url &&
!!config.webdav.path_prefix
) {
return await this.uploadDav(dirPath, filePath)
} else if (
!!config.local_upload &&
!!config.local_upload.path_prefix
) {
return await this.uploadLocal(dirPath, filePath)
} else {
throw { error: 'Either webdav or local_upload settings must be configured!' }
}
}
} }
// Make Seance an EventEmitter // Make Seance an EventEmitter

363
yarn.lock
View file

@ -299,6 +299,35 @@ aproba@^1.0.3, aproba@^1.1.1:
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
archiver-utils@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2"
integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==
dependencies:
glob "^7.1.4"
graceful-fs "^4.2.0"
lazystream "^1.0.0"
lodash.defaults "^4.2.0"
lodash.difference "^4.5.0"
lodash.flatten "^4.4.0"
lodash.isplainobject "^4.0.6"
lodash.union "^4.6.0"
normalize-path "^3.0.0"
readable-stream "^2.0.0"
archiver@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.0.tgz#dd3e097624481741df626267564f7dd8640a45ba"
integrity sha512-iUw+oDwK0fgNpvveEsdQ0Ase6IIKztBJU2U0E9MzszMfmVVUyv1QJhS2ITW9ZCqx8dktAxVAjWWkKehuZE8OPg==
dependencies:
archiver-utils "^2.1.0"
async "^3.2.0"
buffer-crc32 "^0.2.1"
readable-stream "^3.6.0"
readdir-glob "^1.0.0"
tar-stream "^2.2.0"
zip-stream "^4.1.0"
are-we-there-yet@~1.1.2: are-we-there-yet@~1.1.2:
version "1.1.5" version "1.1.5"
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
@ -400,6 +429,11 @@ async@^2.3.0:
dependencies: dependencies:
lodash "^4.17.14" lodash "^4.17.14"
async@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
async@~0.9.0: async@~0.9.0:
version "0.9.2" version "0.9.2"
resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
@ -1025,6 +1059,11 @@ base64-js@^1.0.2:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
base@^0.11.1: base@^0.11.1:
version "0.11.2" version "0.11.2"
resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
@ -1062,6 +1101,15 @@ bindings@^1.5.0:
dependencies: dependencies:
file-uri-to-path "1.0.0" file-uri-to-path "1.0.0"
bl@^4.0.3:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
readable-stream "^3.4.0"
block-stream@*: block-stream@*:
version "0.0.9" version "0.0.9"
resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
@ -1095,6 +1143,11 @@ body-parser@1.19.0, body-parser@^1.19.0:
raw-body "2.4.0" raw-body "2.4.0"
type-is "~1.6.17" type-is "~1.6.17"
boolbase@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
brace-expansion@^1.1.7: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@ -1207,6 +1260,11 @@ browserslist@^3.2.6:
caniuse-lite "^1.0.30000844" caniuse-lite "^1.0.30000844"
electron-to-chromium "^1.3.47" electron-to-chromium "^1.3.47"
buffer-crc32@^0.2.1, buffer-crc32@^0.2.13:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
buffer-equal-constant-time@1.0.1: buffer-equal-constant-time@1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
@ -1231,6 +1289,14 @@ buffer@^4.3.0:
ieee754 "^1.1.4" ieee754 "^1.1.4"
isarray "^1.0.0" isarray "^1.0.0"
buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.1.13"
builtin-status-codes@^3.0.0: builtin-status-codes@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
@ -1383,6 +1449,30 @@ chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5" escape-string-regexp "^1.0.5"
supports-color "^5.3.0" supports-color "^5.3.0"
cheerio-select-tmp@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/cheerio-select-tmp/-/cheerio-select-tmp-0.1.1.tgz#55bbef02a4771710195ad736d5e346763ca4e646"
integrity sha512-YYs5JvbpU19VYJyj+F7oYrIE2BOll1/hRU7rEy/5+v9BzkSo3bK81iAeeQEMI92vRIxz677m72UmJUiVwwgjfQ==
dependencies:
css-select "^3.1.2"
css-what "^4.0.0"
domelementtype "^2.1.0"
domhandler "^4.0.0"
domutils "^2.4.4"
cheerio@^1.0.0-rc.5:
version "1.0.0-rc.5"
resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.5.tgz#88907e1828674e8f9fee375188b27dadd4f0fa2f"
integrity sha512-yoqps/VCaZgN4pfXtenwHROTp8NG6/Hlt4Jpz2FEP0ZJQ+ZUkVDd0hAPDNKhj3nakpfPt/CNs57yEtxD1bXQiw==
dependencies:
cheerio-select-tmp "^0.1.0"
dom-serializer "~1.2.0"
domhandler "^4.0.0"
entities "~2.1.0"
htmlparser2 "^6.0.0"
parse5 "^6.0.0"
parse5-htmlparser2-tree-adapter "^6.0.0"
chokidar@^2.1.8: chokidar@^2.1.8:
version "2.1.8" version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
@ -1605,6 +1695,16 @@ component-emitter@^1.2.1:
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
compress-commons@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.0.tgz#25ec7a4528852ccd1d441a7d4353cd0ece11371b"
integrity sha512-ofaaLqfraD1YRTkrRKPCrGJ1pFeDG/MVCkVVV2FNGeWquSlqw5wOrwOfPQ1xF2u+blpeWASie5EubHz+vsNIgA==
dependencies:
buffer-crc32 "^0.2.13"
crc32-stream "^4.0.1"
normalize-path "^3.0.0"
readable-stream "^3.6.0"
concat-map@0.0.1: concat-map@0.0.1:
version "0.0.1" version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
@ -1661,20 +1761,16 @@ convert-source-map@^1.5.1:
dependencies: dependencies:
safe-buffer "~5.1.1" safe-buffer "~5.1.1"
convict-format-with-validator@^6.2.0: convict@^5.2.0:
version "6.2.0" version "5.2.0"
resolved "https://registry.yarnpkg.com/convict-format-with-validator/-/convict-format-with-validator-6.2.0.tgz#3cab7779e83a89351b9157685cbf20a941414192" resolved "https://registry.yarnpkg.com/convict/-/convict-5.2.0.tgz#4c01fa06885b8c4a4ffc98b7de43222fe6c876dc"
integrity sha512-2LIL3yEZY27M13UHLIP4mGivusP9h2M+X4mYsRBLexwUp8+0sgVk2MgB2b2bnQwkn293lkbkxgdevzn0nZdyzQ== integrity sha512-C3cdUwo47cCikZNzu5Vv8AL0MuXVVeg9t/Gyr9qyK5ZpCjOkMPmJ85KUF3CowNeSfj4UtztHxS+hoO9wGRh6kg==
dependencies: dependencies:
validator "^13.6.0" json5 "2.1.0"
lodash.clonedeep "4.5.0"
convict@6: moment "2.24.0"
version "6.2.0" validator "11.1.0"
resolved "https://registry.yarnpkg.com/convict/-/convict-6.2.0.tgz#d227aef6d77a4d518ca6a6a3b863bdfdb6dc5665" yargs-parser "13.0.0"
integrity sha512-aCk1+VWt3TG6SJV59u+wwuza7lvtlJfj6zH/fmE1xzx5yZnNby1lPYkccq1mKaJJXHjk9cuVCFWVVIhbkpmwRw==
dependencies:
lodash.clonedeep "^4.5.0"
yargs-parser "^20.2.7"
cookie-signature@1.0.6: cookie-signature@1.0.6:
version "1.0.6" version "1.0.6"
@ -1723,6 +1819,22 @@ cosmiconfig@^5.0.0:
js-yaml "^3.13.1" js-yaml "^3.13.1"
parse-json "^4.0.0" parse-json "^4.0.0"
crc-32@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208"
integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==
dependencies:
exit-on-epipe "~1.0.1"
printj "~1.1.0"
crc32-stream@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007"
integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==
dependencies:
crc-32 "^1.2.0"
readable-stream "^3.4.0"
create-ecdh@^4.0.0: create-ecdh@^4.0.0:
version "4.0.3" version "4.0.3"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
@ -1833,6 +1945,17 @@ css-loader@^3.5.3:
schema-utils "^2.6.6" schema-utils "^2.6.6"
semver "^6.3.0" semver "^6.3.0"
css-select@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/css-select/-/css-select-3.1.2.tgz#d52cbdc6fee379fba97fb0d3925abbd18af2d9d8"
integrity sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==
dependencies:
boolbase "^1.0.0"
css-what "^4.0.0"
domhandler "^4.0.0"
domutils "^2.4.3"
nth-check "^2.0.0"
css-selector-tokenizer@^0.7.0: css-selector-tokenizer@^0.7.0:
version "0.7.2" version "0.7.2"
resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz#11e5e27c9a48d90284f22d45061c303d7a25ad87" resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz#11e5e27c9a48d90284f22d45061c303d7a25ad87"
@ -1847,6 +1970,11 @@ css-unit-converter@^1.1.1:
resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996" resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= integrity sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=
css-what@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-4.0.0.tgz#35e73761cab2eeb3d3661126b23d7aa0e8432233"
integrity sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==
cssesc@^3.0.0: cssesc@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
@ -2063,11 +2191,41 @@ diffie-hellman@^5.0.0:
miller-rabin "^4.0.0" miller-rabin "^4.0.0"
randombytes "^2.0.0" randombytes "^2.0.0"
dom-serializer@^1.0.1, dom-serializer@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1"
integrity sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==
dependencies:
domelementtype "^2.0.1"
domhandler "^4.0.0"
entities "^2.0.0"
domain-browser@^1.1.1: domain-browser@^1.1.1:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
domelementtype@^2.0.1, domelementtype@^2.1.0, domelementtype@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57"
integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
domhandler@^4.0.0, domhandler@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.1.0.tgz#c1d8d494d5ec6db22de99e46a149c2a4d23ddd43"
integrity sha512-/6/kmsGlMY4Tup/nGVutdrK9yQi4YjWVcVeoQmixpzjOUK1U7pQkvAPHBJeUxOgxF0J8f8lwCJSlCfD0V4CMGQ==
dependencies:
domelementtype "^2.2.0"
domutils@^2.4.3, domutils@^2.4.4:
version "2.5.1"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.5.1.tgz#9b8e84b5d9f788499ae77506ea832e9b4f9aa1c0"
integrity sha512-hO1XwHMGAthA/1KL7c83oip/6UWo3FlUNIuWiWKltoiQ5oCOiqths8KknvY2jpOohUoUgnwa/+Rm7UpwpSbY/Q==
dependencies:
dom-serializer "^1.0.1"
domelementtype "^2.2.0"
domhandler "^4.1.0"
dotenv@^8.2.0: dotenv@^8.2.0:
version "8.2.0" version "8.2.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
@ -2136,7 +2294,7 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
end-of-stream@^1.0.0, end-of-stream@^1.1.0: end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4" version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@ -2157,6 +2315,16 @@ entities@^1.1.1:
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
entities@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
entities@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
errno@^0.1.3, errno@~0.1.7: errno@^0.1.3, errno@~0.1.7:
version "0.1.7" version "0.1.7"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
@ -2259,6 +2427,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
md5.js "^1.3.4" md5.js "^1.3.4"
safe-buffer "^5.1.1" safe-buffer "^5.1.1"
exit-on-epipe@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
expand-brackets@^2.1.4: expand-brackets@^2.1.4:
version "2.1.4" version "2.1.4"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
@ -2537,6 +2710,11 @@ from2@^2.1.0:
inherits "^2.0.1" inherits "^2.0.1"
readable-stream "^2.0.0" readable-stream "^2.0.0"
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
fs-minipass@^1.2.5: fs-minipass@^1.2.5:
version "1.2.7" version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
@ -2664,6 +2842,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
graceful-fs@^4.2.0:
version "4.2.6"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
har-schema@^2.0.0: har-schema@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
@ -2801,6 +2984,16 @@ html-comment-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
htmlparser2@^6.0.0:
version "6.0.1"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.0.1.tgz#422521231ef6d42e56bd411da8ba40aa36e91446"
integrity sha512-GDKPd+vk4jvSuvCbyuzx/unmXkk090Azec7LovXP8as1Hn8q9p3hbjmDGbUqqhknw0ajwit6LiiWqfiTUPMK7w==
dependencies:
domelementtype "^2.0.1"
domhandler "^4.0.0"
domutils "^2.4.4"
entities "^2.0.0"
http-errors@1.7.2: http-errors@1.7.2:
version "1.7.2" version "1.7.2"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
@ -2868,6 +3061,11 @@ icss-utils@^4.0.0, icss-utils@^4.1.1:
dependencies: dependencies:
postcss "^7.0.14" postcss "^7.0.14"
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ieee754@^1.1.4: ieee754@^1.1.4:
version "1.1.13" version "1.1.13"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
@ -3273,6 +3471,13 @@ json-stringify-safe@~5.0.1:
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
json5@2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850"
integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==
dependencies:
minimist "^1.2.0"
json5@^0.5.1: json5@^0.5.1:
version "0.5.1" version "0.5.1"
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
@ -3352,6 +3557,13 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
lazystream@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4"
integrity sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=
dependencies:
readable-stream "^2.0.5"
load-json-file@^1.0.0: load-json-file@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
@ -3403,11 +3615,26 @@ lodash.camelcase@^4.3.0:
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
lodash.clonedeep@^4.5.0: lodash.clonedeep@4.5.0:
version "4.5.0" version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
lodash.defaults@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
lodash.difference@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=
lodash.flatten@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
lodash.includes@^4.3.0: lodash.includes@^4.3.0:
version "4.3.0" version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
@ -3468,6 +3695,11 @@ lodash.templatesettings@^4.0.0:
dependencies: dependencies:
lodash._reinterpolate "^3.0.0" lodash._reinterpolate "^3.0.0"
lodash.union@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=
lodash.uniq@^4.5.0: lodash.uniq@^4.5.0:
version "4.5.0" version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
@ -3728,11 +3960,16 @@ minimist@0.0.8:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: minimist@^1.1.3, minimist@^1.2.5:
version "1.2.5" version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0:
version "2.9.0" version "2.9.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
@ -3794,6 +4031,16 @@ mkdirp@^0.5.0, mkdirp@^0.5.1:
dependencies: dependencies:
minimist "0.0.8" minimist "0.0.8"
moment@2.24.0:
version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
moment@^2.29.1:
version "2.29.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
move-concurrently@^1.0.1: move-concurrently@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
@ -3973,6 +4220,14 @@ node-version@^1.1.3:
resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d" resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d"
integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ== integrity sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==
nodepub@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/nodepub/-/nodepub-3.0.1.tgz#345a687f28c1852332087329fbc3aac40a049d4c"
integrity sha512-aS38l5pCHKeDajiNoZyiLcJIDnZYfFfmpGLtgYUJ4K22wChVX7gvA86dK5XWjPdj1Em7VSIiQNQzwjxmra0xlg==
dependencies:
archiver "^5.2.0"
moment "^2.29.1"
"nopt@2 || 3": "nopt@2 || 3":
version "3.0.6" version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
@ -4062,6 +4317,13 @@ npm-packlist@^1.1.6:
gauge "~2.7.3" gauge "~2.7.3"
set-blocking "~2.0.0" set-blocking "~2.0.0"
nth-check@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125"
integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==
dependencies:
boolbase "^1.0.0"
null-loader@^0.1.1: null-loader@^0.1.1:
version "0.1.1" version "0.1.1"
resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-0.1.1.tgz#17be9abfcd3ff0e1512f6fc4afcb1f5039378fae" resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-0.1.1.tgz#17be9abfcd3ff0e1512f6fc4afcb1f5039378fae"
@ -4249,6 +4511,18 @@ parse-json@^4.0.0:
error-ex "^1.3.1" error-ex "^1.3.1"
json-parse-better-errors "^1.0.1" json-parse-better-errors "^1.0.1"
parse5-htmlparser2-tree-adapter@^6.0.0:
version "6.0.1"
resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6"
integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==
dependencies:
parse5 "^6.0.1"
parse5@^6.0.0, parse5@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
parseurl@~1.3.3: parseurl@~1.3.3:
version "1.3.3" version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@ -5018,6 +5292,11 @@ prettier@^1.18.2:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
printj@~1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
private@^0.1.6, private@^0.1.8: private@^0.1.6, private@^0.1.8:
version "0.1.8" version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@ -5243,7 +5522,7 @@ read@1.0.x:
dependencies: dependencies:
mute-stream "~0.0.4" mute-stream "~0.0.4"
"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: "readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.7" version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@ -5269,7 +5548,7 @@ readable-stream@^2.0.6:
string_decoder "~1.1.1" string_decoder "~1.1.1"
util-deprecate "~1.0.1" util-deprecate "~1.0.1"
readable-stream@^3.6.0: readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
version "3.6.0" version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@ -5278,6 +5557,13 @@ readable-stream@^3.6.0:
string_decoder "^1.1.1" string_decoder "^1.1.1"
util-deprecate "^1.0.1" util-deprecate "^1.0.1"
readdir-glob@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4"
integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==
dependencies:
minimatch "^3.0.4"
readdirp@^2.2.1: readdirp@^2.2.1:
version "2.2.1" version "2.2.1"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
@ -6128,6 +6414,17 @@ tapable@^1.0.0, tapable@^1.1.3:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
tar-stream@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
dependencies:
bl "^4.0.3"
end-of-stream "^1.4.1"
fs-constants "^1.0.0"
inherits "^2.0.3"
readable-stream "^3.1.1"
tar@^2.0.0: tar@^2.0.0:
version "2.2.2" version "2.2.2"
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
@ -6503,10 +6800,10 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0" spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0" spdx-expression-parse "^3.0.0"
validator@^13.6.0: validator@11.1.0:
version "13.6.0" version "11.1.0"
resolved "https://registry.yarnpkg.com/validator/-/validator-13.6.0.tgz#1e71899c14cdc7b2068463cb24c1cc16f6ec7059" resolved "https://registry.yarnpkg.com/validator/-/validator-11.1.0.tgz#ac18cac42e0aa5902b603d7a5d9b7827e2346ac4"
integrity sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg== integrity sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==
vary@~1.1.2: vary@~1.1.2:
version "1.1.2" version "1.1.2"
@ -6780,6 +7077,14 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
yargs-parser@13.0.0:
version "13.0.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.0.0.tgz#3fc44f3e76a8bdb1cc3602e860108602e5ccde8b"
integrity sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==
dependencies:
camelcase "^5.0.0"
decamelize "^1.2.0"
yargs-parser@^13.1.2: yargs-parser@^13.1.2:
version "13.1.2" version "13.1.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
@ -6788,11 +7093,6 @@ yargs-parser@^13.1.2:
camelcase "^5.0.0" camelcase "^5.0.0"
decamelize "^1.2.0" decamelize "^1.2.0"
yargs-parser@^20.2.7:
version "20.2.9"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
yargs@^13.3.2: yargs@^13.3.2:
version "13.3.2" version "13.3.2"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
@ -6808,3 +7108,12 @@ yargs@^13.3.2:
which-module "^2.0.0" which-module "^2.0.0"
y18n "^4.0.0" y18n "^4.0.0"
yargs-parser "^13.1.2" yargs-parser "^13.1.2"
zip-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79"
integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==
dependencies:
archiver-utils "^2.1.0"
compress-commons "^4.1.0"
readable-stream "^3.6.0"