Compare commits
3 commits
epub-gener
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
ab5ced7c6a | ||
|
42f96c00b9 | ||
|
991899a1df |
7 changed files with 237 additions and 593 deletions
19
README.md
19
README.md
|
@ -40,10 +40,15 @@ files, and for your Ghost API interface. The parameters to set are:
|
|||
* `WEBDAV_SERVER_URL` - location of your WebDAV server
|
||||
* `WEBDAV_USERNAME` - username for signing in
|
||||
* `WEBDAV_PASSWORD` - password, likewise
|
||||
* `WEBDAV_UPLOADED_PATH` - path where uploaded images will be served (it
|
||||
could end up being different from `WEBDAV_SERVER_URL`: say you go to
|
||||
`https://myhost.com:1234/dav/[folder]` to upload, but the public sees
|
||||
it as `https://media.mysite.com/[folder]`.
|
||||
* `WEBDAV_PATH_PREFIX` - prefix to add to all WebDAV paths: no uploads
|
||||
will happen outside of this path
|
||||
* `UPLOADED_PATH_PREFIX` - path where uploaded images will be
|
||||
served (it could end up being different from `WEBDAV_SERVER_URL`: say
|
||||
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_VERSION` - 'v2' or 'v3' depending on which version you're using
|
||||
* `GHOST_ADMIN_KEY` - 'Admi API key for Ghost'
|
||||
|
@ -51,7 +56,11 @@ 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
|
||||
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
|
||||
before we think of anything else. Pull requests are welcome!
|
||||
before we think of anything else.
|
||||
|
||||
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
|
||||
|
||||
|
|
110
cli.js
110
cli.js
|
@ -42,39 +42,82 @@ program.command('setup')
|
|||
'\n\nWe\'re going to take you through some steps' +
|
||||
' 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
|
||||
prompt.start()
|
||||
res = await prompt.get([
|
||||
{ name: 'server_url', default: config.webdav.server_url || '' },
|
||||
{ name: 'username', default: config.webdav.username || '' },
|
||||
{ name: 'password', default: config.webdav.password || '' , hidden: true},
|
||||
])
|
||||
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]`)
|
||||
|
||||
console.log('First up: File uploads.')
|
||||
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'
|
||||
'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([
|
||||
{ name: 'path_prefix', default: config.webdav.path_prefix || '' },
|
||||
{ name: 'uploaded_path_prefix', default: config.webdav.uploaded_path_prefix || '' },
|
||||
{
|
||||
name: 'upload_mode',
|
||||
default: 'webdav',
|
||||
pattern: /^(webdav|local)$/ig,
|
||||
message: 'Please enter "webdav" or "local"',
|
||||
},
|
||||
])
|
||||
config.webdav.path_prefix = res.path_prefix
|
||||
config.webdav.uploaded_path_prefix = res.uploaded_path_prefix
|
||||
console.log(`Cool. So uploads to ${config.webdav.path_prefix} will go to ${config.webdav.uploaded_path_prefix}.`)
|
||||
|
||||
if (res.upload_mode == 'webdav') {
|
||||
|
||||
console.log('You\'re going with WebDAV? Awesome!')
|
||||
console.log(
|
||||
'Please enter your server url (including the port), ' +
|
||||
'username, and password\n'
|
||||
)
|
||||
|
||||
res = await prompt.get([
|
||||
{ name: 'server_url', default: config.webdav.server_url || '' },
|
||||
{ name: 'username', default: config.webdav.username || '' },
|
||||
{ name: 'password', default: config.webdav.password || '' , hidden: true},
|
||||
])
|
||||
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]`)
|
||||
|
||||
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(
|
||||
|
@ -187,23 +230,6 @@ program.command('webdav-test <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>')
|
||||
.description('[test command] check if an image matches the set separator')
|
||||
.action(async (file) => {
|
||||
|
|
36
config.js
36
config.js
|
@ -1,26 +1,36 @@
|
|||
// load configuraton from .env file (if exists)
|
||||
require('dotenv').config()
|
||||
const convict = require('convict')
|
||||
const convict_format_with_validator = require('convict-format-with-validator')
|
||||
const os = require('os')
|
||||
const path = require('path')
|
||||
const yaml = require('js-yaml')
|
||||
const fs = require('fs')
|
||||
|
||||
convict.addFormats(convict_format_with_validator)
|
||||
convict.addParser({ extension: ['yml', 'yaml'], parse: yaml.safeLoad })
|
||||
|
||||
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: {
|
||||
server_url: {
|
||||
doc: 'WebDAV server URL (eg. https://myhost.com:2078)',
|
||||
format: 'url',
|
||||
env: 'WEBDAV_SERVER_URL',
|
||||
default: null,
|
||||
nullable: true,
|
||||
},
|
||||
username: {
|
||||
doc: 'Username for WebDAV server',
|
||||
format: 'String',
|
||||
env: 'WEBDAV_USERNAME',
|
||||
default: null,
|
||||
nullable: true,
|
||||
},
|
||||
password: {
|
||||
doc: 'Password for WebDAV server',
|
||||
|
@ -28,18 +38,21 @@ let config = convict({
|
|||
env: 'WEBDAV_PASSWORD',
|
||||
default: null,
|
||||
sensitive: true,
|
||||
nullable: true,
|
||||
},
|
||||
path_prefix: {
|
||||
doc: 'Where to upload files (eg. /seance-uploads)',
|
||||
format: 'String',
|
||||
env: 'WEBDAV_PATH_PREFIX',
|
||||
default: null,
|
||||
nullable: true,
|
||||
},
|
||||
uploaded_path_prefix: {
|
||||
uploaded_path_prefix: { // FIXME: Deprecated; remove
|
||||
doc: 'URL where files are uploaded (eg. https://mysitem.com/media)',
|
||||
format: 'url',
|
||||
env: 'WEBDAV_UPLOADED_PATH_PREFIX',
|
||||
default: null,
|
||||
nullable: true,
|
||||
},
|
||||
use_digest: {
|
||||
doc: 'Whether to use digest authentication',
|
||||
|
@ -48,6 +61,14 @@ let config = convict({
|
|||
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: {
|
||||
url: {
|
||||
doc: 'URL of Ghost installation',
|
||||
|
@ -73,7 +94,7 @@ let config = convict({
|
|||
format: '*', // TODO: validate by checking path
|
||||
env: 'SEPARATOR_IMAGE',
|
||||
default: null,
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
// Load configs from home directory, if present
|
||||
|
@ -98,6 +119,17 @@ try {
|
|||
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.validated = validated
|
||||
|
||||
|
|
|
@ -20,9 +20,9 @@
|
|||
"babel-preset-env": "^1.7.0",
|
||||
"body-parser": "^1.19.0",
|
||||
"bulma": "^0.8.2",
|
||||
"cheerio": "^1.0.0-rc.5",
|
||||
"commander": "^3.0.2",
|
||||
"convict": "^5.2.0",
|
||||
"convict": "6",
|
||||
"convict-format-with-validator": "^6.2.0",
|
||||
"css-loader": "^3.5.3",
|
||||
"dotenv": "^8.2.0",
|
||||
"express": "^4.17.1",
|
||||
|
@ -32,7 +32,6 @@
|
|||
"mediumexporter": "github:badrihippo/mediumexporter#seance-latest",
|
||||
"mini-css-extract-plugin": "^0.9.0",
|
||||
"node-sass": "^4.14.1",
|
||||
"nodepub": "^3.0.1",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"prompt-async": "^0.9.9",
|
||||
"r2": "^2.0.1",
|
||||
|
@ -48,6 +47,6 @@
|
|||
"webpack-node-externals": "^1.7.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "12.x"
|
||||
"node": ">=12.x"
|
||||
}
|
||||
}
|
||||
|
|
BIN
random-cover.jpg
BIN
random-cover.jpg
Binary file not shown.
Before Width: | Height: | Size: 66 KiB |
295
seance.js
295
seance.js
|
@ -9,10 +9,7 @@ const readline = require('readline')
|
|||
const { markdown } = require('markdown')
|
||||
const GhostAdminAPI = require('@tryghost/admin-api')
|
||||
const { Canvas, Image } = require('canvas')
|
||||
const slugify = require('underscore.string/slugify')
|
||||
const Rembrandt = require('rembrandt')
|
||||
const nodepub = require('nodepub')
|
||||
const cheerio = require('cheerio')
|
||||
|
||||
const config = require('./config')
|
||||
|
||||
|
@ -119,7 +116,7 @@ class Seance {
|
|||
* @param {Boolean} options.noUpload Skip uploading of images
|
||||
* @param {Boolean} options.noPush Skip pushing to Ghost; just generate the file
|
||||
* @param {Boolean} options.dryRun Combination of noUpload and noPush
|
||||
* @returns [object] object containing details of the uploaded Ghost post
|
||||
* @returns [string] status
|
||||
*/
|
||||
async pushToGhost (postSlug, options={}) {
|
||||
this.emit('update', {
|
||||
|
@ -162,7 +159,7 @@ class Seance {
|
|||
return false
|
||||
}
|
||||
|
||||
// Decide WebDAV upload path
|
||||
// Decide file/WebDAV upload path
|
||||
var current_date = new Date()
|
||||
|
||||
const uploadPath = path.join(
|
||||
|
@ -171,12 +168,9 @@ class Seance {
|
|||
postSlug
|
||||
)
|
||||
|
||||
// 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)
|
||||
// Public path to upload those files (eg. https://example.com:2078)
|
||||
// We'll do it directly since path.join mangles the protocol
|
||||
const uploadedPath = config.webdav.uploaded_path_prefix + '/' + uploadPath
|
||||
const uploadedPath = config.uploaded_path_prefix + '/' + uploadPath
|
||||
|
||||
// load metadata file
|
||||
this.emit('update', {
|
||||
|
@ -273,7 +267,7 @@ class Seance {
|
|||
|
||||
// Let's wait for the upload, just to avoid conflicts
|
||||
if (!options.noUpload) {
|
||||
await this.uploadDav(davPath, imagePath)
|
||||
await this.upload(uploadPath, imagePath)
|
||||
}
|
||||
|
||||
newLine = '![' + imageAlt + '](' + uploadedPath + '/' + imageName + ')'
|
||||
|
@ -323,7 +317,7 @@ class Seance {
|
|||
})
|
||||
|
||||
if (!options.noUpload) {
|
||||
this.uploadDav(davPath, imagePath)
|
||||
this.upload(uploadPath, imagePath)
|
||||
}
|
||||
|
||||
featuredImagePath = uploadedPath + '/' + imageName
|
||||
|
@ -570,8 +564,7 @@ class Seance {
|
|||
loglevel: 'info'
|
||||
})
|
||||
|
||||
await this.uploadDav(path.join(config.webdav.path_prefix,'avatars'),
|
||||
filePath)
|
||||
await this.upload('avatars', filePath)
|
||||
|
||||
// Generate Ghost JSON
|
||||
|
||||
|
@ -584,7 +577,7 @@ class Seance {
|
|||
bio: json.payload.user.bio,
|
||||
email: email,
|
||||
name: json.payload.user.name,
|
||||
profile_image: config.webdav.uploaded_path_prefix + '/avatars/' + fileName
|
||||
profile_image: config.uploaded_path_prefix + '/avatars/' + fileName
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -683,6 +676,9 @@ class Seance {
|
|||
* @returns [string] status
|
||||
*/
|
||||
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
|
||||
const client = createClient(
|
||||
|
@ -695,7 +691,7 @@ class Seance {
|
|||
|
||||
// create directory if not exists
|
||||
console.debug(`[dav-upload] Loading ${dirPath}`)
|
||||
if (!await this.createDirIfNotExist(client, dirPath)) {
|
||||
if (!await this.createDirIfNotExist(client, uploadPath)) {
|
||||
console.error(`[dav-upload] Could not upload ${path.basename(filePath)} :(`)
|
||||
return false
|
||||
}
|
||||
|
@ -703,7 +699,7 @@ class Seance {
|
|||
// upload a file
|
||||
console.debug('Uploading file')
|
||||
const outStream = client.createWriteStream(
|
||||
path.join(dirPath, path.basename(filePath))
|
||||
path.join(uploadPath, path.basename(filePath))
|
||||
)
|
||||
outStream.on('finish', () => console.debug('Uploaded successfully.'))
|
||||
|
||||
|
@ -715,197 +711,88 @@ class Seance {
|
|||
|
||||
|
||||
/**
|
||||
* function [fetchToEpub]
|
||||
* @description fetches posts from Ghost and packs them into an epub
|
||||
* @options.id unique ID for the generated epub
|
||||
* @options.title title of the generated epub
|
||||
* @options.author author of the generated epub
|
||||
* @options.language language of the book
|
||||
* @genre genre of the book
|
||||
* @cover cover image to use
|
||||
* @returns [string] status
|
||||
* function [exists]
|
||||
* @returns [boolean]
|
||||
*
|
||||
* check if the given file exists or not
|
||||
*/
|
||||
async fetchToEpub (postSlugs, options = {}) {
|
||||
if (!options.title) options.title = 'Seance Collection'
|
||||
if (!options.author) options.author = 'Seance'
|
||||
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 = '.'
|
||||
|
||||
|
||||
console.log(`Fetching: ${postSlugs}`)
|
||||
let allPosts = []
|
||||
|
||||
// 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)
|
||||
async fsExists (path) {
|
||||
try {
|
||||
await fs.promises.access(path)
|
||||
return true
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
|
||||
// prepare for image downloads, starting with the scissors!
|
||||
let pics = [path.join(__dirname, 'scissors.png')]
|
||||
let picFolder = path.join(options.outputFolder, 'seance-images')
|
||||
if (!fs.existsSync(picFolder)) {
|
||||
fs.mkdirSync(picFolder, { recursive: true })
|
||||
}
|
||||
|
||||
// prepare array to collect processed posts
|
||||
let processedPosts = []
|
||||
|
||||
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(),
|
||||
})
|
||||
}
|
||||
|
||||
// decide metadata
|
||||
let metadata = {
|
||||
id: 'seance-test', // FIXME
|
||||
title: options.title,
|
||||
author: options.author,
|
||||
language: options.language,
|
||||
contents: 'Table of Contents',
|
||||
genre: options.genre,
|
||||
cover: options.coverImage,
|
||||
images: pics,
|
||||
}
|
||||
|
||||
// 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 [uploadLocal]
|
||||
* @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) {
|
||||
// Set uploadPath
|
||||
// We'll do it directly since path.join mangles the protocol
|
||||
let uploadPath = path.join(config.local_upload.path_prefix, dirPath)
|
||||
|
||||
// safety: don't touch directories outside LOCAL_UPLOAD_PATH_PREFIX
|
||||
if (!uploadPath.startsWith(config.local_upload.path_prefix)) {
|
||||
console.error(`[local-upload] Cannot create directories outside ${config.local_upload.path_prefix}`)
|
||||
return false
|
||||
}
|
||||
|
||||
// create directory if not exists
|
||||
console.debug(`[local-upload] Loading ${uploadPath}`)
|
||||
if (
|
||||
!(await this.fsExists(uploadPath)) ||
|
||||
!(await fs.promises.lstat(uploadPath)).isDirectory()
|
||||
) {
|
||||
if (!(await fs.promises.mkdir(uploadPath,
|
||||
{ recursive: true }))) {
|
||||
console.error(`[local-upload] Could not upload ${path.basename(filePath)} :(`)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// actually do the copying
|
||||
console.debug('Uploading file')
|
||||
try {
|
||||
await fs.promises.copyFile(filePath,
|
||||
path.join(uploadPath, path.basename(filePath)))
|
||||
} catch (err) {
|
||||
console.error(`Upload error: ${err}`)
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 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
|
||||
|
|
363
yarn.lock
363
yarn.lock
|
@ -299,35 +299,6 @@ aproba@^1.0.3, aproba@^1.1.1:
|
|||
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
|
||||
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:
|
||||
version "1.1.5"
|
||||
resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
|
||||
|
@ -429,11 +400,6 @@ async@^2.3.0:
|
|||
dependencies:
|
||||
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:
|
||||
version "0.9.2"
|
||||
resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
|
||||
|
@ -1059,11 +1025,6 @@ base64-js@^1.0.2:
|
|||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
|
||||
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:
|
||||
version "0.11.2"
|
||||
resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
|
||||
|
@ -1101,15 +1062,6 @@ bindings@^1.5.0:
|
|||
dependencies:
|
||||
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@*:
|
||||
version "0.0.9"
|
||||
resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
|
||||
|
@ -1143,11 +1095,6 @@ body-parser@1.19.0, body-parser@^1.19.0:
|
|||
raw-body "2.4.0"
|
||||
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:
|
||||
version "1.1.11"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
|
||||
|
@ -1260,11 +1207,6 @@ browserslist@^3.2.6:
|
|||
caniuse-lite "^1.0.30000844"
|
||||
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:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
|
||||
|
@ -1289,14 +1231,6 @@ buffer@^4.3.0:
|
|||
ieee754 "^1.1.4"
|
||||
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:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
|
||||
|
@ -1449,30 +1383,6 @@ chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2:
|
|||
escape-string-regexp "^1.0.5"
|
||||
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:
|
||||
version "2.1.8"
|
||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
|
||||
|
@ -1695,16 +1605,6 @@ component-emitter@^1.2.1:
|
|||
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
|
||||
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:
|
||||
version "0.0.1"
|
||||
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
|
||||
|
@ -1761,16 +1661,20 @@ convert-source-map@^1.5.1:
|
|||
dependencies:
|
||||
safe-buffer "~5.1.1"
|
||||
|
||||
convict@^5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/convict/-/convict-5.2.0.tgz#4c01fa06885b8c4a4ffc98b7de43222fe6c876dc"
|
||||
integrity sha512-C3cdUwo47cCikZNzu5Vv8AL0MuXVVeg9t/Gyr9qyK5ZpCjOkMPmJ85KUF3CowNeSfj4UtztHxS+hoO9wGRh6kg==
|
||||
convict-format-with-validator@^6.2.0:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/convict-format-with-validator/-/convict-format-with-validator-6.2.0.tgz#3cab7779e83a89351b9157685cbf20a941414192"
|
||||
integrity sha512-2LIL3yEZY27M13UHLIP4mGivusP9h2M+X4mYsRBLexwUp8+0sgVk2MgB2b2bnQwkn293lkbkxgdevzn0nZdyzQ==
|
||||
dependencies:
|
||||
json5 "2.1.0"
|
||||
lodash.clonedeep "4.5.0"
|
||||
moment "2.24.0"
|
||||
validator "11.1.0"
|
||||
yargs-parser "13.0.0"
|
||||
validator "^13.6.0"
|
||||
|
||||
convict@6:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/convict/-/convict-6.2.0.tgz#d227aef6d77a4d518ca6a6a3b863bdfdb6dc5665"
|
||||
integrity sha512-aCk1+VWt3TG6SJV59u+wwuza7lvtlJfj6zH/fmE1xzx5yZnNby1lPYkccq1mKaJJXHjk9cuVCFWVVIhbkpmwRw==
|
||||
dependencies:
|
||||
lodash.clonedeep "^4.5.0"
|
||||
yargs-parser "^20.2.7"
|
||||
|
||||
cookie-signature@1.0.6:
|
||||
version "1.0.6"
|
||||
|
@ -1819,22 +1723,6 @@ cosmiconfig@^5.0.0:
|
|||
js-yaml "^3.13.1"
|
||||
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:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
|
||||
|
@ -1945,17 +1833,6 @@ css-loader@^3.5.3:
|
|||
schema-utils "^2.6.6"
|
||||
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:
|
||||
version "0.7.2"
|
||||
resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz#11e5e27c9a48d90284f22d45061c303d7a25ad87"
|
||||
|
@ -1970,11 +1847,6 @@ css-unit-converter@^1.1.1:
|
|||
resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
|
||||
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:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
|
||||
|
@ -2191,41 +2063,11 @@ diffie-hellman@^5.0.0:
|
|||
miller-rabin "^4.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:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
|
||||
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:
|
||||
version "8.2.0"
|
||||
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
|
||||
|
@ -2294,7 +2136,7 @@ encodeurl@~1.0.2:
|
|||
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
|
||||
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
|
||||
|
||||
end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
|
||||
end-of-stream@^1.0.0, end-of-stream@^1.1.0:
|
||||
version "1.4.4"
|
||||
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
|
||||
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
|
||||
|
@ -2315,16 +2157,6 @@ entities@^1.1.1:
|
|||
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
|
||||
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:
|
||||
version "0.1.7"
|
||||
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
|
||||
|
@ -2427,11 +2259,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
|
|||
md5.js "^1.3.4"
|
||||
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:
|
||||
version "2.1.4"
|
||||
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
|
||||
|
@ -2710,11 +2537,6 @@ from2@^2.1.0:
|
|||
inherits "^2.0.1"
|
||||
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:
|
||||
version "1.2.7"
|
||||
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
|
||||
|
@ -2842,11 +2664,6 @@ 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"
|
||||
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:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
|
||||
|
@ -2984,16 +2801,6 @@ html-comment-regex@^1.1.0:
|
|||
resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
|
||||
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:
|
||||
version "1.7.2"
|
||||
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
|
||||
|
@ -3061,11 +2868,6 @@ icss-utils@^4.0.0, icss-utils@^4.1.1:
|
|||
dependencies:
|
||||
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:
|
||||
version "1.1.13"
|
||||
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
|
||||
|
@ -3471,13 +3273,6 @@ json-stringify-safe@~5.0.1:
|
|||
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
|
||||
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:
|
||||
version "0.5.1"
|
||||
resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
|
||||
|
@ -3557,13 +3352,6 @@ kind-of@^6.0.0, kind-of@^6.0.2:
|
|||
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
|
||||
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:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
|
||||
|
@ -3615,26 +3403,11 @@ lodash.camelcase@^4.3.0:
|
|||
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
|
||||
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
|
||||
|
||||
lodash.clonedeep@4.5.0:
|
||||
lodash.clonedeep@^4.5.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
|
||||
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:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
|
||||
|
@ -3695,11 +3468,6 @@ lodash.templatesettings@^4.0.0:
|
|||
dependencies:
|
||||
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:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
|
||||
|
@ -3960,16 +3728,11 @@ minimist@0.0.8:
|
|||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
||||
|
||||
minimist@^1.1.3, minimist@^1.2.5:
|
||||
minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
|
||||
version "1.2.5"
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
|
||||
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:
|
||||
version "2.9.0"
|
||||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6"
|
||||
|
@ -4031,16 +3794,6 @@ mkdirp@^0.5.0, mkdirp@^0.5.1:
|
|||
dependencies:
|
||||
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:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
|
||||
|
@ -4220,14 +3973,6 @@ node-version@^1.1.3:
|
|||
resolved "https://registry.yarnpkg.com/node-version/-/node-version-1.2.0.tgz#34fde3ffa8e1149bd323983479dda620e1b5060d"
|
||||
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":
|
||||
version "3.0.6"
|
||||
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
|
||||
|
@ -4317,13 +4062,6 @@ npm-packlist@^1.1.6:
|
|||
gauge "~2.7.3"
|
||||
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:
|
||||
version "0.1.1"
|
||||
resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-0.1.1.tgz#17be9abfcd3ff0e1512f6fc4afcb1f5039378fae"
|
||||
|
@ -4511,18 +4249,6 @@ parse-json@^4.0.0:
|
|||
error-ex "^1.3.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:
|
||||
version "1.3.3"
|
||||
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
|
||||
|
@ -5292,11 +5018,6 @@ prettier@^1.18.2:
|
|||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
|
||||
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:
|
||||
version "0.1.8"
|
||||
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
|
||||
|
@ -5522,7 +5243,7 @@ read@1.0.x:
|
|||
dependencies:
|
||||
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.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:
|
||||
"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:
|
||||
version "2.3.7"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
|
||||
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
|
||||
|
@ -5548,7 +5269,7 @@ readable-stream@^2.0.6:
|
|||
string_decoder "~1.1.1"
|
||||
util-deprecate "~1.0.1"
|
||||
|
||||
readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
|
||||
readable-stream@^3.6.0:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
|
||||
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
|
||||
|
@ -5557,13 +5278,6 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
|
|||
string_decoder "^1.1.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:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
|
||||
|
@ -6414,17 +6128,6 @@ tapable@^1.0.0, tapable@^1.1.3:
|
|||
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
|
||||
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:
|
||||
version "2.2.2"
|
||||
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
|
||||
|
@ -6800,10 +6503,10 @@ validate-npm-package-license@^3.0.1:
|
|||
spdx-correct "^3.0.0"
|
||||
spdx-expression-parse "^3.0.0"
|
||||
|
||||
validator@11.1.0:
|
||||
version "11.1.0"
|
||||
resolved "https://registry.yarnpkg.com/validator/-/validator-11.1.0.tgz#ac18cac42e0aa5902b603d7a5d9b7827e2346ac4"
|
||||
integrity sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==
|
||||
validator@^13.6.0:
|
||||
version "13.6.0"
|
||||
resolved "https://registry.yarnpkg.com/validator/-/validator-13.6.0.tgz#1e71899c14cdc7b2068463cb24c1cc16f6ec7059"
|
||||
integrity sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==
|
||||
|
||||
vary@~1.1.2:
|
||||
version "1.1.2"
|
||||
|
@ -7077,14 +6780,6 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
|
|||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
|
||||
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:
|
||||
version "13.1.2"
|
||||
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
|
||||
|
@ -7093,6 +6788,11 @@ yargs-parser@^13.1.2:
|
|||
camelcase "^5.0.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:
|
||||
version "13.3.2"
|
||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
|
||||
|
@ -7108,12 +6808,3 @@ yargs@^13.3.2:
|
|||
which-module "^2.0.0"
|
||||
y18n "^4.0.0"
|
||||
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"
|
||||
|
|
Loading…
Reference in a new issue