diff --git a/e2e/package.json b/e2e/package.json index 2fe1ef2582..0afe2839fb 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -45,11 +45,11 @@ "@uppy/zoom": "workspace:^" }, "devDependencies": { - "cypress": "^10.0.0", + "cypress": "^12.9.0", "cypress-terminal-report": "^4.1.2", "deep-freeze": "^0.0.1", "execa": "^6.1.0", - "parcel": "^2.0.1", + "parcel": "2.0.0-nightly.1278", "prompts": "^2.4.2", "react": "^18.1.0", "react-dom": "^18.1.0", diff --git a/package.json b/package.json index e387474109..8cd0b4c08f 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@babel/preset-env": "^7.14.7", "@babel/register": "^7.10.5", "@babel/types": "^7.17.0", - "@parcel/transformer-vue": "2.7.0", + "@parcel/transformer-vue": "2.8.4-nightly.2903+5b901a317", "@types/jasmine": "file:./private/@types/jasmine", "@types/jasminewd2": "file:./private/@types/jasmine", "@typescript-eslint/eslint-plugin": "^5.0.0", diff --git a/packages/@uppy/aws-s3-multipart/src/MultipartUploader.js b/packages/@uppy/aws-s3-multipart/src/MultipartUploader.js index 34a5ca2255..4c7a2a6975 100644 --- a/packages/@uppy/aws-s3-multipart/src/MultipartUploader.js +++ b/packages/@uppy/aws-s3-multipart/src/MultipartUploader.js @@ -70,19 +70,29 @@ class MultipartUploader { // Upload zero-sized files in one zero-sized chunk if (this.#data.size === 0) { - this.#chunks = [this.#data] - this.#data.onProgress = this.#onPartProgress(0) - this.#data.onComplete = this.#onPartComplete(0) + this.#chunks = [{ + getData: () => this.#data, + onProgress: this.#onPartProgress(0), + onComplete: this.#onPartComplete(0), + }] } else { const arraySize = Math.ceil(fileSize / chunkSize) this.#chunks = Array(arraySize) - let j = 0 - for (let i = 0; i < fileSize; i += chunkSize) { + + for (let i = 0, j = 0; i < fileSize; i += chunkSize, j++) { const end = Math.min(fileSize, i + chunkSize) - const chunk = this.#data.slice(i, end) - chunk.onProgress = this.#onPartProgress(j) - chunk.onComplete = this.#onPartComplete(j) - this.#chunks[j++] = chunk + + // Defer data fetching/slicing until we actually need the data, because it's slow if we have a lot of files + const getData = () => { + const i2 = i + return this.#data.slice(i2, end) + } + + this.#chunks[j] = { + getData, + onProgress: this.#onPartProgress(j), + onComplete: this.#onPartComplete(j), + } } } diff --git a/packages/@uppy/aws-s3-multipart/src/index.js b/packages/@uppy/aws-s3-multipart/src/index.js index 13e5ae31b0..e2b1acd05f 100644 --- a/packages/@uppy/aws-s3-multipart/src/index.js +++ b/packages/@uppy/aws-s3-multipart/src/index.js @@ -4,7 +4,7 @@ import EventTracker from '@uppy/utils/lib/EventTracker' import emitSocketProgress from '@uppy/utils/lib/emitSocketProgress' import getSocketHost from '@uppy/utils/lib/getSocketHost' import { RateLimitedQueue } from '@uppy/utils/lib/RateLimitedQueue' - +import { filterNonFailedFiles, filterFilesToEmitUploadStarted } from '@uppy/utils/lib/fileFilters' import { createAbortError } from '@uppy/utils/lib/AbortController' import packageJson from '../package.json' import MultipartUploader from './MultipartUploader.js' @@ -200,17 +200,23 @@ class HTTPCommunicationQueue { return this.#sendCompletionRequest(file, { key, uploadId, parts, signal }).abortOn(signal) } - async uploadChunk (file, partNumber, body, signal) { + async uploadChunk (file, partNumber, chunk, signal) { throwIfAborted(signal) const { uploadId, key } = await this.getUploadId(file, signal) throwIfAborted(signal) for (;;) { - const signature = await this.#fetchSignature(file, { uploadId, key, partNumber, body, signal }).abortOn(signal) + const chunkData = chunk.getData() + const { onProgress, onComplete } = chunk + + const signature = await this.#fetchSignature(file, { + uploadId, key, partNumber, body: chunkData, signal, + }).abortOn(signal) + throwIfAborted(signal) try { return { PartNumber: partNumber, - ...await this.#uploadPartBytes(signature, body, signal).abortOn(signal), + ...await this.#uploadPartBytes({ signature, body: chunkData, onProgress, onComplete, signal }).abortOn(signal), } } catch (err) { if (!await this.#shouldRetry(err)) throw err @@ -258,8 +264,6 @@ export default class AwsS3Multipart extends BasePlugin { } } - this.upload = this.upload.bind(this) - /** * Simultaneous upload limiting is shared across all uploads with this plugin. * @@ -369,7 +373,7 @@ export default class AwsS3Multipart extends BasePlugin { .then(assertServerError) } - static async uploadPartBytes ({ url, expires, headers }, body, signal) { + static async uploadPartBytes ({ signature: { url, expires, headers }, body, onProgress, onComplete, signal }) { throwIfAborted(signal) if (url == null) { @@ -397,7 +401,7 @@ export default class AwsS3Multipart extends BasePlugin { } signal.addEventListener('abort', onabort) - xhr.upload.addEventListener('progress', body.onProgress) + xhr.upload.addEventListener('progress', onProgress) xhr.addEventListener('abort', () => { cleanup() @@ -427,7 +431,7 @@ export default class AwsS3Multipart extends BasePlugin { return } - body.onProgress?.(body.size) + onProgress?.(body.size) // NOTE This must be allowed by CORS. const etag = ev.target.getResponseHeader('ETag') @@ -437,7 +441,7 @@ export default class AwsS3Multipart extends BasePlugin { return } - body.onComplete?.(etag) + onComplete?.(etag) resolve({ ETag: etag, }) @@ -466,8 +470,10 @@ export default class AwsS3Multipart extends BasePlugin { }) } - uploadFile (file) { + #uploadFile (file) { return new Promise((resolve, reject) => { + const getFile = () => this.uppy.getFile(file.id) || file + const onProgress = (bytesUploaded, bytesTotal) => { this.uppy.emit('upload-progress', file, { uploader: this, @@ -485,7 +491,6 @@ export default class AwsS3Multipart extends BasePlugin { } const onSuccess = (result) => { - const uploadObject = upload // eslint-disable-line no-use-before-define const uploadResp = { body: { ...result, @@ -495,23 +500,17 @@ export default class AwsS3Multipart extends BasePlugin { this.resetUploaderReferences(file.id) - const cFile = this.uppy.getFile(file.id) - this.uppy.emit('upload-success', cFile || file, uploadResp) + this.uppy.emit('upload-success', getFile(), uploadResp) if (result.location) { this.uppy.log(`Download ${file.name} from ${result.location}`) } - resolve(uploadObject) + resolve() } const onPartComplete = (part) => { - const cFile = this.uppy.getFile(file.id) - if (!cFile) { - return - } - - this.uppy.emit('s3-multipart:part-uploaded', cFile, part) + this.uppy.emit('s3-multipart:part-uploaded', getFile(), part) } const upload = new MultipartUploader(file.data, { @@ -564,11 +563,7 @@ export default class AwsS3Multipart extends BasePlugin { upload.start() }) - // Don't double-emit upload-started for Golden Retriever-restored files that were already started - if (!file.progress.uploadStarted || !file.isRestored) { - upload.start() - this.uppy.emit('upload-started', file) - } + upload.start() }) } @@ -597,14 +592,9 @@ export default class AwsS3Multipart extends BasePlugin { // NOTE! Keep this duplicated code in sync with other plugins // TODO we should probably abstract this into a common function - async uploadRemote (file) { + async #uploadRemote (file) { this.resetUploaderReferences(file.id) - // Don't double-emit upload-started for Golden Retriever-restored files that were already started - if (!file.progress.uploadStarted || !file.isRestored) { - this.uppy.emit('upload-started', file) - } - try { if (file.serverToken) { return await this.connectToServerSocket(file) @@ -733,15 +723,20 @@ export default class AwsS3Multipart extends BasePlugin { }) } - async upload (fileIDs) { + #upload = async (fileIDs) => { if (fileIDs.length === 0) return undefined - const promises = fileIDs.map((id) => { - const file = this.uppy.getFile(id) + const files = this.uppy.getFilesByIds(fileIDs) + + const filesFiltered = filterNonFailedFiles(files) + const filesToEmit = filterFilesToEmitUploadStarted(filesFiltered) + this.uppy.emit('upload-start', filesToEmit) + + const promises = filesFiltered.map((file) => { if (file.isRemote) { - return this.uploadRemote(file) + return this.#uploadRemote(file) } - return this.uploadFile(file) + return this.#uploadFile(file) }) return Promise.all(promises) @@ -810,7 +805,7 @@ export default class AwsS3Multipart extends BasePlugin { }, }) this.uppy.addPreProcessor(this.#setCompanionHeaders) - this.uppy.addUploader(this.upload) + this.uppy.addUploader(this.#upload) } uninstall () { @@ -822,6 +817,6 @@ export default class AwsS3Multipart extends BasePlugin { }, }) this.uppy.removePreProcessor(this.#setCompanionHeaders) - this.uppy.removeUploader(this.upload) + this.uppy.removeUploader(this.#upload) } } diff --git a/packages/@uppy/aws-s3/src/index.js b/packages/@uppy/aws-s3/src/index.js index 7c34dd6370..cb0c267f7a 100644 --- a/packages/@uppy/aws-s3/src/index.js +++ b/packages/@uppy/aws-s3/src/index.js @@ -28,6 +28,7 @@ import BasePlugin from '@uppy/core/lib/BasePlugin.js' import { RateLimitedQueue, internalRateLimitedQueue } from '@uppy/utils/lib/RateLimitedQueue' import { RequestClient } from '@uppy/companion-client' +import { filterNonFailedFiles, filterFilesToEmitUploadStarted } from '@uppy/utils/lib/fileFilters' import packageJson from '../package.json' import MiniXHRUpload from './MiniXHRUpload.js' @@ -163,7 +164,7 @@ export default class AwsS3 extends BasePlugin { .then(assertServerError) } - #handleUpload = (fileIDs) => { + #handleUpload = async (fileIDs) => { /** * keep track of `getUploadParameters()` responses * so we can cancel the calls individually using just a file ID @@ -178,10 +179,11 @@ export default class AwsS3 extends BasePlugin { } this.uppy.on('file-removed', onremove) - fileIDs.forEach((id) => { - const file = this.uppy.getFile(id) - this.uppy.emit('upload-started', file) - }) + const files = this.uppy.getFilesByIds(fileIDs) + + const filesFiltered = filterNonFailedFiles(files) + const filesToEmit = filterFilesToEmitUploadStarted(filesFiltered) + this.uppy.emit('upload-start', filesToEmit) const getUploadParameters = this.#requests.wrapPromiseFunction((file) => { return this.opts.getUploadParameters(file) diff --git a/packages/@uppy/core/src/Restricter.js b/packages/@uppy/core/src/Restricter.js index 7e90545d57..4255d47197 100644 --- a/packages/@uppy/core/src/Restricter.js +++ b/packages/@uppy/core/src/Restricter.js @@ -13,6 +13,12 @@ const defaultOptions = { } class RestrictionError extends Error { + constructor (message, { isUserFacing = true, file } = {}) { + super(message) + this.isUserFacing = isUserFacing + if (file != null) this.file = file // only some restriction errors are related to a particular file + } + isRestriction = true } @@ -30,16 +36,38 @@ class Restricter { } } - validate (file, files) { - const { maxFileSize, minFileSize, maxTotalFileSize, maxNumberOfFiles, allowedFileTypes } = this.getOpts().restrictions + // Because these operations are slow, we cannot run them for every file (if we are adding multiple files) + validateAggregateRestrictions (existingFiles, addingFiles) { + const { maxTotalFileSize, maxNumberOfFiles } = this.getOpts().restrictions if (maxNumberOfFiles) { - const nonGhostFiles = files.filter(f => !f.isGhost) - if (nonGhostFiles.length + 1 > maxNumberOfFiles) { + const nonGhostFiles = existingFiles.filter(f => !f.isGhost) + if (nonGhostFiles.length + addingFiles.length > maxNumberOfFiles) { throw new RestrictionError(`${this.i18n('youCanOnlyUploadX', { smart_count: maxNumberOfFiles })}`) } } + if (maxTotalFileSize) { + let totalFilesSize = existingFiles.reduce((total, f) => (total + f.size), 0) + + for (const addingFile of addingFiles) { + if (addingFile.size != null) { // We can't check maxTotalFileSize if the size is unknown. + totalFilesSize += addingFile.size + + if (totalFilesSize > maxTotalFileSize) { + throw new RestrictionError(this.i18n('exceedsSize', { + size: prettierBytes(maxTotalFileSize), + file: addingFile.name, + })) + } + } + } + } + } + + validateSingleFile (file) { + const { maxFileSize, minFileSize, allowedFileTypes } = this.getOpts().restrictions + if (allowedFileTypes) { const isCorrectFileType = allowedFileTypes.some((type) => { // check if this is a mime-type @@ -57,19 +85,7 @@ class Restricter { if (!isCorrectFileType) { const allowedFileTypesString = allowedFileTypes.join(', ') - throw new RestrictionError(this.i18n('youCanOnlyUploadFileTypes', { types: allowedFileTypesString })) - } - } - - // We can't check maxTotalFileSize if the size is unknown. - if (maxTotalFileSize && file.size != null) { - const totalFilesSize = files.reduce((total, f) => (total + f.size), file.size) - - if (totalFilesSize > maxTotalFileSize) { - throw new RestrictionError(this.i18n('exceedsSize', { - size: prettierBytes(maxTotalFileSize), - file: file.name, - })) + throw new RestrictionError(this.i18n('youCanOnlyUploadFileTypes', { types: allowedFileTypesString }), { file }) } } @@ -78,17 +94,24 @@ class Restricter { throw new RestrictionError(this.i18n('exceedsSize', { size: prettierBytes(maxFileSize), file: file.name, - })) + }), { file }) } // We can't check minFileSize if the size is unknown. if (minFileSize && file.size != null && file.size < minFileSize) { throw new RestrictionError(this.i18n('inferiorSize', { size: prettierBytes(minFileSize), - })) + }), { file }) } } + validate (existingFiles, addingFiles) { + addingFiles.forEach((addingFile) => { + this.validateSingleFile(addingFile) + }) + this.validateAggregateRestrictions(existingFiles, addingFiles) + } + validateMinNumberOfFiles (files) { const { minNumberOfFiles } = this.getOpts().restrictions if (Object.keys(files).length < minNumberOfFiles) { diff --git a/packages/@uppy/core/src/Uppy.js b/packages/@uppy/core/src/Uppy.js index ce45394923..5ee79072fd 100644 --- a/packages/@uppy/core/src/Uppy.js +++ b/packages/@uppy/core/src/Uppy.js @@ -178,6 +178,23 @@ class Uppy { return this.store.getState() } + patchFilesState (filesWithNewState) { + const existingFilesState = this.getState().files + + this.setState({ + files: { + ...existingFilesState, + ...Object.fromEntries(Object.entries(filesWithNewState).map(([fileID, newFileState]) => ([ + fileID, + { + ...existingFilesState[fileID], + ...newFileState, + }, + ]))), + }, + }) + } + /** * Shorthand to set state for a specific file. */ @@ -186,9 +203,7 @@ class Uppy { throw new Error(`Can’t set state for ${fileID} (the file could have been removed)`) } - this.setState({ - files: { ...this.getState().files, [fileID]: { ...this.getState().files[fileID], ...state } }, - }) + this.patchFilesState({ [fileID]: state }) } i18nInit () { @@ -323,6 +338,10 @@ class Uppy { return Object.values(files) } + getFilesByIds (ids) { + return ids.map((id) => this.getFile(id)) + } + getObjectOfFilesPerState () { const { files: filesObject, totalProgress, error } = this.getState() const files = Object.values(filesObject) @@ -362,29 +381,43 @@ class Uppy { /* * @constructs - * @param { Error } error + * @param { Error[] } errors * @param { undefined } file */ /* * @constructs * @param { RestrictionError } error - * @param { UppyFile | undefined } file */ - #informAndEmit (error, file) { - const { message, details = '' } = error + #informAndEmit (errors) { + for (const error of errors) { + const { file, isRestriction } = error - if (error.isRestriction) { - this.emit('restriction-failed', file, error) - } else { - this.emit('error', error) + if (isRestriction) { + this.emit('restriction-failed', file, error) + } else { + this.emit('error', error) + } + this.log(error, 'warning') + } + + const userFacingErrors = errors.filter((error) => error.isUserFacing) + + // don't flood the user: only show the first 4 toasts + const maxNumToShow = 4 + const firstErrors = userFacingErrors.slice(0, maxNumToShow) + const additionalErrors = userFacingErrors.slice(maxNumToShow) + firstErrors.forEach(({ message, details = '' }) => { + this.info({ message, details }, 'error', this.opts.infoTimeout) + }) + + if (additionalErrors.length > 0) { + this.info({ message: this.i18n('additionalRestrictionsFailed', { count: additionalErrors.length }) }) } - this.info({ message, details }, 'error', this.opts.infoTimeout) - this.log(error, 'warning') } validateRestrictions (file, files = this.getFiles()) { try { - this.#restricter.validate(file, files) + this.#restricter.validate(files, [file]) } catch (err) { return err } @@ -417,8 +450,8 @@ class Uppy { const { allowNewUpload } = this.getState() if (allowNewUpload === false) { - const error = new RestrictionError(this.i18n('noMoreFilesAllowed')) - this.#informAndEmit(error, file) + const error = new RestrictionError(this.i18n('noMoreFilesAllowed'), { file }) + this.#informAndEmit([error]) throw error } } @@ -434,25 +467,17 @@ class Uppy { /** * Create a file state object based on user-provided `addFile()` options. - * - * Note this is extremely side-effectful and should only be done when a file state object - * will be added to state immediately afterward! - * - * The `files` value is passed in because it may be updated by the caller without updating the store. */ - #checkAndCreateFileStateObject (files, fileDescriptor) { + #transformFile (fileDescriptorOrFile) { // Uppy expects files in { name, type, size, data } format. // If the actual File object is passed from input[type=file] or drag-drop, // we normalize it to match Uppy file object - if (fileDescriptor instanceof File) { - // eslint-disable-next-line no-param-reassign - fileDescriptor = { - name: fileDescriptor.name, - type: fileDescriptor.type, - size: fileDescriptor.size, - data: fileDescriptor, - } - } + const fileDescriptor = fileDescriptorOrFile instanceof File ? { + name: fileDescriptorOrFile.name, + type: fileDescriptorOrFile.type, + size: fileDescriptorOrFile.size, + data: fileDescriptorOrFile, + } : fileDescriptorOrFile const fileType = getFileType(fileDescriptor) const fileName = getFileName(fileType, fileDescriptor) @@ -460,12 +485,6 @@ class Uppy { const isRemote = Boolean(fileDescriptor.isRemote) const id = getSafeFileId(fileDescriptor) - if (this.checkIfFileAlreadyExists(id)) { - const error = new RestrictionError(this.i18n('noDuplicates', { fileName })) - this.#informAndEmit(error, fileDescriptor) - throw error - } - const meta = fileDescriptor.meta || {} meta.name = fileName meta.type = fileType @@ -473,7 +492,7 @@ class Uppy { // `null` means the size is unknown. const size = Number.isFinite(fileDescriptor.data.size) ? fileDescriptor.data.size : null - let newFile = { + return { source: fileDescriptor.source || '', id, name: fileName, @@ -496,27 +515,6 @@ class Uppy { remote: fileDescriptor.remote || '', preview: fileDescriptor.preview, } - - const onBeforeFileAddedResult = this.opts.onBeforeFileAdded(newFile, files) - - if (onBeforeFileAddedResult === false) { - // Don’t show UI info for this error, as it should be done by the developer - const error = new RestrictionError('Cannot add the file because onBeforeFileAdded returned false.') - this.emit('restriction-failed', fileDescriptor, error) - throw error - } else if (typeof onBeforeFileAddedResult === 'object' && onBeforeFileAddedResult !== null) { - newFile = onBeforeFileAddedResult - } - - try { - const filesArray = Object.keys(files).map(i => files[i]) - this.#restricter.validate(newFile, filesArray) - } catch (err) { - this.#informAndEmit(err, newFile) - throw err - } - - return newFile } // Schedule an upload if `autoProceed` is enabled. @@ -533,6 +531,76 @@ class Uppy { } } + #checkAndUpdateFileState (filesToAdd) { + const { files: existingFiles } = this.getState() + + // create a copy of the files object only once + const nextFilesState = { ...existingFiles } + const validFilesToAdd = [] + const errors = [] + + for (const fileToAdd of filesToAdd) { + try { + let newFile = this.#transformFile(fileToAdd) + + // If a file has been recovered (Golden Retriever), but we were unable to recover its data (probably too large), + // users are asked to re-select these half-recovered files and then this method will be called again. + // In order to keep the progress, meta and everthing else, we keep the existing file, + // but we replace `data`, and we remove `isGhost`, because the file is no longer a ghost now + if (existingFiles[newFile.id]?.isGhost) { + const { isGhost, ...existingFileState } = existingFiles[newFile.id] + newFile = { + ...existingFileState, + data: fileToAdd.data, + } + this.log(`Replaced the blob in the restored ghost file: ${newFile.name}, ${newFile.id}`) + } + + if (this.checkIfFileAlreadyExists(newFile.id)) { + throw new RestrictionError(this.i18n('noDuplicates', { fileName: newFile.name }), { file: fileToAdd }) + } + + const onBeforeFileAddedResult = this.opts.onBeforeFileAdded(newFile, nextFilesState) + + if (onBeforeFileAddedResult === false) { + // Don’t show UI info for this error, as it should be done by the developer + throw new RestrictionError('Cannot add the file because onBeforeFileAdded returned false.', { isUserFacing: false, file: fileToAdd }) + } else if (typeof onBeforeFileAddedResult === 'object' && onBeforeFileAddedResult !== null) { + newFile = onBeforeFileAddedResult + } + + this.#restricter.validateSingleFile(newFile) + + // need to add it to the new local state immediately, so we can use the state to validate the next files too + nextFilesState[newFile.id] = newFile + validFilesToAdd.push(newFile) + } catch (err) { + errors.push(err) + } + } + + try { + // need to run this separately because it's much more slow, so if we run it inside the for-loop it will be very slow + // when many files are added + this.#restricter.validateAggregateRestrictions(Object.values(existingFiles), validFilesToAdd) + } catch (err) { + errors.push(err) + + // If we have any aggregate error, don't allow adding this batch + return { + nextFilesState: existingFiles, + validFilesToAdd: [], + errors, + } + } + + return { + nextFilesState, + validFilesToAdd, + errors, + } + } + /** * Add a new file to `state.files`. This will run `onBeforeFileAdded`, * try to guess file type in a clever way, check file against restrictions, @@ -544,34 +612,24 @@ class Uppy { addFile (file) { this.#assertNewUploadAllowed(file) - const { files } = this.getState() - let newFile = this.#checkAndCreateFileStateObject(files, file) - - // Users are asked to re-select recovered files without data, - // and to keep the progress, meta and everthing else, we only replace said data - if (files[newFile.id] && files[newFile.id].isGhost) { - newFile = { - ...files[newFile.id], - data: file.data, - isGhost: false, - } - this.log(`Replaced the blob in the restored ghost file: ${newFile.name}, ${newFile.id}`) - } + const { nextFilesState, validFilesToAdd, errors } = this.#checkAndUpdateFileState([file]) - this.setState({ - files: { - ...files, - [newFile.id]: newFile, - }, - }) + const restrictionErrors = errors.filter((error) => error.isRestriction) + this.#informAndEmit(restrictionErrors) + + if (errors.length > 0) throw errors[0] - this.emit('file-added', newFile) - this.emit('files-added', [newFile]) - this.log(`Added file: ${newFile.name}, ${newFile.id}, mime type: ${newFile.type}`) + this.setState({ files: nextFilesState }) + + const [firstValidFileToAdd] = validFilesToAdd + + this.emit('file-added', firstValidFileToAdd) + this.emit('files-added', validFilesToAdd) + this.log(`Added file: ${firstValidFileToAdd.name}, ${firstValidFileToAdd.id}, mime type: ${firstValidFileToAdd.type}`) this.#startIfAutoProceed() - return newFile.id + return firstValidFileToAdd.id } /** @@ -584,71 +642,54 @@ class Uppy { addFiles (fileDescriptors) { this.#assertNewUploadAllowed() - // create a copy of the files object only once - const files = { ...this.getState().files } - const newFiles = [] - const errors = [] - for (let i = 0; i < fileDescriptors.length; i++) { - try { - let newFile = this.#checkAndCreateFileStateObject(files, fileDescriptors[i]) - // Users are asked to re-select recovered files without data, - // and to keep the progress, meta and everthing else, we only replace said data - if (files[newFile.id] && files[newFile.id].isGhost) { - newFile = { - ...files[newFile.id], - data: fileDescriptors[i].data, - isGhost: false, - } - this.log(`Replaced blob in a ghost file: ${newFile.name}, ${newFile.id}`) - } - files[newFile.id] = newFile - newFiles.push(newFile) - } catch (err) { - if (!err.isRestriction) { - errors.push(err) - } - } - } - - this.setState({ files }) - - newFiles.forEach((newFile) => { - this.emit('file-added', newFile) - }) - - this.emit('files-added', newFiles) + const { nextFilesState, validFilesToAdd, errors } = this.#checkAndUpdateFileState(fileDescriptors) - if (newFiles.length > 5) { - this.log(`Added batch of ${newFiles.length} files`) - } else { - Object.keys(newFiles).forEach(fileID => { - this.log(`Added file: ${newFiles[fileID].name}\n id: ${newFiles[fileID].id}\n type: ${newFiles[fileID].type}`) - }) - } + const restrictionErrors = errors.filter((error) => error.isRestriction) + this.#informAndEmit(restrictionErrors) - if (newFiles.length > 0) { - this.#startIfAutoProceed() - } + const nonRestrictionErrors = errors.filter((error) => !error.isRestriction) - if (errors.length > 0) { + if (nonRestrictionErrors.length > 0) { let message = 'Multiple errors occurred while adding files:\n' - errors.forEach((subError) => { + nonRestrictionErrors.forEach((subError) => { message += `\n * ${subError.message}` }) this.info({ - message: this.i18n('addBulkFilesFailed', { smart_count: errors.length }), + message: this.i18n('addBulkFilesFailed', { smart_count: nonRestrictionErrors.length }), details: message, }, 'error', this.opts.infoTimeout) if (typeof AggregateError === 'function') { - throw new AggregateError(errors, message) + throw new AggregateError(nonRestrictionErrors, message) } else { const err = new Error(message) - err.errors = errors + err.errors = nonRestrictionErrors throw err } } + + // OK, we haven't thrown an error, we can start updating state and emitting events now: + + this.setState({ files: nextFilesState }) + + validFilesToAdd.forEach((file) => { + this.emit('file-added', file) + }) + + this.emit('files-added', validFilesToAdd) + + if (validFilesToAdd.length > 5) { + this.log(`Added batch of ${validFilesToAdd.length} files`) + } else { + Object.values(validFilesToAdd).forEach((file) => { + this.log(`Added file: ${file.name}\n id: ${file.id}\n type: ${file.type}`) + }) + } + + if (validFilesToAdd.length > 0) { + this.#startIfAutoProceed() + } } removeFiles (fileIDs, reason) { @@ -965,14 +1006,15 @@ class Uppy { if (typeof error === 'object' && error.message) { const newError = new Error(error.message) + newError.isUserFacing = true // todo maybe don't do this with all errors? newError.details = error.message if (error.details) { newError.details += ` ${error.details}` } newError.message = this.i18n('failedToUpload', { file: file?.name }) - this.#informAndEmit(newError) + this.#informAndEmit([newError]) } else { - this.#informAndEmit(error) + this.#informAndEmit([error]) } }) @@ -993,20 +1035,35 @@ class Uppy { this.setState({ error: null }) }) - this.on('upload-started', (file) => { - if (file == null || !this.getFile(file.id)) { - this.log(`Not setting progress for a file that has been removed: ${file?.id}`) - return - } - this.setFileState(file.id, { - progress: { - uploadStarted: Date.now(), - uploadComplete: false, - percentage: 0, - bytesUploaded: 0, - bytesTotal: file.size, + const onUploadStarted = (files) => { + const filesFiltered = files.filter((file) => { + const exists = (file != null && this.getFile(file.id)) + if (!exists) this.log(`Not setting progress for a file that has been removed: ${file?.id}`) + return exists + }) + + const filesState = Object.fromEntries(filesFiltered.map((file) => ([ + file.id, + { + progress: { + uploadStarted: Date.now(), + uploadComplete: false, + percentage: 0, + bytesUploaded: 0, + bytesTotal: file.size, + }, }, + ]))) + + this.patchFilesState(filesState) + } + + this.on('upload-start', (files) => { + files.forEach((file) => { + // todo backward compat, remove this event in a next major + this.emit('upload-started', file) }) + onUploadStarted(files) }) this.on('upload-progress', this.calculateProgress) @@ -1415,9 +1472,12 @@ class Uppy { * @private */ async #runUpload (uploadID) { - let { currentUploads } = this.getState() - let currentUpload = currentUploads[uploadID] - const restoreStep = currentUpload.step || 0 + const getCurrentUpload = () => { + const { currentUploads } = this.getState() + return currentUploads[uploadID] + } + + let currentUpload = getCurrentUpload() const steps = [ ...this.#preProcessors, @@ -1425,31 +1485,30 @@ class Uppy { ...this.#postProcessors, ] try { - for (let step = restoreStep; step < steps.length; step++) { + for (let step = currentUpload.step || 0; step < steps.length; step++) { if (!currentUpload) { break } const fn = steps[step] - const updatedUpload = { - ...currentUpload, - step, - } - this.setState({ currentUploads: { - ...currentUploads, - [uploadID]: updatedUpload, + ...this.getState().currentUploads, + [uploadID]: { + ...currentUpload, + step, + }, }, }) + const { fileIDs } = currentUpload + // TODO give this the `updatedUpload` object as its only parameter maybe? // Otherwise when more metadata may be added to the upload this would keep getting more parameters - await fn(updatedUpload.fileIDs, uploadID) + await fn(fileIDs, uploadID) // Update currentUpload value in case it was modified asynchronously. - currentUploads = this.getState().currentUploads - currentUpload = currentUploads[uploadID] + currentUpload = getCurrentUpload() } } catch (err) { this.#removeUpload(uploadID) @@ -1481,8 +1540,7 @@ class Uppy { await this.addResultData(uploadID, { successful, failed, uploadID }) // Update currentUpload value in case it was modified asynchronously. - currentUploads = this.getState().currentUploads - currentUpload = currentUploads[uploadID] + currentUpload = getCurrentUpload() } // Emit completion events. // This is in a separate function so that the `currentUploads` variable @@ -1531,7 +1589,7 @@ class Uppy { return Promise.resolve() .then(() => this.#restricter.validateMinNumberOfFiles(files)) .catch((err) => { - this.#informAndEmit(err) + this.#informAndEmit([err]) throw err }) .then(() => { diff --git a/packages/@uppy/core/src/Uppy.test.js b/packages/@uppy/core/src/Uppy.test.js index fd8faff2b4..a3141c09c8 100644 --- a/packages/@uppy/core/src/Uppy.test.js +++ b/packages/@uppy/core/src/Uppy.test.js @@ -684,8 +684,10 @@ describe('src/Core', () => { describe('adding a file', () => { it('should call onBeforeFileAdded if it was specified in the options when initialising the class', () => { const onBeforeFileAdded = jest.fn() + const core = new Core({ - onBeforeFileAdded, + // need to capture a snapshot of files, because files will change in the next tick, thus failing the expect below + onBeforeFileAdded: (file, files) => onBeforeFileAdded(file, { ...files }), }) core.addFile({ @@ -1428,7 +1430,7 @@ describe('src/Core', () => { const promise = new Promise((resolve) => { proceedUpload = resolve }) const finishPromise = new Promise((resolve) => { finishUpload = resolve }) core.addUploader(async ([id]) => { - core.emit('upload-started', core.getFile(id)) + core.emit('upload-start', [core.getFile(id)]) await promise core.emit('upload-progress', core.getFile(id), { bytesTotal: 3456, @@ -1448,7 +1450,11 @@ describe('src/Core', () => { core.calculateTotalProgress() const uploadPromise = core.upload() - await new Promise((resolve) => core.once('upload-started', resolve)) + await Promise.all([ + new Promise((resolve) => core.once('upload-start', resolve)), + // todo backward compat: remove in next major + new Promise((resolve) => core.once('upload-started', resolve)), + ]) expect(core.getFiles()[0].size).toBeNull() expect(core.getFiles()[0].progress).toMatchObject({ @@ -1491,7 +1497,7 @@ describe('src/Core', () => { const core = new Core() core.once('file-added', (file) => { - core.emit('upload-started', file) + core.emit('upload-start', [file]) core.emit('upload-progress', file, { bytesTotal: 3456, bytesUploaded: 1234, @@ -1505,7 +1511,7 @@ describe('src/Core', () => { }) core.once('file-added', (file) => { - core.emit('upload-started', file) + core.emit('upload-start', [file]) core.emit('upload-progress', file, { bytesTotal: null, bytesUploaded: null, diff --git a/packages/@uppy/core/src/locale.js b/packages/@uppy/core/src/locale.js index 34d229541e..a3ca237906 100644 --- a/packages/@uppy/core/src/locale.js +++ b/packages/@uppy/core/src/locale.js @@ -57,5 +57,6 @@ export default { 0: 'Added %{smart_count} file from %{folder}', 1: 'Added %{smart_count} files from %{folder}', }, + additionalRestrictionsFailed: '%{count} additional restrictions were not fulfilled', }, } diff --git a/packages/@uppy/dashboard/src/Dashboard.jsx b/packages/@uppy/dashboard/src/Dashboard.jsx index 4a9f138d8f..44e367cb56 100644 --- a/packages/@uppy/dashboard/src/Dashboard.jsx +++ b/packages/@uppy/dashboard/src/Dashboard.jsx @@ -655,6 +655,8 @@ export default class Dashboard extends UIPlugin { } } + this.uppy.log('[Dashboard] Processing dropped files') + // Add all dropped files const files = await getDroppedFiles(event.dataTransfer, { logDropError }) if (files.length > 0) { diff --git a/packages/@uppy/dashboard/src/components/Dashboard.jsx b/packages/@uppy/dashboard/src/components/Dashboard.jsx index ca0587e756..406d9fb475 100644 --- a/packages/@uppy/dashboard/src/components/Dashboard.jsx +++ b/packages/@uppy/dashboard/src/components/Dashboard.jsx @@ -144,8 +144,28 @@ export default function Dashboard (props) { {showFileList ? ( diff --git a/packages/@uppy/dashboard/src/components/FileList.jsx b/packages/@uppy/dashboard/src/components/FileList.jsx index b56ba5b5fa..0568a929a4 100644 --- a/packages/@uppy/dashboard/src/components/FileList.jsx +++ b/packages/@uppy/dashboard/src/components/FileList.jsx @@ -1,4 +1,5 @@ import { h } from 'preact' +import { useMemo } from 'preact/hooks' import FileItem from './FileItem/index.jsx' import VirtualList from './VirtualList.jsx' @@ -17,52 +18,28 @@ function chunks (list, size) { return chunked } -export default (props) => { +export default ({ + id, error, i18n, uppy, files, acquirers, resumableUploads, hideRetryButton, hidePauseResumeButton, hideCancelButton, + showLinkToFileUploadResult, showRemoveButtonAfterComplete, isWide, metaFields, isSingleFile, toggleFileCard, + handleRequestThumbnail, handleCancelThumbnail, recoveredState, individualCancellation, itemsPerRow, openFileEditor, + canEditFile, toggleAddFilesPanel, containerWidth, containerHeight, +}) => { // It's not great that this is hardcoded! // It's ESPECIALLY not great that this is checking against `itemsPerRow`! - const rowHeight = props.itemsPerRow === 1 + const rowHeight = itemsPerRow === 1 // Mobile ? 71 // 190px height + 2 * 5px margin : 200 - const fileProps = { - // FIXME This is confusing, it's actually the Dashboard's plugin ID - id: props.id, - error: props.error, - // TODO move this to context - i18n: props.i18n, - uppy: props.uppy, - // features - acquirers: props.acquirers, - resumableUploads: props.resumableUploads, - individualCancellation: props.individualCancellation, - // visual options - hideRetryButton: props.hideRetryButton, - hidePauseResumeButton: props.hidePauseResumeButton, - hideCancelButton: props.hideCancelButton, - showLinkToFileUploadResult: props.showLinkToFileUploadResult, - showRemoveButtonAfterComplete: props.showRemoveButtonAfterComplete, - isWide: props.isWide, - metaFields: props.metaFields, - recoveredState: props.recoveredState, - isSingleFile: props.isSingleFile, - containerWidth: props.containerWidth, - containerHeight: props.containerHeight, - // callbacks - toggleFileCard: props.toggleFileCard, - handleRequestThumbnail: props.handleRequestThumbnail, - handleCancelThumbnail: props.handleCancelThumbnail, - } - - const sortByGhostComesFirst = (file1, file2) => { - return props.files[file2].isGhost - props.files[file1].isGhost - } - // Sort files by file.isGhost, ghost files first, only if recoveredState is present - const files = Object.keys(props.files) - if (props.recoveredState) files.sort(sortByGhostComesFirst) - const rows = chunks(files, props.itemsPerRow) + const rows = useMemo(() => { + const sortByGhostComesFirst = (file1, file2) => files[file2].isGhost - files[file1].isGhost + + const fileIds = Object.keys(files) + if (recoveredState) fileIds.sort(sortByGhostComesFirst) + return chunks(fileIds, itemsPerRow) + }, [files, itemsPerRow, recoveredState]) const renderRow = (row) => ( // The `role="presentation` attribute ensures that the list items are properly @@ -72,19 +49,43 @@ export default (props) => { {row.map((fileID) => ( ))} ) - if (props.isSingleFile) { + if (isSingleFile) { return (
{renderRow(rows[0])} diff --git a/packages/@uppy/locales/src/en_US.js b/packages/@uppy/locales/src/en_US.js index 01decba47d..e1a5fd35c6 100644 --- a/packages/@uppy/locales/src/en_US.js +++ b/packages/@uppy/locales/src/en_US.js @@ -81,6 +81,7 @@ en_US.strings = { '0': 'Added %{smart_count} file from %{folder}', '1': 'Added %{smart_count} files from %{folder}', }, + additionalRestrictionsFailed: '%{count} additional restrictions were not fulfilled', folderAlreadyAdded: 'The folder "%{folder}" was already added', generatingThumbnails: 'Generating thumbnails...', import: 'Import', diff --git a/packages/@uppy/provider-views/package.json b/packages/@uppy/provider-views/package.json index 2f7e240f7b..d3a569ef15 100644 --- a/packages/@uppy/provider-views/package.json +++ b/packages/@uppy/provider-views/package.json @@ -23,6 +23,7 @@ "@uppy/utils": "workspace:^", "classnames": "^2.2.6", "nanoid": "^4.0.0", + "p-queue": "^7.3.4", "preact": "^10.5.13" }, "peerDependencies": { diff --git a/packages/@uppy/provider-views/src/ProviderView/ProviderView.jsx b/packages/@uppy/provider-views/src/ProviderView/ProviderView.jsx index 9b6a28fbff..cb3d01492d 100644 --- a/packages/@uppy/provider-views/src/ProviderView/ProviderView.jsx +++ b/packages/@uppy/provider-views/src/ProviderView/ProviderView.jsx @@ -1,4 +1,6 @@ import { h } from 'preact' +// eslint-disable-next-line import/no-unresolved +import PQueue from 'p-queue' import { getSafeFileId } from '@uppy/utils/lib/generateFileID' @@ -235,23 +237,23 @@ export default class ProviderView extends View { } } - async* recursivelyListAllFiles (path) { + async recursivelyListAllFiles (path, queue, onFiles) { let curPath = path - // need to repeat the list call until there are no more pages while (curPath) { const res = await this.provider.list(curPath) + curPath = res.nextPagePath - for (const item of res.items) { - if (item.isFolder) { - // recursively call self for folder - yield* this.recursivelyListAllFiles(item.requestPath) - } else { - yield item - } - } + const files = res.items.filter((item) => !item.isFolder) + const folders = res.items.filter((item) => item.isFolder) - curPath = res.nextPagePath + onFiles(files) + + // recursively queue call to self for each folder + const promises = folders.map(async (folder) => queue.add(async () => ( + this.recursivelyListAllFiles(folder.requestPath, queue, onFiles) + ))) + await Promise.all(promises) // in case we get an error } } @@ -263,28 +265,34 @@ export default class ProviderView extends View { const messages = [] const newFiles = [] - // eslint-disable-next-line no-unreachable-loop for (const file of currentSelection) { if (file.isFolder) { const { requestPath, name } = file let isEmpty = true let numNewFiles = 0 - for await (const fileInFolder of this.recursivelyListAllFiles(requestPath)) { - const tagFile = this.getTagFile(fileInFolder) - const id = getSafeFileId(tagFile) - // If the same folder is added again, we don't want to send - // X amount of duplicate file notifications, we want to say - // the folder was already added. This checks if all files are duplicate, - // if that's the case, we don't add the files. - if (!this.plugin.uppy.checkIfFileAlreadyExists(id)) { - newFiles.push(fileInFolder) - numNewFiles++ - this.setLoading(this.plugin.uppy.i18n('addedNumFiles', { numFiles: numNewFiles })) + const queue = new PQueue({ concurrency: 6 }) + + const onFiles = (files) => { + for (const newFile of files) { + const tagFile = this.getTagFile(newFile) + const id = getSafeFileId(tagFile) + // If the same folder is added again, we don't want to send + // X amount of duplicate file notifications, we want to say + // the folder was already added. This checks if all files are duplicate, + // if that's the case, we don't add the files. + if (!this.plugin.uppy.checkIfFileAlreadyExists(id)) { + newFiles.push(newFile) + numNewFiles++ + this.setLoading(this.plugin.uppy.i18n('addedNumFiles', { numFiles: numNewFiles })) + } + isEmpty = false } - isEmpty = false } + await this.recursivelyListAllFiles(requestPath, queue, onFiles) + await queue.onIdle() + let message if (isEmpty) { message = this.plugin.uppy.i18n('emptyFolderAdded') @@ -293,6 +301,9 @@ export default class ProviderView extends View { folder: name, }) } else { + // TODO we don't really know at this point whether any files were actually added + // (only later after addFiles has been called) so we should probably rewrite this. + // Example: If all files fail to add due to restriction error, it will still say "Added 100 files from folder" message = this.plugin.uppy.i18n('folderAdded', { smart_count: numNewFiles, folder: name, }) diff --git a/packages/@uppy/tus/src/index.js b/packages/@uppy/tus/src/index.js index a1f0c4feeb..0d254d65e9 100644 --- a/packages/@uppy/tus/src/index.js +++ b/packages/@uppy/tus/src/index.js @@ -3,12 +3,12 @@ import * as tus from 'tus-js-client' import { Provider, RequestClient, Socket } from '@uppy/companion-client' import emitSocketProgress from '@uppy/utils/lib/emitSocketProgress' import getSocketHost from '@uppy/utils/lib/getSocketHost' -import settle from '@uppy/utils/lib/settle' import EventTracker from '@uppy/utils/lib/EventTracker' import NetworkError from '@uppy/utils/lib/NetworkError' import isNetworkError from '@uppy/utils/lib/isNetworkError' import { RateLimitedQueue } from '@uppy/utils/lib/RateLimitedQueue' import hasProperty from '@uppy/utils/lib/hasProperty' +import { filterNonFailedFiles, filterFilesToEmitUploadStarted } from '@uppy/utils/lib/fileFilters' import getFingerprint from './getFingerprint.js' import packageJson from '../package.json' @@ -102,7 +102,6 @@ export default class Tus extends BasePlugin { this.uploaderSockets = Object.create(null) this.handleResetProgress = this.handleResetProgress.bind(this) - this.handleUpload = this.handleUpload.bind(this) this.#queueRequestSocketToken = this.requests.wrapPromiseFunction(this.#requestSocketToken, { priority: -1 }) } @@ -183,7 +182,7 @@ export default class Tus extends BasePlugin { * @param {UppyFile} file for use with upload * @returns {Promise} */ - upload (file) { + #upload (file) { this.resetUploaderReferences(file.id) // Create a new tus upload @@ -192,8 +191,6 @@ export default class Tus extends BasePlugin { let qRequest let upload - this.uppy.emit('upload-started', file) - const opts = { ...this.opts, ...(file.tus || {}), @@ -462,14 +459,9 @@ export default class Tus extends BasePlugin { * @param {UppyFile} file for use with upload * @returns {Promise} */ - async uploadRemote (file) { + async #uploadRemote (file) { this.resetUploaderReferences(file.id) - // Don't double-emit upload-started for Golden Retriever-restored files that were already started - if (!file.progress.uploadStarted || !file.isRestored) { - this.uppy.emit('upload-started', file) - } - try { if (file.serverToken) { return await this.connectToServerSocket(file) @@ -730,39 +722,29 @@ export default class Tus extends BasePlugin { /** * @param {(UppyFile | FailedUppyFile)[]} files */ - uploadFiles (files) { - const promises = files.map((file, i) => { + async #uploadFiles (files) { + const filesFiltered = filterNonFailedFiles(files) + const filesToEmit = filterFilesToEmitUploadStarted(filesFiltered) + this.uppy.emit('upload-start', filesToEmit) + + await Promise.allSettled(filesFiltered.map((file, i) => { const current = i + 1 const total = files.length - if ('error' in file && file.error) { - return Promise.reject(new Error(file.error)) - } if (file.isRemote) { - // We emit upload-started here, so that it's also emitted for files - // that have to wait due to the `limit` option. - // Don't double-emit upload-started for Golden Retriever-restored files that were already started - if (!file.progress.uploadStarted || !file.isRestored) { - this.uppy.emit('upload-started', file) - } - return this.uploadRemote(file, current, total) - } - // Don't double-emit upload-started for Golden Retriever-restored files that were already started - if (!file.progress.uploadStarted || !file.isRestored) { - this.uppy.emit('upload-started', file) + if (file.isRemote) { + return this.#uploadRemote(file, current, total) } - return this.upload(file, current, total) - }) - - return settle(promises) + return this.#upload(file, current, total) + })) } /** * @param {string[]} fileIDs */ - handleUpload (fileIDs) { + #handleUpload = async (fileIDs) => { if (fileIDs.length === 0) { this.uppy.log('[Tus] No files to upload') - return Promise.resolve() + return } if (this.opts.limit === 0) { @@ -773,17 +755,16 @@ export default class Tus extends BasePlugin { } this.uppy.log('[Tus] Uploading...') - const filesToUpload = fileIDs.map((fileID) => this.uppy.getFile(fileID)) + const filesToUpload = this.uppy.getFilesByIds(fileIDs) - return this.uploadFiles(filesToUpload) - .then(() => null) + await this.#uploadFiles(filesToUpload) } install () { this.uppy.setState({ capabilities: { ...this.uppy.getState().capabilities, resumableUploads: true }, }) - this.uppy.addUploader(this.handleUpload) + this.uppy.addUploader(this.#handleUpload) this.uppy.on('reset-progress', this.handleResetProgress) } @@ -792,6 +773,6 @@ export default class Tus extends BasePlugin { this.uppy.setState({ capabilities: { ...this.uppy.getState().capabilities, resumableUploads: false }, }) - this.uppy.removeUploader(this.handleUpload) + this.uppy.removeUploader(this.#handleUpload) } } diff --git a/packages/@uppy/utils/package.json b/packages/@uppy/utils/package.json index 4a7a7cbc38..4aab462357 100644 --- a/packages/@uppy/utils/package.json +++ b/packages/@uppy/utils/package.json @@ -61,6 +61,7 @@ "./lib/mimeTypes": "./lib/mimeTypes.js", "./lib/getDroppedFiles": "./lib/getDroppedFiles/index.js", "./lib/FOCUSABLE_ELEMENTS.js": "./lib/FOCUSABLE_ELEMENTS.js", + "./lib/fileFilters": "./lib/fileFilters.js", "./src/microtip.scss": "./src/microtip.scss" }, "dependencies": { diff --git a/packages/@uppy/utils/src/fileFilters.js b/packages/@uppy/utils/src/fileFilters.js new file mode 100644 index 0000000000..f4164cc6f4 --- /dev/null +++ b/packages/@uppy/utils/src/fileFilters.js @@ -0,0 +1,10 @@ +export function filterNonFailedFiles (files) { + const hasError = (file) => 'error' in file && file.error + + return files.filter((file) => !hasError(file)) +} + +// Don't double-emit upload-started for Golden Retriever-restored files that were already started +export function filterFilesToEmitUploadStarted (files) { + return files.filter((file) => !file.progress.uploadStarted || !file.isRestored) +} diff --git a/packages/@uppy/utils/src/settle.js b/packages/@uppy/utils/src/settle.js index d7b3235bea..2a57f6c3d6 100644 --- a/packages/@uppy/utils/src/settle.js +++ b/packages/@uppy/utils/src/settle.js @@ -1,3 +1,4 @@ +// TODO remove (no longer in use) export default function settle (promises) { const resolutions = [] const rejections = [] diff --git a/packages/@uppy/xhr-upload/src/index.js b/packages/@uppy/xhr-upload/src/index.js index 65e297ad11..b95d71f195 100644 --- a/packages/@uppy/xhr-upload/src/index.js +++ b/packages/@uppy/xhr-upload/src/index.js @@ -3,12 +3,12 @@ import { nanoid } from 'nanoid/non-secure' import { Provider, RequestClient, Socket } from '@uppy/companion-client' import emitSocketProgress from '@uppy/utils/lib/emitSocketProgress' import getSocketHost from '@uppy/utils/lib/getSocketHost' -import settle from '@uppy/utils/lib/settle' import EventTracker from '@uppy/utils/lib/EventTracker' import ProgressTimeout from '@uppy/utils/lib/ProgressTimeout' import { RateLimitedQueue, internalRateLimitedQueue } from '@uppy/utils/lib/RateLimitedQueue' import NetworkError from '@uppy/utils/lib/NetworkError' import isNetworkError from '@uppy/utils/lib/isNetworkError' +import { filterNonFailedFiles, filterFilesToEmitUploadStarted } from '@uppy/utils/lib/fileFilters' import packageJson from '../package.json' import locale from './locale.js' @@ -113,8 +113,6 @@ export default class XHRUpload extends BasePlugin { this.opts = { ...defaultOptions, ...opts } this.i18nInit() - this.handleUpload = this.handleUpload.bind(this) - // Simultaneous upload limiting is shared across all uploads with this plugin. if (internalRateLimitedQueue in this.opts) { this.requests = this.opts[internalRateLimitedQueue] @@ -214,13 +212,11 @@ export default class XHRUpload extends BasePlugin { return formPost } - upload (file, current, total) { + async #upload (file, current, total) { const opts = this.getOptions(file) this.uppy.log(`uploading ${current} of ${total}`) return new Promise((resolve, reject) => { - this.uppy.emit('upload-started', file) - const data = opts.formData ? this.createFormDataUpload(file, opts) : file.data @@ -317,8 +313,6 @@ export default class XHRUpload extends BasePlugin { } queuedRequest = this.requests.run(() => { - this.uppy.emit('upload-started', file) - // When using an authentication system like JWT, the bearer token goes as a header. This // header needs to be fresh each time the token is refreshed so computing and setting the // headers just before the upload starts enables this kind of authentication to work properly. @@ -375,10 +369,9 @@ export default class XHRUpload extends BasePlugin { // NOTE! Keep this duplicated code in sync with other plugins // TODO we should probably abstract this into a common function - async uploadRemote (file) { + async #uploadRemote (file) { // TODO: we could rewrite this to use server-sent events instead of creating WebSockets. try { - this.uppy.emit('upload-started', file) if (file.serverToken) { return await this.connectToServerSocket(file) } @@ -496,7 +489,7 @@ export default class XHRUpload extends BasePlugin { }) } - uploadBundle (files) { + #uploadBundle (files) { return new Promise((resolve, reject) => { const { endpoint } = this.opts const { method } = this.opts @@ -587,27 +580,19 @@ export default class XHRUpload extends BasePlugin { }) xhr.send(formData) - - files.forEach((file) => { - this.uppy.emit('upload-started', file) - }) }) } - uploadFiles (files) { - const promises = files.map((file, i) => { + async #uploadFiles (files) { + await Promise.allSettled(files.map((file, i) => { const current = parseInt(i, 10) + 1 const total = files.length - if (file.error) { - return Promise.reject(new Error(file.error)) - } if (file.isRemote) { - return this.uploadRemote(file, current, total) + if (file.isRemote) { + return this.#uploadRemote(file, current, total) } - return this.upload(file, current, total) - }) - - return settle(promises) + return this.#upload(file, current, total) + })) } onFileRemove (fileID, cb) { @@ -638,10 +623,10 @@ export default class XHRUpload extends BasePlugin { }) } - handleUpload (fileIDs) { + #handleUpload = async (fileIDs) => { if (fileIDs.length === 0) { this.uppy.log('[XHRUpload] No files to upload!') - return Promise.resolve() + return } // No limit configured by the user, and no RateLimitedQueue passed in by a "parent" plugin @@ -654,11 +639,15 @@ export default class XHRUpload extends BasePlugin { } this.uppy.log('[XHRUpload] Uploading...') - const files = fileIDs.map((fileID) => this.uppy.getFile(fileID)) + const files = this.uppy.getFilesByIds(fileIDs) + + const filesFiltered = filterNonFailedFiles(files) + const filesToEmit = filterFilesToEmitUploadStarted(filesFiltered) + this.uppy.emit('upload-start', filesToEmit) if (this.opts.bundle) { // if bundle: true, we don’t support remote uploads - const isSomeFileRemote = files.some(file => file.isRemote) + const isSomeFileRemote = filesFiltered.some(file => file.isRemote) if (isSomeFileRemote) { throw new Error('Can’t upload remote files when the `bundle: true` option is set') } @@ -667,10 +656,10 @@ export default class XHRUpload extends BasePlugin { throw new TypeError('`headers` may not be a function when the `bundle: true` option is set') } - return this.uploadBundle(files) + await this.#uploadBundle(filesFiltered) + } else { + await this.#uploadFiles(filesFiltered) } - - return this.uploadFiles(files).then(() => null) } install () { @@ -684,7 +673,7 @@ export default class XHRUpload extends BasePlugin { }) } - this.uppy.addUploader(this.handleUpload) + this.uppy.addUploader(this.#handleUpload) } uninstall () { @@ -698,6 +687,6 @@ export default class XHRUpload extends BasePlugin { }) } - this.uppy.removeUploader(this.handleUpload) + this.uppy.removeUploader(this.#handleUpload) } } diff --git a/private/dev/Dashboard.js b/private/dev/Dashboard.js index 0e98db614a..ed6933b9c5 100644 --- a/private/dev/Dashboard.js +++ b/private/dev/Dashboard.js @@ -40,6 +40,7 @@ console.log(import.meta.env) // DEV CONFIG: enable or disable Golden Retriever const RESTORE = false +const COMPRESS = false async function assemblyOptions () { return generateSignatureIfSecret(TRANSLOADIT_SECRET, { @@ -108,7 +109,10 @@ export default () => { .use(DropTarget, { target: document.body, }) - .use(Compressor) + + if (COMPRESS) { + uppyDashboard.use(Compressor) + } switch (UPLOADER) { case 'tus': diff --git a/yarn.lock b/yarn.lock index fb4aacb9fa..d661ee4b82 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4332,109 +4332,196 @@ __metadata: languageName: node linkType: hard -"@parcel/bundler-default@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/bundler-default@npm:2.7.0" +"@parcel/bundler-default@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/bundler-default@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/graph": 2.8.4-nightly.2903+5b901a317 + "@parcel/hash": 2.8.4-nightly.2903+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + nullthrows: ^1.1.1 + checksum: 936a3ea9adac2641cac0059a2f5927ab660e8f9e5dba946c92e4300beac4804743f642a76545c1d11ad71f6f5e362c654b33af2185e7e222c3a81616c487e29a + languageName: node + linkType: hard + +"@parcel/bundler-default@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/bundler-default@npm:2.8.3" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/hash": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.8.3 + "@parcel/graph": 2.8.3 + "@parcel/hash": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 nullthrows: ^1.1.1 - checksum: 0efb78be2e8873d951549f0e6e25fe441ff7a0220bc8414430c8ddd4a7cb3ae84b100a5cc761277af699bf736e3631eb0fa456bdec1141a7bddc5f0f52312522 + checksum: 219b2be341cad20991659b7a3031454a081ce0787c161a4da8a73ae8a4af4468667b284caea9488e869b162763d308cfd6495ab35fe386413b14325d6667ea86 languageName: node linkType: hard -"@parcel/cache@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/cache@npm:2.7.0" +"@parcel/cache@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/cache@npm:2.0.0-nightly.1280" dependencies: - "@parcel/fs": 2.7.0 - "@parcel/logger": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/fs": 2.0.0-nightly.1280+5b901a317 + "@parcel/logger": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 lmdb: 2.5.2 peerDependencies: - "@parcel/core": ^2.7.0 - checksum: 7aa6a6883b1c62a8f1fa13d8841adbed3e2d969b72d67f51f833c6a14464ad5fc5a6368883759e817bcda44a4f0f617ece068a93d389bc68697c326e7651c8f6 + "@parcel/core": 2.0.0-nightly.1278+5b901a317 + checksum: 4ae837045250e1415eb7c73787c66a08138cb2e559b3a836a63ede0708a127c6030a7278508020830b0830cd5e2688d0ef70dc90271f24792d1b469f74658b76 languageName: node linkType: hard -"@parcel/codeframe@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/codeframe@npm:2.7.0" +"@parcel/cache@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/cache@npm:2.8.3" + dependencies: + "@parcel/fs": 2.8.3 + "@parcel/logger": 2.8.3 + "@parcel/utils": 2.8.3 + lmdb: 2.5.2 + peerDependencies: + "@parcel/core": ^2.8.3 + checksum: cd679053d229f8d06536a8fc9d857e5fa58905492e1a97c4f6b1da82de0dcef202a609c1e36206d3cdb32e5da3a214525f868b98dfd7aa671a53dacceb004fd9 + languageName: node + linkType: hard + +"@parcel/codeframe@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/codeframe@npm:2.0.0-nightly.1280" dependencies: chalk: ^4.1.0 - checksum: 169f305518f567019d893ef3865ccc29f38d93652441d1345ef93f5c5c0533c99f37493917514c2be051939643e62faea213a52c0d797e078120f40cfe90138d + checksum: af0d7b78b4779f980c1c4fc1965d085926183c84b1d071c270df37ba973de20bb9e3e8db864ffba0778e8fb8ac41dfc9e2af1faa3eb9fd7f474864b3e77229ae languageName: node linkType: hard -"@parcel/compressor-raw@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/compressor-raw@npm:2.7.0" +"@parcel/codeframe@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/codeframe@npm:2.8.3" dependencies: - "@parcel/plugin": 2.7.0 - checksum: 6b9c009fe45ff461b4c7b6ec1ac723da6d09ea3d9af2b1b9a8bacefa97fd7c597fc2f71fc47328f97b26c7bd77cf6beedaa46797a26c5692bb8a63ea1cb5937b + chalk: ^4.1.0 + checksum: a6e82c30e6251dcae14f247a14f6cb265f766b8bf18b62dd6a1c4a103cfae364a08897b36c5c379d0d867169647cb72962266f77571f718ff68ef70a16b81c02 languageName: node linkType: hard -"@parcel/config-default@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/config-default@npm:2.7.0" - dependencies: - "@parcel/bundler-default": 2.7.0 - "@parcel/compressor-raw": 2.7.0 - "@parcel/namer-default": 2.7.0 - "@parcel/optimizer-css": 2.7.0 - "@parcel/optimizer-htmlnano": 2.7.0 - "@parcel/optimizer-image": 2.7.0 - "@parcel/optimizer-svgo": 2.7.0 - "@parcel/optimizer-terser": 2.7.0 - "@parcel/packager-css": 2.7.0 - "@parcel/packager-html": 2.7.0 - "@parcel/packager-js": 2.7.0 - "@parcel/packager-raw": 2.7.0 - "@parcel/packager-svg": 2.7.0 - "@parcel/reporter-dev-server": 2.7.0 - "@parcel/resolver-default": 2.7.0 - "@parcel/runtime-browser-hmr": 2.7.0 - "@parcel/runtime-js": 2.7.0 - "@parcel/runtime-react-refresh": 2.7.0 - "@parcel/runtime-service-worker": 2.7.0 - "@parcel/transformer-babel": 2.7.0 - "@parcel/transformer-css": 2.7.0 - "@parcel/transformer-html": 2.7.0 - "@parcel/transformer-image": 2.7.0 - "@parcel/transformer-js": 2.7.0 - "@parcel/transformer-json": 2.7.0 - "@parcel/transformer-postcss": 2.7.0 - "@parcel/transformer-posthtml": 2.7.0 - "@parcel/transformer-raw": 2.7.0 - "@parcel/transformer-react-refresh-wrap": 2.7.0 - "@parcel/transformer-svg": 2.7.0 - peerDependencies: - "@parcel/core": ^2.7.0 - checksum: 165d4ec08907d20759267160d7ab6c455aa05d855211dbd4d5f973de3c6b4bcccc41a039f819df76bf39d348cf0448efda06bc8916c4daf4d6c626e05d731a01 - languageName: node - linkType: hard - -"@parcel/core@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/core@npm:2.7.0" +"@parcel/compressor-raw@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/compressor-raw@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + checksum: ca3b8a4f60e5193cffaa8041e709513df9c6cb54f32c9d20fef993a9af2d84f1e2d8bf8f4092220a8abaec24679498f854e683511876187f35b4f94a5852cf85 + languageName: node + linkType: hard + +"@parcel/compressor-raw@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/compressor-raw@npm:2.8.4-nightly.2903" + dependencies: + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + checksum: 02465b01f57504afcb6819fd58f74e969f3db4467aebd63ddf24657241583dbf4d9cd56e5e8d76bdb9ab77518fb53756e9f9317e311937f077f9ce0aba56c281 + languageName: node + linkType: hard + +"@parcel/config-default@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/config-default@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/bundler-default": 2.0.0-nightly.1280+5b901a317 + "@parcel/compressor-raw": 2.8.4-nightly.2903+5b901a317 + "@parcel/namer-default": 2.0.0-nightly.1280+5b901a317 + "@parcel/optimizer-css": 2.8.4-nightly.2903+5b901a317 + "@parcel/optimizer-htmlnano": 2.0.0-nightly.1280+5b901a317 + "@parcel/optimizer-image": 2.8.4-nightly.2903+5b901a317 + "@parcel/optimizer-svgo": 2.8.4-nightly.2903+5b901a317 + "@parcel/optimizer-swc": 2.8.4-nightly.2903+5b901a317 + "@parcel/packager-css": 2.0.0-nightly.1280+5b901a317 + "@parcel/packager-html": 2.0.0-nightly.1280+5b901a317 + "@parcel/packager-js": 2.0.0-nightly.1280+5b901a317 + "@parcel/packager-raw": 2.0.0-nightly.1280+5b901a317 + "@parcel/packager-svg": 2.8.4-nightly.2903+5b901a317 + "@parcel/reporter-dev-server": 2.0.0-nightly.1280+5b901a317 + "@parcel/resolver-default": 2.0.0-nightly.1280+5b901a317 + "@parcel/runtime-browser-hmr": 2.0.0-nightly.1280+5b901a317 + "@parcel/runtime-js": 2.0.0-nightly.1280+5b901a317 + "@parcel/runtime-react-refresh": 2.0.0-nightly.1280+5b901a317 + "@parcel/runtime-service-worker": 2.8.4-nightly.2903+5b901a317 + "@parcel/transformer-babel": 2.0.0-nightly.1280+5b901a317 + "@parcel/transformer-css": 2.0.0-nightly.1280+5b901a317 + "@parcel/transformer-html": 2.0.0-nightly.1280+5b901a317 + "@parcel/transformer-image": 2.8.4-nightly.2903+5b901a317 + "@parcel/transformer-js": 2.0.0-nightly.1280+5b901a317 + "@parcel/transformer-json": 2.0.0-nightly.1280+5b901a317 + "@parcel/transformer-postcss": 2.0.0-nightly.1280+5b901a317 + "@parcel/transformer-posthtml": 2.0.0-nightly.1280+5b901a317 + "@parcel/transformer-raw": 2.0.0-nightly.1280+5b901a317 + "@parcel/transformer-react-refresh-wrap": 2.0.0-nightly.1280+5b901a317 + "@parcel/transformer-svg": 2.8.4-nightly.2903+5b901a317 + peerDependencies: + "@parcel/core": 2.0.0-nightly.1278+5b901a317 + checksum: 3d72c1fec22e5e2ddbe1ca11b1460f08247253d6c5e21863f47f31058075fb1804c69c40d99cdab9b47f0a1d9f668b7bd8bef3d87c1e15cb11220f0a32847a15 + languageName: node + linkType: hard + +"@parcel/config-default@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/config-default@npm:2.8.3" + dependencies: + "@parcel/bundler-default": 2.8.3 + "@parcel/compressor-raw": 2.8.3 + "@parcel/namer-default": 2.8.3 + "@parcel/optimizer-css": 2.8.3 + "@parcel/optimizer-htmlnano": 2.8.3 + "@parcel/optimizer-image": 2.8.3 + "@parcel/optimizer-svgo": 2.8.3 + "@parcel/optimizer-terser": 2.8.3 + "@parcel/packager-css": 2.8.3 + "@parcel/packager-html": 2.8.3 + "@parcel/packager-js": 2.8.3 + "@parcel/packager-raw": 2.8.3 + "@parcel/packager-svg": 2.8.3 + "@parcel/reporter-dev-server": 2.8.3 + "@parcel/resolver-default": 2.8.3 + "@parcel/runtime-browser-hmr": 2.8.3 + "@parcel/runtime-js": 2.8.3 + "@parcel/runtime-react-refresh": 2.8.3 + "@parcel/runtime-service-worker": 2.8.3 + "@parcel/transformer-babel": 2.8.3 + "@parcel/transformer-css": 2.8.3 + "@parcel/transformer-html": 2.8.3 + "@parcel/transformer-image": 2.8.3 + "@parcel/transformer-js": 2.8.3 + "@parcel/transformer-json": 2.8.3 + "@parcel/transformer-postcss": 2.8.3 + "@parcel/transformer-posthtml": 2.8.3 + "@parcel/transformer-raw": 2.8.3 + "@parcel/transformer-react-refresh-wrap": 2.8.3 + "@parcel/transformer-svg": 2.8.3 + peerDependencies: + "@parcel/core": ^2.8.3 + checksum: 08c700a7a253f39e84e1d341b3e0f558a2410bb27bf8a128113d8d157c32a7ef6b6ebd95e2c26d9f35c1040b98ff229ab56782247746189b4c41b925d1efd251 + languageName: node + linkType: hard + +"@parcel/core@npm:2.0.0-nightly.1278+5b901a317": + version: 2.0.0-nightly.1278 + resolution: "@parcel/core@npm:2.0.0-nightly.1278" dependencies: "@mischnic/json-sourcemap": ^0.1.0 - "@parcel/cache": 2.7.0 - "@parcel/diagnostic": 2.7.0 - "@parcel/events": 2.7.0 - "@parcel/fs": 2.7.0 - "@parcel/graph": 2.7.0 - "@parcel/hash": 2.7.0 - "@parcel/logger": 2.7.0 - "@parcel/package-manager": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/types": 2.7.0 - "@parcel/utils": 2.7.0 - "@parcel/workers": 2.7.0 + "@parcel/cache": 2.0.0-nightly.1280+5b901a317 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/events": 2.0.0-nightly.1280+5b901a317 + "@parcel/fs": 2.0.0-nightly.1280+5b901a317 + "@parcel/graph": 2.8.4-nightly.2903+5b901a317 + "@parcel/hash": 2.8.4-nightly.2903+5b901a317 + "@parcel/logger": 2.0.0-nightly.1280+5b901a317 + "@parcel/package-manager": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/types": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + "@parcel/workers": 2.0.0-nightly.1280+5b901a317 abortcontroller-polyfill: ^1.1.9 base-x: ^3.0.8 browserslist: ^4.6.6 @@ -4445,672 +4532,1155 @@ __metadata: msgpackr: ^1.5.4 nullthrows: ^1.1.1 semver: ^5.7.1 - checksum: 615903871f7e3d03f19342a6d1b231612f1ac780a0079d4a37c82d4819a75140d5cf287172b9d40fad1c7aad3c12198c27718f838b543db75d90702ac558b15e + checksum: a3348495e20dec77aff5126ac8feaaedf409dd079e85807316696880d2d8d1a96be7e0f2e6f85d831cf675c6bd2a36b5720eaf7eb65f583c5a8215a08ec455c0 languageName: node linkType: hard -"@parcel/css-darwin-arm64@npm:1.13.0": - version: 1.13.0 - resolution: "@parcel/css-darwin-arm64@npm:1.13.0" - conditions: os=darwin & cpu=arm64 +"@parcel/core@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/core@npm:2.8.3" + dependencies: + "@mischnic/json-sourcemap": ^0.1.0 + "@parcel/cache": 2.8.3 + "@parcel/diagnostic": 2.8.3 + "@parcel/events": 2.8.3 + "@parcel/fs": 2.8.3 + "@parcel/graph": 2.8.3 + "@parcel/hash": 2.8.3 + "@parcel/logger": 2.8.3 + "@parcel/package-manager": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/source-map": ^2.1.1 + "@parcel/types": 2.8.3 + "@parcel/utils": 2.8.3 + "@parcel/workers": 2.8.3 + abortcontroller-polyfill: ^1.1.9 + base-x: ^3.0.8 + browserslist: ^4.6.6 + clone: ^2.1.1 + dotenv: ^7.0.0 + dotenv-expand: ^5.1.0 + json5: ^2.2.0 + msgpackr: ^1.5.4 + nullthrows: ^1.1.1 + semver: ^5.7.1 + checksum: 68adceb1b041208fe922bb52da218e6be90d6e016322f4eac5a5dbfbac72838080cf9bbce51785d65556a258293c02dffba4482217dbd9b723258101d925fb0e languageName: node linkType: hard -"@parcel/css-darwin-x64@npm:1.13.0": - version: 1.13.0 - resolution: "@parcel/css-darwin-x64@npm:1.13.0" - conditions: os=darwin & cpu=x64 +"@parcel/diagnostic@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/diagnostic@npm:2.0.0-nightly.1280" + dependencies: + "@mischnic/json-sourcemap": ^0.1.0 + nullthrows: ^1.1.1 + checksum: 07918b760d4ce474b5d4a39fd10f9febb82dc6b4562ea4476ae42b972e0cd5bb2d7c782cffa593cd8d3a85b5fcf8f9dc331f755076037010750a20a56c8ea74b languageName: node linkType: hard -"@parcel/css-linux-arm-gnueabihf@npm:1.13.0": - version: 1.13.0 - resolution: "@parcel/css-linux-arm-gnueabihf@npm:1.13.0" - conditions: os=linux & cpu=arm +"@parcel/diagnostic@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/diagnostic@npm:2.8.3" + dependencies: + "@mischnic/json-sourcemap": ^0.1.0 + nullthrows: ^1.1.1 + checksum: c24d98a2dbf068ef334c595d51504cd063310c0327477b5d7bcf817af3f8ad79d56593cdf91d8d45cb4a41a48baf9090ae4100a96d2c197d4ed20bc5db9df2d9 languageName: node linkType: hard -"@parcel/css-linux-arm64-gnu@npm:1.13.0": - version: 1.13.0 - resolution: "@parcel/css-linux-arm64-gnu@npm:1.13.0" - conditions: os=linux & cpu=arm64 & libc=glibc +"@parcel/events@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/events@npm:2.0.0-nightly.1280" + checksum: 8208e6d05faddef14d19b3e46526ce0b2e5a6ab8878e3d84ba818f8b2191c22369b30ccad0e19f16b756748f3d88d095d1c8b34f1dd443570ed9019193d71551 languageName: node linkType: hard -"@parcel/css-linux-arm64-musl@npm:1.13.0": - version: 1.13.0 - resolution: "@parcel/css-linux-arm64-musl@npm:1.13.0" - conditions: os=linux & cpu=arm64 & libc=musl +"@parcel/events@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/events@npm:2.8.3" + checksum: 9d23c6663e9afce1d1094c46d38eba0b0171835201140258c1dcd33f63cfbc20bb1abdc163cbb7a01d407a8cf06c8742c10035c8a835ebca261b19d8ee0fbf7e languageName: node linkType: hard -"@parcel/css-linux-x64-gnu@npm:1.13.0": - version: 1.13.0 - resolution: "@parcel/css-linux-x64-gnu@npm:1.13.0" - conditions: os=linux & cpu=x64 & libc=glibc +"@parcel/fs-search@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/fs-search@npm:2.8.3" + dependencies: + detect-libc: ^1.0.3 + checksum: 25e8eda6942fbf28e02cef1f5e94acafb3e33275a20b0a3e553402f04d2d24026be796b645728e872949dc8555b03a7d26d615a4f8eeed03a3af76aed535cc10 languageName: node linkType: hard -"@parcel/css-linux-x64-musl@npm:1.13.0": - version: 1.13.0 - resolution: "@parcel/css-linux-x64-musl@npm:1.13.0" - conditions: os=linux & cpu=x64 & libc=musl +"@parcel/fs-search@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/fs-search@npm:2.8.4-nightly.2903" + checksum: 1e0c5c2d612396c789426a5cc2af201f81a22e55c22f73b04f4372b9437833489beb5043ac62342f474b2d69a3fa0d5a7d46d28d8066f75cc0b9f4584b4f072a languageName: node linkType: hard -"@parcel/css-win32-x64-msvc@npm:1.13.0": - version: 1.13.0 - resolution: "@parcel/css-win32-x64-msvc@npm:1.13.0" - conditions: os=win32 & cpu=x64 +"@parcel/fs@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/fs@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/fs-search": 2.8.4-nightly.2903+5b901a317 + "@parcel/types": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + "@parcel/watcher": ^2.0.7 + "@parcel/workers": 2.0.0-nightly.1280+5b901a317 + peerDependencies: + "@parcel/core": 2.0.0-nightly.1278+5b901a317 + checksum: c8460a191854c39777e3da71f09dfe2e57f134202f8c89c801850e2f28e5a0bdbf71a5e0d4ebc5af8365f6c90f76191abf911420aa0f54933c52c42d6d607298 languageName: node linkType: hard -"@parcel/css@npm:^1.12.2": - version: 1.13.0 - resolution: "@parcel/css@npm:1.13.0" - dependencies: - "@parcel/css-darwin-arm64": 1.13.0 - "@parcel/css-darwin-x64": 1.13.0 - "@parcel/css-linux-arm-gnueabihf": 1.13.0 - "@parcel/css-linux-arm64-gnu": 1.13.0 - "@parcel/css-linux-arm64-musl": 1.13.0 - "@parcel/css-linux-x64-gnu": 1.13.0 - "@parcel/css-linux-x64-musl": 1.13.0 - "@parcel/css-win32-x64-msvc": 1.13.0 - detect-libc: ^1.0.3 - dependenciesMeta: - "@parcel/css-darwin-arm64": - optional: true - "@parcel/css-darwin-x64": - optional: true - "@parcel/css-linux-arm-gnueabihf": - optional: true - "@parcel/css-linux-arm64-gnu": - optional: true - "@parcel/css-linux-arm64-musl": - optional: true - "@parcel/css-linux-x64-gnu": - optional: true - "@parcel/css-linux-x64-musl": - optional: true - "@parcel/css-win32-x64-msvc": - optional: true - checksum: 97f319baeec4d628bc84fd293cc048645d66f31c370fad9f1537cd775291e1ac56b3892daeee4d4a2cf9b39653cdfed2e19a63d8d051f6d7279683ae3becbf7f +"@parcel/fs@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/fs@npm:2.8.3" + dependencies: + "@parcel/fs-search": 2.8.3 + "@parcel/types": 2.8.3 + "@parcel/utils": 2.8.3 + "@parcel/watcher": ^2.0.7 + "@parcel/workers": 2.8.3 + peerDependencies: + "@parcel/core": ^2.8.3 + checksum: cc421552daef3c7676030867a1b4ed45d64d5f4221b0b12d487a86183a39544290fd3e7ed9104b1b58c05f2a6b5ec0698ce37a9cd49c484d94ed6b445f26d598 languageName: node linkType: hard -"@parcel/diagnostic@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/diagnostic@npm:2.7.0" +"@parcel/graph@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/graph@npm:2.8.3" dependencies: - "@mischnic/json-sourcemap": ^0.1.0 nullthrows: ^1.1.1 - checksum: a41cc65cb1815b90256f767eb118fcf3bf84b6bed4a31ef61627f2a1cc26e9aa9b9ad6fadb7cc7ce443b985b154b36ac3b10adcc0d0bbd42b0092129324a5fef + checksum: ceed8445f5a23396cca001a54ee0620bd7d6ecbb455977c16bd2f446da14c1791817ed715a4cf70d6ba66310991eeee44d692f15f70ff52e75b98b629da25a88 languageName: node linkType: hard -"@parcel/events@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/events@npm:2.7.0" - checksum: 9477cc8eefa2d5bed9cae39b9aed6379f3686735ea7ab7ffcc78148f2f83ed356663c9dd07ccf93edee5e59f877cb0072ae876c5a03e754cf6d2263638788875 +"@parcel/graph@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/graph@npm:2.8.4-nightly.2903" + dependencies: + nullthrows: ^1.1.1 + checksum: 639aadb5c859aa09ba914b8889fd13e4705a4dbb1f76a03ce6c8bd5c54f57a498a97f4102a0c5ecc873619cd84e9b8f5de26cbc4d067843db4cfa35ba2c94d91 languageName: node linkType: hard -"@parcel/fs-search@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/fs-search@npm:2.7.0" +"@parcel/hash@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/hash@npm:2.8.3" dependencies: detect-libc: ^1.0.3 - checksum: ed49a19d86b21ff5f399d3d137ebd38885d523f34a8753c59a63565d438bb107578ff1f76bdcac2e7d93090553c262dbecdc39e3c2640a12a9eb19416ee18c32 + xxhash-wasm: ^0.4.2 + checksum: 29cef199feda672756c930a8b45ee91e46607aa1b6659c38658758fe2f88870c20e0d4e8738d96ca8b44df60c1b767b5593110e2d24b99382214158c759258d0 languageName: node linkType: hard -"@parcel/fs@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/fs@npm:2.7.0" +"@parcel/hash@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/hash@npm:2.8.4-nightly.2903" dependencies: - "@parcel/fs-search": 2.7.0 - "@parcel/types": 2.7.0 - "@parcel/utils": 2.7.0 - "@parcel/watcher": ^2.0.0 - "@parcel/workers": 2.7.0 - peerDependencies: - "@parcel/core": ^2.7.0 - checksum: 176c21f4a94e0189615582b3d4aca3611012f5e790fcd97ba8d7fe8fdd79ce6e51e0239510698381568aa04a3ec76afbfe689cd7e14c0ee971d9ff8dd3339707 + xxhash-wasm: ^0.4.2 + checksum: 4e1994f815d94a0a0325d899b5cf71fb8fb76cd1156b57b8bc26404a8a10e110ebbbfb40b6ab2f9722964598c6a1efd131045e93f7a3517730f197a0b1191345 languageName: node linkType: hard -"@parcel/graph@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/graph@npm:2.7.0" +"@parcel/logger@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/logger@npm:2.0.0-nightly.1280" dependencies: - "@parcel/utils": 2.7.0 - nullthrows: ^1.1.1 - checksum: 55db3972df4a1246410e1b1a9683b2336497c8d323e3b69c2161d9884bce45170d2f5791211c05ccba6bce181e2c9ffe9fd07401220ef2ed5b7ec031fc87f38a + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/events": 2.0.0-nightly.1280+5b901a317 + checksum: 68ef2004b53f6cd86370a4861e5ab6d19b9e0980993448d0b604e7142ac33c388e580e77bf890741050b3d9ecdac796796b1a3e0d8032c14457ad4f2dbba0b0a languageName: node linkType: hard -"@parcel/hash@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/hash@npm:2.7.0" +"@parcel/logger@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/logger@npm:2.8.3" dependencies: - detect-libc: ^1.0.3 - xxhash-wasm: ^0.4.2 - checksum: 42cad499e60c5c8ff989f644e51d629ddb175574b2c53aae1c89ee3a9827f6d69012c5652459b7f3460a7fe94a9e49a59432ee12250bcebb149ca46faa4b5b0f + "@parcel/diagnostic": 2.8.3 + "@parcel/events": 2.8.3 + checksum: 04fd46313138ea8e38c5bd051cd79ee245ad0a7bb6d5d12a892cafa79755af81ec1b6ddc83a79224bb74170bc1323f016cf849981326adb391f43920976ec9dc languageName: node linkType: hard -"@parcel/logger@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/logger@npm:2.7.0" +"@parcel/markdown-ansi@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/markdown-ansi@npm:2.0.0-nightly.1280" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/events": 2.7.0 - checksum: 85e959a8edc408750260fd908bf3cc886e2d6178977ae93ca6a0907c2a53f14751d7f4ab9fd682dbbe4c3b158001a3f39ee98f98dcdc182ebec41c6128cab7f7 + chalk: ^4.1.0 + checksum: f30557ba0f0143c3013b6d935386641ab3d1bcdf2a468da9686ddf47c7f567a52e2012145094473494d205210b2427e316cc565070e430493ec9f75ad48774f0 languageName: node linkType: hard -"@parcel/markdown-ansi@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/markdown-ansi@npm:2.7.0" +"@parcel/markdown-ansi@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/markdown-ansi@npm:2.8.3" dependencies: chalk: ^4.1.0 - checksum: a9f19091c5a663e71a6ee7936a76c25759eb30af4271883c51468ef193ba0bebe54619d2b6b9d70fb3d9262e8e60a8bbe20f74404e41fbcf3dc0ce4a82d63896 + checksum: 1985f149b2ac08347f954230922fdcc45d7ceedba9b7f458078843a018d950a56cb512fb951537b4f995e861b9290b0757cfc0eadf542a13b124175b5ef02945 languageName: node linkType: hard -"@parcel/namer-default@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/namer-default@npm:2.7.0" +"@parcel/namer-default@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/namer-default@npm:2.0.0-nightly.1280" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/plugin": 2.7.0 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 nullthrows: ^1.1.1 - checksum: 0012b78fc95646c8f201476534eefaa354039a0fcd03cf04f2e33cf8e0c457010cfd78cc9071718f72b7e4d848e077b89f72e58baae3ea5cacc97045b83e8a24 + checksum: b5e47d1c3b2ee910805165b9cdde5aac909e0105076f8ad772ce7454f200e174123b01e9efaf4d4bc389786dcd9b70af70552281d3c912cd7335142b8c56de3b languageName: node linkType: hard -"@parcel/node-resolver-core@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/node-resolver-core@npm:2.7.0" +"@parcel/namer-default@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/namer-default@npm:2.8.3" + dependencies: + "@parcel/diagnostic": 2.8.3 + "@parcel/plugin": 2.8.3 + nullthrows: ^1.1.1 + checksum: 7c2c3434460d8fa6c9d482a9bfc681e47322ad82c8beef193eee9e45831374860d0f89de4c69e2e5cf41301cad19c7e87f5b536ca7d684aa383e783bcce02ef1 + languageName: node + linkType: hard + +"@parcel/node-resolver-core@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/node-resolver-core@npm:2.8.3" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.8.3 + "@parcel/utils": 2.8.3 nullthrows: ^1.1.1 semver: ^5.7.1 - checksum: bc0a94ce3c2423ded844dcf13e61208a3adbffaa13d8e84646023bf48b837ecb0f9b4c39eb667d2bf1080a1b7ee1094164afd3710a943a8828e39da35e28449f + checksum: 4976d3ecc9acc6ee05c7709291f4576c269bc84f896c8bf9e6171ce6f9fbd9c2dd7e3db4e11542b3b29093c73f5451724c94bf7b0735b9920ddcdeecf1809968 languageName: node linkType: hard -"@parcel/optimizer-css@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/optimizer-css@npm:2.7.0" +"@parcel/node-resolver-core@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/node-resolver-core@npm:2.8.4-nightly.2903" + dependencies: + "@mischnic/json-sourcemap": ^0.1.0 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/fs": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + nullthrows: ^1.1.1 + semver: ^5.7.1 + checksum: 716a08216910fc114c3efc068a2ae0958d17064a15d74324d0b7ea819b5722840f4f53c2f506c57b46ca90048e506263478db2c70837c722e1e9425282b9ab89 + languageName: node + linkType: hard + +"@parcel/optimizer-css@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/optimizer-css@npm:2.8.3" dependencies: - "@parcel/css": ^1.12.2 - "@parcel/diagnostic": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.8.3 browserslist: ^4.6.6 + lightningcss: ^1.16.1 nullthrows: ^1.1.1 - checksum: 3799e128cb1cafc57c4de384a9b7339c5be7d4a0205887424a7265d31205439bce25195b1c06036e91acb32cb354edd9ccf9116f5a46a04db72e16b4e185e664 + checksum: ffac43a2c20243d57b8627257b5a74462ebc0f4aa780b3117237240c9c3e9ca37ddcc8312296be9fe571a78f5a44cc14fa47ca9490d3796d673d8313d6cd8c9a languageName: node linkType: hard -"@parcel/optimizer-htmlnano@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/optimizer-htmlnano@npm:2.7.0" +"@parcel/optimizer-css@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/optimizer-css@npm:2.8.4-nightly.2903" dependencies: - "@parcel/plugin": 2.7.0 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + browserslist: ^4.6.6 + lightningcss: ^1.16.1 + nullthrows: ^1.1.1 + checksum: c25cf960eda5e3bcd066aa3c7cca990d938bb6cc2387bbe384060f60b23c8a0ff4085627c70ad226c09ca81cc6ee611da788cc2e7f0a780dfef7ccaf4a5510f6 + languageName: node + linkType: hard + +"@parcel/optimizer-htmlnano@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/optimizer-htmlnano@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 htmlnano: ^2.0.0 nullthrows: ^1.1.1 posthtml: ^0.16.5 svgo: ^2.4.0 - checksum: a5fa890bc36c7f4c8ebb5f8ff4ba88b15a0a9a489fd99badabfe0dfec8e4381cc04c6ee59b856bd17bdc1933529a851d0567c26d7e7df2fc19d6d623c5670e2a + checksum: 1daacb2b5727a0f88d60df56daef565e1d49ee38f0a53e6cbf1545d8890c2240779bf473cc76118619308161f3fb7443bd459daa9e246a583425637e62480963 languageName: node linkType: hard -"@parcel/optimizer-image@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/optimizer-image@npm:2.7.0" +"@parcel/optimizer-htmlnano@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/optimizer-htmlnano@npm:2.8.3" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 - "@parcel/workers": 2.7.0 + "@parcel/plugin": 2.8.3 + htmlnano: ^2.0.0 + nullthrows: ^1.1.1 + posthtml: ^0.16.5 + svgo: ^2.4.0 + checksum: ca1cab7b1ecc16f209ad867fbdd8b2f446fd831d8688db068491fa22786a5aa3a0debb4290e0f003830c6b06c6f3a4c3a3cd9cdb033e7fa6cded8a19887d5f23 + languageName: node + linkType: hard + +"@parcel/optimizer-image@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/optimizer-image@npm:2.8.3" + dependencies: + "@parcel/diagnostic": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + "@parcel/workers": 2.8.3 detect-libc: ^1.0.3 - checksum: ca12701e1c7080c4bff15971b6be7ff6c9633ed6ef69d925eedd06021cbedf02c326862fa5899072d35ce01a34018de265ccb811ff4f31556a9b931dcbff835b + checksum: 72c5acffaea833237f62e23c8fb183eb85863ccddeb11304b2299b28973b957daba1e34854d347314edf35d83cba695c0d7600e1ae125dec4cc3151abd8f2e31 languageName: node linkType: hard -"@parcel/optimizer-svgo@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/optimizer-svgo@npm:2.7.0" +"@parcel/optimizer-image@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/optimizer-image@npm:2.8.4-nightly.2903" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + "@parcel/workers": 2.0.0-nightly.1280+5b901a317 + checksum: 9805f058025f2614355cf9ecf493ee37a20dbabb9de29e236060b592ecb436b891ed52c889752a3ba259b3cbaf2f7e1b6f8b135488c3192bd4b526acfc36a918 + languageName: node + linkType: hard + +"@parcel/optimizer-svgo@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/optimizer-svgo@npm:2.8.3" + dependencies: + "@parcel/diagnostic": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 svgo: ^2.4.0 - checksum: 305024d23c9bb049cce91cd902d8f9053b93cac9e5f7eb8f7b5d6a9b5d419d67e2321b3194689c09b20c3999087a11975e6cd95a669c5a5c61952be9a2a866c0 + checksum: b3544c08fac4009de1ec6f88136a58cdec70b072433b13fb99f9e6584dc4731afea82ae13d27e4121ed5aaec9e4481225a54251ce52b6ece835908300c26fa33 languageName: node linkType: hard -"@parcel/optimizer-terser@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/optimizer-terser@npm:2.7.0" +"@parcel/optimizer-svgo@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/optimizer-svgo@npm:2.8.4-nightly.2903" + dependencies: + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + svgo: ^2.4.0 + checksum: a7a961360bc8d31fe8cd4630285aa8008fbf2e26bc12895357d8129fa0d36ad8b6c0cea592ac4564ed69f0fc436e5de8a79d6a57b6d7720de6bfa25b03d6168e + languageName: node + linkType: hard + +"@parcel/optimizer-swc@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/optimizer-swc@npm:2.8.4-nightly.2903" + dependencies: + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + "@swc/core": ^1.3.36 + nullthrows: ^1.1.1 + checksum: 37d3fadef5a7ac754187c057e8d4ae577ee683a7b806932739dcc86e68774a883c1c1e66bc3ccee55a687ee5cabb9e325d14667f0048e321be27cc25c7494295 + languageName: node + linkType: hard + +"@parcel/optimizer-terser@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/optimizer-terser@npm:2.8.3" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.8.3 nullthrows: ^1.1.1 terser: ^5.2.0 - checksum: 20eddbcaa947c380909ba95337d3db436b748c0baf5525e3a59756fa05219a612f30070d9618aef7570037a3a926e5bacc5ac9c221603bfab19753b864aca202 + checksum: ee1959f5965c7eee8ad1519f9d2554810030f326e959dd5e44aa014c29a51c2ab777dfbbf604a6b4436b75176a8694b7b8c9d99f945d57dea7828225762c8823 languageName: node linkType: hard -"@parcel/package-manager@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/package-manager@npm:2.7.0" - dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/fs": 2.7.0 - "@parcel/logger": 2.7.0 - "@parcel/types": 2.7.0 - "@parcel/utils": 2.7.0 - "@parcel/workers": 2.7.0 +"@parcel/package-manager@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/package-manager@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/fs": 2.0.0-nightly.1280+5b901a317 + "@parcel/logger": 2.0.0-nightly.1280+5b901a317 + "@parcel/node-resolver-core": 2.8.4-nightly.2903+5b901a317 + "@parcel/types": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + "@parcel/workers": 2.0.0-nightly.1280+5b901a317 semver: ^5.7.1 peerDependencies: - "@parcel/core": ^2.7.0 - checksum: f4817d1aae84e3f4a7758a3e51a1f2a35996649450ef32b6f8de680b77ff98b138d917652f4802a49cb8ab562a737f661bb28ceadd18132f05170805b5bb145d + "@parcel/core": 2.0.0-nightly.1278+5b901a317 + checksum: e455aeaab735c22dbaa0491cc593b14ba3b54fff707e7cf20481c826da8b3750fb2b95f61b0b284361313295520108f07c68024e0de81800180b3860e888ec2b languageName: node linkType: hard -"@parcel/packager-css@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/packager-css@npm:2.7.0" +"@parcel/package-manager@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/package-manager@npm:2.8.3" + dependencies: + "@parcel/diagnostic": 2.8.3 + "@parcel/fs": 2.8.3 + "@parcel/logger": 2.8.3 + "@parcel/types": 2.8.3 + "@parcel/utils": 2.8.3 + "@parcel/workers": 2.8.3 + semver: ^5.7.1 + peerDependencies: + "@parcel/core": ^2.8.3 + checksum: 572a5aacfd7bc545d9aa35ff2125f1231226b550f9b0fe2c36d68a82ec8ffb047035e25fdb883bc2331a6eaf69c98bb5d6752644546d962de7bf544c6243a959 + languageName: node + linkType: hard + +"@parcel/packager-css@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/packager-css@npm:2.0.0-nightly.1280" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/utils": 2.7.0 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 nullthrows: ^1.1.1 - checksum: 0a7fbedb8860626c8cd70ed8c8977b65b80856e2180a71ec988809f8b15721dec328bcdc56200b1224f292ce122efdafff5ef6ef5402d3b0e251dbe74ca6790a + checksum: 368784dc531481717ec463ecb21d32948afd2bd8255cdc6f7d24886d321e13e6d8fd61e98bd62904018a9606e4c05e04e38e84d37c54af920acb9e402ba7770b languageName: node linkType: hard -"@parcel/packager-html@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/packager-html@npm:2.7.0" +"@parcel/packager-css@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/packager-css@npm:2.8.3" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/types": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/plugin": 2.8.3 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.8.3 + nullthrows: ^1.1.1 + checksum: bb28fc9f02df83a1fd8eac7043466debb67398190819282a40a52ff299b0f4c3f474bfa7806be776ce36a66cc89574128a9fa210d2c0c9cb905bbb4dbbd2b926 + languageName: node + linkType: hard + +"@parcel/packager-html@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/packager-html@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/types": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 nullthrows: ^1.1.1 posthtml: ^0.16.5 - checksum: 9ca4f91112bfce9cf99ec34241f15775f964a74ea293b9e526d4bd64c60fa837e1385bec8c8a3a9315f66fe980e3e05c16b32793a2c98c9837482a3f79319269 + checksum: 4206ce709f5de492e46422def0056bbe27e62719bcf173e8cf9281ed0bb2f500129243af96f58bbe1d69300fc8d9e3cde203c5da58f2ac075a180b434b61b138 languageName: node linkType: hard -"@parcel/packager-js@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/packager-js@npm:2.7.0" +"@parcel/packager-html@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/packager-html@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + "@parcel/types": 2.8.3 + "@parcel/utils": 2.8.3 + nullthrows: ^1.1.1 + posthtml: ^0.16.5 + checksum: 631f98fca0fdd3f11fe4cfbc1e0ad73b86f7fb00be7164fef5633c600a13282ae592b8f7d9aa31d4f66bd645ae57ce27e67db51a81b2a91c286ed5c8b36a4a87 + languageName: node + linkType: hard + +"@parcel/packager-js@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/packager-js@npm:2.0.0-nightly.1280" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/hash": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/hash": 2.8.4-nightly.2903+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 globals: ^13.2.0 nullthrows: ^1.1.1 - checksum: 8a65b8f82c40f3e429d11ce5df73454c90233ada8dd00a8913e945b8cbc85a021ddb0c75c2f8bd2bdc2424105874a86f0cb748eb5c8f157dd085b13c67f72f63 + checksum: 224cf1c29d4cb46e3ac260d7d7dadaba03a9ec2c8c9438eb6981b26629ae0031e79060d9e42bc63ab9660b77454fdb006c145a63ea8c621d8258e0a7130a980d languageName: node linkType: hard -"@parcel/packager-raw@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/packager-raw@npm:2.7.0" +"@parcel/packager-js@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/packager-js@npm:2.8.3" dependencies: - "@parcel/plugin": 2.7.0 - checksum: d895ed703e3f71b57bb1d2f6e2f9c574fb259790622afd7818e6ac174b69c8dead78d8cc15abf19df566b9642d7ea5cd7db22dd62256cfc3e86bb2b838e6c2d8 + "@parcel/diagnostic": 2.8.3 + "@parcel/hash": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.8.3 + globals: ^13.2.0 + nullthrows: ^1.1.1 + checksum: 92ac88244b6104c5905ab95d882b755134042654ab48106ca84ab18441fb7240b66f049e407146958aead0812345823da729a4a37f32be17afd2b44cbdebc926 languageName: node linkType: hard -"@parcel/packager-svg@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/packager-svg@npm:2.7.0" +"@parcel/packager-raw@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/packager-raw@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + checksum: a47bd334442d9c00b90968f8ec91148520573b29512a3d8ba311fd8ebcb86ae45866a42bbf639b9a820b3a9193a85060441338c4089387936b8954337f8ce55f + languageName: node + linkType: hard + +"@parcel/packager-raw@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/packager-raw@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + checksum: 26236dd64624a25fc1d749fb96b1bc3a6854b14d4386109670572f55feda4bb6affde19b1c9e971c4e50bfb53fd88e32da8303c83a3cb18ceaf12dd310685c34 + languageName: node + linkType: hard + +"@parcel/packager-svg@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/packager-svg@npm:2.8.3" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/types": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/plugin": 2.8.3 + "@parcel/types": 2.8.3 + "@parcel/utils": 2.8.3 posthtml: ^0.16.4 - checksum: 9b2c4e4cee93ecc18f852bf623eb9097e53b4d0d9dea562674942b7b1121f82c1c8b418a5ccc4a18010df7e62c4934bb039903ea21c0493732f6adedaca9ba0c + checksum: 45c966ad8e6dbb25049adca66d761089a09cda83558d8767b46501a023b8d94b050f1a2899b1c8b18eac6cf87d2605ad5aa9a4cb2f9d90474794576dafb2e4fc languageName: node linkType: hard -"@parcel/plugin@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/plugin@npm:2.7.0" +"@parcel/packager-svg@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/packager-svg@npm:2.8.4-nightly.2903" dependencies: - "@parcel/types": 2.7.0 - checksum: 930befafa01c179b27d34d6a63e5f67fe4998724654163fc07a618a432e8d20397cc3f424093ee967ddad8c4adf4e3f0e596e72f2ca5764b3fe212211c09d321 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/types": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + posthtml: ^0.16.4 + checksum: e26c1ff07026de7e07ebc38cba480d5af09001e1d48715450f4f068380b430c8eea43af440e0e61d9f9d749fc824d38c7f46279ef387278e62b8e7d04dc21dfd languageName: node linkType: hard -"@parcel/reporter-cli@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/reporter-cli@npm:2.7.0" +"@parcel/plugin@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/plugin@npm:2.0.0-nightly.1280" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/types": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/types": 2.0.0-nightly.1280+5b901a317 + checksum: ebf77381744e1c5f10dd021f18440f5baef3f3028dca012458150f4257b3166e794aa37c1bd37d9027bf831096bccc5e7476a3bf998287b8485dd8c17a324974 + languageName: node + linkType: hard + +"@parcel/plugin@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/plugin@npm:2.8.3" + dependencies: + "@parcel/types": 2.8.3 + checksum: a69ac66f5cc28197cf689f1c4144398457d62a086621a22b3b45fe863909a094b616dad415ec01673a9eb731b05fe9060bcb340c07efcd48343577a540fbfdf7 + languageName: node + linkType: hard + +"@parcel/reporter-cli@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/reporter-cli@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/types": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 chalk: ^4.1.0 term-size: ^2.2.1 - checksum: eff35a2ee3f2b453688fd16603c41a97b24d250a7b50fd9e7dcb2f35be743b338031c82746bf1e8cd299b7f3c4acb3345d13c02da3865bea7bd4f2aafcb9f6af + checksum: 7174c550f0fdf60daa7fc17688af9d2cb695db3a34f2e484c247417f7237a0bc2400d2cf8b5e03e890612971ecfeb467908704adccdae619041b6fcdd636286f languageName: node linkType: hard -"@parcel/reporter-dev-server@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/reporter-dev-server@npm:2.7.0" +"@parcel/reporter-cli@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/reporter-cli@npm:2.8.3" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 - checksum: e315689d8d4ba094e67b0206d15c259c9faccf8554e191e14c53a4f176d9b52457ee24e9e53581fbc1685932f76ce57286613fdd9cafb81139b6e38fb57838e1 + "@parcel/plugin": 2.8.3 + "@parcel/types": 2.8.3 + "@parcel/utils": 2.8.3 + chalk: ^4.1.0 + term-size: ^2.2.1 + checksum: 791dd4706aac706427a563455d9db5fa330b77e94fe4226b3751cd527327d8540d62400a8040e85a5fd29ecb6e673507e9d4a1fa754c093f1c005078670eef85 languageName: node linkType: hard -"@parcel/resolver-default@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/resolver-default@npm:2.7.0" +"@parcel/reporter-dev-server@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/reporter-dev-server@npm:2.0.0-nightly.1280" dependencies: - "@parcel/node-resolver-core": 2.7.0 - "@parcel/plugin": 2.7.0 - checksum: 5bc64bea956c3579c99eb13bef0c868be1b0b5d9d045184adfc3cdc02f503775d12fdb2116f093d62cc9d7e7fc506351973d2808b71b091a5ed5c038064906fe + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + checksum: 4f80c644ba093b5fcd57e1bf08a3778c0d2599a05808fa9559c9eadfa996fd03e1dd81231ba5222cfec039814370d61443b59bb7bb4968e28bed39f0921e1083 languageName: node linkType: hard -"@parcel/runtime-browser-hmr@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/runtime-browser-hmr@npm:2.7.0" +"@parcel/reporter-dev-server@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/reporter-dev-server@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + checksum: 329db9fd0cdc3ddc36d8156a7d67747335c76b1368116c98e266218f1e1ce4ea108981441bcb78961f64e2067a2d8a1745d8aa069398d50e67278e1333293723 + languageName: node + linkType: hard + +"@parcel/resolver-default@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/resolver-default@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/node-resolver-core": 2.8.4-nightly.2903+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + checksum: 5525c49b7736baed6e042580a157851e27f2dc828b04a783b47985721b23b041f9756ce242b4fed8fd28495ea3983e0b5318ee6b80ee022d6ab7d8bf13d32389 + languageName: node + linkType: hard + +"@parcel/resolver-default@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/resolver-default@npm:2.8.3" + dependencies: + "@parcel/node-resolver-core": 2.8.3 + "@parcel/plugin": 2.8.3 + checksum: 40515a62c1a301050144e1427ac7a591afedea50e89baff0ab4ed05ad8424f5df6ad4a7b5e413956a199ecef18bf8220b353fb115af72fac4187a62e8a997d1d + languageName: node + linkType: hard + +"@parcel/runtime-browser-hmr@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/runtime-browser-hmr@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + checksum: 985cd4109b2abe1e7f63251782a09e59e9dd288567206e93af7bba3a61cfb4273e80abc8a6918bb00b1c53e461f771717b31e1ac775413454a3d8c4bde5e0760 + languageName: node + linkType: hard + +"@parcel/runtime-browser-hmr@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/runtime-browser-hmr@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + checksum: 56c276c7b03bb4c301d7dbe94c5183404af4064286f67682399e848ff894bfb5ea783dad11082290d40f2f07be64252dd236b993baf2e3e8fbb30a572f95a0dc + languageName: node + linkType: hard + +"@parcel/runtime-js@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/runtime-js@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + nullthrows: ^1.1.1 + checksum: 7388643282789e623159004648fa0bb3fe79def0203c911742e418d4b5c03383690eb8fe54de321b9c8a2ddec2f11e4fc0ecb050ec1d58cbe417bec454c8c07c + languageName: node + linkType: hard + +"@parcel/runtime-js@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/runtime-js@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + nullthrows: ^1.1.1 + checksum: ee5e04f84d522a6f53753c3956d37cacb2bdabb2539e2f40e640762b3cc43b20efc495331fe254d92d82a06c3e1b4690c17125090a12300d75ad7c3a9ca3e2f0 + languageName: node + linkType: hard + +"@parcel/runtime-react-refresh@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/runtime-react-refresh@npm:2.0.0-nightly.1280" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 - checksum: ad736bab6972d42e0027bd5aeee4beef087b1c32a99ab1700f7c6ccc125fe566ff08d065fffa6a6565e5f2e0bd6bc256a9869f6ec98322b09c02b2f97f29bb77 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + react-error-overlay: 6.0.9 + react-refresh: ^0.9.0 + checksum: face88be0b0e741d7ca4d28e7da4a52b83483b7100c0603a04f9c1e38641f301edce329db87f3b9e60ad657852d27bfcae7c57b085a58eb43b3200d5277dcd3e + languageName: node + linkType: hard + +"@parcel/runtime-react-refresh@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/runtime-react-refresh@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + react-error-overlay: 6.0.9 + react-refresh: ^0.9.0 + checksum: 327159be0c8183f1cff139de973e8e8ca6b83dc2fc94846a89415fabf8cd8535e95ed3ae9750ac08e73a303de57c18c4e5da959ecbe73af75f1d3c9a98f5c20b + languageName: node + linkType: hard + +"@parcel/runtime-service-worker@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/runtime-service-worker@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + nullthrows: ^1.1.1 + checksum: 0646fee9a9378c0844c223d0eaf1c46e817738e70b2e993434717fb6aab998339b37a32c5bd9db891fcb8bc44dc3d7530564f84a5cd978d6dd47f204f18bd44a + languageName: node + linkType: hard + +"@parcel/runtime-service-worker@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/runtime-service-worker@npm:2.8.4-nightly.2903" + dependencies: + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + nullthrows: ^1.1.1 + checksum: fa5b993337727ce46d04065c9303c5eaa29167382d226980c2b6a9fd67c174154ff6cdbbb8d1dc4291ab9600749765cf2514a6a448d52b32ec9bc7abcd0e8bd0 + languageName: node + linkType: hard + +"@parcel/source-map@npm:^2.1.1": + version: 2.1.1 + resolution: "@parcel/source-map@npm:2.1.1" + dependencies: + detect-libc: ^1.0.3 + checksum: 1fa27a7047ec08faf7fe1dd0e2ae95a27b84697ecfaed029d0b7d06e46d84ed8f98a9dc9d308fe623655f3c985052dcf7622de479bfa6103c44884fb7f6c810a + languageName: node + linkType: hard + +"@parcel/transformer-babel@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/transformer-babel@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + browserslist: ^4.6.6 + json5: ^2.2.0 + nullthrows: ^1.1.1 + semver: ^5.7.0 + checksum: 7f19bbda39f6f643b72bbe131565e3a7ab2a9b7f218103509066482f2598eaa456fd4ffbae8a9f6c734169e71c36ad1f12f053c3410bcf208e33b2cdfeac0e28 languageName: node linkType: hard -"@parcel/runtime-js@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/runtime-js@npm:2.7.0" +"@parcel/transformer-babel@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-babel@npm:2.8.3" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.8.3 + browserslist: ^4.6.6 + json5: ^2.2.0 nullthrows: ^1.1.1 - checksum: 3a22c78ce1848c37b677ca1c38d2e4eca632059d9607be65ac1cf49e985c969b393c34103ad79f0a4f372fe3d49088ddff471cbebcb100de7ab1b14bb6047ff3 + semver: ^5.7.0 + checksum: a27bbe8d893854a77d9a8c9b45490728b2db81ad0782b7d9085d00c50155840477dd4ada8e382e0b02f9f5f8761da48bd6d3feb62ddd582e6608f92d4468df80 languageName: node linkType: hard -"@parcel/runtime-react-refresh@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/runtime-react-refresh@npm:2.7.0" +"@parcel/transformer-css@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/transformer-css@npm:2.0.0-nightly.1280" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 - react-error-overlay: 6.0.9 - react-refresh: ^0.9.0 - checksum: ea4c240185f00266d2820393b9c3faa95e7854b92ea9b18191eca5329e5ac53e287a32a967c9001890af4a78741eba3dc0173323af2bdbe65ec72f0bfa70a055 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + browserslist: ^4.6.6 + lightningcss: ^1.16.1 + nullthrows: ^1.1.1 + checksum: a93a1cb011c4bcd41d33fd670618d9236ef98b1ec9d8d769cd32539d5697497b94df18250e7b2b846ecc91976f387f1bb4d1fc7ddfa03aabf44621ebbd7783d3 languageName: node linkType: hard -"@parcel/runtime-service-worker@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/runtime-service-worker@npm:2.7.0" +"@parcel/transformer-css@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-css@npm:2.8.3" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.8.3 + browserslist: ^4.6.6 + lightningcss: ^1.16.1 nullthrows: ^1.1.1 - checksum: 13eb0ba276e104c5b412d139fbf8b15a3f7ef836fec386d9f7982d0f3eac1e0942be87c62e1d4926efcdb15919547c32df4e6a54b228a5f67da6241e058a5c32 + checksum: 31375a140550968a36f7a8eb998c03f20200d202b7c62c98fb49b05f719777ca545d08f356dec9ca6d9a601ba0020abce5cf4672fe425bc99a540dccf262a6cc languageName: node linkType: hard -"@parcel/source-map@npm:^2.0.0": - version: 2.1.0 - resolution: "@parcel/source-map@npm:2.1.0" +"@parcel/transformer-html@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/transformer-html@npm:2.0.0-nightly.1280" dependencies: - detect-libc: ^1.0.3 - checksum: 7ec2cfec01148d1813030615e525b7ce27ee6a80781769aba52149677286f02b6b6e387e8c602fd67abe5e0f815b07a5b2ee94e1cc8bf1714301c575436aaaa6 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/hash": 2.8.4-nightly.2903+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + nullthrows: ^1.1.1 + posthtml: ^0.16.5 + posthtml-parser: ^0.10.1 + posthtml-render: ^3.0.0 + semver: ^5.7.1 + srcset: 4 + checksum: 885e4105ba1a5b3feec22dd10372c13c37c077ca6b0644222a6c3668e5fdc171002d95edfb1140f7d8030c1f05e77ac4e557d47a5c3f4dd2e8e2175b28edbb8a languageName: node linkType: hard -"@parcel/transformer-babel@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-babel@npm:2.7.0" +"@parcel/transformer-html@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-html@npm:2.8.3" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/utils": 2.7.0 - browserslist: ^4.6.6 - json5: ^2.2.0 + "@parcel/diagnostic": 2.8.3 + "@parcel/hash": 2.8.3 + "@parcel/plugin": 2.8.3 nullthrows: ^1.1.1 - semver: ^5.7.0 - checksum: aa269b12913667175919322faaea9e192fd2259765cc482b3902a050ecbfc48c212b4d999cda976c7095bfbe78f94d38333f5a66719eb5989fbe4b32963a9a07 + posthtml: ^0.16.5 + posthtml-parser: ^0.10.1 + posthtml-render: ^3.0.0 + semver: ^5.7.1 + srcset: 4 + checksum: 21600a3e0ac9e05aa6f6066ef94f8ba7e0de62a8ae59a812230907f5731dcf73dc5308fb74b32bfb6dab16089d13f72043965e1e87e8c4daec8447a9081af8eb languageName: node linkType: hard -"@parcel/transformer-css@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-css@npm:2.7.0" +"@parcel/transformer-image@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-image@npm:2.8.3" dependencies: - "@parcel/css": ^1.12.2 - "@parcel/diagnostic": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/utils": 2.7.0 - browserslist: ^4.6.6 + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + "@parcel/workers": 2.8.3 nullthrows: ^1.1.1 - checksum: 47cf7cd9a40b8e957075442fb56c3d52882572f3b65ccc2f67ae3190706d51f93cf783fb1275e01a9562538d94f570f7f1922f9f943faa83f87b8a1f36663943 + peerDependencies: + "@parcel/core": ^2.8.3 + checksum: f4b3464828e1b3d44e7da5c7a71272f5f53f830d9bb371e8dd8b2f32040f4426f3efeae12949947e34b39f7755a253f0b48c6eeec6d86ad43baf0b30717f1f47 languageName: node linkType: hard -"@parcel/transformer-html@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-html@npm:2.7.0" +"@parcel/transformer-image@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/transformer-image@npm:2.8.4-nightly.2903" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/hash": 2.7.0 - "@parcel/plugin": 2.7.0 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + "@parcel/workers": 2.0.0-nightly.1280+5b901a317 nullthrows: ^1.1.1 - posthtml: ^0.16.5 - posthtml-parser: ^0.10.1 - posthtml-render: ^3.0.0 - semver: ^5.7.1 - checksum: 4028ffa5ece1b30cd801b97d371eba142eed52267d527c06a02c5ec9b83960353dd0e6143d408c3351fc5acb3bfbceb1755bed07827e619119a4be77863471d9 + peerDependencies: + "@parcel/core": 2.0.0-nightly.1278+5b901a317 + checksum: a53ac35c288bfc48b839684d52f09eb4d15735a02a4c6e7ae0603bc9ec6a18c95ea0814a05a41f71ba8dbe5745c4cb5d119aa252786993300b69c71e0f341ccc languageName: node linkType: hard -"@parcel/transformer-image@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-image@npm:2.7.0" +"@parcel/transformer-js@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/transformer-js@npm:2.0.0-nightly.1280" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 - "@parcel/workers": 2.7.0 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + "@parcel/workers": 2.0.0-nightly.1280+5b901a317 + "@swc/helpers": ^0.4.12 + browserslist: ^4.6.6 nullthrows: ^1.1.1 + regenerator-runtime: ^0.13.7 + semver: ^5.7.1 peerDependencies: - "@parcel/core": ^2.7.0 - checksum: 1decacc1a4b037de9c7838fce34057338262c03e16a199d00e9641be0ad80885ff77119bd571765268e5f0d2f1f2d1863b759aaaaba6de2f64fe5b2c44b69b4c + "@parcel/core": 2.0.0-nightly.1278+5b901a317 + checksum: da67f0a9d510b0bf117a733ccffd3329efb7f23a6c589555cff191697d06e2f10f34dc69edacb02032b9566a05c11dd8f324d909521c0b90a7a584987becc037 languageName: node linkType: hard -"@parcel/transformer-js@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-js@npm:2.7.0" - dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/utils": 2.7.0 - "@parcel/workers": 2.7.0 - "@swc/helpers": ^0.4.2 +"@parcel/transformer-js@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-js@npm:2.8.3" + dependencies: + "@parcel/diagnostic": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.8.3 + "@parcel/workers": 2.8.3 + "@swc/helpers": ^0.4.12 browserslist: ^4.6.6 detect-libc: ^1.0.3 nullthrows: ^1.1.1 regenerator-runtime: ^0.13.7 semver: ^5.7.1 peerDependencies: - "@parcel/core": ^2.7.0 - checksum: 76669ef593672cf3936aafd68676ba9f23562556dafd3594f5714bbb8fdebae83e0b2ad51cef47bedf0304cce1a55a7c344679f20747306a7a111caae535704a + "@parcel/core": ^2.8.3 + checksum: 29fb203502309e11452837e4ae60589300c0d91fae35cf4774e70959e9f4532960ef4619959ce9c95f0060020faabbcfd024b076f41c7d5f7e126c3547244ff6 languageName: node linkType: hard -"@parcel/transformer-json@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-json@npm:2.7.0" +"@parcel/transformer-json@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/transformer-json@npm:2.0.0-nightly.1280" dependencies: - "@parcel/plugin": 2.7.0 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 json5: ^2.2.0 - checksum: d9d82148ee69b623129596408f97269199aabbce0ced71bbb501addf9fb76761eb3da49b3e1286a3d08806caf01156b97fdac766212e38e62823db34b1433bfa + checksum: 5b6d4a980987d14b7ef1814fae804830cd2d9581d9494a887b0aaea177261f9a0f7aa3d8e7ab787fcae22e3848a025744ea42f89e07722e16f10500ab004e652 languageName: node linkType: hard -"@parcel/transformer-postcss@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-postcss@npm:2.7.0" +"@parcel/transformer-json@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-json@npm:2.8.3" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/hash": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/plugin": 2.8.3 + json5: ^2.2.0 + checksum: 04da28b0f0ff1ec1d7c6383b880daa2918f85ba1375351690a9a07ea4de102531d5f6addb3091ae5109623e270e1d2cdf582661f4a0805bd982a653a06d26890 + languageName: node + linkType: hard + +"@parcel/transformer-postcss@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/transformer-postcss@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/hash": 2.8.4-nightly.2903+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 clone: ^2.1.1 nullthrows: ^1.1.1 postcss-value-parser: ^4.2.0 semver: ^5.7.1 - checksum: 15bd9ac0510d1ec822891f64aadbb7a9e22e7a86619863863fe0de056f1e9da8f910590ed0664575950bf483b58196640634278beecdc492c65ea675a832f3e5 + checksum: e4a4052177caa0a18ee4123bf674808382ec0293a6d734f51cfa616c1f8cd28e78f1205db51efc357ea894f17882a592885f76402b173daa8f50d7651d038bcf languageName: node linkType: hard -"@parcel/transformer-posthtml@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-posthtml@npm:2.7.0" +"@parcel/transformer-postcss@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-postcss@npm:2.8.3" + dependencies: + "@parcel/diagnostic": 2.8.3 + "@parcel/hash": 2.8.3 + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + clone: ^2.1.1 + nullthrows: ^1.1.1 + postcss-value-parser: ^4.2.0 + semver: ^5.7.1 + checksum: 2c75cb5cec7112d12a28ac5cddc9f2e939f76e006929757804431b266e7541aae5df6ba8601727c33c7b53f0f971a6df5dfb4394fa0baf284bd2c6fc9b507650 + languageName: node + linkType: hard + +"@parcel/transformer-posthtml@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/transformer-posthtml@npm:2.0.0-nightly.1280" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 nullthrows: ^1.1.1 posthtml: ^0.16.5 posthtml-parser: ^0.10.1 posthtml-render: ^3.0.0 semver: ^5.7.1 - checksum: 04642838ce10f3a54b42c95115afc59f852095b8370482c6b3728db46e047443a7663b6f28d76ad1eeb18b81828d5dda0b8e650ebbfb1cc65e09d725b901f8f4 + checksum: 1323de92963a7c8d625ba69364fe73dc26e3237ac777f79dccb5f9f6779e5f860807b3c85023a7f921952b7c65b778e1cae20d7123cf64b75de911d929788ce7 languageName: node linkType: hard -"@parcel/transformer-raw@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-raw@npm:2.7.0" +"@parcel/transformer-posthtml@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-posthtml@npm:2.8.3" dependencies: - "@parcel/plugin": 2.7.0 - checksum: 942a5ddbed9453fe905310f22430ef643e544d4a262f317a2ca4452080aad18484ea7dd1953e1a6c7ef049b42366c46820297d981cec9ac76b980df424248b4c + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + nullthrows: ^1.1.1 + posthtml: ^0.16.5 + posthtml-parser: ^0.10.1 + posthtml-render: ^3.0.0 + semver: ^5.7.1 + checksum: 130c95782aebb2491f2d89685db573b3b85ed1f7d9862684db2ab9d11fe8148995185a4e144b818de06d596cf687c5bd57b6b8648d2856cf830a9674c2ec3237 languageName: node linkType: hard -"@parcel/transformer-react-refresh-wrap@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-react-refresh-wrap@npm:2.7.0" +"@parcel/transformer-raw@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/transformer-raw@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + checksum: cb8b34174d4e4449c1c560419e8bc051fc96f6b25e71f11cc0c227a4fba553644454d6a994263cdb9e91fc52f6b34801c01b25e2fb72915138483eedb25d282a + languageName: node + linkType: hard + +"@parcel/transformer-raw@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-raw@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + checksum: 371263bb526373c229aa3e730f2a1d6687bd6b771203d73237c04da3a3ada86c4fcf0b534d3fb366a7b3842df0cf98ae1e033602613cafd9f702f47a6568a83c + languageName: node + linkType: hard + +"@parcel/transformer-react-refresh-wrap@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/transformer-react-refresh-wrap@npm:2.0.0-nightly.1280" dependencies: - "@parcel/plugin": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 react-refresh: ^0.9.0 - checksum: d193b9552b8e9abff7313845d02f2068112f16a15ba7eb0e7fba568937b765030ab874c84d601d8941dc6a14af9090327be8093825a95f0c4b35eabf7d36f1a3 + checksum: 95e45d237c5936ca4fc5d8180ab2a35a34a62634069332b804cca853ad92f74167826f96bcb3bc0753823c9a31245afc19cb357690a2e16e1cff9b91c220ab4c languageName: node linkType: hard -"@parcel/transformer-svg@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-svg@npm:2.7.0" +"@parcel/transformer-react-refresh-wrap@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-react-refresh-wrap@npm:2.8.3" + dependencies: + "@parcel/plugin": 2.8.3 + "@parcel/utils": 2.8.3 + react-refresh: ^0.9.0 + checksum: e9648e04b7f9b29f47ec7baedfba9cc36bbb7e44be6ad4b6b4433c20d1b5a3184a3043b712add16a5cc06300289305d5fa9ebb73c6dc926d04df7c52d9bc3316 + languageName: node + linkType: hard + +"@parcel/transformer-svg@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/transformer-svg@npm:2.8.3" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/hash": 2.7.0 - "@parcel/plugin": 2.7.0 + "@parcel/diagnostic": 2.8.3 + "@parcel/hash": 2.8.3 + "@parcel/plugin": 2.8.3 nullthrows: ^1.1.1 posthtml: ^0.16.5 posthtml-parser: ^0.10.1 posthtml-render: ^3.0.0 semver: ^5.7.1 - checksum: 19026a39f9757908f89d1a57ba9de027cbb80c562e055d5dd88a8ea7691c42d6d8598412b3a8b80e52001b305303b16dd6b8ae2a7708e95861a7654a682c8a2e + checksum: 1f3db309e47d07849a2b4ffe11b508fd7ae792c0c0ce7b03e442fffb25f5e7425c5027428729bf2b587309265bba0be6da635d62c51ae8ab7e54483eff3f575e languageName: node linkType: hard -"@parcel/transformer-vue@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/transformer-vue@npm:2.7.0" +"@parcel/transformer-svg@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/transformer-svg@npm:2.8.4-nightly.2903" + dependencies: + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/hash": 2.8.4-nightly.2903+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + nullthrows: ^1.1.1 + posthtml: ^0.16.5 + posthtml-parser: ^0.10.1 + posthtml-render: ^3.0.0 + semver: ^5.7.1 + checksum: 8cdb11e2661292b5cea355d6986eec0d63c63ea06b7388d181124d9b12a92f888255771a53d6b04a319184ae0f98a232e0687f46162179e315b385a778956090 + languageName: node + linkType: hard + +"@parcel/transformer-vue@npm:2.8.4-nightly.2903+5b901a317": + version: 2.8.4-nightly.2903 + resolution: "@parcel/transformer-vue@npm:2.8.4-nightly.2903" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/plugin": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/plugin": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 "@vue/compiler-sfc": ^3.2.27 consolidate: ^0.16.0 nullthrows: ^1.1.1 semver: ^5.7.1 - checksum: 564c98af47091b2a74e4419884429e66f82cda8ec589193d96c637eb670766ba8d21d1deef16c672bd2907783b7c4659ef53ae62e938da1245406b3c74edcc94 + checksum: 44dfe9af51a9cb384dd32b7952d6e02f88e5689d7fdd27fca08b72d15c6461eef062ecbd7b6952dcabf5aabf6b903edb17782b3fdb391edf3a46824f84a9c63a languageName: node linkType: hard -"@parcel/types@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/types@npm:2.7.0" - dependencies: - "@parcel/cache": 2.7.0 - "@parcel/diagnostic": 2.7.0 - "@parcel/fs": 2.7.0 - "@parcel/package-manager": 2.7.0 - "@parcel/source-map": ^2.0.0 - "@parcel/workers": 2.7.0 +"@parcel/types@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/types@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/cache": 2.0.0-nightly.1280+5b901a317 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/fs": 2.0.0-nightly.1280+5b901a317 + "@parcel/package-manager": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 + "@parcel/workers": 2.0.0-nightly.1280+5b901a317 utility-types: ^3.10.0 - checksum: cf28c56d3e74faabefb2359259906a3f574a70ebda20633a3059b6c4c897f7a97df4e89920d89650855829b2ec3677b23a44efcef6fcc7be65c78eef7b21b96c + checksum: d654966d21665cce71f5fff8da405fa6538eb8c72916406e3ffd55002d9ed785458858b85cbb0603397d326d63740a273cc660e1df7c07ddb351b4b3f520cdd4 languageName: node linkType: hard -"@parcel/utils@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/utils@npm:2.7.0" - dependencies: - "@parcel/codeframe": 2.7.0 - "@parcel/diagnostic": 2.7.0 - "@parcel/hash": 2.7.0 - "@parcel/logger": 2.7.0 - "@parcel/markdown-ansi": 2.7.0 - "@parcel/source-map": ^2.0.0 +"@parcel/types@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/types@npm:2.8.3" + dependencies: + "@parcel/cache": 2.8.3 + "@parcel/diagnostic": 2.8.3 + "@parcel/fs": 2.8.3 + "@parcel/package-manager": 2.8.3 + "@parcel/source-map": ^2.1.1 + "@parcel/workers": 2.8.3 + utility-types: ^3.10.0 + checksum: ece0abdd5c7cce32a246155f6828f6a92830341dfbceb81c9aaf7da44e0733b87ea8a607412dfe4b5ec59d7c9a3c1b1463b94ec8a5a82b745541881952003a16 + languageName: node + linkType: hard + +"@parcel/utils@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/utils@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/codeframe": 2.0.0-nightly.1280+5b901a317 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/hash": 2.8.4-nightly.2903+5b901a317 + "@parcel/logger": 2.0.0-nightly.1280+5b901a317 + "@parcel/markdown-ansi": 2.0.0-nightly.1280+5b901a317 + "@parcel/source-map": ^2.1.1 chalk: ^4.1.0 - checksum: 2645b3379deea727af4d908687b18707d721c71eafbe597275fd02da7e04ccb4ae50a191ef8afacc1cf119dcc77d33fe627cbfe56c0d210d84a1fe8b32ab9bac + nullthrows: ^1.1.1 + checksum: 35c247b0f5591924ec44196530b87851d975ca0101c5d029d06d59a4e3047a994e6443df226cb676cd0924d7b0fa57e58cc622b1ad25e6fc9f9361c033f494d3 languageName: node linkType: hard -"@parcel/watcher@npm:^2.0.0": - version: 2.0.5 - resolution: "@parcel/watcher@npm:2.0.5" +"@parcel/utils@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/utils@npm:2.8.3" + dependencies: + "@parcel/codeframe": 2.8.3 + "@parcel/diagnostic": 2.8.3 + "@parcel/hash": 2.8.3 + "@parcel/logger": 2.8.3 + "@parcel/markdown-ansi": 2.8.3 + "@parcel/source-map": ^2.1.1 + chalk: ^4.1.0 + checksum: 69edf3e7c3ef1ccd4caa6ca838a64b27b27668b213212579111405824ed969e6555857b33f0b9e793e97399a60f034904addde19b98628b37a2fcbbb9141cafa + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.0.7": + version: 2.1.0 + resolution: "@parcel/watcher@npm:2.1.0" dependencies: + is-glob: ^4.0.3 + micromatch: ^4.0.5 node-addon-api: ^3.2.1 node-gyp: latest node-gyp-build: ^4.3.0 - checksum: ddc5b073e82cfadbc3bca3c1c0d5e64f445550f77a073fa3f7b1ac4547ec545fd6474ba5cd7e37aa0121d1ea37e70535172be74f9b081a17e7458849cedffdb0 + checksum: 17f512ad6d5dbb40053ceea7091f8af754afc63786b8f050b225b89a8ba24900468aad8bc4edb25c0349b4c0c8d061f50aa19242c0af52cbc30e6ebf50c7bf4c languageName: node linkType: hard -"@parcel/workers@npm:2.7.0": - version: 2.7.0 - resolution: "@parcel/workers@npm:2.7.0" +"@parcel/workers@npm:2.0.0-nightly.1280+5b901a317": + version: 2.0.0-nightly.1280 + resolution: "@parcel/workers@npm:2.0.0-nightly.1280" + dependencies: + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/logger": 2.0.0-nightly.1280+5b901a317 + "@parcel/types": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + chrome-trace-event: ^1.0.2 + nullthrows: ^1.1.1 + peerDependencies: + "@parcel/core": 2.0.0-nightly.1278+5b901a317 + checksum: b0a561c5fd4cfede403388ab674d3312519c5a972667af85ef3adf7f8412eb9c847144a7212d568d2aadfb2c86bc88006201f559d01b6e7ebb4f4331d7b67174 + languageName: node + linkType: hard + +"@parcel/workers@npm:2.8.3": + version: 2.8.3 + resolution: "@parcel/workers@npm:2.8.3" dependencies: - "@parcel/diagnostic": 2.7.0 - "@parcel/logger": 2.7.0 - "@parcel/types": 2.7.0 - "@parcel/utils": 2.7.0 + "@parcel/diagnostic": 2.8.3 + "@parcel/logger": 2.8.3 + "@parcel/types": 2.8.3 + "@parcel/utils": 2.8.3 chrome-trace-event: ^1.0.2 nullthrows: ^1.1.1 peerDependencies: - "@parcel/core": ^2.7.0 - checksum: e3621c40300be14db72d2a201db9de08fdea121cf76c721a466960b5586052c4416b26931ea8e2df2fb7df2d942180c73759ceca4bd484499f8ac04caa104897 + "@parcel/core": ^2.8.3 + checksum: e3168b3e9ee6bd8e92472e11af9228aca689c5d31841410c908ab31f2a11adf939481d9f4d945ae44d7d3ec1e07980fb3ca5c2f87be82e31a02a94f4655c8e01 languageName: node linkType: hard @@ -6794,12 +7364,126 @@ __metadata: languageName: node linkType: hard -"@swc/helpers@npm:^0.4.2": - version: 0.4.11 - resolution: "@swc/helpers@npm:0.4.11" +"@swc/core-darwin-arm64@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-darwin-arm64@npm:1.3.49" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-x64@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-darwin-x64@npm:1.3.49" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.3.49" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-linux-arm64-gnu@npm:1.3.49" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-arm64-musl@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-linux-arm64-musl@npm:1.3.49" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-linux-x64-gnu@npm:1.3.49" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-musl@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-linux-x64-musl@npm:1.3.49" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-win32-arm64-msvc@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-win32-arm64-msvc@npm:1.3.49" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-win32-ia32-msvc@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-win32-ia32-msvc@npm:1.3.49" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@swc/core-win32-x64-msvc@npm:1.3.49": + version: 1.3.49 + resolution: "@swc/core-win32-x64-msvc@npm:1.3.49" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/core@npm:^1.3.36": + version: 1.3.49 + resolution: "@swc/core@npm:1.3.49" + dependencies: + "@swc/core-darwin-arm64": 1.3.49 + "@swc/core-darwin-x64": 1.3.49 + "@swc/core-linux-arm-gnueabihf": 1.3.49 + "@swc/core-linux-arm64-gnu": 1.3.49 + "@swc/core-linux-arm64-musl": 1.3.49 + "@swc/core-linux-x64-gnu": 1.3.49 + "@swc/core-linux-x64-musl": 1.3.49 + "@swc/core-win32-arm64-msvc": 1.3.49 + "@swc/core-win32-ia32-msvc": 1.3.49 + "@swc/core-win32-x64-msvc": 1.3.49 + peerDependencies: + "@swc/helpers": ^0.5.0 + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 7234f38451dd765ea94cb44236f261603014e27bff6ecd133d9ba8a2d39314e9949e43bb77ffccd21f5e6c942ad7acf444de8972744ca24ac8f3ccecaea849a1 + languageName: node + linkType: hard + +"@swc/helpers@npm:^0.4.12": + version: 0.4.14 + resolution: "@swc/helpers@npm:0.4.14" dependencies: tslib: ^2.4.0 - checksum: 736857d524b41a8a4db81094e9b027f554004e0fa3e86325d85bdb38f7e6459ce022db079edb6c61ba0f46fe8583b3e663e95f7acbd13e51b8da6c34e45bba2e + checksum: 273fd3f3fc461a92f3790cc551ea054745c6d6959afbe1232e6d7aa1c722bbc114d308aab96bef5c78fc0303c85c7b472ef00e2253251cc89737f3b1af56e5a5 languageName: node linkType: hard @@ -8069,7 +8753,7 @@ __metadata: "@babel/preset-env": ^7.14.7 "@babel/register": ^7.10.5 "@babel/types": ^7.17.0 - "@parcel/transformer-vue": 2.7.0 + "@parcel/transformer-vue": 2.8.4-nightly.2903+5b901a317 "@types/jasmine": "file:./private/@types/jasmine" "@types/jasminewd2": "file:./private/@types/jasmine" "@typescript-eslint/eslint-plugin": ^5.0.0 @@ -8952,6 +9636,7 @@ __metadata: "@uppy/utils": "workspace:^" classnames: ^2.2.6 nanoid: ^4.0.0 + p-queue: ^7.3.4 preact: ^10.5.13 peerDependencies: "@uppy/core": "workspace:^" @@ -13927,9 +14612,9 @@ __metadata: languageName: node linkType: hard -"cypress@npm:^10.0.0": - version: 10.7.0 - resolution: "cypress@npm:10.7.0" +"cypress@npm:^12.9.0": + version: 12.9.0 + resolution: "cypress@npm:12.9.0" dependencies: "@cypress/request": ^2.88.10 "@cypress/xvfb": ^1.2.4 @@ -13948,9 +14633,9 @@ __metadata: commander: ^5.1.0 common-tags: ^1.8.0 dayjs: ^1.10.4 - debug: ^4.3.2 + debug: ^4.3.4 enquirer: ^2.3.6 - eventemitter2: ^6.4.3 + eventemitter2: 6.4.7 execa: 4.1.0 executable: ^4.1.1 extract-zip: 2.0.1 @@ -13975,7 +14660,7 @@ __metadata: yauzl: ^2.10.0 bin: cypress: bin/cypress - checksum: ef8a5ae54f3404f7926e1e248ba7a27c7f66e654a9603bf9df6366731d8dd75455f6ec9cc34d7e55e1a8c3cb8e0e36ce59add81b7b14466f2063cfe45e6c00f4 + checksum: aad2278310fe4897b2c4e1f23e22f28992c83bcac945a6c350d077b1b2fb1805e44d5c58e19e2a9d63ca04aa3f9eabdd3c661cab0ce5dddd75c72702262ac89e languageName: node linkType: hard @@ -14853,11 +15538,11 @@ __metadata: "@uppy/webcam": "workspace:^" "@uppy/xhr-upload": "workspace:^" "@uppy/zoom": "workspace:^" - cypress: ^10.0.0 + cypress: ^12.9.0 cypress-terminal-report: ^4.1.2 deep-freeze: ^0.0.1 execa: ^6.1.0 - parcel: ^2.0.1 + parcel: 2.0.0-nightly.1278 prompts: ^2.4.2 react: ^18.1.0 react-dom: ^18.1.0 @@ -16681,14 +17366,14 @@ __metadata: languageName: node linkType: hard -"eventemitter2@npm:^6.4.3": +"eventemitter2@npm:6.4.7": version: 6.4.7 resolution: "eventemitter2@npm:6.4.7" checksum: 1b36a77e139d6965ebf3a36c01fa00c089ae6b80faa1911e52888f40b3a7057b36a2cc45dcd1ad87cda3798fe7b97a0aabcbb8175a8b96092a23bb7d0f039e66 languageName: node linkType: hard -"eventemitter3@npm:^4.0.0": +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 @@ -22112,6 +22797,96 @@ __metadata: languageName: node linkType: hard +"lightningcss-darwin-arm64@npm:1.19.0": + version: 1.19.0 + resolution: "lightningcss-darwin-arm64@npm:1.19.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.19.0": + version: 1.19.0 + resolution: "lightningcss-darwin-x64@npm:1.19.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.19.0": + version: 1.19.0 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.19.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.19.0": + version: 1.19.0 + resolution: "lightningcss-linux-arm64-gnu@npm:1.19.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.19.0": + version: 1.19.0 + resolution: "lightningcss-linux-arm64-musl@npm:1.19.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.19.0": + version: 1.19.0 + resolution: "lightningcss-linux-x64-gnu@npm:1.19.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.19.0": + version: 1.19.0 + resolution: "lightningcss-linux-x64-musl@npm:1.19.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.19.0": + version: 1.19.0 + resolution: "lightningcss-win32-x64-msvc@npm:1.19.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:^1.16.1": + version: 1.19.0 + resolution: "lightningcss@npm:1.19.0" + dependencies: + detect-libc: ^1.0.3 + lightningcss-darwin-arm64: 1.19.0 + lightningcss-darwin-x64: 1.19.0 + lightningcss-linux-arm-gnueabihf: 1.19.0 + lightningcss-linux-arm64-gnu: 1.19.0 + lightningcss-linux-arm64-musl: 1.19.0 + lightningcss-linux-x64-gnu: 1.19.0 + lightningcss-linux-x64-musl: 1.19.0 + lightningcss-win32-x64-msvc: 1.19.0 + dependenciesMeta: + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: c51de34b7379f9da391d0c1157893bb1484357d1ce2212a8c7943690d7a4fed7f2fa0d2dd7a92004b4444662011564ec7bf31f458a1638c856c529fe07285177 + languageName: node + linkType: hard + "lilconfig@npm:2.0.5": version: 2.0.5 resolution: "lilconfig@npm:2.0.5" @@ -25996,6 +26771,16 @@ __metadata: languageName: node linkType: hard +"p-queue@npm:^7.3.4": + version: 7.3.4 + resolution: "p-queue@npm:7.3.4" + dependencies: + eventemitter3: ^4.0.7 + p-timeout: ^5.0.2 + checksum: a21b8a4dd75f64a4988e4468cc344d1b45132506ddd2c771932d3de446d108ee68713b629e0d3f0809c227bc10eafc613edde6ae741d9f60db89b6031e40921c + languageName: node + linkType: hard + "p-retry@npm:^4.5.0": version: 4.6.2 resolution: "p-retry@npm:4.6.2" @@ -26015,6 +26800,13 @@ __metadata: languageName: node linkType: hard +"p-timeout@npm:^5.0.2": + version: 5.1.0 + resolution: "p-timeout@npm:5.1.0" + checksum: f5cd4e17301ff1ff1d8dbf2817df0ad88c6bba99349fc24d8d181827176ad4f8aca649190b8a5b1a428dfd6ddc091af4606835d3e0cb0656e04045da5c9e270c + languageName: node + linkType: hard + "p-try@npm:^1.0.0": version: 1.0.0 resolution: "p-try@npm:1.0.0" @@ -26095,27 +26887,51 @@ __metadata: languageName: node linkType: hard -"parcel@npm:^2.0.0, parcel@npm:^2.0.1": - version: 2.7.0 - resolution: "parcel@npm:2.7.0" - dependencies: - "@parcel/config-default": 2.7.0 - "@parcel/core": 2.7.0 - "@parcel/diagnostic": 2.7.0 - "@parcel/events": 2.7.0 - "@parcel/fs": 2.7.0 - "@parcel/logger": 2.7.0 - "@parcel/package-manager": 2.7.0 - "@parcel/reporter-cli": 2.7.0 - "@parcel/reporter-dev-server": 2.7.0 - "@parcel/utils": 2.7.0 +"parcel@npm:2.0.0-nightly.1278": + version: 2.0.0-nightly.1278 + resolution: "parcel@npm:2.0.0-nightly.1278" + dependencies: + "@parcel/config-default": 2.0.0-nightly.1280+5b901a317 + "@parcel/core": 2.0.0-nightly.1278+5b901a317 + "@parcel/diagnostic": 2.0.0-nightly.1280+5b901a317 + "@parcel/events": 2.0.0-nightly.1280+5b901a317 + "@parcel/fs": 2.0.0-nightly.1280+5b901a317 + "@parcel/logger": 2.0.0-nightly.1280+5b901a317 + "@parcel/package-manager": 2.0.0-nightly.1280+5b901a317 + "@parcel/reporter-cli": 2.0.0-nightly.1280+5b901a317 + "@parcel/reporter-dev-server": 2.0.0-nightly.1280+5b901a317 + "@parcel/utils": 2.0.0-nightly.1280+5b901a317 + chalk: ^4.1.0 + commander: ^7.0.0 + get-port: ^4.2.0 + v8-compile-cache: ^2.0.0 + bin: + parcel: lib/bin.js + checksum: 73a67032a7db14882c93fbc7fa1c5361af2684a50d85410c1099f57a29b98f2643c2bbca7fb5189baa366533aceda8c8023536af27dfcfd178381130342f64ec + languageName: node + linkType: hard + +"parcel@npm:^2.0.0": + version: 2.8.3 + resolution: "parcel@npm:2.8.3" + dependencies: + "@parcel/config-default": 2.8.3 + "@parcel/core": 2.8.3 + "@parcel/diagnostic": 2.8.3 + "@parcel/events": 2.8.3 + "@parcel/fs": 2.8.3 + "@parcel/logger": 2.8.3 + "@parcel/package-manager": 2.8.3 + "@parcel/reporter-cli": 2.8.3 + "@parcel/reporter-dev-server": 2.8.3 + "@parcel/utils": 2.8.3 chalk: ^4.1.0 commander: ^7.0.0 get-port: ^4.2.0 v8-compile-cache: ^2.0.0 bin: parcel: lib/bin.js - checksum: 0584bc59daccf9c1e3afe0235d134f440fc2e08135c66d7ac4ee7b4edec12739ec94c829590cf18774f33f760ac601a78b5df26b81977842d1052e3c9b71e94b + checksum: 09cd2dc23c2ec0417e9de93face185a08679d744c6cbb627fce6ffb507f8af1f8d0642f063e0cf771b699419a29db8ee7ca60cdb32966a65dd3b03da35473bfa languageName: node linkType: hard @@ -31248,6 +32064,13 @@ __metadata: languageName: node linkType: hard +"srcset@npm:4": + version: 4.0.0 + resolution: "srcset@npm:4.0.0" + checksum: aceb898c9281101ef43bfbf96bf04dfae828e1bf942a45df6fad74ae9f8f0a425f4bca1480e0d22879beb40dd2bc6947e0e1e5f4d307a714666196164bc5769d + languageName: node + linkType: hard + "sshpk@npm:^1.14.1": version: 1.17.0 resolution: "sshpk@npm:1.17.0"