From 9c11f31eff44e73a386da8a216d599dd36e8b767 Mon Sep 17 00:00:00 2001 From: Merlijn Vos Date: Mon, 29 Apr 2024 16:03:02 +0200 Subject: [PATCH 1/7] @uppy/core: reference updated i18n in Restricter (#5118) Fixes: https://github.com/transloadit/uppy/issues/5115 --- packages/@uppy/core/src/Restricter.ts | 26 +++++++++++++--------- packages/@uppy/core/src/Uppy.test.ts | 32 +++++++++++++++++++++++++++ packages/@uppy/core/src/Uppy.ts | 5 ++++- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/packages/@uppy/core/src/Restricter.ts b/packages/@uppy/core/src/Restricter.ts index d591646617..378fd6c1f5 100644 --- a/packages/@uppy/core/src/Restricter.ts +++ b/packages/@uppy/core/src/Restricter.ts @@ -3,7 +3,6 @@ import prettierBytes from '@transloadit/prettier-bytes' // @ts-ignore untyped import match from 'mime-match' -import Translator from '@uppy/utils/lib/Translator' import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile' import type { I18n } from '@uppy/utils/lib/Translator' import type { State, NonNullableUppyOptions } from './Uppy' @@ -58,12 +57,15 @@ class RestrictionError extends Error { } class Restricter { - i18n: Translator['translate'] + getI18n: () => I18n getOpts: () => NonNullableUppyOptions - constructor(getOpts: () => NonNullableUppyOptions, i18n: I18n) { - this.i18n = i18n + constructor( + getOpts: () => NonNullableUppyOptions, + getI18n: () => I18n, + ) { + this.getI18n = getI18n this.getOpts = (): NonNullableUppyOptions => { const opts = getOpts() @@ -88,7 +90,7 @@ class Restricter { const nonGhostFiles = existingFiles.filter((f) => !f.isGhost) if (nonGhostFiles.length + addingFiles.length > maxNumberOfFiles) { throw new RestrictionError( - `${this.i18n('youCanOnlyUploadX', { + `${this.getI18n()('youCanOnlyUploadX', { smart_count: maxNumberOfFiles, })}`, ) @@ -108,7 +110,7 @@ class Restricter { if (totalFilesSize > maxTotalFileSize) { throw new RestrictionError( - this.i18n('exceedsSize', { + this.getI18n()('exceedsSize', { size: prettierBytes(maxTotalFileSize), file: addingFile.name, }), @@ -141,7 +143,7 @@ class Restricter { if (!isCorrectFileType) { const allowedFileTypesString = allowedFileTypes.join(', ') throw new RestrictionError( - this.i18n('youCanOnlyUploadFileTypes', { + this.getI18n()('youCanOnlyUploadFileTypes', { types: allowedFileTypesString, }), { file } as { file: UppyFile }, @@ -152,7 +154,7 @@ class Restricter { // We can't check maxFileSize if the size is unknown. if (maxFileSize && file.size != null && file.size > maxFileSize) { throw new RestrictionError( - this.i18n('exceedsSize', { + this.getI18n()('exceedsSize', { size: prettierBytes(maxFileSize), file: file.name, }), @@ -163,7 +165,7 @@ class Restricter { // We can't check minFileSize if the size is unknown. if (minFileSize && file.size != null && file.size < minFileSize) { throw new RestrictionError( - this.i18n('inferiorSize', { + this.getI18n()('inferiorSize', { size: prettierBytes(minFileSize), }), { file } as { file: UppyFile }, @@ -185,7 +187,9 @@ class Restricter { const { minNumberOfFiles } = this.getOpts().restrictions if (minNumberOfFiles && Object.keys(files).length < minNumberOfFiles) { throw new RestrictionError( - this.i18n('youHaveToAtLeastSelectX', { smart_count: minNumberOfFiles }), + this.getI18n()('youHaveToAtLeastSelectX', { + smart_count: minNumberOfFiles, + }), ) } } @@ -195,7 +199,7 @@ class Restricter { error: RestrictionError } { const error = new RestrictionError( - this.i18n('missingRequiredMetaFieldOnFile', { fileName: file.name }), + this.getI18n()('missingRequiredMetaFieldOnFile', { fileName: file.name }), ) const { requiredMetaFields } = this.getOpts().restrictions const missingFields: string[] = [] diff --git a/packages/@uppy/core/src/Uppy.test.ts b/packages/@uppy/core/src/Uppy.test.ts index 6f73e34452..b71229a8c9 100644 --- a/packages/@uppy/core/src/Uppy.test.ts +++ b/packages/@uppy/core/src/Uppy.test.ts @@ -7,6 +7,7 @@ import fs from 'node:fs' import path from 'node:path' import prettierBytes from '@transloadit/prettier-bytes' import type { Body, Meta } from '@uppy/utils/lib/UppyFile' +import type { Locale } from '@uppy/utils/lib/Translator' import Core from './index.ts' import UIPlugin from './UIPlugin.ts' import BasePlugin, { @@ -1540,6 +1541,18 @@ describe('src/Core', () => { }) it('should change restrictions on the fly', () => { + const fr_FR: Locale<0 | 1> = { + strings: { + youCanOnlyUploadFileTypes: + 'Vous pouvez seulement téléverser: %{types}', + }, + pluralize(n) { + if (n <= 1) { + return 0 + } + return 1 + }, + } const core = new Core({ restrictions: { allowedFileTypes: ['image/jpeg'], @@ -1560,6 +1573,25 @@ describe('src/Core', () => { } core.setOptions({ + locale: fr_FR, + }) + + try { + core.addFile({ + source: 'vi', + name: 'foo1.png', + type: 'image/png', + // @ts-ignore + data: new File([sampleImage], { type: 'image/png' }), + }) + } catch (err) { + expect(err).toMatchObject( + new Error('Vous pouvez seulement téléverser: image/jpeg'), + ) + } + + core.setOptions({ + locale: fr_FR, restrictions: { allowedFileTypes: ['image/png'], }, diff --git a/packages/@uppy/core/src/Uppy.ts b/packages/@uppy/core/src/Uppy.ts index 9e473b51a4..c9b6c8d7ba 100644 --- a/packages/@uppy/core/src/Uppy.ts +++ b/packages/@uppy/core/src/Uppy.ts @@ -460,7 +460,10 @@ export class Uppy { info: [], }) - this.#restricter = new Restricter(() => this.opts, this.i18n) + this.#restricter = new Restricter( + () => this.opts, + () => this.i18n, + ) this.#storeUnsubscribe = this.store.subscribe( // eslint-disable-next-line From d2be2d84cdb2484ae5685989289305b623bf6320 Mon Sep 17 00:00:00 2001 From: Merlijn Vos Date: Mon, 29 Apr 2024 16:10:41 +0200 Subject: [PATCH 2/7] @uppy/core: add instance ID to generated IDs (#5080) --- packages/@uppy/core/src/Uppy.ts | 2 +- .../src/ProviderView/ProviderView.tsx | 2 +- packages/@uppy/utils/src/generateFileID.ts | 19 +++++++++++++------ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/@uppy/core/src/Uppy.ts b/packages/@uppy/core/src/Uppy.ts index c9b6c8d7ba..654a7ee6ab 100644 --- a/packages/@uppy/core/src/Uppy.ts +++ b/packages/@uppy/core/src/Uppy.ts @@ -915,7 +915,7 @@ export class Uppy { const fileType = getFileType(file) const fileName = getFileName(fileType, file) const fileExtension = getFileNameAndExtension(fileName).extension - const id = getSafeFileId(file) + const id = getSafeFileId(file, this.getID()) const meta = file.meta || {} meta.name = fileName diff --git a/packages/@uppy/provider-views/src/ProviderView/ProviderView.tsx b/packages/@uppy/provider-views/src/ProviderView/ProviderView.tsx index efb2a931d4..f89ac115b1 100644 --- a/packages/@uppy/provider-views/src/ProviderView/ProviderView.tsx +++ b/packages/@uppy/provider-views/src/ProviderView/ProviderView.tsx @@ -465,7 +465,7 @@ export default class ProviderView extends View< for (const newFile of files) { const tagFile = this.getTagFile(newFile) - const id = getSafeFileId(tagFile) + const id = getSafeFileId(tagFile, this.plugin.uppy.getID()) // 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, diff --git a/packages/@uppy/utils/src/generateFileID.ts b/packages/@uppy/utils/src/generateFileID.ts index 1694e43cc0..41107c3777 100644 --- a/packages/@uppy/utils/src/generateFileID.ts +++ b/packages/@uppy/utils/src/generateFileID.ts @@ -21,11 +21,12 @@ function encodeFilename(name: string): string { */ export default function generateFileID( file: MinimalRequiredUppyFile, + instanceId: string, ): string { // It's tempting to do `[items].filter(Boolean).join('-')` here, but that // is slower! simple string concatenation is fast - let id = 'uppy' + let id = instanceId || 'uppy' if (typeof file.name === 'string') { id += `-${encodeFilename(file.name.toLowerCase())}` } @@ -63,13 +64,19 @@ function hasFileStableId(file: MinimalRequiredUppyFile): boolean { return stableIdProviders.has(file.remote.provider as any) } -export function getSafeFileId(file: MinimalRequiredUppyFile): string { +export function getSafeFileId( + file: MinimalRequiredUppyFile, + instanceId: string, +): string { if (hasFileStableId(file)) return file.id! const fileType = getFileType(file) - return generateFileID({ - ...file, - type: fileType, - }) + return generateFileID( + { + ...file, + type: fileType, + }, + instanceId, + ) } From faceaf0da3df87c586317c8c5a4c586038643838 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Mon, 29 Apr 2024 16:23:28 +0200 Subject: [PATCH 3/7] meta: enforce use of `.js` extension in `import type` declarations (#5126) --- .eslintrc.js | 4 ++++ packages/@uppy/audio/types/index.d.ts | 2 +- .../@uppy/aws-s3-multipart/src/HTTPCommunicationQueue.ts | 6 +++--- packages/@uppy/aws-s3-multipart/src/MultipartUploader.ts | 4 ++-- packages/@uppy/aws-s3-multipart/src/index.test.ts | 2 +- packages/@uppy/aws-s3-multipart/src/index.ts | 2 +- packages/@uppy/aws-s3-multipart/src/utils.ts | 2 +- packages/@uppy/aws-s3-multipart/types/index.test-d.ts | 1 + .../@uppy/companion-client/src/CompanionPluginOptions.ts | 2 +- packages/@uppy/companion-client/src/Provider.ts | 2 +- packages/@uppy/compressor/types/index.d.ts | 2 +- packages/@uppy/core/src/BasePlugin.ts | 2 +- packages/@uppy/core/src/EventManager.ts | 2 +- packages/@uppy/core/src/Restricter.ts | 2 +- packages/@uppy/core/src/UIPlugin.ts | 4 ++-- packages/@uppy/core/src/Uppy.ts | 4 ++-- packages/@uppy/core/src/mocks/acquirerPlugin1.ts | 2 +- packages/@uppy/core/src/mocks/acquirerPlugin2.ts | 2 +- packages/@uppy/core/src/mocks/invalidPluginWithoutId.ts | 2 +- packages/@uppy/core/src/mocks/invalidPluginWithoutType.ts | 2 +- packages/@uppy/core/types/index.test-d.ts | 1 + packages/@uppy/image-editor/src/Editor.tsx | 2 +- packages/@uppy/provider-views/src/Breadcrumbs.tsx | 2 +- packages/@uppy/provider-views/src/ProviderView/AuthView.tsx | 4 ++-- packages/@uppy/provider-views/src/ProviderView/Header.tsx | 2 +- packages/@uppy/react/types/Dashboard.d.ts | 2 +- packages/@uppy/react/types/DashboardModal.d.ts | 2 +- packages/@uppy/react/types/DragDrop.d.ts | 2 +- packages/@uppy/react/types/FileInput.d.ts | 2 +- packages/@uppy/react/types/ProgressBar.d.ts | 2 +- packages/@uppy/react/types/StatusBar.d.ts | 2 +- packages/@uppy/status-bar/src/StatusBar.tsx | 2 +- packages/@uppy/status-bar/src/StatusBarOptions.ts | 2 +- packages/@uppy/transloadit/src/Assembly.ts | 2 +- packages/@uppy/transloadit/src/AssemblyOptions.ts | 6 +++++- packages/@uppy/transloadit/src/AssemblyWatcher.ts | 2 +- packages/@uppy/transloadit/src/Client.ts | 4 ++-- packages/@uppy/utils/src/ErrorWithCause.ts | 2 +- packages/@uppy/utils/src/UppyFile.ts | 2 +- packages/@uppy/utils/src/emitSocketProgress.ts | 4 ++-- packages/@uppy/utils/src/fileFilters.ts | 2 +- packages/@uppy/utils/src/generateFileID.ts | 2 +- packages/@uppy/utils/src/getBytesRemaining.ts | 2 +- packages/@uppy/utils/src/getETA.ts | 2 +- packages/@uppy/utils/src/getFileType.test.ts | 2 +- packages/@uppy/utils/src/getSpeed.ts | 2 +- 46 files changed, 61 insertions(+), 51 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 9cc223fdec..c47834e6ea 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -474,6 +474,10 @@ module.exports = { 'plugin:@typescript-eslint/recommended', ], rules: { + 'no-restricted-syntax': ['error', { + selector: 'ImportDeclaration[importKind="type"][source.value=/^\\./]:not([source.value=/\\.js$/])', + message: 'Use ".js" file extension for import type declarations', + }], 'import/prefer-default-export': 'off', '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-explicit-any': 'off', diff --git a/packages/@uppy/audio/types/index.d.ts b/packages/@uppy/audio/types/index.d.ts index 27a65e61e2..6d3fe8a47a 100644 --- a/packages/@uppy/audio/types/index.d.ts +++ b/packages/@uppy/audio/types/index.d.ts @@ -1,5 +1,5 @@ import type { PluginTarget, UIPlugin, UIPluginOptions } from '@uppy/core' -import type AudioLocale from './generatedLocale' +import type AudioLocale from './generatedLocale.js' export interface AudioOptions extends UIPluginOptions { target?: PluginTarget diff --git a/packages/@uppy/aws-s3-multipart/src/HTTPCommunicationQueue.ts b/packages/@uppy/aws-s3-multipart/src/HTTPCommunicationQueue.ts index 0a86c50f5f..1b645b65b6 100644 --- a/packages/@uppy/aws-s3-multipart/src/HTTPCommunicationQueue.ts +++ b/packages/@uppy/aws-s3-multipart/src/HTTPCommunicationQueue.ts @@ -4,10 +4,10 @@ import type { WrapPromiseFunctionType, } from '@uppy/utils/lib/RateLimitedQueue' import { pausingUploadReason, type Chunk } from './MultipartUploader.ts' -import type AwsS3Multipart from './index.ts' +import type AwsS3Multipart from './index.js' import { throwIfAborted } from './utils.ts' -import type { Body, UploadPartBytesResult, UploadResult } from './utils.ts' -import type { AwsS3MultipartOptions, uploadPartBytes } from './index.ts' +import type { Body, UploadPartBytesResult, UploadResult } from './utils.js' +import type { AwsS3MultipartOptions, uploadPartBytes } from './index.js' function removeMetadataFromURL(urlString: string) { const urlObject = new URL(urlString) diff --git a/packages/@uppy/aws-s3-multipart/src/MultipartUploader.ts b/packages/@uppy/aws-s3-multipart/src/MultipartUploader.ts index 665041afb4..c0099d54b9 100644 --- a/packages/@uppy/aws-s3-multipart/src/MultipartUploader.ts +++ b/packages/@uppy/aws-s3-multipart/src/MultipartUploader.ts @@ -1,8 +1,8 @@ import type { Uppy } from '@uppy/core' import { AbortController } from '@uppy/utils/lib/AbortController' import type { Meta, UppyFile } from '@uppy/utils/lib/UppyFile' -import type { HTTPCommunicationQueue } from './HTTPCommunicationQueue' -import type { Body } from './utils' +import type { HTTPCommunicationQueue } from './HTTPCommunicationQueue.js' +import type { Body } from './utils.js' const MB = 1024 * 1024 diff --git a/packages/@uppy/aws-s3-multipart/src/index.test.ts b/packages/@uppy/aws-s3-multipart/src/index.test.ts index 97f1b45904..0b2c22aaf0 100644 --- a/packages/@uppy/aws-s3-multipart/src/index.test.ts +++ b/packages/@uppy/aws-s3-multipart/src/index.test.ts @@ -4,7 +4,7 @@ import 'whatwg-fetch' import nock from 'nock' import Core from '@uppy/core' import AwsS3Multipart from './index.ts' -import type { Body } from './utils.ts' +import type { Body } from './utils.js' const KB = 1024 const MB = KB * KB diff --git a/packages/@uppy/aws-s3-multipart/src/index.ts b/packages/@uppy/aws-s3-multipart/src/index.ts index d55937c6a2..2595d1bfe0 100644 --- a/packages/@uppy/aws-s3-multipart/src/index.ts +++ b/packages/@uppy/aws-s3-multipart/src/index.ts @@ -22,7 +22,7 @@ import type { MultipartUploadResultWithSignal, UploadPartBytesResult, Body, -} from './utils.ts' +} from './utils.js' import createSignedURL from './createSignedURL.ts' import { HTTPCommunicationQueue } from './HTTPCommunicationQueue.ts' // eslint-disable-next-line @typescript-eslint/ban-ts-comment diff --git a/packages/@uppy/aws-s3-multipart/src/utils.ts b/packages/@uppy/aws-s3-multipart/src/utils.ts index 69c4f1a5ac..49d1f032a0 100644 --- a/packages/@uppy/aws-s3-multipart/src/utils.ts +++ b/packages/@uppy/aws-s3-multipart/src/utils.ts @@ -1,7 +1,7 @@ import { createAbortError } from '@uppy/utils/lib/AbortController' import type { Body as _Body } from '@uppy/utils/lib/UppyFile' -import type { AwsS3Part } from './index' +import type { AwsS3Part } from './index.js' export function throwIfAborted(signal?: AbortSignal | null): void { if (signal?.aborted) { diff --git a/packages/@uppy/aws-s3-multipart/types/index.test-d.ts b/packages/@uppy/aws-s3-multipart/types/index.test-d.ts index 1287eca958..6b28cb72e7 100644 --- a/packages/@uppy/aws-s3-multipart/types/index.test-d.ts +++ b/packages/@uppy/aws-s3-multipart/types/index.test-d.ts @@ -2,6 +2,7 @@ import { expectError, expectType } from 'tsd' import Uppy from '@uppy/core' import type { UppyFile } from '@uppy/core' import AwsS3Multipart from '..' +// eslint-disable-next-line no-restricted-syntax import type { AwsS3Part } from '..' { diff --git a/packages/@uppy/companion-client/src/CompanionPluginOptions.ts b/packages/@uppy/companion-client/src/CompanionPluginOptions.ts index 709b8f0dc3..4b5e44bfd8 100644 --- a/packages/@uppy/companion-client/src/CompanionPluginOptions.ts +++ b/packages/@uppy/companion-client/src/CompanionPluginOptions.ts @@ -1,5 +1,5 @@ import type { UIPluginOptions } from '@uppy/core' -import type { tokenStorage } from '.' +import type { tokenStorage } from './index.js' export interface CompanionPluginOptions extends UIPluginOptions { title?: string diff --git a/packages/@uppy/companion-client/src/Provider.ts b/packages/@uppy/companion-client/src/Provider.ts index b69eefe96a..aad0ef42ec 100644 --- a/packages/@uppy/companion-client/src/Provider.ts +++ b/packages/@uppy/companion-client/src/Provider.ts @@ -7,7 +7,7 @@ import type { } from '@uppy/utils/lib/CompanionClientProvider' import type { UnknownProviderPlugin } from '@uppy/core/lib/Uppy' import RequestClient, { authErrorStatusCode } from './RequestClient.ts' -import type { CompanionPluginOptions } from '.' +import type { CompanionPluginOptions } from './index.js' // TODO: remove deprecated options in next major release export interface Opts extends PluginOpts, CompanionPluginOptions { diff --git a/packages/@uppy/compressor/types/index.d.ts b/packages/@uppy/compressor/types/index.d.ts index 5562d4badc..74bc889a5c 100644 --- a/packages/@uppy/compressor/types/index.d.ts +++ b/packages/@uppy/compressor/types/index.d.ts @@ -1,6 +1,6 @@ import type { PluginOptions, BasePlugin } from '@uppy/core' import { UppyFile } from '@uppy/utils' -import type CompressorLocale from './generatedLocale' +import type CompressorLocale from './generatedLocale.js' export interface CompressorOptions extends PluginOptions { quality?: number diff --git a/packages/@uppy/core/src/BasePlugin.ts b/packages/@uppy/core/src/BasePlugin.ts index f8f8e8121b..708865be80 100644 --- a/packages/@uppy/core/src/BasePlugin.ts +++ b/packages/@uppy/core/src/BasePlugin.ts @@ -16,7 +16,7 @@ import type { OptionalPluralizeLocale, } from '@uppy/utils/lib/Translator' import type { Body, Meta } from '@uppy/utils/lib/UppyFile' -import type { State, UnknownPlugin, Uppy } from './Uppy' +import type { State, UnknownPlugin, Uppy } from './Uppy.js' export type PluginOpts = { locale?: Locale diff --git a/packages/@uppy/core/src/EventManager.ts b/packages/@uppy/core/src/EventManager.ts index e4a819f4e3..02ba3eac9e 100644 --- a/packages/@uppy/core/src/EventManager.ts +++ b/packages/@uppy/core/src/EventManager.ts @@ -4,7 +4,7 @@ import type { Uppy, UppyEventMap, _UppyEventMap, -} from './Uppy' +} from './Uppy.js' /** * Create a wrapper around an event emitter with a `remove` method to remove diff --git a/packages/@uppy/core/src/Restricter.ts b/packages/@uppy/core/src/Restricter.ts index 378fd6c1f5..a8000363d6 100644 --- a/packages/@uppy/core/src/Restricter.ts +++ b/packages/@uppy/core/src/Restricter.ts @@ -5,7 +5,7 @@ import prettierBytes from '@transloadit/prettier-bytes' import match from 'mime-match' import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile' import type { I18n } from '@uppy/utils/lib/Translator' -import type { State, NonNullableUppyOptions } from './Uppy' +import type { State, NonNullableUppyOptions } from './Uppy.js' export type Restrictions = { maxFileSize: number | null diff --git a/packages/@uppy/core/src/UIPlugin.ts b/packages/@uppy/core/src/UIPlugin.ts index 39f4e4029b..b9be3f6373 100644 --- a/packages/@uppy/core/src/UIPlugin.ts +++ b/packages/@uppy/core/src/UIPlugin.ts @@ -5,8 +5,8 @@ import getTextDirection from '@uppy/utils/lib/getTextDirection' import type { Body, Meta } from '@uppy/utils/lib/UppyFile' import BasePlugin from './BasePlugin.ts' -import type { PluginOpts } from './BasePlugin.ts' -import type { State } from './Uppy.ts' +import type { PluginOpts } from './BasePlugin.js' +import type { State } from './Uppy.js' /** * Defer a frequent call to the microtask queue. diff --git a/packages/@uppy/core/src/Uppy.ts b/packages/@uppy/core/src/Uppy.ts index 654a7ee6ab..87c305a585 100644 --- a/packages/@uppy/core/src/Uppy.ts +++ b/packages/@uppy/core/src/Uppy.ts @@ -47,8 +47,8 @@ import { import packageJson from '../package.json' import locale from './locale.ts' -import type BasePlugin from './BasePlugin.ts' -import type { Restrictions, ValidateableFile } from './Restricter.ts' +import type BasePlugin from './BasePlugin.js' +import type { Restrictions, ValidateableFile } from './Restricter.js' type Processor = ( fileIDs: string[], diff --git a/packages/@uppy/core/src/mocks/acquirerPlugin1.ts b/packages/@uppy/core/src/mocks/acquirerPlugin1.ts index 2968f37849..3d71385742 100644 --- a/packages/@uppy/core/src/mocks/acquirerPlugin1.ts +++ b/packages/@uppy/core/src/mocks/acquirerPlugin1.ts @@ -1,6 +1,6 @@ import { vi } from 'vitest' // eslint-disable-line import/no-extraneous-dependencies import UIPlugin from '../UIPlugin.ts' -import type Uppy from '../Uppy.ts' +import type Uppy from '../Uppy.js' type mock = ReturnType diff --git a/packages/@uppy/core/src/mocks/acquirerPlugin2.ts b/packages/@uppy/core/src/mocks/acquirerPlugin2.ts index 01a5c2fa1c..ddc4d2901e 100644 --- a/packages/@uppy/core/src/mocks/acquirerPlugin2.ts +++ b/packages/@uppy/core/src/mocks/acquirerPlugin2.ts @@ -1,6 +1,6 @@ import { vi } from 'vitest' // eslint-disable-line import/no-extraneous-dependencies import UIPlugin from '../UIPlugin.ts' -import type Uppy from '../Uppy.ts' +import type Uppy from '../Uppy.js' type mock = ReturnType diff --git a/packages/@uppy/core/src/mocks/invalidPluginWithoutId.ts b/packages/@uppy/core/src/mocks/invalidPluginWithoutId.ts index f24dc4b8f0..38cb0759b3 100644 --- a/packages/@uppy/core/src/mocks/invalidPluginWithoutId.ts +++ b/packages/@uppy/core/src/mocks/invalidPluginWithoutId.ts @@ -1,5 +1,5 @@ import UIPlugin from '../UIPlugin.ts' -import type Uppy from '../Uppy.ts' +import type Uppy from '../Uppy.js' export default class InvalidPluginWithoutName extends UIPlugin { public type: string diff --git a/packages/@uppy/core/src/mocks/invalidPluginWithoutType.ts b/packages/@uppy/core/src/mocks/invalidPluginWithoutType.ts index 3e600eaed4..770264d027 100644 --- a/packages/@uppy/core/src/mocks/invalidPluginWithoutType.ts +++ b/packages/@uppy/core/src/mocks/invalidPluginWithoutType.ts @@ -1,5 +1,5 @@ import UIPlugin from '../UIPlugin.ts' -import type Uppy from '../Uppy.ts' +import type Uppy from '../Uppy.js' export default class InvalidPluginWithoutType extends UIPlugin { public id: string diff --git a/packages/@uppy/core/types/index.test-d.ts b/packages/@uppy/core/types/index.test-d.ts index fcffd72337..a834516041 100644 --- a/packages/@uppy/core/types/index.test-d.ts +++ b/packages/@uppy/core/types/index.test-d.ts @@ -3,6 +3,7 @@ import { expectError, expectType } from 'tsd' import DefaultStore from '@uppy/store-default' // eslint-disable-next-line import/no-named-as-default import Uppy, { UIPlugin } from '..' +// eslint-disable-next-line no-restricted-syntax import type { UploadedUppyFile, FailedUppyFile, diff --git a/packages/@uppy/image-editor/src/Editor.tsx b/packages/@uppy/image-editor/src/Editor.tsx index c8f61d39c6..b636d102b4 100644 --- a/packages/@uppy/image-editor/src/Editor.tsx +++ b/packages/@uppy/image-editor/src/Editor.tsx @@ -7,7 +7,7 @@ import getCanvasDataThatFitsPerfectlyIntoContainer from './utils/getCanvasDataTh import getScaleFactorThatRemovesDarkCorners from './utils/getScaleFactorThatRemovesDarkCorners.ts' import limitCropboxMovementOnMove from './utils/limitCropboxMovementOnMove.ts' import limitCropboxMovementOnResize from './utils/limitCropboxMovementOnResize.ts' -import type ImageEditor from './ImageEditor.tsx' +import type ImageEditor from './ImageEditor.js' type Props = { currentImage: UppyFile diff --git a/packages/@uppy/provider-views/src/Breadcrumbs.tsx b/packages/@uppy/provider-views/src/Breadcrumbs.tsx index 6831666fac..0312d42ec9 100644 --- a/packages/@uppy/provider-views/src/Breadcrumbs.tsx +++ b/packages/@uppy/provider-views/src/Breadcrumbs.tsx @@ -1,7 +1,7 @@ import type { UnknownProviderPluginState } from '@uppy/core/lib/Uppy' import { h, Fragment } from 'preact' import type { Body, Meta } from '@uppy/utils/lib/UppyFile' -import type ProviderView from './ProviderView' +import type ProviderView from './ProviderView/index.js' type BreadcrumbProps = { getFolder: () => void diff --git a/packages/@uppy/provider-views/src/ProviderView/AuthView.tsx b/packages/@uppy/provider-views/src/ProviderView/AuthView.tsx index f24bd7a2ec..5b07df30ce 100644 --- a/packages/@uppy/provider-views/src/ProviderView/AuthView.tsx +++ b/packages/@uppy/provider-views/src/ProviderView/AuthView.tsx @@ -3,8 +3,8 @@ import { h } from 'preact' import { useCallback } from 'preact/hooks' import type { Body, Meta } from '@uppy/utils/lib/UppyFile' import type Translator from '@uppy/utils/lib/Translator' -import type { ProviderViewOptions } from './ProviderView' -import type ProviderViews from './ProviderView' +import type { ProviderViewOptions } from './ProviderView.js' +import type ProviderViews from './ProviderView.js' type AuthViewProps = { loading: boolean | string diff --git a/packages/@uppy/provider-views/src/ProviderView/Header.tsx b/packages/@uppy/provider-views/src/ProviderView/Header.tsx index 0451743b3f..4a2e6efa5c 100644 --- a/packages/@uppy/provider-views/src/ProviderView/Header.tsx +++ b/packages/@uppy/provider-views/src/ProviderView/Header.tsx @@ -5,7 +5,7 @@ import type { Body, Meta } from '@uppy/utils/lib/UppyFile' import type { UnknownProviderPluginState } from '@uppy/core/lib/Uppy' import User from './User.tsx' import Breadcrumbs from '../Breadcrumbs.tsx' -import type ProviderView from './ProviderView.tsx' +import type ProviderView from './ProviderView.js' type HeaderProps = { showBreadcrumbs: boolean diff --git a/packages/@uppy/react/types/Dashboard.d.ts b/packages/@uppy/react/types/Dashboard.d.ts index 42d4b0b9a8..4af363c368 100644 --- a/packages/@uppy/react/types/Dashboard.d.ts +++ b/packages/@uppy/react/types/Dashboard.d.ts @@ -1,6 +1,6 @@ import * as React from 'react' import type { DashboardOptions } from '@uppy/dashboard' -import type { Omit, WithBaseUppyProps } from './CommonTypes' +import type { Omit, WithBaseUppyProps } from './CommonTypes.js' // This type is mapped into `DashboardProps` below so IntelliSense doesn't display this big mess of nested types type DashboardPropsInner = Omit< diff --git a/packages/@uppy/react/types/DashboardModal.d.ts b/packages/@uppy/react/types/DashboardModal.d.ts index 3e7b36bb65..9ef7617076 100644 --- a/packages/@uppy/react/types/DashboardModal.d.ts +++ b/packages/@uppy/react/types/DashboardModal.d.ts @@ -1,5 +1,5 @@ import type { DashboardOptions } from '@uppy/dashboard' -import type { Omit, ToUppyProps } from './CommonTypes' +import type { Omit, ToUppyProps } from './CommonTypes.js' // This type is mapped into `DashboardModalProps` below so IntelliSense doesn't display this big mess of nested types type DashboardModalPropsInner = { diff --git a/packages/@uppy/react/types/DragDrop.d.ts b/packages/@uppy/react/types/DragDrop.d.ts index 55862e509c..c127152b83 100644 --- a/packages/@uppy/react/types/DragDrop.d.ts +++ b/packages/@uppy/react/types/DragDrop.d.ts @@ -1,5 +1,5 @@ import type { DragDropOptions } from '@uppy/drag-drop' -import type { ToUppyProps } from './CommonTypes' +import type { ToUppyProps } from './CommonTypes.js' export type DragDropProps = ToUppyProps & React.BaseHTMLAttributes diff --git a/packages/@uppy/react/types/FileInput.d.ts b/packages/@uppy/react/types/FileInput.d.ts index 92d7c4b5ae..adbc796ba3 100644 --- a/packages/@uppy/react/types/FileInput.d.ts +++ b/packages/@uppy/react/types/FileInput.d.ts @@ -1,5 +1,5 @@ import type { FileInputOptions } from '@uppy/file-input' -import type { ToUppyProps } from './CommonTypes' +import type { ToUppyProps } from './CommonTypes.js' export type FileInputProps = ToUppyProps diff --git a/packages/@uppy/react/types/ProgressBar.d.ts b/packages/@uppy/react/types/ProgressBar.d.ts index 425c78b05f..fe1a9baa3a 100644 --- a/packages/@uppy/react/types/ProgressBar.d.ts +++ b/packages/@uppy/react/types/ProgressBar.d.ts @@ -1,5 +1,5 @@ import type { ProgressBarOptions } from '@uppy/progress-bar' -import type { ToUppyProps } from './CommonTypes' +import type { ToUppyProps } from './CommonTypes.js' export type ProgressBarProps = ToUppyProps & React.BaseHTMLAttributes diff --git a/packages/@uppy/react/types/StatusBar.d.ts b/packages/@uppy/react/types/StatusBar.d.ts index 22be1dedf7..0bbe4d562e 100644 --- a/packages/@uppy/react/types/StatusBar.d.ts +++ b/packages/@uppy/react/types/StatusBar.d.ts @@ -1,5 +1,5 @@ import type { StatusBarOptions } from '@uppy/status-bar' -import type { ToUppyProps } from './CommonTypes' +import type { ToUppyProps } from './CommonTypes.js' export type StatusBarProps = ToUppyProps & React.BaseHTMLAttributes diff --git a/packages/@uppy/status-bar/src/StatusBar.tsx b/packages/@uppy/status-bar/src/StatusBar.tsx index 26c29b87ed..6fa730f147 100644 --- a/packages/@uppy/status-bar/src/StatusBar.tsx +++ b/packages/@uppy/status-bar/src/StatusBar.tsx @@ -11,7 +11,7 @@ import StatusBarUI, { type StatusBarUIProps } from './StatusBarUI.tsx' // @ts-ignore We don't want TS to generate types for the package.json import packageJson from '../package.json' import locale from './locale.ts' -import type { StatusBarOptions } from './StatusBarOptions.ts' +import type { StatusBarOptions } from './StatusBarOptions.js' const speedFilterHalfLife = 2000 const ETAFilterHalfLife = 2000 diff --git a/packages/@uppy/status-bar/src/StatusBarOptions.ts b/packages/@uppy/status-bar/src/StatusBarOptions.ts index 63649a5844..f2f9f4f6d7 100644 --- a/packages/@uppy/status-bar/src/StatusBarOptions.ts +++ b/packages/@uppy/status-bar/src/StatusBarOptions.ts @@ -1,5 +1,5 @@ import type { UIPluginOptions } from '@uppy/core/lib/UIPlugin' -import type StatusBarLocale from './locale.ts' +import type StatusBarLocale from './locale.js' export interface StatusBarOptions extends UIPluginOptions { showProgressDetails?: boolean diff --git a/packages/@uppy/transloadit/src/Assembly.ts b/packages/@uppy/transloadit/src/Assembly.ts index 644d398d66..765639f88d 100644 --- a/packages/@uppy/transloadit/src/Assembly.ts +++ b/packages/@uppy/transloadit/src/Assembly.ts @@ -8,7 +8,7 @@ import type { RateLimitedQueue, WrapPromiseFunctionType, } from '@uppy/utils/lib/RateLimitedQueue' -import type { AssemblyResponse } from '.' +import type { AssemblyResponse } from './index.js' const ASSEMBLY_UPLOADING = 'ASSEMBLY_UPLOADING' const ASSEMBLY_EXECUTING = 'ASSEMBLY_EXECUTING' diff --git a/packages/@uppy/transloadit/src/AssemblyOptions.ts b/packages/@uppy/transloadit/src/AssemblyOptions.ts index a4cd9cb98e..ce4823206f 100644 --- a/packages/@uppy/transloadit/src/AssemblyOptions.ts +++ b/packages/@uppy/transloadit/src/AssemblyOptions.ts @@ -1,6 +1,10 @@ import ErrorWithCause from '@uppy/utils/lib/ErrorWithCause' import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile' -import type { AssemblyParameters, Opts, AssemblyOptions as Options } from '.' +import type { + AssemblyParameters, + Opts, + AssemblyOptions as Options, +} from './index.js' /** * Check that Assembly parameters are present and include all required fields. diff --git a/packages/@uppy/transloadit/src/AssemblyWatcher.ts b/packages/@uppy/transloadit/src/AssemblyWatcher.ts index 075e2fde80..b3dca112fa 100644 --- a/packages/@uppy/transloadit/src/AssemblyWatcher.ts +++ b/packages/@uppy/transloadit/src/AssemblyWatcher.ts @@ -1,7 +1,7 @@ import type { Uppy } from '@uppy/core' import type { Body, Meta } from '@uppy/utils/lib/UppyFile' import Emitter from 'component-emitter' -import type { AssemblyResponse } from '.' +import type { AssemblyResponse } from './index.js' /** * Track completion of multiple assemblies. diff --git a/packages/@uppy/transloadit/src/Client.ts b/packages/@uppy/transloadit/src/Client.ts index da8a4c32e7..823f39df80 100644 --- a/packages/@uppy/transloadit/src/Client.ts +++ b/packages/@uppy/transloadit/src/Client.ts @@ -4,8 +4,8 @@ import type { } from '@uppy/utils/lib/RateLimitedQueue' import type { Body, Meta, UppyFile } from '@uppy/utils/lib/UppyFile' import fetchWithNetworkError from '@uppy/utils/lib/fetchWithNetworkError' -import type { AssemblyResponse } from '.' -import type { OptionsWithRestructuredFields } from './AssemblyOptions' +import type { AssemblyResponse } from './index.js' +import type { OptionsWithRestructuredFields } from './AssemblyOptions.js' const ASSEMBLIES_ENDPOINT = '/assemblies' diff --git a/packages/@uppy/utils/src/ErrorWithCause.ts b/packages/@uppy/utils/src/ErrorWithCause.ts index 31a005b128..b980c7f481 100644 --- a/packages/@uppy/utils/src/ErrorWithCause.ts +++ b/packages/@uppy/utils/src/ErrorWithCause.ts @@ -1,4 +1,4 @@ -import type NetworkError from './NetworkError.ts' +import type NetworkError from './NetworkError.js' import hasProperty from './hasProperty.ts' class ErrorWithCause extends Error { diff --git a/packages/@uppy/utils/src/UppyFile.ts b/packages/@uppy/utils/src/UppyFile.ts index f0374e45c9..624b0baee2 100644 --- a/packages/@uppy/utils/src/UppyFile.ts +++ b/packages/@uppy/utils/src/UppyFile.ts @@ -1,4 +1,4 @@ -import type { FileProgress } from './FileProgress' +import type { FileProgress } from './FileProgress.js' export type Meta = Record diff --git a/packages/@uppy/utils/src/emitSocketProgress.ts b/packages/@uppy/utils/src/emitSocketProgress.ts index a38c3830e4..62e07cd505 100644 --- a/packages/@uppy/utils/src/emitSocketProgress.ts +++ b/packages/@uppy/utils/src/emitSocketProgress.ts @@ -1,6 +1,6 @@ import throttle from 'lodash/throttle.js' -import type { UppyFile } from './UppyFile' -import type { FileProgress } from './FileProgress' +import type { UppyFile } from './UppyFile.js' +import type { FileProgress } from './FileProgress.js' function emitSocketProgress( uploader: any, diff --git a/packages/@uppy/utils/src/fileFilters.ts b/packages/@uppy/utils/src/fileFilters.ts index cdd67a7489..415bdef7a3 100644 --- a/packages/@uppy/utils/src/fileFilters.ts +++ b/packages/@uppy/utils/src/fileFilters.ts @@ -1,4 +1,4 @@ -import type { UppyFile } from './UppyFile' +import type { UppyFile } from './UppyFile.js' export function filterNonFailedFiles( files: UppyFile[], diff --git a/packages/@uppy/utils/src/generateFileID.ts b/packages/@uppy/utils/src/generateFileID.ts index 41107c3777..5f4e733d1a 100644 --- a/packages/@uppy/utils/src/generateFileID.ts +++ b/packages/@uppy/utils/src/generateFileID.ts @@ -1,4 +1,4 @@ -import type { MinimalRequiredUppyFile } from './UppyFile' +import type { MinimalRequiredUppyFile } from './UppyFile.js' import getFileType from './getFileType.ts' function encodeCharacter(character: string): string { diff --git a/packages/@uppy/utils/src/getBytesRemaining.ts b/packages/@uppy/utils/src/getBytesRemaining.ts index f7d8f08e9c..fdb0e97b18 100644 --- a/packages/@uppy/utils/src/getBytesRemaining.ts +++ b/packages/@uppy/utils/src/getBytesRemaining.ts @@ -1,4 +1,4 @@ -import type { FileProgress } from './FileProgress' +import type { FileProgress } from './FileProgress.js' export default function getBytesRemaining(fileProgress: FileProgress): number { if (fileProgress.bytesTotal == null) return 0 diff --git a/packages/@uppy/utils/src/getETA.ts b/packages/@uppy/utils/src/getETA.ts index e85416aeec..9a03b36209 100644 --- a/packages/@uppy/utils/src/getETA.ts +++ b/packages/@uppy/utils/src/getETA.ts @@ -1,6 +1,6 @@ import getSpeed from './getSpeed.ts' import getBytesRemaining from './getBytesRemaining.ts' -import type { FileProgress } from './FileProgress.ts' +import type { FileProgress } from './FileProgress.js' export default function getETA(fileProgress: FileProgress): number { if (!fileProgress.bytesUploaded) return 0 diff --git a/packages/@uppy/utils/src/getFileType.test.ts b/packages/@uppy/utils/src/getFileType.test.ts index 2316961b21..d85e6e8683 100644 --- a/packages/@uppy/utils/src/getFileType.test.ts +++ b/packages/@uppy/utils/src/getFileType.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' import getFileType from './getFileType.ts' -import type { UppyFile } from './UppyFile.ts' +import type { UppyFile } from './UppyFile.js' describe('getFileType', () => { it('should trust the filetype if the file comes from a remote source', () => { diff --git a/packages/@uppy/utils/src/getSpeed.ts b/packages/@uppy/utils/src/getSpeed.ts index d1abd33857..667f92ee62 100644 --- a/packages/@uppy/utils/src/getSpeed.ts +++ b/packages/@uppy/utils/src/getSpeed.ts @@ -1,4 +1,4 @@ -import type { FileProgress, FileProgressStarted } from './FileProgress' +import type { FileProgress, FileProgressStarted } from './FileProgress.js' export default function getSpeed(fileProgress: FileProgress): number { if (!fileProgress.bytesUploaded) return 0 From 0f84390107c33b2ae3c726feb4036ed428bc7208 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 29 Apr 2024 14:35:21 +0000 Subject: [PATCH 4/7] Release: uppy@3.25.0 (#5127) | Package | Version | Package | Version | | ---------------------- | ------- | ---------------------- | ------- | | @uppy/audio | 1.1.9 | @uppy/instagram | 3.3.1 | | @uppy/aws-s3-multipart | 3.11.1 | @uppy/onedrive | 3.3.1 | | @uppy/box | 2.3.1 | @uppy/provider-views | 3.12.0 | | @uppy/companion-client | 3.8.1 | @uppy/react | 3.3.1 | | @uppy/compressor | 1.1.3 | @uppy/status-bar | 3.3.2 | | @uppy/core | 3.11.0 | @uppy/svelte | 3.1.4 | | @uppy/dashboard | 3.8.2 | @uppy/transloadit | 3.6.1 | | @uppy/drop-target | 2.1.0 | @uppy/unsplash | 3.3.1 | | @uppy/dropbox | 3.3.1 | @uppy/url | 3.6.1 | | @uppy/facebook | 3.3.1 | @uppy/utils | 5.9.0 | | @uppy/file-input | 3.1.2 | @uppy/webcam | 3.4.1 | | @uppy/form | 3.2.1 | @uppy/xhr-upload | 3.6.5 | | @uppy/google-drive | 3.5.1 | @uppy/zoom | 2.3.1 | | @uppy/image-editor | 2.4.5 | uppy | 3.25.0 | - meta: enforce use of `.js` extension in `import type` declarations (Antoine du Hamel / #5126) - @uppy/core: add instance ID to generated IDs (Merlijn Vos / #5080) - @uppy/core: reference updated i18n in Restricter (Merlijn Vos / #5118) - @uppy/xhr-upload: refactor to use `fetcher` (Merlijn Vos / #5074) - meta: docs: use StackBlitz for all examples/issue template (Merlijn Vos / #5125) - meta: Update yarn.lock (Murderlon) - @uppy/svelte: Add svelte 5 as peer dep (frederikhors / #5122) - meta: Bump docker/setup-buildx-action from 2 to 3 (dependabot[bot] / #5124) - meta: Bump actions/checkout from 3 to 4 (dependabot[bot] / #5123) - @uppy/dashboard,@uppy/provider-views: Remove JSX global type everywhere (Merlijn Vos / #5117) - @uppy/utils: improve return type of `dataURItoFile` (Antoine du Hamel / #5112) - @uppy/drop-target: change drop event type to DragEvent (Alireza Heydari / #5107) - @uppy/image-editor: fix label definitions (Antoine du Hamel / #5111) - meta: bump Prettier version (Antoine du Hamel / #5114) - @uppy/provider-views: bring back "loaded X files..." (Mikael Finstad / #5097) - @uppy/dashboard: fix type of trigger option (Merlijn Vos / #5106) - meta: fix linter (Antoine du Hamel) - @uppy/form: fix `submitOnSuccess` and `triggerUploadOnSubmit` combination (Merlijn Vos / #5058) - meta: Bump docker/build-push-action from 3 to 5 (dependabot[bot] / #5105) - meta: Bump akhileshns/heroku-deploy from 3.12.12 to 3.13.15 (dependabot[bot] / #5102) - meta: Bump docker/login-action from 2 to 3 (dependabot[bot] / #5101) - meta: Bump actions/download-artifact from 3 to 4 (dependabot[bot]) - meta: Bump actions/upload-artifact from 3 to 4 (dependabot[bot]) --- BUNDLE-README.md | 2 +- CHANGELOG.md | 46 +++++++ README.md | 130 +++++++++--------- examples/aws-nodejs/public/drag.html | 4 +- examples/aws-nodejs/public/index.html | 4 +- examples/cdn-example/index.html | 6 +- .../uppy-with-companion/client/index.html | 4 +- packages/@uppy/audio/package.json | 2 +- packages/@uppy/aws-s3-multipart/package.json | 2 +- packages/@uppy/box/package.json | 2 +- packages/@uppy/companion-client/package.json | 2 +- packages/@uppy/compressor/package.json | 2 +- packages/@uppy/core/CHANGELOG.md | 8 ++ packages/@uppy/core/package.json | 2 +- packages/@uppy/dashboard/CHANGELOG.md | 8 ++ packages/@uppy/dashboard/package.json | 2 +- packages/@uppy/drop-target/CHANGELOG.md | 7 + packages/@uppy/drop-target/package.json | 2 +- packages/@uppy/dropbox/package.json | 2 +- packages/@uppy/facebook/package.json | 2 +- packages/@uppy/file-input/package.json | 2 +- packages/@uppy/form/CHANGELOG.md | 7 + packages/@uppy/form/package.json | 2 +- packages/@uppy/google-drive/package.json | 2 +- packages/@uppy/image-editor/CHANGELOG.md | 7 + packages/@uppy/image-editor/package.json | 2 +- packages/@uppy/instagram/package.json | 2 +- packages/@uppy/onedrive/package.json | 2 +- packages/@uppy/provider-views/CHANGELOG.md | 8 ++ packages/@uppy/provider-views/package.json | 2 +- packages/@uppy/react/package.json | 2 +- packages/@uppy/status-bar/package.json | 2 +- packages/@uppy/svelte/CHANGELOG.md | 7 + packages/@uppy/svelte/package.json | 2 +- packages/@uppy/transloadit/package.json | 2 +- packages/@uppy/unsplash/package.json | 2 +- packages/@uppy/url/package.json | 2 +- packages/@uppy/utils/CHANGELOG.md | 7 + packages/@uppy/utils/package.json | 2 +- packages/@uppy/webcam/package.json | 2 +- packages/@uppy/xhr-upload/CHANGELOG.md | 7 + packages/@uppy/xhr-upload/package.json | 2 +- packages/@uppy/zoom/package.json | 2 +- packages/uppy/package.json | 2 +- 44 files changed, 215 insertions(+), 103 deletions(-) diff --git a/BUNDLE-README.md b/BUNDLE-README.md index 4b77e7e7f9..71bf5bae86 100644 --- a/BUNDLE-README.md +++ b/BUNDLE-README.md @@ -1,7 +1,7 @@ # Uppy Hi, thanks for trying out the bundled version of the Uppy File Uploader. You can use -this from a CDN (``) or bundle it with your webapp. +this from a CDN (``) or bundle it with your webapp. Note that the recommended way to use Uppy is to install it with yarn/npm and use a bundler like Webpack so that you can create a smaller custom build with only the diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cd905285e..8d065c1cf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,52 @@ Please add your entries in this format: In the current stage we aim to release a new version at least every month. +## 3.25.0 + +Released: 2024-04-29 + +| Package | Version | Package | Version | +| ---------------------- | ------- | ---------------------- | ------- | +| @uppy/audio | 1.1.9 | @uppy/instagram | 3.3.1 | +| @uppy/aws-s3-multipart | 3.11.1 | @uppy/onedrive | 3.3.1 | +| @uppy/box | 2.3.1 | @uppy/provider-views | 3.12.0 | +| @uppy/companion-client | 3.8.1 | @uppy/react | 3.3.1 | +| @uppy/compressor | 1.1.3 | @uppy/status-bar | 3.3.2 | +| @uppy/core | 3.11.0 | @uppy/svelte | 3.1.4 | +| @uppy/dashboard | 3.8.2 | @uppy/transloadit | 3.6.1 | +| @uppy/drop-target | 2.1.0 | @uppy/unsplash | 3.3.1 | +| @uppy/dropbox | 3.3.1 | @uppy/url | 3.6.1 | +| @uppy/facebook | 3.3.1 | @uppy/utils | 5.9.0 | +| @uppy/file-input | 3.1.2 | @uppy/webcam | 3.4.1 | +| @uppy/form | 3.2.1 | @uppy/xhr-upload | 3.6.5 | +| @uppy/google-drive | 3.5.1 | @uppy/zoom | 2.3.1 | +| @uppy/image-editor | 2.4.5 | uppy | 3.25.0 | + +- meta: enforce use of `.js` extension in `import type` declarations (Antoine du Hamel / #5126) +- @uppy/core: add instance ID to generated IDs (Merlijn Vos / #5080) +- @uppy/core: reference updated i18n in Restricter (Merlijn Vos / #5118) +- @uppy/xhr-upload: refactor to use `fetcher` (Merlijn Vos / #5074) +- meta: docs: use StackBlitz for all examples/issue template (Merlijn Vos / #5125) +- meta: Update yarn.lock (Murderlon) +- @uppy/svelte: Add svelte 5 as peer dep (frederikhors / #5122) +- meta: Bump docker/setup-buildx-action from 2 to 3 (dependabot[bot] / #5124) +- meta: Bump actions/checkout from 3 to 4 (dependabot[bot] / #5123) +- @uppy/dashboard,@uppy/provider-views: Remove JSX global type everywhere (Merlijn Vos / #5117) +- @uppy/utils: improve return type of `dataURItoFile` (Antoine du Hamel / #5112) +- @uppy/drop-target: change drop event type to DragEvent (Alireza Heydari / #5107) +- @uppy/image-editor: fix label definitions (Antoine du Hamel / #5111) +- meta: bump Prettier version (Antoine du Hamel / #5114) +- @uppy/provider-views: bring back "loaded X files..." (Mikael Finstad / #5097) +- @uppy/dashboard: fix type of trigger option (Merlijn Vos / #5106) +- meta: fix linter (Antoine du Hamel) +- @uppy/form: fix `submitOnSuccess` and `triggerUploadOnSubmit` combination (Merlijn Vos / #5058) +- meta: Bump docker/build-push-action from 3 to 5 (dependabot[bot] / #5105) +- meta: Bump akhileshns/heroku-deploy from 3.12.12 to 3.13.15 (dependabot[bot] / #5102) +- meta: Bump docker/login-action from 2 to 3 (dependabot[bot] / #5101) +- meta: Bump actions/download-artifact from 3 to 4 (dependabot[bot]) +- meta: Bump actions/upload-artifact from 3 to 4 (dependabot[bot]) + + ## 3.24.3 Released: 2024-04-16 diff --git a/README.md b/README.md index 3a0e8493c0..59565c2401 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ const uppy = new Uppy() npm install @uppy/core @uppy/dashboard @uppy/tus ``` -Add CSS [uppy.min.css](https://releases.transloadit.com/uppy/v3.24.3/uppy.min.css), either to your HTML page’s `` or include in JS, if your bundler of choice supports it. +Add CSS [uppy.min.css](https://releases.transloadit.com/uppy/v3.25.0/uppy.min.css), either to your HTML page’s `` or include in JS, if your bundler of choice supports it. Alternatively, you can also use a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. @@ -73,12 +73,12 @@ Alternatively, you can also use a pre-built bundle from Transloadit’s CDN: Edg ```html - +
+ ``` ## FAQ @@ -283,45 +283,45 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [schonert](https://github.com/schonert) |[SlavikTraktor](https://github.com/SlavikTraktor) |[scottbessler](https://github.com/scottbessler) |[jrschumacher](https://github.com/jrschumacher) |[rosenfeld](https://github.com/rosenfeld) |[rdimartino](https://github.com/rdimartino) | -[richmeij](https://github.com/richmeij) |[Youssef1313](https://github.com/Youssef1313) |[allenfantasy](https://github.com/allenfantasy) |[Zyclotrop-j](https://github.com/Zyclotrop-j) |[anark](https://github.com/anark) |[bdirito](https://github.com/bdirito) | +[ahmedkandel](https://github.com/ahmedkandel) |[Youssef1313](https://github.com/Youssef1313) |[allenfantasy](https://github.com/allenfantasy) |[Zyclotrop-j](https://github.com/Zyclotrop-j) |[anark](https://github.com/anark) |[bdirito](https://github.com/bdirito) | :---: |:---: |:---: |:---: |:---: |:---: | -[richmeij](https://github.com/richmeij) |[Youssef1313](https://github.com/Youssef1313) |[allenfantasy](https://github.com/allenfantasy) |[Zyclotrop-j](https://github.com/Zyclotrop-j) |[anark](https://github.com/anark) |[bdirito](https://github.com/bdirito) | +[ahmedkandel](https://github.com/ahmedkandel) |[Youssef1313](https://github.com/Youssef1313) |[allenfantasy](https://github.com/allenfantasy) |[Zyclotrop-j](https://github.com/Zyclotrop-j) |[anark](https://github.com/anark) |[bdirito](https://github.com/bdirito) | -[darthf1](https://github.com/darthf1) |[fortrieb](https://github.com/fortrieb) |[heocoi](https://github.com/heocoi) |[jarey](https://github.com/jarey) |[muhammadInam](https://github.com/muhammadInam) |[rettgerst](https://github.com/rettgerst) | +[darthf1](https://github.com/darthf1) |[fortrieb](https://github.com/fortrieb) |[frederikhors](https://github.com/frederikhors) |[heocoi](https://github.com/heocoi) |[jarey](https://github.com/jarey) |[muhammadInam](https://github.com/muhammadInam) | :---: |:---: |:---: |:---: |:---: |:---: | -[darthf1](https://github.com/darthf1) |[fortrieb](https://github.com/fortrieb) |[heocoi](https://github.com/heocoi) |[jarey](https://github.com/jarey) |[muhammadInam](https://github.com/muhammadInam) |[rettgerst](https://github.com/rettgerst) | +[darthf1](https://github.com/darthf1) |[fortrieb](https://github.com/fortrieb) |[frederikhors](https://github.com/frederikhors) |[heocoi](https://github.com/heocoi) |[jarey](https://github.com/jarey) |[muhammadInam](https://github.com/muhammadInam) | -[mkabatek](https://github.com/mkabatek) |[jukakoski](https://github.com/jukakoski) |[olemoign](https://github.com/olemoign) |[ahmedkandel](https://github.com/ahmedkandel) |[btrice](https://github.com/btrice) |[5idereal](https://github.com/5idereal) | +[rettgerst](https://github.com/rettgerst) |[mkabatek](https://github.com/mkabatek) |[jukakoski](https://github.com/jukakoski) |[olemoign](https://github.com/olemoign) |[btrice](https://github.com/btrice) |[5idereal](https://github.com/5idereal) | :---: |:---: |:---: |:---: |:---: |:---: | -[mkabatek](https://github.com/mkabatek) |[jukakoski](https://github.com/jukakoski) |[olemoign](https://github.com/olemoign) |[ahmedkandel](https://github.com/ahmedkandel) |[btrice](https://github.com/btrice) |[5idereal](https://github.com/5idereal) | +[rettgerst](https://github.com/rettgerst) |[mkabatek](https://github.com/mkabatek) |[jukakoski](https://github.com/jukakoski) |[olemoign](https://github.com/olemoign) |[btrice](https://github.com/btrice) |[5idereal](https://github.com/5idereal) | [AndrwM](https://github.com/AndrwM) |[behnammodi](https://github.com/behnammodi) |[BePo65](https://github.com/BePo65) |[bradedelman](https://github.com/bradedelman) |[camiloforero](https://github.com/camiloforero) |[command-tab](https://github.com/command-tab) | :---: |:---: |:---: |:---: |:---: |:---: | [AndrwM](https://github.com/AndrwM) |[behnammodi](https://github.com/behnammodi) |[BePo65](https://github.com/BePo65) |[bradedelman](https://github.com/bradedelman) |[camiloforero](https://github.com/camiloforero) |[command-tab](https://github.com/command-tab) | -[craig-jennings](https://github.com/craig-jennings) |[davekiss](https://github.com/davekiss) |[denysdesign](https://github.com/denysdesign) |[ethanwillis](https://github.com/ethanwillis) |[richartkeil](https://github.com/richartkeil) |[paescuj](https://github.com/paescuj) | +[craig-jennings](https://github.com/craig-jennings) |[davekiss](https://github.com/davekiss) |[denysdesign](https://github.com/denysdesign) |[ethanwillis](https://github.com/ethanwillis) |[frobinsonj](https://github.com/frobinsonj) |[richartkeil](https://github.com/richartkeil) | :---: |:---: |:---: |:---: |:---: |:---: | -[craig-jennings](https://github.com/craig-jennings) |[davekiss](https://github.com/davekiss) |[denysdesign](https://github.com/denysdesign) |[ethanwillis](https://github.com/ethanwillis) |[richartkeil](https://github.com/richartkeil) |[paescuj](https://github.com/paescuj) | +[craig-jennings](https://github.com/craig-jennings) |[davekiss](https://github.com/davekiss) |[denysdesign](https://github.com/denysdesign) |[ethanwillis](https://github.com/ethanwillis) |[frobinsonj](https://github.com/frobinsonj) |[richartkeil](https://github.com/richartkeil) | -[msand](https://github.com/msand) |[martiuslim](https://github.com/martiuslim) |[Martin005](https://github.com/Martin005) |[mskelton](https://github.com/mskelton) |[mactavishz](https://github.com/mactavishz) |[lafe](https://github.com/lafe) | +[paescuj](https://github.com/paescuj) |[richmeij](https://github.com/richmeij) |[msand](https://github.com/msand) |[martiuslim](https://github.com/martiuslim) |[Martin005](https://github.com/Martin005) |[mskelton](https://github.com/mskelton) | :---: |:---: |:---: |:---: |:---: |:---: | -[msand](https://github.com/msand) |[martiuslim](https://github.com/martiuslim) |[Martin005](https://github.com/Martin005) |[mskelton](https://github.com/mskelton) |[mactavishz](https://github.com/mactavishz) |[lafe](https://github.com/lafe) | +[paescuj](https://github.com/paescuj) |[richmeij](https://github.com/richmeij) |[msand](https://github.com/msand) |[martiuslim](https://github.com/martiuslim) |[Martin005](https://github.com/Martin005) |[mskelton](https://github.com/mskelton) | -[dogrocker](https://github.com/dogrocker) |[jedwood](https://github.com/jedwood) |[jasonbosco](https://github.com/jasonbosco) |[frobinsonj](https://github.com/frobinsonj) |[ghasrfakhri](https://github.com/ghasrfakhri) |[geertclerx](https://github.com/geertclerx) | +[mactavishz](https://github.com/mactavishz) |[lafe](https://github.com/lafe) |[dogrocker](https://github.com/dogrocker) |[jedwood](https://github.com/jedwood) |[jasonbosco](https://github.com/jasonbosco) |[ghasrfakhri](https://github.com/ghasrfakhri) | :---: |:---: |:---: |:---: |:---: |:---: | -[dogrocker](https://github.com/dogrocker) |[jedwood](https://github.com/jedwood) |[jasonbosco](https://github.com/jasonbosco) |[frobinsonj](https://github.com/frobinsonj) |[ghasrfakhri](https://github.com/ghasrfakhri) |[geertclerx](https://github.com/geertclerx) | +[mactavishz](https://github.com/mactavishz) |[lafe](https://github.com/lafe) |[dogrocker](https://github.com/dogrocker) |[jedwood](https://github.com/jedwood) |[jasonbosco](https://github.com/jasonbosco) |[ghasrfakhri](https://github.com/ghasrfakhri) | -[neuronet77](https://github.com/neuronet77) |[rossng](https://github.com/rossng) |[scherroman](https://github.com/scherroman) |[robwilson1](https://github.com/robwilson1) |[SxDx](https://github.com/SxDx) |[refo](https://github.com/refo) | +[geertclerx](https://github.com/geertclerx) |[eman8519](https://github.com/eman8519) |[luarmr](https://github.com/luarmr) |[raulibanez](https://github.com/raulibanez) |[refo](https://github.com/refo) |[SxDx](https://github.com/SxDx) | :---: |:---: |:---: |:---: |:---: |:---: | -[neuronet77](https://github.com/neuronet77) |[rossng](https://github.com/rossng) |[scherroman](https://github.com/scherroman) |[robwilson1](https://github.com/robwilson1) |[SxDx](https://github.com/SxDx) |[refo](https://github.com/refo) | +[geertclerx](https://github.com/geertclerx) |[eman8519](https://github.com/eman8519) |[luarmr](https://github.com/luarmr) |[raulibanez](https://github.com/raulibanez) |[refo](https://github.com/refo) |[SxDx](https://github.com/SxDx) | -[raulibanez](https://github.com/raulibanez) |[luarmr](https://github.com/luarmr) |[eman8519](https://github.com/eman8519) |[Pzoco](https://github.com/Pzoco) |[ppadmavilasom](https://github.com/ppadmavilasom) |[phillipalexander](https://github.com/phillipalexander) | +[robwilson1](https://github.com/robwilson1) |[scherroman](https://github.com/scherroman) |[neuronet77](https://github.com/neuronet77) |[Pzoco](https://github.com/Pzoco) |[ppadmavilasom](https://github.com/ppadmavilasom) |[phillipalexander](https://github.com/phillipalexander) | :---: |:---: |:---: |:---: |:---: |:---: | -[raulibanez](https://github.com/raulibanez) |[luarmr](https://github.com/luarmr) |[eman8519](https://github.com/eman8519) |[Pzoco](https://github.com/Pzoco) |[ppadmavilasom](https://github.com/ppadmavilasom) |[phillipalexander](https://github.com/phillipalexander) | +[robwilson1](https://github.com/robwilson1) |[scherroman](https://github.com/scherroman) |[neuronet77](https://github.com/neuronet77) |[Pzoco](https://github.com/Pzoco) |[ppadmavilasom](https://github.com/ppadmavilasom) |[phillipalexander](https://github.com/phillipalexander) | -[pmusaraj](https://github.com/pmusaraj) |[pedrofs](https://github.com/pedrofs) |[plneto](https://github.com/plneto) |[patricklindsay](https://github.com/patricklindsay) |[pascalwengerter](https://github.com/pascalwengerter) |[Tashows](https://github.com/Tashows) | +[pmusaraj](https://github.com/pmusaraj) |[pedrofs](https://github.com/pedrofs) |[plneto](https://github.com/plneto) |[patricklindsay](https://github.com/patricklindsay) |[pascalwengerter](https://github.com/pascalwengerter) |[ParsaArvanehPA](https://github.com/ParsaArvanehPA) | :---: |:---: |:---: |:---: |:---: |:---: | -[pmusaraj](https://github.com/pmusaraj) |[pedrofs](https://github.com/pedrofs) |[plneto](https://github.com/plneto) |[patricklindsay](https://github.com/patricklindsay) |[pascalwengerter](https://github.com/pascalwengerter) |[Tashows](https://github.com/Tashows) | +[pmusaraj](https://github.com/pmusaraj) |[pedrofs](https://github.com/pedrofs) |[plneto](https://github.com/plneto) |[patricklindsay](https://github.com/patricklindsay) |[pascalwengerter](https://github.com/pascalwengerter) |[ParsaArvanehPA](https://github.com/ParsaArvanehPA) | [taj](https://github.com/taj) |[strayer](https://github.com/strayer) |[sjauld](https://github.com/sjauld) |[steverob](https://github.com/steverob) |[amaitu](https://github.com/amaitu) |[quigebo](https://github.com/quigebo) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -331,9 +331,9 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [waptik](https://github.com/waptik) |[SpazzMarticus](https://github.com/SpazzMarticus) |[szh](https://github.com/szh) |[sergei-zelinsky](https://github.com/sergei-zelinsky) |[sebasegovia01](https://github.com/sebasegovia01) |[sdebacker](https://github.com/sdebacker) | -[samuelcolburn](https://github.com/samuelcolburn) |[fortunto2](https://github.com/fortunto2) |[GNURub](https://github.com/GNURub) |[rart](https://github.com/rart) |[ken-kuro](https://github.com/ken-kuro) |[mkopinsky](https://github.com/mkopinsky) | +[samuelcolburn](https://github.com/samuelcolburn) |[fortunto2](https://github.com/fortunto2) |[GNURub](https://github.com/GNURub) |[rart](https://github.com/rart) |[rossng](https://github.com/rossng) |[mkopinsky](https://github.com/mkopinsky) | :---: |:---: |:---: |:---: |:---: |:---: | -[samuelcolburn](https://github.com/samuelcolburn) |[fortunto2](https://github.com/fortunto2) |[GNURub](https://github.com/GNURub) |[rart](https://github.com/rart) |[ken-kuro](https://github.com/ken-kuro) |[mkopinsky](https://github.com/mkopinsky) | +[samuelcolburn](https://github.com/samuelcolburn) |[fortunto2](https://github.com/fortunto2) |[GNURub](https://github.com/GNURub) |[rart](https://github.com/rart) |[rossng](https://github.com/rossng) |[mkopinsky](https://github.com/mkopinsky) | [mhulet](https://github.com/mhulet) |[hrsh](https://github.com/hrsh) |[mauricioribeiro](https://github.com/mauricioribeiro) |[matthewhartstonge](https://github.com/matthewhartstonge) |[mjesuele](https://github.com/mjesuele) |[mattfik](https://github.com/mattfik) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -343,9 +343,9 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [mateuscruz](https://github.com/mateuscruz) |[masumulu28](https://github.com/masumulu28) |[masaok](https://github.com/masaok) |[martin-brennan](https://github.com/martin-brennan) |[marcusforsberg](https://github.com/marcusforsberg) |[marcosthejew](https://github.com/marcosthejew) | -[mperrando](https://github.com/mperrando) |[onhate](https://github.com/onhate) |[marc-mabe](https://github.com/marc-mabe) |[ParsaArvanehPA](https://github.com/ParsaArvanehPA) |[cryptic022](https://github.com/cryptic022) |[Ozodbek1405](https://github.com/Ozodbek1405) | +[mperrando](https://github.com/mperrando) |[onhate](https://github.com/onhate) |[marc-mabe](https://github.com/marc-mabe) |[Lucklj521](https://github.com/Lucklj521) |[cryptic022](https://github.com/cryptic022) |[Ozodbek1405](https://github.com/Ozodbek1405) | :---: |:---: |:---: |:---: |:---: |:---: | -[mperrando](https://github.com/mperrando) |[onhate](https://github.com/onhate) |[marc-mabe](https://github.com/marc-mabe) |[ParsaArvanehPA](https://github.com/ParsaArvanehPA) |[cryptic022](https://github.com/cryptic022) |[Ozodbek1405](https://github.com/Ozodbek1405) | +[mperrando](https://github.com/mperrando) |[onhate](https://github.com/onhate) |[marc-mabe](https://github.com/marc-mabe) |[Lucklj521](https://github.com/Lucklj521) |[cryptic022](https://github.com/cryptic022) |[Ozodbek1405](https://github.com/Ozodbek1405) | [leftdevel](https://github.com/leftdevel) |[nil1511](https://github.com/nil1511) |[coreprocess](https://github.com/coreprocess) |[nicojones](https://github.com/nicojones) |[trungcva10a6tn](https://github.com/trungcva10a6tn) |[naveed-ahmad](https://github.com/naveed-ahmad) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -355,33 +355,33 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [pleasespammelater](https://github.com/pleasespammelater) |[marton-laszlo-attila](https://github.com/marton-laszlo-attila) |[navruzm](https://github.com/navruzm) |[mogzol](https://github.com/mogzol) |[shahimclt](https://github.com/shahimclt) |[mnafees](https://github.com/mnafees) | -[boudra](https://github.com/boudra) |[achmiral](https://github.com/achmiral) |[mosi-kha](https://github.com/mosi-kha) |[maddy-jo](https://github.com/maddy-jo) |[mdxiaohu](https://github.com/mdxiaohu) |[magumbo](https://github.com/magumbo) | +[boudra](https://github.com/boudra) |[achmiral](https://github.com/achmiral) |[ken-kuro](https://github.com/ken-kuro) |[mosi-kha](https://github.com/mosi-kha) |[maddy-jo](https://github.com/maddy-jo) |[mdxiaohu](https://github.com/mdxiaohu) | :---: |:---: |:---: |:---: |:---: |:---: | -[boudra](https://github.com/boudra) |[achmiral](https://github.com/achmiral) |[mosi-kha](https://github.com/mosi-kha) |[maddy-jo](https://github.com/maddy-jo) |[mdxiaohu](https://github.com/mdxiaohu) |[magumbo](https://github.com/magumbo) | +[boudra](https://github.com/boudra) |[achmiral](https://github.com/achmiral) |[ken-kuro](https://github.com/ken-kuro) |[mosi-kha](https://github.com/mosi-kha) |[maddy-jo](https://github.com/maddy-jo) |[mdxiaohu](https://github.com/mdxiaohu) | -[jx-zyf](https://github.com/jx-zyf) |[kode-ninja](https://github.com/kode-ninja) |[sontixyou](https://github.com/sontixyou) |[jur-ng](https://github.com/jur-ng) |[johnmanjiro13](https://github.com/johnmanjiro13) |[jyoungblood](https://github.com/jyoungblood) | +[magumbo](https://github.com/magumbo) |[jx-zyf](https://github.com/jx-zyf) |[kode-ninja](https://github.com/kode-ninja) |[sontixyou](https://github.com/sontixyou) |[jur-ng](https://github.com/jur-ng) |[johnmanjiro13](https://github.com/johnmanjiro13) | :---: |:---: |:---: |:---: |:---: |:---: | -[jx-zyf](https://github.com/jx-zyf) |[kode-ninja](https://github.com/kode-ninja) |[sontixyou](https://github.com/sontixyou) |[jur-ng](https://github.com/jur-ng) |[johnmanjiro13](https://github.com/johnmanjiro13) |[jyoungblood](https://github.com/jyoungblood) | +[magumbo](https://github.com/magumbo) |[jx-zyf](https://github.com/jx-zyf) |[kode-ninja](https://github.com/kode-ninja) |[sontixyou](https://github.com/sontixyou) |[jur-ng](https://github.com/jur-ng) |[johnmanjiro13](https://github.com/johnmanjiro13) | -[green-mike](https://github.com/green-mike) |[gaelicwinter](https://github.com/gaelicwinter) |[frederikhors](https://github.com/frederikhors) |[franckl](https://github.com/franckl) |[fingul](https://github.com/fingul) |[elliotsayes](https://github.com/elliotsayes) | +[jyoungblood](https://github.com/jyoungblood) |[green-mike](https://github.com/green-mike) |[gaelicwinter](https://github.com/gaelicwinter) |[franckl](https://github.com/franckl) |[fingul](https://github.com/fingul) |[elliotsayes](https://github.com/elliotsayes) | :---: |:---: |:---: |:---: |:---: |:---: | -[green-mike](https://github.com/green-mike) |[gaelicwinter](https://github.com/gaelicwinter) |[frederikhors](https://github.com/frederikhors) |[franckl](https://github.com/franckl) |[fingul](https://github.com/fingul) |[elliotsayes](https://github.com/elliotsayes) | +[jyoungblood](https://github.com/jyoungblood) |[green-mike](https://github.com/green-mike) |[gaelicwinter](https://github.com/gaelicwinter) |[franckl](https://github.com/franckl) |[fingul](https://github.com/fingul) |[elliotsayes](https://github.com/elliotsayes) | -[YehudaKremer](https://github.com/YehudaKremer) |[JimmyLv](https://github.com/JimmyLv) |[zanzlender](https://github.com/zanzlender) |[olitomas](https://github.com/olitomas) |[yoann-hellopret](https://github.com/yoann-hellopret) |[vedran555](https://github.com/vedran555) | +[dzcpy](https://github.com/dzcpy) |[xhocquet](https://github.com/xhocquet) |[JimmyLv](https://github.com/JimmyLv) |[zanzlender](https://github.com/zanzlender) |[olitomas](https://github.com/olitomas) |[yoann-hellopret](https://github.com/yoann-hellopret) | :---: |:---: |:---: |:---: |:---: |:---: | -[YehudaKremer](https://github.com/YehudaKremer) |[JimmyLv](https://github.com/JimmyLv) |[zanzlender](https://github.com/zanzlender) |[olitomas](https://github.com/olitomas) |[yoann-hellopret](https://github.com/yoann-hellopret) |[vedran555](https://github.com/vedran555) | +[dzcpy](https://github.com/dzcpy) |[xhocquet](https://github.com/xhocquet) |[JimmyLv](https://github.com/JimmyLv) |[zanzlender](https://github.com/zanzlender) |[olitomas](https://github.com/olitomas) |[yoann-hellopret](https://github.com/yoann-hellopret) | -[tusharjkhunt](https://github.com/tusharjkhunt) |[thanhthot](https://github.com/thanhthot) |[stduhpf](https://github.com/stduhpf) |[slawexxx44](https://github.com/slawexxx44) |[rtaieb](https://github.com/rtaieb) |[rmoura-92](https://github.com/rmoura-92) | +[vedran555](https://github.com/vedran555) |[tusharjkhunt](https://github.com/tusharjkhunt) |[thanhthot](https://github.com/thanhthot) |[stduhpf](https://github.com/stduhpf) |[slawexxx44](https://github.com/slawexxx44) |[rtaieb](https://github.com/rtaieb) | :---: |:---: |:---: |:---: |:---: |:---: | -[tusharjkhunt](https://github.com/tusharjkhunt) |[thanhthot](https://github.com/thanhthot) |[stduhpf](https://github.com/stduhpf) |[slawexxx44](https://github.com/slawexxx44) |[rtaieb](https://github.com/rtaieb) |[rmoura-92](https://github.com/rmoura-92) | +[vedran555](https://github.com/vedran555) |[tusharjkhunt](https://github.com/tusharjkhunt) |[thanhthot](https://github.com/thanhthot) |[stduhpf](https://github.com/stduhpf) |[slawexxx44](https://github.com/slawexxx44) |[rtaieb](https://github.com/rtaieb) | -[rlebosse](https://github.com/rlebosse) |[rhymes](https://github.com/rhymes) |[luntta](https://github.com/luntta) |[phil714](https://github.com/phil714) |[ordago](https://github.com/ordago) |[odselsevier](https://github.com/odselsevier) | +[rmoura-92](https://github.com/rmoura-92) |[rlebosse](https://github.com/rlebosse) |[rhymes](https://github.com/rhymes) |[luntta](https://github.com/luntta) |[phil714](https://github.com/phil714) |[ordago](https://github.com/ordago) | :---: |:---: |:---: |:---: |:---: |:---: | -[rlebosse](https://github.com/rlebosse) |[rhymes](https://github.com/rhymes) |[luntta](https://github.com/luntta) |[phil714](https://github.com/phil714) |[ordago](https://github.com/ordago) |[odselsevier](https://github.com/odselsevier) | +[rmoura-92](https://github.com/rmoura-92) |[rlebosse](https://github.com/rlebosse) |[rhymes](https://github.com/rhymes) |[luntta](https://github.com/luntta) |[phil714](https://github.com/phil714) |[ordago](https://github.com/ordago) | -[ninesalt](https://github.com/ninesalt) |[xhocquet](https://github.com/xhocquet) |[willycamargo](https://github.com/willycamargo) |[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[dwnste](https://github.com/dwnste) |[nagyv](https://github.com/nagyv) | +[odselsevier](https://github.com/odselsevier) |[ninesalt](https://github.com/ninesalt) |[willycamargo](https://github.com/willycamargo) |[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[dwnste](https://github.com/dwnste) |[nagyv](https://github.com/nagyv) | :---: |:---: |:---: |:---: |:---: |:---: | -[ninesalt](https://github.com/ninesalt) |[xhocquet](https://github.com/xhocquet) |[willycamargo](https://github.com/willycamargo) |[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[dwnste](https://github.com/dwnste) |[nagyv](https://github.com/nagyv) | +[odselsevier](https://github.com/odselsevier) |[ninesalt](https://github.com/ninesalt) |[willycamargo](https://github.com/willycamargo) |[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[dwnste](https://github.com/dwnste) |[nagyv](https://github.com/nagyv) | [stiig](https://github.com/stiig) |[valentinoli](https://github.com/valentinoli) |[vially](https://github.com/vially) |[trivikr](https://github.com/trivikr) |[top-master](https://github.com/top-master) |[tvaliasek](https://github.com/tvaliasek) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -391,9 +391,9 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [tomekp](https://github.com/tomekp) |[tomsaleeba](https://github.com/tomsaleeba) |[WIStudent](https://github.com/WIStudent) |[tmaier](https://github.com/tmaier) |[twarlop](https://github.com/twarlop) |[tcgj](https://github.com/tcgj) | -[dzcpy](https://github.com/dzcpy) |[dkisic](https://github.com/dkisic) |[craigcbrunner](https://github.com/craigcbrunner) |[codehero7386](https://github.com/codehero7386) |[christianwengert](https://github.com/christianwengert) |[cgoinglove](https://github.com/cgoinglove) | +[Tashows](https://github.com/Tashows) |[dkisic](https://github.com/dkisic) |[craigcbrunner](https://github.com/craigcbrunner) |[codehero7386](https://github.com/codehero7386) |[christianwengert](https://github.com/christianwengert) |[cgoinglove](https://github.com/cgoinglove) | :---: |:---: |:---: |:---: |:---: |:---: | -[dzcpy](https://github.com/dzcpy) |[dkisic](https://github.com/dkisic) |[craigcbrunner](https://github.com/craigcbrunner) |[codehero7386](https://github.com/codehero7386) |[christianwengert](https://github.com/christianwengert) |[cgoinglove](https://github.com/cgoinglove) | +[Tashows](https://github.com/Tashows) |[dkisic](https://github.com/dkisic) |[craigcbrunner](https://github.com/craigcbrunner) |[codehero7386](https://github.com/codehero7386) |[christianwengert](https://github.com/christianwengert) |[cgoinglove](https://github.com/cgoinglove) | [canvasbh](https://github.com/canvasbh) |[c0b41](https://github.com/c0b41) |[avalla](https://github.com/avalla) |[arggh](https://github.com/arggh) |[alfatv](https://github.com/alfatv) |[agreene-coursera](https://github.com/agreene-coursera) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -403,21 +403,21 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [aduh95-test-account](https://github.com/aduh95-test-account) |[sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) |[zackbloom](https://github.com/zackbloom) |[zlawson-ut](https://github.com/zlawson-ut) |[zachconner](https://github.com/zachconner) |[yafkari](https://github.com/yafkari) | -[Cruaier](https://github.com/Cruaier) |[sercraig](https://github.com/sercraig) |[ardeois](https://github.com/ardeois) |[CommanderRoot](https://github.com/CommanderRoot) |[czj](https://github.com/czj) |[cbush06](https://github.com/cbush06) | +[YehudaKremer](https://github.com/YehudaKremer) |[sercraig](https://github.com/sercraig) |[ardeois](https://github.com/ardeois) |[CommanderRoot](https://github.com/CommanderRoot) |[czj](https://github.com/czj) |[cbush06](https://github.com/cbush06) | :---: |:---: |:---: |:---: |:---: |:---: | -[Cruaier](https://github.com/Cruaier) |[sercraig](https://github.com/sercraig) |[ardeois](https://github.com/ardeois) |[CommanderRoot](https://github.com/CommanderRoot) |[czj](https://github.com/czj) |[cbush06](https://github.com/cbush06) | +[YehudaKremer](https://github.com/YehudaKremer) |[sercraig](https://github.com/sercraig) |[ardeois](https://github.com/ardeois) |[CommanderRoot](https://github.com/CommanderRoot) |[czj](https://github.com/czj) |[cbush06](https://github.com/cbush06) | [Aarbel](https://github.com/Aarbel) |[cfra](https://github.com/cfra) |[csprance](https://github.com/csprance) |[prattcmp](https://github.com/prattcmp) |[subvertallchris](https://github.com/subvertallchris) |[charlybillaud](https://github.com/charlybillaud) | :---: |:---: |:---: |:---: |:---: |:---: | [Aarbel](https://github.com/Aarbel) |[cfra](https://github.com/cfra) |[csprance](https://github.com/csprance) |[prattcmp](https://github.com/prattcmp) |[subvertallchris](https://github.com/subvertallchris) |[charlybillaud](https://github.com/charlybillaud) | -[Cretezy](https://github.com/Cretezy) |[chao](https://github.com/chao) |[cellvinchung](https://github.com/cellvinchung) |[cartfisk](https://github.com/cartfisk) |[cyu](https://github.com/cyu) |[radarhere](https://github.com/radarhere) | +[Cretezy](https://github.com/Cretezy) |[chao](https://github.com/chao) |[cellvinchung](https://github.com/cellvinchung) |[cartfisk](https://github.com/cartfisk) |[cyu](https://github.com/cyu) |[bryanjswift](https://github.com/bryanjswift) | :---: |:---: |:---: |:---: |:---: |:---: | -[Cretezy](https://github.com/Cretezy) |[chao](https://github.com/chao) |[cellvinchung](https://github.com/cellvinchung) |[cartfisk](https://github.com/cartfisk) |[cyu](https://github.com/cyu) |[radarhere](https://github.com/radarhere) | +[Cretezy](https://github.com/Cretezy) |[chao](https://github.com/chao) |[cellvinchung](https://github.com/cellvinchung) |[cartfisk](https://github.com/cartfisk) |[cyu](https://github.com/cyu) |[bryanjswift](https://github.com/bryanjswift) | -[kergekacsa](https://github.com/kergekacsa) |[eliOcs](https://github.com/eliOcs) |[yoldar](https://github.com/yoldar) |[efbautista](https://github.com/efbautista) |[emuell](https://github.com/emuell) |[EdgarSantiago93](https://github.com/EdgarSantiago93) | +[functino](https://github.com/functino) |[firesharkstudios](https://github.com/firesharkstudios) |[yoldar](https://github.com/yoldar) |[efbautista](https://github.com/efbautista) |[emuell](https://github.com/emuell) |[EdgarSantiago93](https://github.com/EdgarSantiago93) | :---: |:---: |:---: |:---: |:---: |:---: | -[kergekacsa](https://github.com/kergekacsa) |[eliOcs](https://github.com/eliOcs) |[yoldar](https://github.com/yoldar) |[efbautista](https://github.com/efbautista) |[emuell](https://github.com/emuell) |[EdgarSantiago93](https://github.com/EdgarSantiago93) | +[functino](https://github.com/functino) |[firesharkstudios](https://github.com/firesharkstudios) |[yoldar](https://github.com/yoldar) |[efbautista](https://github.com/efbautista) |[emuell](https://github.com/emuell) |[EdgarSantiago93](https://github.com/EdgarSantiago93) | [sweetro](https://github.com/sweetro) |[jeetiss](https://github.com/jeetiss) |[DennisKofflard](https://github.com/DennisKofflard) |[hoangsvit](https://github.com/hoangsvit) |[davilima6](https://github.com/davilima6) |[akizor](https://github.com/akizor) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -427,17 +427,17 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [KaminskiDaniell](https://github.com/KaminskiDaniell) |[Cantabar](https://github.com/Cantabar) |[mrboomer](https://github.com/mrboomer) |[danilat](https://github.com/danilat) |[danschalow](https://github.com/danschalow) |[danmichaelo](https://github.com/danmichaelo) | -[functino](https://github.com/functino) |[amitport](https://github.com/amitport) |[tekacs](https://github.com/tekacs) |[Dogfalo](https://github.com/Dogfalo) |[aalepis](https://github.com/aalepis) |[alexnj](https://github.com/alexnj) | +[Cruaier](https://github.com/Cruaier) |[amitport](https://github.com/amitport) |[tekacs](https://github.com/tekacs) |[Dogfalo](https://github.com/Dogfalo) |[alirezahi](https://github.com/alirezahi) |[aalepis](https://github.com/aalepis) | :---: |:---: |:---: |:---: |:---: |:---: | -[functino](https://github.com/functino) |[amitport](https://github.com/amitport) |[tekacs](https://github.com/tekacs) |[Dogfalo](https://github.com/Dogfalo) |[aalepis](https://github.com/aalepis) |[alexnj](https://github.com/alexnj) | +[Cruaier](https://github.com/Cruaier) |[amitport](https://github.com/amitport) |[tekacs](https://github.com/tekacs) |[Dogfalo](https://github.com/Dogfalo) |[alirezahi](https://github.com/alirezahi) |[aalepis](https://github.com/aalepis) | -[asmt3](https://github.com/asmt3) |[ahmadissa](https://github.com/ahmadissa) |[adritasharma](https://github.com/adritasharma) |[Adrrei](https://github.com/Adrrei) |[adityapatadia](https://github.com/adityapatadia) |[adamvigneault](https://github.com/adamvigneault) | +[alexnj](https://github.com/alexnj) |[asmt3](https://github.com/asmt3) |[ahmadissa](https://github.com/ahmadissa) |[adritasharma](https://github.com/adritasharma) |[Adrrei](https://github.com/Adrrei) |[adityapatadia](https://github.com/adityapatadia) | :---: |:---: |:---: |:---: |:---: |:---: | -[asmt3](https://github.com/asmt3) |[ahmadissa](https://github.com/ahmadissa) |[adritasharma](https://github.com/adritasharma) |[Adrrei](https://github.com/Adrrei) |[adityapatadia](https://github.com/adityapatadia) |[adamvigneault](https://github.com/adamvigneault) | +[alexnj](https://github.com/alexnj) |[asmt3](https://github.com/asmt3) |[ahmadissa](https://github.com/ahmadissa) |[adritasharma](https://github.com/adritasharma) |[Adrrei](https://github.com/Adrrei) |[adityapatadia](https://github.com/adityapatadia) | -[ajh-sr](https://github.com/ajh-sr) |[adamdottv](https://github.com/adamdottv) |[abannach](https://github.com/abannach) |[superhawk610](https://github.com/superhawk610) |[ajschmidt8](https://github.com/ajschmidt8) |[bryanjswift](https://github.com/bryanjswift) | +[adamvigneault](https://github.com/adamvigneault) |[ajh-sr](https://github.com/ajh-sr) |[adamdottv](https://github.com/adamdottv) |[abannach](https://github.com/abannach) |[superhawk610](https://github.com/superhawk610) |[ajschmidt8](https://github.com/ajschmidt8) | :---: |:---: |:---: |:---: |:---: |:---: | -[ajh-sr](https://github.com/ajh-sr) |[adamdottv](https://github.com/adamdottv) |[abannach](https://github.com/abannach) |[superhawk610](https://github.com/superhawk610) |[ajschmidt8](https://github.com/ajschmidt8) |[bryanjswift](https://github.com/bryanjswift) | +[adamvigneault](https://github.com/adamvigneault) |[ajh-sr](https://github.com/ajh-sr) |[adamdottv](https://github.com/adamdottv) |[abannach](https://github.com/abannach) |[superhawk610](https://github.com/superhawk610) |[ajschmidt8](https://github.com/ajschmidt8) | [bedgerotto](https://github.com/bedgerotto) |[wbaaron](https://github.com/wbaaron) |[Quorafind](https://github.com/Quorafind) |[bducharme](https://github.com/bducharme) |[azizk](https://github.com/azizk) |[azeemba](https://github.com/azeemba) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -447,9 +447,9 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [ayhankesicioglu](https://github.com/ayhankesicioglu) |[atsawin](https://github.com/atsawin) |[ash-jc-allen](https://github.com/ash-jc-allen) |[apuyou](https://github.com/apuyou) |[arthurdenner](https://github.com/arthurdenner) |[Abourass](https://github.com/Abourass) | -[tyndria](https://github.com/tyndria) |[anthony0030](https://github.com/anthony0030) |[andychongyz](https://github.com/andychongyz) |[andrii-bodnar](https://github.com/andrii-bodnar) |[superandrew213](https://github.com/superandrew213) |[firesharkstudios](https://github.com/firesharkstudios) | +[tyndria](https://github.com/tyndria) |[anthony0030](https://github.com/anthony0030) |[andychongyz](https://github.com/andychongyz) |[andrii-bodnar](https://github.com/andrii-bodnar) |[superandrew213](https://github.com/superandrew213) |[radarhere](https://github.com/radarhere) | :---: |:---: |:---: |:---: |:---: |:---: | -[tyndria](https://github.com/tyndria) |[anthony0030](https://github.com/anthony0030) |[andychongyz](https://github.com/andychongyz) |[andrii-bodnar](https://github.com/andrii-bodnar) |[superandrew213](https://github.com/superandrew213) |[firesharkstudios](https://github.com/firesharkstudios) | +[tyndria](https://github.com/tyndria) |[anthony0030](https://github.com/anthony0030) |[andychongyz](https://github.com/andychongyz) |[andrii-bodnar](https://github.com/andrii-bodnar) |[superandrew213](https://github.com/superandrew213) |[radarhere](https://github.com/radarhere) | [kaspermeinema](https://github.com/kaspermeinema) |[tykarol](https://github.com/tykarol) |[jvelten](https://github.com/jvelten) |[mellow-fellow](https://github.com/mellow-fellow) |[jmontoyaa](https://github.com/jmontoyaa) |[jcalonso](https://github.com/jcalonso) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -459,9 +459,9 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [jbelej](https://github.com/jbelej) |[jszobody](https://github.com/jszobody) |[jorgeepc](https://github.com/jorgeepc) |[jondewoo](https://github.com/jondewoo) |[jonathanarbely](https://github.com/jonathanarbely) |[jsanchez034](https://github.com/jsanchez034) | -[Jokcy](https://github.com/Jokcy) |[chromacoma](https://github.com/chromacoma) |[profsmallpine](https://github.com/profsmallpine) |[IanVS](https://github.com/IanVS) |[Lucklj521](https://github.com/Lucklj521) |[lucax88x](https://github.com/lucax88x) | +[Jokcy](https://github.com/Jokcy) |[chromacoma](https://github.com/chromacoma) |[profsmallpine](https://github.com/profsmallpine) |[theJoeBiz](https://github.com/theJoeBiz) |[huydod](https://github.com/huydod) |[lucax88x](https://github.com/lucax88x) | :---: |:---: |:---: |:---: |:---: |:---: | -[Jokcy](https://github.com/Jokcy) |[chromacoma](https://github.com/chromacoma) |[profsmallpine](https://github.com/profsmallpine) |[IanVS](https://github.com/IanVS) |[Lucklj521](https://github.com/Lucklj521) |[lucax88x](https://github.com/lucax88x) | +[Jokcy](https://github.com/Jokcy) |[chromacoma](https://github.com/chromacoma) |[profsmallpine](https://github.com/profsmallpine) |[theJoeBiz](https://github.com/theJoeBiz) |[huydod](https://github.com/huydod) |[lucax88x](https://github.com/lucax88x) | [lucaperret](https://github.com/lucaperret) |[ombr](https://github.com/ombr) |[louim](https://github.com/louim) |[dolphinigle](https://github.com/dolphinigle) |[leomelzer](https://github.com/leomelzer) |[leods92](https://github.com/leods92) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -471,9 +471,9 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [galli-leo](https://github.com/galli-leo) |[dviry](https://github.com/dviry) |[larowlan](https://github.com/larowlan) |[leaanthony](https://github.com/leaanthony) |[hoangbits](https://github.com/hoangbits) |[labohkip81](https://github.com/labohkip81) | -[kyleparisi](https://github.com/kyleparisi) |[elkebab](https://github.com/elkebab) |[kidonng](https://github.com/kidonng) |[kevin-west-10x](https://github.com/kevin-west-10x) |[huydod](https://github.com/huydod) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) | +[kyleparisi](https://github.com/kyleparisi) |[elkebab](https://github.com/elkebab) |[kidonng](https://github.com/kidonng) |[kevin-west-10x](https://github.com/kevin-west-10x) |[kergekacsa](https://github.com/kergekacsa) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) | :---: |:---: |:---: |:---: |:---: |:---: | -[kyleparisi](https://github.com/kyleparisi) |[elkebab](https://github.com/elkebab) |[kidonng](https://github.com/kidonng) |[kevin-west-10x](https://github.com/kevin-west-10x) |[huydod](https://github.com/huydod) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) | +[kyleparisi](https://github.com/kyleparisi) |[elkebab](https://github.com/elkebab) |[kidonng](https://github.com/kidonng) |[kevin-west-10x](https://github.com/kevin-west-10x) |[kergekacsa](https://github.com/kergekacsa) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) | [HughbertD](https://github.com/HughbertD) |[hiromi2424](https://github.com/hiromi2424) |[giacomocerquone](https://github.com/giacomocerquone) |[roenschg](https://github.com/roenschg) |[gjungb](https://github.com/gjungb) |[geoffappleford](https://github.com/geoffappleford) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -483,9 +483,9 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [gabiganam](https://github.com/gabiganam) |[fuadscodes](https://github.com/fuadscodes) |[dtrucs](https://github.com/dtrucs) |[ferdiusa](https://github.com/ferdiusa) |[fgallinari](https://github.com/fgallinari) |[Gkleinereva](https://github.com/Gkleinereva) | -[epexa](https://github.com/epexa) |[EnricoSottile](https://github.com/EnricoSottile) |[elliotdickison](https://github.com/elliotdickison) |[theJoeBiz](https://github.com/theJoeBiz) |[Jmales](https://github.com/Jmales) |[jessica-coursera](https://github.com/jessica-coursera) | +[epexa](https://github.com/epexa) |[EnricoSottile](https://github.com/EnricoSottile) |[elliotdickison](https://github.com/elliotdickison) |[eliOcs](https://github.com/eliOcs) |[Jmales](https://github.com/Jmales) |[jessica-coursera](https://github.com/jessica-coursera) | :---: |:---: |:---: |:---: |:---: |:---: | -[epexa](https://github.com/epexa) |[EnricoSottile](https://github.com/EnricoSottile) |[elliotdickison](https://github.com/elliotdickison) |[theJoeBiz](https://github.com/theJoeBiz) |[Jmales](https://github.com/Jmales) |[jessica-coursera](https://github.com/jessica-coursera) | +[epexa](https://github.com/epexa) |[EnricoSottile](https://github.com/EnricoSottile) |[elliotdickison](https://github.com/elliotdickison) |[eliOcs](https://github.com/eliOcs) |[Jmales](https://github.com/Jmales) |[jessica-coursera](https://github.com/jessica-coursera) | [vith](https://github.com/vith) |[janwilts](https://github.com/janwilts) |[janklimo](https://github.com/janklimo) |[jamestiotio](https://github.com/jamestiotio) |[jcjmcclean](https://github.com/jcjmcclean) |[Jbithell](https://github.com/Jbithell) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -495,9 +495,9 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [JakubHaladej](https://github.com/JakubHaladej) |[jakemcallister](https://github.com/jakemcallister) |[gaejabong](https://github.com/gaejabong) |[JacobMGEvans](https://github.com/JacobMGEvans) |[mazoruss](https://github.com/mazoruss) |[GreenJimmy](https://github.com/GreenJimmy) | -[intenzive](https://github.com/intenzive) |[NaxYo](https://github.com/NaxYo) |[ishendyweb](https://github.com/ishendyweb) | -:---: |:---: |:---: | -[intenzive](https://github.com/intenzive) |[NaxYo](https://github.com/NaxYo) |[ishendyweb](https://github.com/ishendyweb) | +[intenzive](https://github.com/intenzive) |[NaxYo](https://github.com/NaxYo) |[ishendyweb](https://github.com/ishendyweb) |[IanVS](https://github.com/IanVS) | +:---: |:---: |:---: |:---: | +[intenzive](https://github.com/intenzive) |[NaxYo](https://github.com/NaxYo) |[ishendyweb](https://github.com/ishendyweb) |[IanVS](https://github.com/IanVS) | diff --git a/examples/aws-nodejs/public/drag.html b/examples/aws-nodejs/public/drag.html index ebbf66a38e..30fdab2658 100644 --- a/examples/aws-nodejs/public/drag.html +++ b/examples/aws-nodejs/public/drag.html @@ -4,7 +4,7 @@ Uppy @@ -22,7 +22,7 @@
Uploaded files:
DragDrop, ProgressBar, AwsS3, - } from 'https://releases.transloadit.com/uppy/v3.24.3/uppy.min.mjs' + } from 'https://releases.transloadit.com/uppy/v3.25.0/uppy.min.mjs' // Function for displaying uploaded files const onUploadSuccess = (elForUploadedFiles) => (file, response) => { diff --git a/examples/aws-nodejs/public/index.html b/examples/aws-nodejs/public/index.html index 4990880e55..422b250a54 100644 --- a/examples/aws-nodejs/public/index.html +++ b/examples/aws-nodejs/public/index.html @@ -4,7 +4,7 @@ Uppy – AWS upload example @@ -16,7 +16,7 @@

AWS upload example

Uppy, Dashboard, AwsS3, - } from 'https://releases.transloadit.com/uppy/v3.24.3/uppy.min.mjs' + } from 'https://releases.transloadit.com/uppy/v3.25.0/uppy.min.mjs' /** * This generator transforms a deep object into URL-encodable pairs * to work with `URLSearchParams` on the client and `body-parser` on the server. diff --git a/examples/cdn-example/index.html b/examples/cdn-example/index.html index f9c1c31749..1cf650c79d 100644 --- a/examples/cdn-example/index.html +++ b/examples/cdn-example/index.html @@ -5,7 +5,7 @@ @@ -19,7 +19,7 @@ Dashboard, Webcam, Tus, - } from 'https://releases.transloadit.com/uppy/v3.24.3/uppy.min.mjs' + } from 'https://releases.transloadit.com/uppy/v3.25.0/uppy.min.mjs' const uppy = new Uppy({ debug: true, autoProceed: false }) .use(Dashboard, { trigger: '#uppyModalOpener' }) @@ -34,7 +34,7 @@ `) or bundle it with your webapp. +Hi, thanks for trying out the bundled version of the Uppy File Uploader. You can +use this from a CDN +(``) +or bundle it with your webapp. -Note that the recommended way to use Uppy is to install it with yarn/npm and use a -bundler like Webpack so that you can create a smaller custom build with only the -things that you need. More info on . +Note that the recommended way to use Uppy is to install it with yarn/npm and use +a bundler like Webpack so that you can create a smaller custom build with only +the things that you need. More info on +. ## How to use this bundle You can extract the contents of this zip to a directory, such as `./js/uppy`. -Now you can create an HTML file, for example `./upload.html`, with the following contents: +Now you can create an HTML file, for example `./upload.html`, with the following +contents: ```html - - - - - -
- -
-
Uploaded files:
-
    -
    - - - + .use(Dashboard, { + browserBackButtonClose: false, + height: 470, + inline: false, + replaceTargetContent: true, + showProgressDetails: true, + target: '.DashboardContainer', + trigger: '.UppyModalOpenerBtn', + metaFields: [ + { id: 'name', name: 'Name', placeholder: 'file name' }, + { + id: 'caption', + name: 'Caption', + placeholder: 'describe what the image is about', + }, + ], + }) + .use(Tus, { endpoint: 'https://tusd.tusdemo.net/files/' }) + .on('upload-success', function (file, response) { + var url = response.uploadURL + var fileName = file.name + + document.querySelector('.uploaded-files ol').innerHTML += + '
  1. ' + fileName + '
  2. ' + }) + + ``` Now open `upload.html` in your browser, and the Uppy Dashboard will appear. ## Next steps -In the example you built, Uppy uploads to a demo server where files will be deleted -shortly after uploading. You’ll want to target your own tusd server, S3 bucket, or Nginx/Apache server. For the latter, use the Xhr plugin: which uploads using regular multipart form posts, that you’ll existing Ruby or PHP backend will be able to make sense of, as if a `` had been used. +In the example you built, Uppy uploads to a demo server where files will be +deleted shortly after uploading. You’ll want to target your own tusd server, S3 +bucket, or Nginx/Apache server. For the latter, use the Xhr plugin: + which uploads using regular multipart form +posts, that you’ll existing Ruby or PHP backend will be able to make sense of, +as if a `` had been used. -The Dashboard now opens when clicking the button, but you can also draw it inline into the page. This, and many more configuration options can be found here: . +The Dashboard now opens when clicking the button, but you can also draw it +inline into the page. This, and many more configuration options can be found +here: . -Uppy has many more Plugins besides Xhr and the Dashboard. For example, you can enable Webcam, Instagram, or video encoding support. For a full list of Plugins check here: . +Uppy has many more Plugins besides Xhr and the Dashboard. For example, you can +enable Webcam, Instagram, or video encoding support. For a full list of Plugins +check here: . -Note that for some Plugins, you will need to run a server side component called: Companion. Those plugins are marked with a (c) symbol. Alternatively, you can sign up for a free Transloadit account. Transloadit runs Companion for you, tusd servers to handle resumable file uploads, and can post-process files to scan for viruses, recognize faces, etc. Check: . +Note that for some Plugins, you will need to run a server side component called: +Companion. Those plugins are marked with a (c) symbol. Alternatively, you can +sign up for a free Transloadit account. Transloadit runs Companion for you, tusd +servers to handle resumable file uploads, and can post-process files to scan for +viruses, recognize faces, etc. Check: . ## Getting help -Stuck with anything? We’re welcoming all your questions and feedback over at . +Stuck with anything? We’re welcoming all your questions and feedback over at +. diff --git a/README.md b/README.md index 59565c2401..d7147a3397 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,24 @@ Uppy logo: a smiling puppy above a pink upwards arrow -Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly with any application. It’s fast, has a comprehensible API and lets you worry about more important problems than building a file uploader. +Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly +with any application. It’s fast, has a comprehensible API and lets you worry +about more important problems than building a file uploader. -* **Fetch** files from local disk, remote URLs, Google Drive, Dropbox, Box, Instagram or snap and record selfies with a camera -* **Preview** and edit metadata with a nice interface -* **Upload** to the final destination, optionally process/encode +- **Fetch** files from local disk, remote URLs, Google Drive, Dropbox, Box, + Instagram or snap and record selfies with a camera +- **Preview** and edit metadata with a nice interface +- **Upload** to the final destination, optionally process/encode -**[Read the docs](https://uppy.io/docs)** | **[Try Uppy](https://uppy.io/examples/dashboard/)** +**[Read the docs](https://uppy.io/docs)** | +**[Try Uppy](https://uppy.io/examples/dashboard/)** -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile API to handle any file in your app. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile API to handle any file in your app. @@ -44,20 +49,28 @@ const uppy = new Uppy() }) ``` -**[Try it online](https://uppy.io/examples/dashboard/)** or **[read the docs](https://uppy.io/docs)** for more details on how to use Uppy and its plugins. +**[Try it online](https://uppy.io/examples/dashboard/)** or +**[read the docs](https://uppy.io/docs)** for more details on how to use Uppy +and its plugins. ## Features -* Lightweight, modular plugin-based architecture, light on dependencies :zap: -* Resumable file uploads via the open [tus](https://tus.io/) standard, so large uploads survive network hiccups -* Supports picking files from: Webcam, Dropbox, Box, Google Drive, Instagram, bypassing the user’s device where possible, syncing between servers directly via [@uppy/companion](https://uppy.io/docs/companion) -* Works great with file encoding and processing backends, such as [Transloadit](https://transloadit.com), works great without (all you need is to roll your own Apache/Nginx/Node/FFmpeg/etc backend) -* Sleek user interface :sparkles: -* Optional file recovery (after a browser crash) with [Golden Retriever](https://uppy.io/docs/golden-retriever/) -* Speaks several languages (i18n) :earth\_africa: -* Built with accessibility in mind -* Free for the world, forever (as in beer 🍺, pizza 🍕, and liberty 🗽) -* Cute as a puppy, also accepts cat pictures :dog: +- Lightweight, modular plugin-based architecture, light on dependencies :zap: +- Resumable file uploads via the open [tus](https://tus.io/) standard, so large + uploads survive network hiccups +- Supports picking files from: Webcam, Dropbox, Box, Google Drive, Instagram, + bypassing the user’s device where possible, syncing between servers directly + via [@uppy/companion](https://uppy.io/docs/companion) +- Works great with file encoding and processing backends, such as + [Transloadit](https://transloadit.com), works great without (all you need is + to roll your own Apache/Nginx/Node/FFmpeg/etc backend) +- Sleek user interface :sparkles: +- Optional file recovery (after a browser crash) with + [Golden Retriever](https://uppy.io/docs/golden-retriever/) +- Speaks several languages (i18n) :earth_africa: +- Built with accessibility in mind +- Free for the world, forever (as in beer 🍺, pizza 🍕, and liberty 🗽) +- Cute as a puppy, also accepts cat pictures :dog: ## Installation @@ -65,20 +78,34 @@ const uppy = new Uppy() npm install @uppy/core @uppy/dashboard @uppy/tus ``` -Add CSS [uppy.min.css](https://releases.transloadit.com/uppy/v3.25.0/uppy.min.css), either to your HTML page’s `` or include in JS, if your bundler of choice supports it. +Add CSS +[uppy.min.css](https://releases.transloadit.com/uppy/v3.25.0/uppy.min.css), +either to your HTML page’s `` or include in JS, if your bundler of choice +supports it. -Alternatively, you can also use a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. +Alternatively, you can also use a pre-built bundle from Transloadit’s CDN: +Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` +object. -> ⚠️ The bundle consists of most Uppy plugins, so this method is not recommended for production, as your users will have to download all plugins when you are likely using only a few. +> ⚠️ The bundle consists of most Uppy plugins, so this method is not recommended +> for production, as your users will have to download all plugins when you are +> likely using only a few. ```html - +
    @@ -187,323 +247,363 @@ bundle, so no need to include anything additionally: ### Why not use ``? -Having no JavaScript beats having a lot of it, so that’s a fair question! Running an uploading & encoding business for ten years though we found that in cases, the file input leaves some to be desired: - -* We received complaints about broken uploads and found that resumable uploads are important, especially for big files and to be inclusive towards people on poorer connections (we also launched [tus.io](https://tus.io) to attack that problem). Uppy uploads can survive network outages and browser crashes or accidental navigate-aways. -* Uppy supports editing meta information before uploading. -* Uppy allows cropping images before uploading. -* There’s the situation where people are using their mobile devices and want to upload on the go, but they have their picture on Instagram, files in Dropbox or a plain file URL from anywhere on the open web. Uppy allows to pick files from those and push it to the destination without downloading it to your mobile device first. -* Accurate upload progress reporting is an issue on many platforms. -* Some file validation — size, type, number of files — can be done on the client with Uppy. -* Uppy integrates webcam support, in case your users want to upload a picture/video/audio that does not exist yet :) -* A larger drag and drop surface can be pleasant to work with. Some people also like that you can control the styling, language, etc. -* Uppy is aware of encoding backends. Often after an upload, the server needs to rotate, detect faces, optimize for iPad, or what have you. Uppy can track progress of this and report back to the user in different ways. -* Sometimes you might want your uploads to happen while you continue to interact on the same single page. - -Not all apps need all these features. An `` is fine in many situations. But these were a few things that our customers hit / asked about enough to spark us to develop Uppy. +Having no JavaScript beats having a lot of it, so that’s a fair question! +Running an uploading & encoding business for ten years though we found that in +cases, the file input leaves some to be desired: + +- We received complaints about broken uploads and found that resumable uploads + are important, especially for big files and to be inclusive towards people on + poorer connections (we also launched [tus.io](https://tus.io) to attack that + problem). Uppy uploads can survive network outages and browser crashes or + accidental navigate-aways. +- Uppy supports editing meta information before uploading. +- Uppy allows cropping images before uploading. +- There’s the situation where people are using their mobile devices and want to + upload on the go, but they have their picture on Instagram, files in Dropbox + or a plain file URL from anywhere on the open web. Uppy allows to pick files + from those and push it to the destination without downloading it to your + mobile device first. +- Accurate upload progress reporting is an issue on many platforms. +- Some file validation — size, type, number of files — can be done on the client + with Uppy. +- Uppy integrates webcam support, in case your users want to upload a + picture/video/audio that does not exist yet :) +- A larger drag and drop surface can be pleasant to work with. Some people also + like that you can control the styling, language, etc. +- Uppy is aware of encoding backends. Often after an upload, the server needs to + rotate, detect faces, optimize for iPad, or what have you. Uppy can track + progress of this and report back to the user in different ways. +- Sometimes you might want your uploads to happen while you continue to interact + on the same single page. + +Not all apps need all these features. An `` is fine in many +situations. But these were a few things that our customers hit / asked about +enough to spark us to develop Uppy. ### Why is all this goodness free? -Transloadit’s team is small and we have a shared ambition to make a living from open source. By giving away projects like [tus.io](https://tus.io) and [Uppy](https://uppy.io), we’re hoping to advance the state of the art, make life a tiny little bit better for everyone and in doing so have rewarding jobs and get some eyes on our commercial service: [a content ingestion & processing platform](https://transloadit.com). +Transloadit’s team is small and we have a shared ambition to make a living from +open source. By giving away projects like [tus.io](https://tus.io) and +[Uppy](https://uppy.io), we’re hoping to advance the state of the art, make life +a tiny little bit better for everyone and in doing so have rewarding jobs and +get some eyes on our commercial service: +[a content ingestion & processing platform](https://transloadit.com). -Our thinking is that if only a fraction of our open source userbase can see the appeal of hosted versions straight from the source, that could already be enough to sustain our work. So far this is working out! We’re able to dedicate 80% of our time to open source and haven’t gone bankrupt yet. :D +Our thinking is that if only a fraction of our open source userbase can see the +appeal of hosted versions straight from the source, that could already be enough +to sustain our work. So far this is working out! We’re able to dedicate 80% of +our time to open source and haven’t gone bankrupt yet. :D ### Does Uppy support S3 uploads? -Yes, please check out the [docs](https://uppy.io/docs/aws-s3/) for more information. +Yes, please check out the [docs](https://uppy.io/docs/aws-s3/) for more +information. ### Can I use Uppy with Rails/Node.js/Go/PHP? -Yes, whatever you want on the backend will work with `@uppy/xhr-upload` plugin, since it only does a `POST` or `PUT` request. Here’s a [PHP backend example](https://uppy.io/docs/xhr-upload/#Uploading-to-a-PHP-Server). +Yes, whatever you want on the backend will work with `@uppy/xhr-upload` plugin, +since it only does a `POST` or `PUT` request. Here’s a +[PHP backend example](https://uppy.io/docs/xhr-upload/#Uploading-to-a-PHP-Server). -If you want resumability with the Tus plugin, use [one of the tus server implementations](https://tus.io/implementations.html) 👌🏼 +If you want resumability with the Tus plugin, use +[one of the tus server implementations](https://tus.io/implementations.html) 👌🏼 -And you’ll need [`@uppy/companion`](https://uppy.io/docs/companion) if you’d like your users to be able to pick files from Instagram, Google Drive, Dropbox or via direct URLs (with more services coming). +And you’ll need [`@uppy/companion`](https://uppy.io/docs/companion) if you’d +like your users to be able to pick files from Instagram, Google Drive, Dropbox +or via direct URLs (with more services coming). ## Contributions are welcome -* Contributor’s guide in [`.github/CONTRIBUTING.md`](.github/CONTRIBUTING.md) -* Changelog to track our release progress (we aim to roll out a release every month): [`CHANGELOG.md`](CHANGELOG.md) +- Contributor’s guide in [`.github/CONTRIBUTING.md`](.github/CONTRIBUTING.md) +- Changelog to track our release progress (we aim to roll out a release every + month): [`CHANGELOG.md`](CHANGELOG.md) ## Used by -Uppy is used by: [Photobox](http://photobox.com), [Issuu](https://issuu.com/), [Law Insider](https://lawinsider.com), [Cool Tabs](https://cool-tabs.com), [Soundoff](https://soundoff.io), [Scrumi](https://www.scrumi.io/), [Crive](https://crive.co/) and others. +Uppy is used by: [Photobox](http://photobox.com), [Issuu](https://issuu.com/), +[Law Insider](https://lawinsider.com), [Cool Tabs](https://cool-tabs.com), +[Soundoff](https://soundoff.io), [Scrumi](https://www.scrumi.io/), +[Crive](https://crive.co/) and others. -Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issues/769)! +Use Uppy in your project? +[Let us know](https://github.com/transloadit/uppy/issues/769)! ## Contributors -[arturi](https://github.com/arturi) |[goto-bus-stop](https://github.com/goto-bus-stop) |[kvz](https://github.com/kvz) |[aduh95](https://github.com/aduh95) |[ifedapoolarewaju](https://github.com/ifedapoolarewaju) |[hedgerh](https://github.com/hedgerh) | -:---: |:---: |:---: |:---: |:---: |:---: | -[arturi](https://github.com/arturi) |[goto-bus-stop](https://github.com/goto-bus-stop) |[kvz](https://github.com/kvz) |[aduh95](https://github.com/aduh95) |[ifedapoolarewaju](https://github.com/ifedapoolarewaju) |[hedgerh](https://github.com/hedgerh) | +| [arturi](https://github.com/arturi) | [goto-bus-stop](https://github.com/goto-bus-stop) | [kvz](https://github.com/kvz) | [aduh95](https://github.com/aduh95) | [ifedapoolarewaju](https://github.com/ifedapoolarewaju) | [hedgerh](https://github.com/hedgerh) | +| :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | +| [arturi](https://github.com/arturi) | [goto-bus-stop](https://github.com/goto-bus-stop) | [kvz](https://github.com/kvz) | [aduh95](https://github.com/aduh95) | [ifedapoolarewaju](https://github.com/ifedapoolarewaju) | [hedgerh](https://github.com/hedgerh) | -[Murderlon](https://github.com/Murderlon) |[AJvanLoon](https://github.com/AJvanLoon) |[nqst](https://github.com/nqst) |[mifi](https://github.com/mifi) |[github-actions[bot]](https://github.com/apps/github-actions) |[lakesare](https://github.com/lakesare) | -:---: |:---: |:---: |:---: |:---: |:---: | -[Murderlon](https://github.com/Murderlon) |[AJvanLoon](https://github.com/AJvanLoon) |[nqst](https://github.com/nqst) |[mifi](https://github.com/mifi) |[github-actions\[bot\]](https://github.com/apps/github-actions) |[lakesare](https://github.com/lakesare) | +| [Murderlon](https://github.com/Murderlon) | [AJvanLoon](https://github.com/AJvanLoon) | [nqst](https://github.com/nqst) | [mifi](https://github.com/mifi) | [github-actions[bot]](https://github.com/apps/github-actions) | [lakesare](https://github.com/lakesare) | +| :-------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | +| [Murderlon](https://github.com/Murderlon) | [AJvanLoon](https://github.com/AJvanLoon) | [nqst](https://github.com/nqst) | [mifi](https://github.com/mifi) | [github-actions\[bot\]](https://github.com/apps/github-actions) | [lakesare](https://github.com/lakesare) | -[dependabot[bot]](https://github.com/apps/dependabot) |[kiloreux](https://github.com/kiloreux) |[samuelayo](https://github.com/samuelayo) |[sadovnychyi](https://github.com/sadovnychyi) |[richardwillars](https://github.com/richardwillars) |[ajkachnic](https://github.com/ajkachnic) | -:---: |:---: |:---: |:---: |:---: |:---: | -[dependabot\[bot\]](https://github.com/apps/dependabot) |[kiloreux](https://github.com/kiloreux) |[samuelayo](https://github.com/samuelayo) |[sadovnychyi](https://github.com/sadovnychyi) |[richardwillars](https://github.com/richardwillars) |[ajkachnic](https://github.com/ajkachnic) | +| [dependabot[bot]](https://github.com/apps/dependabot) | [kiloreux](https://github.com/kiloreux) | [samuelayo](https://github.com/samuelayo) | [sadovnychyi](https://github.com/sadovnychyi) | [richardwillars](https://github.com/richardwillars) | [ajkachnic](https://github.com/ajkachnic) | +| :------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | +| [dependabot\[bot\]](https://github.com/apps/dependabot) | [kiloreux](https://github.com/kiloreux) | [samuelayo](https://github.com/samuelayo) | [sadovnychyi](https://github.com/sadovnychyi) | [richardwillars](https://github.com/richardwillars) | [ajkachnic](https://github.com/ajkachnic) | -[zcallan](https://github.com/zcallan) |[YukeshShr](https://github.com/YukeshShr) |[janko](https://github.com/janko) |[oliverpool](https://github.com/oliverpool) |[Botz](https://github.com/Botz) |[mcallistertyler](https://github.com/mcallistertyler) | -:---: |:---: |:---: |:---: |:---: |:---: | -[zcallan](https://github.com/zcallan) |[YukeshShr](https://github.com/YukeshShr) |[janko](https://github.com/janko) |[oliverpool](https://github.com/oliverpool) |[Botz](https://github.com/Botz) |[mcallistertyler](https://github.com/mcallistertyler) | +| [zcallan](https://github.com/zcallan) | [YukeshShr](https://github.com/YukeshShr) | [janko](https://github.com/janko) | [oliverpool](https://github.com/oliverpool) | [Botz](https://github.com/Botz) | [mcallistertyler](https://github.com/mcallistertyler) | +| :----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | +| [zcallan](https://github.com/zcallan) | [YukeshShr](https://github.com/YukeshShr) | [janko](https://github.com/janko) | [oliverpool](https://github.com/oliverpool) | [Botz](https://github.com/Botz) | [mcallistertyler](https://github.com/mcallistertyler) | -[mokutsu-coursera](https://github.com/mokutsu-coursera) |[dschmidt](https://github.com/dschmidt) |[DJWassink](https://github.com/DJWassink) |[mrbatista](https://github.com/mrbatista) |[taoqf](https://github.com/taoqf) |[timodwhit](https://github.com/timodwhit) | -:---: |:---: |:---: |:---: |:---: |:---: | -[mokutsu-coursera](https://github.com/mokutsu-coursera) |[dschmidt](https://github.com/dschmidt) |[DJWassink](https://github.com/DJWassink) |[mrbatista](https://github.com/mrbatista) |[taoqf](https://github.com/taoqf) |[timodwhit](https://github.com/timodwhit) | +| [mokutsu-coursera](https://github.com/mokutsu-coursera) | [dschmidt](https://github.com/dschmidt) | [DJWassink](https://github.com/DJWassink) | [mrbatista](https://github.com/mrbatista) | [taoqf](https://github.com/taoqf) | [timodwhit](https://github.com/timodwhit) | +| :----------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | +| [mokutsu-coursera](https://github.com/mokutsu-coursera) | [dschmidt](https://github.com/dschmidt) | [DJWassink](https://github.com/DJWassink) | [mrbatista](https://github.com/mrbatista) | [taoqf](https://github.com/taoqf) | [timodwhit](https://github.com/timodwhit) | -[tim-kos](https://github.com/tim-kos) |[eltociear](https://github.com/eltociear) |[tuoxiansp](https://github.com/tuoxiansp) |[pauln](https://github.com/pauln) |[MikeKovarik](https://github.com/MikeKovarik) |[toadkicker](https://github.com/toadkicker) | -:---: |:---: |:---: |:---: |:---: |:---: | -[tim-kos](https://github.com/tim-kos) |[eltociear](https://github.com/eltociear) |[tuoxiansp](https://github.com/tuoxiansp) |[pauln](https://github.com/pauln) |[MikeKovarik](https://github.com/MikeKovarik) |[toadkicker](https://github.com/toadkicker) | +| [tim-kos](https://github.com/tim-kos) | [eltociear](https://github.com/eltociear) | [tuoxiansp](https://github.com/tuoxiansp) | [pauln](https://github.com/pauln) | [MikeKovarik](https://github.com/MikeKovarik) | [toadkicker](https://github.com/toadkicker) | +| :-------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | +| [tim-kos](https://github.com/tim-kos) | [eltociear](https://github.com/eltociear) | [tuoxiansp](https://github.com/tuoxiansp) | [pauln](https://github.com/pauln) | [MikeKovarik](https://github.com/MikeKovarik) | [toadkicker](https://github.com/toadkicker) | -[ap--](https://github.com/ap--) |[tranvansang](https://github.com/tranvansang) |[LiviaMedeiros](https://github.com/LiviaMedeiros) |[bertho-zero](https://github.com/bertho-zero) |[juliangruber](https://github.com/juliangruber) |[Hawxy](https://github.com/Hawxy) | -:---: |:---: |:---: |:---: |:---: |:---: | -[ap--](https://github.com/ap--) |[tranvansang](https://github.com/tranvansang) |[LiviaMedeiros](https://github.com/LiviaMedeiros) |[bertho-zero](https://github.com/bertho-zero) |[juliangruber](https://github.com/juliangruber) |[Hawxy](https://github.com/Hawxy) | +| [ap--](https://github.com/ap--) | [tranvansang](https://github.com/tranvansang) | [LiviaMedeiros](https://github.com/LiviaMedeiros) | [bertho-zero](https://github.com/bertho-zero) | [juliangruber](https://github.com/juliangruber) | [Hawxy](https://github.com/Hawxy) | +| :---------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | +| [ap--](https://github.com/ap--) | [tranvansang](https://github.com/tranvansang) | [LiviaMedeiros](https://github.com/LiviaMedeiros) | [bertho-zero](https://github.com/bertho-zero) | [juliangruber](https://github.com/juliangruber) | [Hawxy](https://github.com/Hawxy) | -[gavboulton](https://github.com/gavboulton) |[mejiaej](https://github.com/mejiaej) |[elenalape](https://github.com/elenalape) |[dominiceden](https://github.com/dominiceden) |[Acconut](https://github.com/Acconut) |[jhen0409](https://github.com/jhen0409) | -:---: |:---: |:---: |:---: |:---: |:---: | -[gavboulton](https://github.com/gavboulton) |[mejiaej](https://github.com/mejiaej) |[elenalape](https://github.com/elenalape) |[dominiceden](https://github.com/dominiceden) |[Acconut](https://github.com/Acconut) |[jhen0409](https://github.com/jhen0409) | +| [gavboulton](https://github.com/gavboulton) | [mejiaej](https://github.com/mejiaej) | [elenalape](https://github.com/elenalape) | [dominiceden](https://github.com/dominiceden) | [Acconut](https://github.com/Acconut) | [jhen0409](https://github.com/jhen0409) | +| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | +| [gavboulton](https://github.com/gavboulton) | [mejiaej](https://github.com/mejiaej) | [elenalape](https://github.com/elenalape) | [dominiceden](https://github.com/dominiceden) | [Acconut](https://github.com/Acconut) | [jhen0409](https://github.com/jhen0409) | -[stephentuso](https://github.com/stephentuso) |[bencergazda](https://github.com/bencergazda) |[a-kriya](https://github.com/a-kriya) |[yonahforst](https://github.com/yonahforst) |[suchoproduction](https://github.com/suchoproduction) |[sksavant](https://github.com/sksavant) | -:---: |:---: |:---: |:---: |:---: |:---: | -[stephentuso](https://github.com/stephentuso) |[bencergazda](https://github.com/bencergazda) |[a-kriya](https://github.com/a-kriya) |[yonahforst](https://github.com/yonahforst) |[suchoproduction](https://github.com/suchoproduction) |[sksavant](https://github.com/sksavant) | +| [stephentuso](https://github.com/stephentuso) | [bencergazda](https://github.com/bencergazda) | [a-kriya](https://github.com/a-kriya) | [yonahforst](https://github.com/yonahforst) | [suchoproduction](https://github.com/suchoproduction) | [sksavant](https://github.com/sksavant) | +| :------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | +| [stephentuso](https://github.com/stephentuso) | [bencergazda](https://github.com/bencergazda) | [a-kriya](https://github.com/a-kriya) | [yonahforst](https://github.com/yonahforst) | [suchoproduction](https://github.com/suchoproduction) | [sksavant](https://github.com/sksavant) | -[ogtfaber](https://github.com/ogtfaber) |[nndevstudio](https://github.com/nndevstudio) |[MatthiasKunnen](https://github.com/MatthiasKunnen) |[manuelkiessling](https://github.com/manuelkiessling) |[dargmuesli](https://github.com/dargmuesli) |[johnnyperkins](https://github.com/johnnyperkins) | -:---: |:---: |:---: |:---: |:---: |:---: | -[ogtfaber](https://github.com/ogtfaber) |[nndevstudio](https://github.com/nndevstudio) |[MatthiasKunnen](https://github.com/MatthiasKunnen) |[manuelkiessling](https://github.com/manuelkiessling) |[dargmuesli](https://github.com/dargmuesli) |[johnnyperkins](https://github.com/johnnyperkins) | +| [ogtfaber](https://github.com/ogtfaber) | [nndevstudio](https://github.com/nndevstudio) | [MatthiasKunnen](https://github.com/MatthiasKunnen) | [manuelkiessling](https://github.com/manuelkiessling) | [dargmuesli](https://github.com/dargmuesli) | [johnnyperkins](https://github.com/johnnyperkins) | +| :----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | +| [ogtfaber](https://github.com/ogtfaber) | [nndevstudio](https://github.com/nndevstudio) | [MatthiasKunnen](https://github.com/MatthiasKunnen) | [manuelkiessling](https://github.com/manuelkiessling) | [dargmuesli](https://github.com/dargmuesli) | [johnnyperkins](https://github.com/johnnyperkins) | -[ofhope](https://github.com/ofhope) |[yaegor](https://github.com/yaegor) |[zhuangya](https://github.com/zhuangya) |[sparanoid](https://github.com/sparanoid) |[ThomasG77](https://github.com/ThomasG77) |[subha1206](https://github.com/subha1206) | -:---: |:---: |:---: |:---: |:---: |:---: | -[ofhope](https://github.com/ofhope) |[yaegor](https://github.com/yaegor) |[zhuangya](https://github.com/zhuangya) |[sparanoid](https://github.com/sparanoid) |[ThomasG77](https://github.com/ThomasG77) |[subha1206](https://github.com/subha1206) | +| [ofhope](https://github.com/ofhope) | [yaegor](https://github.com/yaegor) | [zhuangya](https://github.com/zhuangya) | [sparanoid](https://github.com/sparanoid) | [ThomasG77](https://github.com/ThomasG77) | [subha1206](https://github.com/subha1206) | +| :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | +| [ofhope](https://github.com/ofhope) | [yaegor](https://github.com/yaegor) | [zhuangya](https://github.com/zhuangya) | [sparanoid](https://github.com/sparanoid) | [ThomasG77](https://github.com/ThomasG77) | [subha1206](https://github.com/subha1206) | -[schonert](https://github.com/schonert) |[SlavikTraktor](https://github.com/SlavikTraktor) |[scottbessler](https://github.com/scottbessler) |[jrschumacher](https://github.com/jrschumacher) |[rosenfeld](https://github.com/rosenfeld) |[rdimartino](https://github.com/rdimartino) | -:---: |:---: |:---: |:---: |:---: |:---: | -[schonert](https://github.com/schonert) |[SlavikTraktor](https://github.com/SlavikTraktor) |[scottbessler](https://github.com/scottbessler) |[jrschumacher](https://github.com/jrschumacher) |[rosenfeld](https://github.com/rosenfeld) |[rdimartino](https://github.com/rdimartino) | +| [schonert](https://github.com/schonert) | [SlavikTraktor](https://github.com/SlavikTraktor) | [scottbessler](https://github.com/scottbessler) | [jrschumacher](https://github.com/jrschumacher) | [rosenfeld](https://github.com/rosenfeld) | [rdimartino](https://github.com/rdimartino) | +| :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | +| [schonert](https://github.com/schonert) | [SlavikTraktor](https://github.com/SlavikTraktor) | [scottbessler](https://github.com/scottbessler) | [jrschumacher](https://github.com/jrschumacher) | [rosenfeld](https://github.com/rosenfeld) | [rdimartino](https://github.com/rdimartino) | -[ahmedkandel](https://github.com/ahmedkandel) |[Youssef1313](https://github.com/Youssef1313) |[allenfantasy](https://github.com/allenfantasy) |[Zyclotrop-j](https://github.com/Zyclotrop-j) |[anark](https://github.com/anark) |[bdirito](https://github.com/bdirito) | -:---: |:---: |:---: |:---: |:---: |:---: | -[ahmedkandel](https://github.com/ahmedkandel) |[Youssef1313](https://github.com/Youssef1313) |[allenfantasy](https://github.com/allenfantasy) |[Zyclotrop-j](https://github.com/Zyclotrop-j) |[anark](https://github.com/anark) |[bdirito](https://github.com/bdirito) | +| [ahmedkandel](https://github.com/ahmedkandel) | [Youssef1313](https://github.com/Youssef1313) | [allenfantasy](https://github.com/allenfantasy) | [Zyclotrop-j](https://github.com/Zyclotrop-j) | [anark](https://github.com/anark) | [bdirito](https://github.com/bdirito) | +| :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | +| [ahmedkandel](https://github.com/ahmedkandel) | [Youssef1313](https://github.com/Youssef1313) | [allenfantasy](https://github.com/allenfantasy) | [Zyclotrop-j](https://github.com/Zyclotrop-j) | [anark](https://github.com/anark) | [bdirito](https://github.com/bdirito) | -[darthf1](https://github.com/darthf1) |[fortrieb](https://github.com/fortrieb) |[frederikhors](https://github.com/frederikhors) |[heocoi](https://github.com/heocoi) |[jarey](https://github.com/jarey) |[muhammadInam](https://github.com/muhammadInam) | -:---: |:---: |:---: |:---: |:---: |:---: | -[darthf1](https://github.com/darthf1) |[fortrieb](https://github.com/fortrieb) |[frederikhors](https://github.com/frederikhors) |[heocoi](https://github.com/heocoi) |[jarey](https://github.com/jarey) |[muhammadInam](https://github.com/muhammadInam) | +| [darthf1](https://github.com/darthf1) | [fortrieb](https://github.com/fortrieb) | [frederikhors](https://github.com/frederikhors) | [heocoi](https://github.com/heocoi) | [jarey](https://github.com/jarey) | [muhammadInam](https://github.com/muhammadInam) | +| :----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | +| [darthf1](https://github.com/darthf1) | [fortrieb](https://github.com/fortrieb) | [frederikhors](https://github.com/frederikhors) | [heocoi](https://github.com/heocoi) | [jarey](https://github.com/jarey) | [muhammadInam](https://github.com/muhammadInam) | -[rettgerst](https://github.com/rettgerst) |[mkabatek](https://github.com/mkabatek) |[jukakoski](https://github.com/jukakoski) |[olemoign](https://github.com/olemoign) |[btrice](https://github.com/btrice) |[5idereal](https://github.com/5idereal) | -:---: |:---: |:---: |:---: |:---: |:---: | -[rettgerst](https://github.com/rettgerst) |[mkabatek](https://github.com/mkabatek) |[jukakoski](https://github.com/jukakoski) |[olemoign](https://github.com/olemoign) |[btrice](https://github.com/btrice) |[5idereal](https://github.com/5idereal) | +| [rettgerst](https://github.com/rettgerst) | [mkabatek](https://github.com/mkabatek) | [jukakoski](https://github.com/jukakoski) | [olemoign](https://github.com/olemoign) | [btrice](https://github.com/btrice) | [5idereal](https://github.com/5idereal) | +| :--------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| [rettgerst](https://github.com/rettgerst) | [mkabatek](https://github.com/mkabatek) | [jukakoski](https://github.com/jukakoski) | [olemoign](https://github.com/olemoign) | [btrice](https://github.com/btrice) | [5idereal](https://github.com/5idereal) | -[AndrwM](https://github.com/AndrwM) |[behnammodi](https://github.com/behnammodi) |[BePo65](https://github.com/BePo65) |[bradedelman](https://github.com/bradedelman) |[camiloforero](https://github.com/camiloforero) |[command-tab](https://github.com/command-tab) | -:---: |:---: |:---: |:---: |:---: |:---: | -[AndrwM](https://github.com/AndrwM) |[behnammodi](https://github.com/behnammodi) |[BePo65](https://github.com/BePo65) |[bradedelman](https://github.com/bradedelman) |[camiloforero](https://github.com/camiloforero) |[command-tab](https://github.com/command-tab) | +| [AndrwM](https://github.com/AndrwM) | [behnammodi](https://github.com/behnammodi) | [BePo65](https://github.com/BePo65) | [bradedelman](https://github.com/bradedelman) | [camiloforero](https://github.com/camiloforero) | [command-tab](https://github.com/command-tab) | +| :------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | +| [AndrwM](https://github.com/AndrwM) | [behnammodi](https://github.com/behnammodi) | [BePo65](https://github.com/BePo65) | [bradedelman](https://github.com/bradedelman) | [camiloforero](https://github.com/camiloforero) | [command-tab](https://github.com/command-tab) | -[craig-jennings](https://github.com/craig-jennings) |[davekiss](https://github.com/davekiss) |[denysdesign](https://github.com/denysdesign) |[ethanwillis](https://github.com/ethanwillis) |[frobinsonj](https://github.com/frobinsonj) |[richartkeil](https://github.com/richartkeil) | -:---: |:---: |:---: |:---: |:---: |:---: | -[craig-jennings](https://github.com/craig-jennings) |[davekiss](https://github.com/davekiss) |[denysdesign](https://github.com/denysdesign) |[ethanwillis](https://github.com/ethanwillis) |[frobinsonj](https://github.com/frobinsonj) |[richartkeil](https://github.com/richartkeil) | +| [craig-jennings](https://github.com/craig-jennings) | [davekiss](https://github.com/davekiss) | [denysdesign](https://github.com/denysdesign) | [ethanwillis](https://github.com/ethanwillis) | [frobinsonj](https://github.com/frobinsonj) | [richartkeil](https://github.com/richartkeil) | +| :-----------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | +| [craig-jennings](https://github.com/craig-jennings) | [davekiss](https://github.com/davekiss) | [denysdesign](https://github.com/denysdesign) | [ethanwillis](https://github.com/ethanwillis) | [frobinsonj](https://github.com/frobinsonj) | [richartkeil](https://github.com/richartkeil) | -[paescuj](https://github.com/paescuj) |[richmeij](https://github.com/richmeij) |[msand](https://github.com/msand) |[martiuslim](https://github.com/martiuslim) |[Martin005](https://github.com/Martin005) |[mskelton](https://github.com/mskelton) | -:---: |:---: |:---: |:---: |:---: |:---: | -[paescuj](https://github.com/paescuj) |[richmeij](https://github.com/richmeij) |[msand](https://github.com/msand) |[martiuslim](https://github.com/martiuslim) |[Martin005](https://github.com/Martin005) |[mskelton](https://github.com/mskelton) | +| [paescuj](https://github.com/paescuj) | [richmeij](https://github.com/richmeij) | [msand](https://github.com/msand) | [martiuslim](https://github.com/martiuslim) | [Martin005](https://github.com/Martin005) | [mskelton](https://github.com/mskelton) | +| :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| [paescuj](https://github.com/paescuj) | [richmeij](https://github.com/richmeij) | [msand](https://github.com/msand) | [martiuslim](https://github.com/martiuslim) | [Martin005](https://github.com/Martin005) | [mskelton](https://github.com/mskelton) | -[mactavishz](https://github.com/mactavishz) |[lafe](https://github.com/lafe) |[dogrocker](https://github.com/dogrocker) |[jedwood](https://github.com/jedwood) |[jasonbosco](https://github.com/jasonbosco) |[ghasrfakhri](https://github.com/ghasrfakhri) | -:---: |:---: |:---: |:---: |:---: |:---: | -[mactavishz](https://github.com/mactavishz) |[lafe](https://github.com/lafe) |[dogrocker](https://github.com/dogrocker) |[jedwood](https://github.com/jedwood) |[jasonbosco](https://github.com/jasonbosco) |[ghasrfakhri](https://github.com/ghasrfakhri) | +| [mactavishz](https://github.com/mactavishz) | [lafe](https://github.com/lafe) | [dogrocker](https://github.com/dogrocker) | [jedwood](https://github.com/jedwood) | [jasonbosco](https://github.com/jasonbosco) | [ghasrfakhri](https://github.com/ghasrfakhri) | +| :----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | +| [mactavishz](https://github.com/mactavishz) | [lafe](https://github.com/lafe) | [dogrocker](https://github.com/dogrocker) | [jedwood](https://github.com/jedwood) | [jasonbosco](https://github.com/jasonbosco) | [ghasrfakhri](https://github.com/ghasrfakhri) | -[geertclerx](https://github.com/geertclerx) |[eman8519](https://github.com/eman8519) |[luarmr](https://github.com/luarmr) |[raulibanez](https://github.com/raulibanez) |[refo](https://github.com/refo) |[SxDx](https://github.com/SxDx) | -:---: |:---: |:---: |:---: |:---: |:---: | -[geertclerx](https://github.com/geertclerx) |[eman8519](https://github.com/eman8519) |[luarmr](https://github.com/luarmr) |[raulibanez](https://github.com/raulibanez) |[refo](https://github.com/refo) |[SxDx](https://github.com/SxDx) | +| [geertclerx](https://github.com/geertclerx) | [eman8519](https://github.com/eman8519) | [luarmr](https://github.com/luarmr) | [raulibanez](https://github.com/raulibanez) | [refo](https://github.com/refo) | [SxDx](https://github.com/SxDx) | +| :---------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | +| [geertclerx](https://github.com/geertclerx) | [eman8519](https://github.com/eman8519) | [luarmr](https://github.com/luarmr) | [raulibanez](https://github.com/raulibanez) | [refo](https://github.com/refo) | [SxDx](https://github.com/SxDx) | -[robwilson1](https://github.com/robwilson1) |[scherroman](https://github.com/scherroman) |[neuronet77](https://github.com/neuronet77) |[Pzoco](https://github.com/Pzoco) |[ppadmavilasom](https://github.com/ppadmavilasom) |[phillipalexander](https://github.com/phillipalexander) | -:---: |:---: |:---: |:---: |:---: |:---: | -[robwilson1](https://github.com/robwilson1) |[scherroman](https://github.com/scherroman) |[neuronet77](https://github.com/neuronet77) |[Pzoco](https://github.com/Pzoco) |[ppadmavilasom](https://github.com/ppadmavilasom) |[phillipalexander](https://github.com/phillipalexander) | +| [robwilson1](https://github.com/robwilson1) | [scherroman](https://github.com/scherroman) | [neuronet77](https://github.com/neuronet77) | [Pzoco](https://github.com/Pzoco) | [ppadmavilasom](https://github.com/ppadmavilasom) | [phillipalexander](https://github.com/phillipalexander) | +| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------: | +| [robwilson1](https://github.com/robwilson1) | [scherroman](https://github.com/scherroman) | [neuronet77](https://github.com/neuronet77) | [Pzoco](https://github.com/Pzoco) | [ppadmavilasom](https://github.com/ppadmavilasom) | [phillipalexander](https://github.com/phillipalexander) | -[pmusaraj](https://github.com/pmusaraj) |[pedrofs](https://github.com/pedrofs) |[plneto](https://github.com/plneto) |[patricklindsay](https://github.com/patricklindsay) |[pascalwengerter](https://github.com/pascalwengerter) |[ParsaArvanehPA](https://github.com/ParsaArvanehPA) | -:---: |:---: |:---: |:---: |:---: |:---: | -[pmusaraj](https://github.com/pmusaraj) |[pedrofs](https://github.com/pedrofs) |[plneto](https://github.com/plneto) |[patricklindsay](https://github.com/patricklindsay) |[pascalwengerter](https://github.com/pascalwengerter) |[ParsaArvanehPA](https://github.com/ParsaArvanehPA) | +| [pmusaraj](https://github.com/pmusaraj) | [pedrofs](https://github.com/pedrofs) | [plneto](https://github.com/plneto) | [patricklindsay](https://github.com/patricklindsay) | [pascalwengerter](https://github.com/pascalwengerter) | [ParsaArvanehPA](https://github.com/ParsaArvanehPA) | +| :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | +| [pmusaraj](https://github.com/pmusaraj) | [pedrofs](https://github.com/pedrofs) | [plneto](https://github.com/plneto) | [patricklindsay](https://github.com/patricklindsay) | [pascalwengerter](https://github.com/pascalwengerter) | [ParsaArvanehPA](https://github.com/ParsaArvanehPA) | -[taj](https://github.com/taj) |[strayer](https://github.com/strayer) |[sjauld](https://github.com/sjauld) |[steverob](https://github.com/steverob) |[amaitu](https://github.com/amaitu) |[quigebo](https://github.com/quigebo) | -:---: |:---: |:---: |:---: |:---: |:---: | -[taj](https://github.com/taj) |[strayer](https://github.com/strayer) |[sjauld](https://github.com/sjauld) |[steverob](https://github.com/steverob) |[amaitu](https://github.com/amaitu) |[quigebo](https://github.com/quigebo) | +| [taj](https://github.com/taj) | [strayer](https://github.com/strayer) | [sjauld](https://github.com/sjauld) | [steverob](https://github.com/steverob) | [amaitu](https://github.com/amaitu) | [quigebo](https://github.com/quigebo) | +| :--------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | +| [taj](https://github.com/taj) | [strayer](https://github.com/strayer) | [sjauld](https://github.com/sjauld) | [steverob](https://github.com/steverob) | [amaitu](https://github.com/amaitu) | [quigebo](https://github.com/quigebo) | -[waptik](https://github.com/waptik) |[SpazzMarticus](https://github.com/SpazzMarticus) |[szh](https://github.com/szh) |[sergei-zelinsky](https://github.com/sergei-zelinsky) |[sebasegovia01](https://github.com/sebasegovia01) |[sdebacker](https://github.com/sdebacker) | -:---: |:---: |:---: |:---: |:---: |:---: | -[waptik](https://github.com/waptik) |[SpazzMarticus](https://github.com/SpazzMarticus) |[szh](https://github.com/szh) |[sergei-zelinsky](https://github.com/sergei-zelinsky) |[sebasegovia01](https://github.com/sebasegovia01) |[sdebacker](https://github.com/sdebacker) | +| [waptik](https://github.com/waptik) | [SpazzMarticus](https://github.com/SpazzMarticus) | [szh](https://github.com/szh) | [sergei-zelinsky](https://github.com/sergei-zelinsky) | [sebasegovia01](https://github.com/sebasegovia01) | [sdebacker](https://github.com/sdebacker) | +| :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| [waptik](https://github.com/waptik) | [SpazzMarticus](https://github.com/SpazzMarticus) | [szh](https://github.com/szh) | [sergei-zelinsky](https://github.com/sergei-zelinsky) | [sebasegovia01](https://github.com/sebasegovia01) | [sdebacker](https://github.com/sdebacker) | -[samuelcolburn](https://github.com/samuelcolburn) |[fortunto2](https://github.com/fortunto2) |[GNURub](https://github.com/GNURub) |[rart](https://github.com/rart) |[rossng](https://github.com/rossng) |[mkopinsky](https://github.com/mkopinsky) | -:---: |:---: |:---: |:---: |:---: |:---: | -[samuelcolburn](https://github.com/samuelcolburn) |[fortunto2](https://github.com/fortunto2) |[GNURub](https://github.com/GNURub) |[rart](https://github.com/rart) |[rossng](https://github.com/rossng) |[mkopinsky](https://github.com/mkopinsky) | +| [samuelcolburn](https://github.com/samuelcolburn) | [fortunto2](https://github.com/fortunto2) | [GNURub](https://github.com/GNURub) | [rart](https://github.com/rart) | [rossng](https://github.com/rossng) | [mkopinsky](https://github.com/mkopinsky) | +| :---------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| [samuelcolburn](https://github.com/samuelcolburn) | [fortunto2](https://github.com/fortunto2) | [GNURub](https://github.com/GNURub) | [rart](https://github.com/rart) | [rossng](https://github.com/rossng) | [mkopinsky](https://github.com/mkopinsky) | -[mhulet](https://github.com/mhulet) |[hrsh](https://github.com/hrsh) |[mauricioribeiro](https://github.com/mauricioribeiro) |[matthewhartstonge](https://github.com/matthewhartstonge) |[mjesuele](https://github.com/mjesuele) |[mattfik](https://github.com/mattfik) | -:---: |:---: |:---: |:---: |:---: |:---: | -[mhulet](https://github.com/mhulet) |[hrsh](https://github.com/hrsh) |[mauricioribeiro](https://github.com/mauricioribeiro) |[matthewhartstonge](https://github.com/matthewhartstonge) |[mjesuele](https://github.com/mjesuele) |[mattfik](https://github.com/mattfik) | +| [mhulet](https://github.com/mhulet) | [hrsh](https://github.com/hrsh) | [mauricioribeiro](https://github.com/mauricioribeiro) | [matthewhartstonge](https://github.com/matthewhartstonge) | [mjesuele](https://github.com/mjesuele) | [mattfik](https://github.com/mattfik) | +| :------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | +| [mhulet](https://github.com/mhulet) | [hrsh](https://github.com/hrsh) | [mauricioribeiro](https://github.com/mauricioribeiro) | [matthewhartstonge](https://github.com/matthewhartstonge) | [mjesuele](https://github.com/mjesuele) | [mattfik](https://github.com/mattfik) | -[mateuscruz](https://github.com/mateuscruz) |[masumulu28](https://github.com/masumulu28) |[masaok](https://github.com/masaok) |[martin-brennan](https://github.com/martin-brennan) |[marcusforsberg](https://github.com/marcusforsberg) |[marcosthejew](https://github.com/marcosthejew) | -:---: |:---: |:---: |:---: |:---: |:---: | -[mateuscruz](https://github.com/mateuscruz) |[masumulu28](https://github.com/masumulu28) |[masaok](https://github.com/masaok) |[martin-brennan](https://github.com/martin-brennan) |[marcusforsberg](https://github.com/marcusforsberg) |[marcosthejew](https://github.com/marcosthejew) | +| [mateuscruz](https://github.com/mateuscruz) | [masumulu28](https://github.com/masumulu28) | [masaok](https://github.com/masaok) | [martin-brennan](https://github.com/martin-brennan) | [marcusforsberg](https://github.com/marcusforsberg) | [marcosthejew](https://github.com/marcosthejew) | +| :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | +| [mateuscruz](https://github.com/mateuscruz) | [masumulu28](https://github.com/masumulu28) | [masaok](https://github.com/masaok) | [martin-brennan](https://github.com/martin-brennan) | [marcusforsberg](https://github.com/marcusforsberg) | [marcosthejew](https://github.com/marcosthejew) | -[mperrando](https://github.com/mperrando) |[onhate](https://github.com/onhate) |[marc-mabe](https://github.com/marc-mabe) |[Lucklj521](https://github.com/Lucklj521) |[cryptic022](https://github.com/cryptic022) |[Ozodbek1405](https://github.com/Ozodbek1405) | -:---: |:---: |:---: |:---: |:---: |:---: | -[mperrando](https://github.com/mperrando) |[onhate](https://github.com/onhate) |[marc-mabe](https://github.com/marc-mabe) |[Lucklj521](https://github.com/Lucklj521) |[cryptic022](https://github.com/cryptic022) |[Ozodbek1405](https://github.com/Ozodbek1405) | +| [mperrando](https://github.com/mperrando) | [onhate](https://github.com/onhate) | [marc-mabe](https://github.com/marc-mabe) | [Lucklj521](https://github.com/Lucklj521) | [cryptic022](https://github.com/cryptic022) | [Ozodbek1405](https://github.com/Ozodbek1405) | +| :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | +| [mperrando](https://github.com/mperrando) | [onhate](https://github.com/onhate) | [marc-mabe](https://github.com/marc-mabe) | [Lucklj521](https://github.com/Lucklj521) | [cryptic022](https://github.com/cryptic022) | [Ozodbek1405](https://github.com/Ozodbek1405) | -[leftdevel](https://github.com/leftdevel) |[nil1511](https://github.com/nil1511) |[coreprocess](https://github.com/coreprocess) |[nicojones](https://github.com/nicojones) |[trungcva10a6tn](https://github.com/trungcva10a6tn) |[naveed-ahmad](https://github.com/naveed-ahmad) | -:---: |:---: |:---: |:---: |:---: |:---: | -[leftdevel](https://github.com/leftdevel) |[nil1511](https://github.com/nil1511) |[coreprocess](https://github.com/coreprocess) |[nicojones](https://github.com/nicojones) |[trungcva10a6tn](https://github.com/trungcva10a6tn) |[naveed-ahmad](https://github.com/naveed-ahmad) | +| [leftdevel](https://github.com/leftdevel) | [nil1511](https://github.com/nil1511) | [coreprocess](https://github.com/coreprocess) | [nicojones](https://github.com/nicojones) | [trungcva10a6tn](https://github.com/trungcva10a6tn) | [naveed-ahmad](https://github.com/naveed-ahmad) | +| :------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | +| [leftdevel](https://github.com/leftdevel) | [nil1511](https://github.com/nil1511) | [coreprocess](https://github.com/coreprocess) | [nicojones](https://github.com/nicojones) | [trungcva10a6tn](https://github.com/trungcva10a6tn) | [naveed-ahmad](https://github.com/naveed-ahmad) | -[pleasespammelater](https://github.com/pleasespammelater) |[marton-laszlo-attila](https://github.com/marton-laszlo-attila) |[navruzm](https://github.com/navruzm) |[mogzol](https://github.com/mogzol) |[shahimclt](https://github.com/shahimclt) |[mnafees](https://github.com/mnafees) | -:---: |:---: |:---: |:---: |:---: |:---: | -[pleasespammelater](https://github.com/pleasespammelater) |[marton-laszlo-attila](https://github.com/marton-laszlo-attila) |[navruzm](https://github.com/navruzm) |[mogzol](https://github.com/mogzol) |[shahimclt](https://github.com/shahimclt) |[mnafees](https://github.com/mnafees) | +| [pleasespammelater](https://github.com/pleasespammelater) | [marton-laszlo-attila](https://github.com/marton-laszlo-attila) | [navruzm](https://github.com/navruzm) | [mogzol](https://github.com/mogzol) | [shahimclt](https://github.com/shahimclt) | [mnafees](https://github.com/mnafees) | +| :------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | +| [pleasespammelater](https://github.com/pleasespammelater) | [marton-laszlo-attila](https://github.com/marton-laszlo-attila) | [navruzm](https://github.com/navruzm) | [mogzol](https://github.com/mogzol) | [shahimclt](https://github.com/shahimclt) | [mnafees](https://github.com/mnafees) | -[boudra](https://github.com/boudra) |[achmiral](https://github.com/achmiral) |[ken-kuro](https://github.com/ken-kuro) |[mosi-kha](https://github.com/mosi-kha) |[maddy-jo](https://github.com/maddy-jo) |[mdxiaohu](https://github.com/mdxiaohu) | -:---: |:---: |:---: |:---: |:---: |:---: | -[boudra](https://github.com/boudra) |[achmiral](https://github.com/achmiral) |[ken-kuro](https://github.com/ken-kuro) |[mosi-kha](https://github.com/mosi-kha) |[maddy-jo](https://github.com/maddy-jo) |[mdxiaohu](https://github.com/mdxiaohu) | +| [boudra](https://github.com/boudra) | [achmiral](https://github.com/achmiral) | [ken-kuro](https://github.com/ken-kuro) | [mosi-kha](https://github.com/mosi-kha) | [maddy-jo](https://github.com/maddy-jo) | [mdxiaohu](https://github.com/mdxiaohu) | +| :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| [boudra](https://github.com/boudra) | [achmiral](https://github.com/achmiral) | [ken-kuro](https://github.com/ken-kuro) | [mosi-kha](https://github.com/mosi-kha) | [maddy-jo](https://github.com/maddy-jo) | [mdxiaohu](https://github.com/mdxiaohu) | -[magumbo](https://github.com/magumbo) |[jx-zyf](https://github.com/jx-zyf) |[kode-ninja](https://github.com/kode-ninja) |[sontixyou](https://github.com/sontixyou) |[jur-ng](https://github.com/jur-ng) |[johnmanjiro13](https://github.com/johnmanjiro13) | -:---: |:---: |:---: |:---: |:---: |:---: | -[magumbo](https://github.com/magumbo) |[jx-zyf](https://github.com/jx-zyf) |[kode-ninja](https://github.com/kode-ninja) |[sontixyou](https://github.com/sontixyou) |[jur-ng](https://github.com/jur-ng) |[johnmanjiro13](https://github.com/johnmanjiro13) | +| [magumbo](https://github.com/magumbo) | [jx-zyf](https://github.com/jx-zyf) | [kode-ninja](https://github.com/kode-ninja) | [sontixyou](https://github.com/sontixyou) | [jur-ng](https://github.com/jur-ng) | [johnmanjiro13](https://github.com/johnmanjiro13) | +| :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | +| [magumbo](https://github.com/magumbo) | [jx-zyf](https://github.com/jx-zyf) | [kode-ninja](https://github.com/kode-ninja) | [sontixyou](https://github.com/sontixyou) | [jur-ng](https://github.com/jur-ng) | [johnmanjiro13](https://github.com/johnmanjiro13) | -[jyoungblood](https://github.com/jyoungblood) |[green-mike](https://github.com/green-mike) |[gaelicwinter](https://github.com/gaelicwinter) |[franckl](https://github.com/franckl) |[fingul](https://github.com/fingul) |[elliotsayes](https://github.com/elliotsayes) | -:---: |:---: |:---: |:---: |:---: |:---: | -[jyoungblood](https://github.com/jyoungblood) |[green-mike](https://github.com/green-mike) |[gaelicwinter](https://github.com/gaelicwinter) |[franckl](https://github.com/franckl) |[fingul](https://github.com/fingul) |[elliotsayes](https://github.com/elliotsayes) | +| [jyoungblood](https://github.com/jyoungblood) | [green-mike](https://github.com/green-mike) | [gaelicwinter](https://github.com/gaelicwinter) | [franckl](https://github.com/franckl) | [fingul](https://github.com/fingul) | [elliotsayes](https://github.com/elliotsayes) | +| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | +| [jyoungblood](https://github.com/jyoungblood) | [green-mike](https://github.com/green-mike) | [gaelicwinter](https://github.com/gaelicwinter) | [franckl](https://github.com/franckl) | [fingul](https://github.com/fingul) | [elliotsayes](https://github.com/elliotsayes) | -[dzcpy](https://github.com/dzcpy) |[xhocquet](https://github.com/xhocquet) |[JimmyLv](https://github.com/JimmyLv) |[zanzlender](https://github.com/zanzlender) |[olitomas](https://github.com/olitomas) |[yoann-hellopret](https://github.com/yoann-hellopret) | -:---: |:---: |:---: |:---: |:---: |:---: | -[dzcpy](https://github.com/dzcpy) |[xhocquet](https://github.com/xhocquet) |[JimmyLv](https://github.com/JimmyLv) |[zanzlender](https://github.com/zanzlender) |[olitomas](https://github.com/olitomas) |[yoann-hellopret](https://github.com/yoann-hellopret) | +| [dzcpy](https://github.com/dzcpy) | [xhocquet](https://github.com/xhocquet) | [JimmyLv](https://github.com/JimmyLv) | [zanzlender](https://github.com/zanzlender) | [olitomas](https://github.com/olitomas) | [yoann-hellopret](https://github.com/yoann-hellopret) | +| :----------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | +| [dzcpy](https://github.com/dzcpy) | [xhocquet](https://github.com/xhocquet) | [JimmyLv](https://github.com/JimmyLv) | [zanzlender](https://github.com/zanzlender) | [olitomas](https://github.com/olitomas) | [yoann-hellopret](https://github.com/yoann-hellopret) | -[vedran555](https://github.com/vedran555) |[tusharjkhunt](https://github.com/tusharjkhunt) |[thanhthot](https://github.com/thanhthot) |[stduhpf](https://github.com/stduhpf) |[slawexxx44](https://github.com/slawexxx44) |[rtaieb](https://github.com/rtaieb) | -:---: |:---: |:---: |:---: |:---: |:---: | -[vedran555](https://github.com/vedran555) |[tusharjkhunt](https://github.com/tusharjkhunt) |[thanhthot](https://github.com/thanhthot) |[stduhpf](https://github.com/stduhpf) |[slawexxx44](https://github.com/slawexxx44) |[rtaieb](https://github.com/rtaieb) | +| [vedran555](https://github.com/vedran555) | [tusharjkhunt](https://github.com/tusharjkhunt) | [thanhthot](https://github.com/thanhthot) | [stduhpf](https://github.com/stduhpf) | [slawexxx44](https://github.com/slawexxx44) | [rtaieb](https://github.com/rtaieb) | +| :--------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | +| [vedran555](https://github.com/vedran555) | [tusharjkhunt](https://github.com/tusharjkhunt) | [thanhthot](https://github.com/thanhthot) | [stduhpf](https://github.com/stduhpf) | [slawexxx44](https://github.com/slawexxx44) | [rtaieb](https://github.com/rtaieb) | -[rmoura-92](https://github.com/rmoura-92) |[rlebosse](https://github.com/rlebosse) |[rhymes](https://github.com/rhymes) |[luntta](https://github.com/luntta) |[phil714](https://github.com/phil714) |[ordago](https://github.com/ordago) | -:---: |:---: |:---: |:---: |:---: |:---: | -[rmoura-92](https://github.com/rmoura-92) |[rlebosse](https://github.com/rlebosse) |[rhymes](https://github.com/rhymes) |[luntta](https://github.com/luntta) |[phil714](https://github.com/phil714) |[ordago](https://github.com/ordago) | +| [rmoura-92](https://github.com/rmoura-92) | [rlebosse](https://github.com/rlebosse) | [rhymes](https://github.com/rhymes) | [luntta](https://github.com/luntta) | [phil714](https://github.com/phil714) | [ordago](https://github.com/ordago) | +| :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | +| [rmoura-92](https://github.com/rmoura-92) | [rlebosse](https://github.com/rlebosse) | [rhymes](https://github.com/rhymes) | [luntta](https://github.com/luntta) | [phil714](https://github.com/phil714) | [ordago](https://github.com/ordago) | -[odselsevier](https://github.com/odselsevier) |[ninesalt](https://github.com/ninesalt) |[willycamargo](https://github.com/willycamargo) |[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[dwnste](https://github.com/dwnste) |[nagyv](https://github.com/nagyv) | -:---: |:---: |:---: |:---: |:---: |:---: | -[odselsevier](https://github.com/odselsevier) |[ninesalt](https://github.com/ninesalt) |[willycamargo](https://github.com/willycamargo) |[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[dwnste](https://github.com/dwnste) |[nagyv](https://github.com/nagyv) | +| [odselsevier](https://github.com/odselsevier) | [ninesalt](https://github.com/ninesalt) | [willycamargo](https://github.com/willycamargo) | [weston-sankey-mark43](https://github.com/weston-sankey-mark43) | [dwnste](https://github.com/dwnste) | [nagyv](https://github.com/nagyv) | +| :------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | +| [odselsevier](https://github.com/odselsevier) | [ninesalt](https://github.com/ninesalt) | [willycamargo](https://github.com/willycamargo) | [weston-sankey-mark43](https://github.com/weston-sankey-mark43) | [dwnste](https://github.com/dwnste) | [nagyv](https://github.com/nagyv) | -[stiig](https://github.com/stiig) |[valentinoli](https://github.com/valentinoli) |[vially](https://github.com/vially) |[trivikr](https://github.com/trivikr) |[top-master](https://github.com/top-master) |[tvaliasek](https://github.com/tvaliasek) | -:---: |:---: |:---: |:---: |:---: |:---: | -[stiig](https://github.com/stiig) |[valentinoli](https://github.com/valentinoli) |[vially](https://github.com/vially) |[trivikr](https://github.com/trivikr) |[top-master](https://github.com/top-master) |[tvaliasek](https://github.com/tvaliasek) | +| [stiig](https://github.com/stiig) | [valentinoli](https://github.com/valentinoli) | [vially](https://github.com/vially) | [trivikr](https://github.com/trivikr) | [top-master](https://github.com/top-master) | [tvaliasek](https://github.com/tvaliasek) | +| :-----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | +| [stiig](https://github.com/stiig) | [valentinoli](https://github.com/valentinoli) | [vially](https://github.com/vially) | [trivikr](https://github.com/trivikr) | [top-master](https://github.com/top-master) | [tvaliasek](https://github.com/tvaliasek) | -[tomekp](https://github.com/tomekp) |[tomsaleeba](https://github.com/tomsaleeba) |[WIStudent](https://github.com/WIStudent) |[tmaier](https://github.com/tmaier) |[twarlop](https://github.com/twarlop) |[tcgj](https://github.com/tcgj) | -:---: |:---: |:---: |:---: |:---: |:---: | -[tomekp](https://github.com/tomekp) |[tomsaleeba](https://github.com/tomsaleeba) |[WIStudent](https://github.com/WIStudent) |[tmaier](https://github.com/tmaier) |[twarlop](https://github.com/twarlop) |[tcgj](https://github.com/tcgj) | +| [tomekp](https://github.com/tomekp) | [tomsaleeba](https://github.com/tomsaleeba) | [WIStudent](https://github.com/WIStudent) | [tmaier](https://github.com/tmaier) | [twarlop](https://github.com/twarlop) | [tcgj](https://github.com/tcgj) | +| :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | +| [tomekp](https://github.com/tomekp) | [tomsaleeba](https://github.com/tomsaleeba) | [WIStudent](https://github.com/WIStudent) | [tmaier](https://github.com/tmaier) | [twarlop](https://github.com/twarlop) | [tcgj](https://github.com/tcgj) | -[Tashows](https://github.com/Tashows) |[dkisic](https://github.com/dkisic) |[craigcbrunner](https://github.com/craigcbrunner) |[codehero7386](https://github.com/codehero7386) |[christianwengert](https://github.com/christianwengert) |[cgoinglove](https://github.com/cgoinglove) | -:---: |:---: |:---: |:---: |:---: |:---: | -[Tashows](https://github.com/Tashows) |[dkisic](https://github.com/dkisic) |[craigcbrunner](https://github.com/craigcbrunner) |[codehero7386](https://github.com/codehero7386) |[christianwengert](https://github.com/christianwengert) |[cgoinglove](https://github.com/cgoinglove) | +| [Tashows](https://github.com/Tashows) | [dkisic](https://github.com/dkisic) | [craigcbrunner](https://github.com/craigcbrunner) | [codehero7386](https://github.com/codehero7386) | [christianwengert](https://github.com/christianwengert) | [cgoinglove](https://github.com/cgoinglove) | +| :----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | +| [Tashows](https://github.com/Tashows) | [dkisic](https://github.com/dkisic) | [craigcbrunner](https://github.com/craigcbrunner) | [codehero7386](https://github.com/codehero7386) | [christianwengert](https://github.com/christianwengert) | [cgoinglove](https://github.com/cgoinglove) | -[canvasbh](https://github.com/canvasbh) |[c0b41](https://github.com/c0b41) |[avalla](https://github.com/avalla) |[arggh](https://github.com/arggh) |[alfatv](https://github.com/alfatv) |[agreene-coursera](https://github.com/agreene-coursera) | -:---: |:---: |:---: |:---: |:---: |:---: | -[canvasbh](https://github.com/canvasbh) |[c0b41](https://github.com/c0b41) |[avalla](https://github.com/avalla) |[arggh](https://github.com/arggh) |[alfatv](https://github.com/alfatv) |[agreene-coursera](https://github.com/agreene-coursera) | +| [canvasbh](https://github.com/canvasbh) | [c0b41](https://github.com/c0b41) | [avalla](https://github.com/avalla) | [arggh](https://github.com/arggh) | [alfatv](https://github.com/alfatv) | [agreene-coursera](https://github.com/agreene-coursera) | +| :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------: | +| [canvasbh](https://github.com/canvasbh) | [c0b41](https://github.com/c0b41) | [avalla](https://github.com/avalla) | [arggh](https://github.com/arggh) | [alfatv](https://github.com/alfatv) | [agreene-coursera](https://github.com/agreene-coursera) | -[aduh95-test-account](https://github.com/aduh95-test-account) |[sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) |[zackbloom](https://github.com/zackbloom) |[zlawson-ut](https://github.com/zlawson-ut) |[zachconner](https://github.com/zachconner) |[yafkari](https://github.com/yafkari) | -:---: |:---: |:---: |:---: |:---: |:---: | -[aduh95-test-account](https://github.com/aduh95-test-account) |[sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) |[zackbloom](https://github.com/zackbloom) |[zlawson-ut](https://github.com/zlawson-ut) |[zachconner](https://github.com/zachconner) |[yafkari](https://github.com/yafkari) | +| [aduh95-test-account](https://github.com/aduh95-test-account) | [sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) | [zackbloom](https://github.com/zackbloom) | [zlawson-ut](https://github.com/zlawson-ut) | [zachconner](https://github.com/zachconner) | [yafkari](https://github.com/yafkari) | +| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | +| [aduh95-test-account](https://github.com/aduh95-test-account) | [sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) | [zackbloom](https://github.com/zackbloom) | [zlawson-ut](https://github.com/zlawson-ut) | [zachconner](https://github.com/zachconner) | [yafkari](https://github.com/yafkari) | -[YehudaKremer](https://github.com/YehudaKremer) |[sercraig](https://github.com/sercraig) |[ardeois](https://github.com/ardeois) |[CommanderRoot](https://github.com/CommanderRoot) |[czj](https://github.com/czj) |[cbush06](https://github.com/cbush06) | -:---: |:---: |:---: |:---: |:---: |:---: | -[YehudaKremer](https://github.com/YehudaKremer) |[sercraig](https://github.com/sercraig) |[ardeois](https://github.com/ardeois) |[CommanderRoot](https://github.com/CommanderRoot) |[czj](https://github.com/czj) |[cbush06](https://github.com/cbush06) | +| [YehudaKremer](https://github.com/YehudaKremer) | [sercraig](https://github.com/sercraig) | [ardeois](https://github.com/ardeois) | [CommanderRoot](https://github.com/CommanderRoot) | [czj](https://github.com/czj) | [cbush06](https://github.com/cbush06) | +| :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | +| [YehudaKremer](https://github.com/YehudaKremer) | [sercraig](https://github.com/sercraig) | [ardeois](https://github.com/ardeois) | [CommanderRoot](https://github.com/CommanderRoot) | [czj](https://github.com/czj) | [cbush06](https://github.com/cbush06) | -[Aarbel](https://github.com/Aarbel) |[cfra](https://github.com/cfra) |[csprance](https://github.com/csprance) |[prattcmp](https://github.com/prattcmp) |[subvertallchris](https://github.com/subvertallchris) |[charlybillaud](https://github.com/charlybillaud) | -:---: |:---: |:---: |:---: |:---: |:---: | -[Aarbel](https://github.com/Aarbel) |[cfra](https://github.com/cfra) |[csprance](https://github.com/csprance) |[prattcmp](https://github.com/prattcmp) |[subvertallchris](https://github.com/subvertallchris) |[charlybillaud](https://github.com/charlybillaud) | +| [Aarbel](https://github.com/Aarbel) | [cfra](https://github.com/cfra) | [csprance](https://github.com/csprance) | [prattcmp](https://github.com/prattcmp) | [subvertallchris](https://github.com/subvertallchris) | [charlybillaud](https://github.com/charlybillaud) | +| :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | +| [Aarbel](https://github.com/Aarbel) | [cfra](https://github.com/cfra) | [csprance](https://github.com/csprance) | [prattcmp](https://github.com/prattcmp) | [subvertallchris](https://github.com/subvertallchris) | [charlybillaud](https://github.com/charlybillaud) | -[Cretezy](https://github.com/Cretezy) |[chao](https://github.com/chao) |[cellvinchung](https://github.com/cellvinchung) |[cartfisk](https://github.com/cartfisk) |[cyu](https://github.com/cyu) |[bryanjswift](https://github.com/bryanjswift) | -:---: |:---: |:---: |:---: |:---: |:---: | -[Cretezy](https://github.com/Cretezy) |[chao](https://github.com/chao) |[cellvinchung](https://github.com/cellvinchung) |[cartfisk](https://github.com/cartfisk) |[cyu](https://github.com/cyu) |[bryanjswift](https://github.com/bryanjswift) | +| [Cretezy](https://github.com/Cretezy) | [chao](https://github.com/chao) | [cellvinchung](https://github.com/cellvinchung) | [cartfisk](https://github.com/cartfisk) | [cyu](https://github.com/cyu) | [bryanjswift](https://github.com/bryanjswift) | +| :---------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | +| [Cretezy](https://github.com/Cretezy) | [chao](https://github.com/chao) | [cellvinchung](https://github.com/cellvinchung) | [cartfisk](https://github.com/cartfisk) | [cyu](https://github.com/cyu) | [bryanjswift](https://github.com/bryanjswift) | -[functino](https://github.com/functino) |[firesharkstudios](https://github.com/firesharkstudios) |[yoldar](https://github.com/yoldar) |[efbautista](https://github.com/efbautista) |[emuell](https://github.com/emuell) |[EdgarSantiago93](https://github.com/EdgarSantiago93) | -:---: |:---: |:---: |:---: |:---: |:---: | -[functino](https://github.com/functino) |[firesharkstudios](https://github.com/firesharkstudios) |[yoldar](https://github.com/yoldar) |[efbautista](https://github.com/efbautista) |[emuell](https://github.com/emuell) |[EdgarSantiago93](https://github.com/EdgarSantiago93) | +| [functino](https://github.com/functino) | [firesharkstudios](https://github.com/firesharkstudios) | [yoldar](https://github.com/yoldar) | [efbautista](https://github.com/efbautista) | [emuell](https://github.com/emuell) | [EdgarSantiago93](https://github.com/EdgarSantiago93) | +| :----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------: | +| [functino](https://github.com/functino) | [firesharkstudios](https://github.com/firesharkstudios) | [yoldar](https://github.com/yoldar) | [efbautista](https://github.com/efbautista) | [emuell](https://github.com/emuell) | [EdgarSantiago93](https://github.com/EdgarSantiago93) | -[sweetro](https://github.com/sweetro) |[jeetiss](https://github.com/jeetiss) |[DennisKofflard](https://github.com/DennisKofflard) |[hoangsvit](https://github.com/hoangsvit) |[davilima6](https://github.com/davilima6) |[akizor](https://github.com/akizor) | -:---: |:---: |:---: |:---: |:---: |:---: | -[sweetro](https://github.com/sweetro) |[jeetiss](https://github.com/jeetiss) |[DennisKofflard](https://github.com/DennisKofflard) |[hoangsvit](https://github.com/hoangsvit) |[davilima6](https://github.com/davilima6) |[akizor](https://github.com/akizor) | +| [sweetro](https://github.com/sweetro) | [jeetiss](https://github.com/jeetiss) | [DennisKofflard](https://github.com/DennisKofflard) | [hoangsvit](https://github.com/hoangsvit) | [davilima6](https://github.com/davilima6) | [akizor](https://github.com/akizor) | +| :---------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | +| [sweetro](https://github.com/sweetro) | [jeetiss](https://github.com/jeetiss) | [DennisKofflard](https://github.com/DennisKofflard) | [hoangsvit](https://github.com/hoangsvit) | [davilima6](https://github.com/davilima6) | [akizor](https://github.com/akizor) | -[KaminskiDaniell](https://github.com/KaminskiDaniell) |[Cantabar](https://github.com/Cantabar) |[mrboomer](https://github.com/mrboomer) |[danilat](https://github.com/danilat) |[danschalow](https://github.com/danschalow) |[danmichaelo](https://github.com/danmichaelo) | -:---: |:---: |:---: |:---: |:---: |:---: | -[KaminskiDaniell](https://github.com/KaminskiDaniell) |[Cantabar](https://github.com/Cantabar) |[mrboomer](https://github.com/mrboomer) |[danilat](https://github.com/danilat) |[danschalow](https://github.com/danschalow) |[danmichaelo](https://github.com/danmichaelo) | +| [KaminskiDaniell](https://github.com/KaminskiDaniell) | [Cantabar](https://github.com/Cantabar) | [mrboomer](https://github.com/mrboomer) | [danilat](https://github.com/danilat) | [danschalow](https://github.com/danschalow) | [danmichaelo](https://github.com/danmichaelo) | +| :--------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | +| [KaminskiDaniell](https://github.com/KaminskiDaniell) | [Cantabar](https://github.com/Cantabar) | [mrboomer](https://github.com/mrboomer) | [danilat](https://github.com/danilat) | [danschalow](https://github.com/danschalow) | [danmichaelo](https://github.com/danmichaelo) | -[Cruaier](https://github.com/Cruaier) |[amitport](https://github.com/amitport) |[tekacs](https://github.com/tekacs) |[Dogfalo](https://github.com/Dogfalo) |[alirezahi](https://github.com/alirezahi) |[aalepis](https://github.com/aalepis) | -:---: |:---: |:---: |:---: |:---: |:---: | -[Cruaier](https://github.com/Cruaier) |[amitport](https://github.com/amitport) |[tekacs](https://github.com/tekacs) |[Dogfalo](https://github.com/Dogfalo) |[alirezahi](https://github.com/alirezahi) |[aalepis](https://github.com/aalepis) | +| [Cruaier](https://github.com/Cruaier) | [amitport](https://github.com/amitport) | [tekacs](https://github.com/tekacs) | [Dogfalo](https://github.com/Dogfalo) | [alirezahi](https://github.com/alirezahi) | [aalepis](https://github.com/aalepis) | +| :---------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | +| [Cruaier](https://github.com/Cruaier) | [amitport](https://github.com/amitport) | [tekacs](https://github.com/tekacs) | [Dogfalo](https://github.com/Dogfalo) | [alirezahi](https://github.com/alirezahi) | [aalepis](https://github.com/aalepis) | -[alexnj](https://github.com/alexnj) |[asmt3](https://github.com/asmt3) |[ahmadissa](https://github.com/ahmadissa) |[adritasharma](https://github.com/adritasharma) |[Adrrei](https://github.com/Adrrei) |[adityapatadia](https://github.com/adityapatadia) | -:---: |:---: |:---: |:---: |:---: |:---: | -[alexnj](https://github.com/alexnj) |[asmt3](https://github.com/asmt3) |[ahmadissa](https://github.com/ahmadissa) |[adritasharma](https://github.com/adritasharma) |[Adrrei](https://github.com/Adrrei) |[adityapatadia](https://github.com/adityapatadia) | +| [alexnj](https://github.com/alexnj) | [asmt3](https://github.com/asmt3) | [ahmadissa](https://github.com/ahmadissa) | [adritasharma](https://github.com/adritasharma) | [Adrrei](https://github.com/Adrrei) | [adityapatadia](https://github.com/adityapatadia) | +| :------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | +| [alexnj](https://github.com/alexnj) | [asmt3](https://github.com/asmt3) | [ahmadissa](https://github.com/ahmadissa) | [adritasharma](https://github.com/adritasharma) | [Adrrei](https://github.com/Adrrei) | [adityapatadia](https://github.com/adityapatadia) | -[adamvigneault](https://github.com/adamvigneault) |[ajh-sr](https://github.com/ajh-sr) |[adamdottv](https://github.com/adamdottv) |[abannach](https://github.com/abannach) |[superhawk610](https://github.com/superhawk610) |[ajschmidt8](https://github.com/ajschmidt8) | -:---: |:---: |:---: |:---: |:---: |:---: | -[adamvigneault](https://github.com/adamvigneault) |[ajh-sr](https://github.com/ajh-sr) |[adamdottv](https://github.com/adamdottv) |[abannach](https://github.com/abannach) |[superhawk610](https://github.com/superhawk610) |[ajschmidt8](https://github.com/ajschmidt8) | +| [adamvigneault](https://github.com/adamvigneault) | [ajh-sr](https://github.com/ajh-sr) | [adamdottv](https://github.com/adamdottv) | [abannach](https://github.com/abannach) | [superhawk610](https://github.com/superhawk610) | [ajschmidt8](https://github.com/ajschmidt8) | +| :----------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | +| [adamvigneault](https://github.com/adamvigneault) | [ajh-sr](https://github.com/ajh-sr) | [adamdottv](https://github.com/adamdottv) | [abannach](https://github.com/abannach) | [superhawk610](https://github.com/superhawk610) | [ajschmidt8](https://github.com/ajschmidt8) | -[bedgerotto](https://github.com/bedgerotto) |[wbaaron](https://github.com/wbaaron) |[Quorafind](https://github.com/Quorafind) |[bducharme](https://github.com/bducharme) |[azizk](https://github.com/azizk) |[azeemba](https://github.com/azeemba) | -:---: |:---: |:---: |:---: |:---: |:---: | -[bedgerotto](https://github.com/bedgerotto) |[wbaaron](https://github.com/wbaaron) |[Quorafind](https://github.com/Quorafind) |[bducharme](https://github.com/bducharme) |[azizk](https://github.com/azizk) |[azeemba](https://github.com/azeemba) | +| [bedgerotto](https://github.com/bedgerotto) | [wbaaron](https://github.com/wbaaron) | [Quorafind](https://github.com/Quorafind) | [bducharme](https://github.com/bducharme) | [azizk](https://github.com/azizk) | [azeemba](https://github.com/azeemba) | +| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | +| [bedgerotto](https://github.com/bedgerotto) | [wbaaron](https://github.com/wbaaron) | [Quorafind](https://github.com/Quorafind) | [bducharme](https://github.com/bducharme) | [azizk](https://github.com/azizk) | [azeemba](https://github.com/azeemba) | -[ayhankesicioglu](https://github.com/ayhankesicioglu) |[atsawin](https://github.com/atsawin) |[ash-jc-allen](https://github.com/ash-jc-allen) |[apuyou](https://github.com/apuyou) |[arthurdenner](https://github.com/arthurdenner) |[Abourass](https://github.com/Abourass) | -:---: |:---: |:---: |:---: |:---: |:---: | -[ayhankesicioglu](https://github.com/ayhankesicioglu) |[atsawin](https://github.com/atsawin) |[ash-jc-allen](https://github.com/ash-jc-allen) |[apuyou](https://github.com/apuyou) |[arthurdenner](https://github.com/arthurdenner) |[Abourass](https://github.com/Abourass) | +| [ayhankesicioglu](https://github.com/ayhankesicioglu) | [atsawin](https://github.com/atsawin) | [ash-jc-allen](https://github.com/ash-jc-allen) | [apuyou](https://github.com/apuyou) | [arthurdenner](https://github.com/arthurdenner) | [Abourass](https://github.com/Abourass) | +| :--------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | +| [ayhankesicioglu](https://github.com/ayhankesicioglu) | [atsawin](https://github.com/atsawin) | [ash-jc-allen](https://github.com/ash-jc-allen) | [apuyou](https://github.com/apuyou) | [arthurdenner](https://github.com/arthurdenner) | [Abourass](https://github.com/Abourass) | -[tyndria](https://github.com/tyndria) |[anthony0030](https://github.com/anthony0030) |[andychongyz](https://github.com/andychongyz) |[andrii-bodnar](https://github.com/andrii-bodnar) |[superandrew213](https://github.com/superandrew213) |[radarhere](https://github.com/radarhere) | -:---: |:---: |:---: |:---: |:---: |:---: | -[tyndria](https://github.com/tyndria) |[anthony0030](https://github.com/anthony0030) |[andychongyz](https://github.com/andychongyz) |[andrii-bodnar](https://github.com/andrii-bodnar) |[superandrew213](https://github.com/superandrew213) |[radarhere](https://github.com/radarhere) | +| [tyndria](https://github.com/tyndria) | [anthony0030](https://github.com/anthony0030) | [andychongyz](https://github.com/andychongyz) | [andrii-bodnar](https://github.com/andrii-bodnar) | [superandrew213](https://github.com/superandrew213) | [radarhere](https://github.com/radarhere) | +| :----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | +| [tyndria](https://github.com/tyndria) | [anthony0030](https://github.com/anthony0030) | [andychongyz](https://github.com/andychongyz) | [andrii-bodnar](https://github.com/andrii-bodnar) | [superandrew213](https://github.com/superandrew213) | [radarhere](https://github.com/radarhere) | -[kaspermeinema](https://github.com/kaspermeinema) |[tykarol](https://github.com/tykarol) |[jvelten](https://github.com/jvelten) |[mellow-fellow](https://github.com/mellow-fellow) |[jmontoyaa](https://github.com/jmontoyaa) |[jcalonso](https://github.com/jcalonso) | -:---: |:---: |:---: |:---: |:---: |:---: | -[kaspermeinema](https://github.com/kaspermeinema) |[tykarol](https://github.com/tykarol) |[jvelten](https://github.com/jvelten) |[mellow-fellow](https://github.com/mellow-fellow) |[jmontoyaa](https://github.com/jmontoyaa) |[jcalonso](https://github.com/jcalonso) | +| [kaspermeinema](https://github.com/kaspermeinema) | [tykarol](https://github.com/tykarol) | [jvelten](https://github.com/jvelten) | [mellow-fellow](https://github.com/mellow-fellow) | [jmontoyaa](https://github.com/jmontoyaa) | [jcalonso](https://github.com/jcalonso) | +| :----------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | +| [kaspermeinema](https://github.com/kaspermeinema) | [tykarol](https://github.com/tykarol) | [jvelten](https://github.com/jvelten) | [mellow-fellow](https://github.com/mellow-fellow) | [jmontoyaa](https://github.com/jmontoyaa) | [jcalonso](https://github.com/jcalonso) | -[jbelej](https://github.com/jbelej) |[jszobody](https://github.com/jszobody) |[jorgeepc](https://github.com/jorgeepc) |[jondewoo](https://github.com/jondewoo) |[jonathanarbely](https://github.com/jonathanarbely) |[jsanchez034](https://github.com/jsanchez034) | -:---: |:---: |:---: |:---: |:---: |:---: | -[jbelej](https://github.com/jbelej) |[jszobody](https://github.com/jszobody) |[jorgeepc](https://github.com/jorgeepc) |[jondewoo](https://github.com/jondewoo) |[jonathanarbely](https://github.com/jonathanarbely) |[jsanchez034](https://github.com/jsanchez034) | +| [jbelej](https://github.com/jbelej) | [jszobody](https://github.com/jszobody) | [jorgeepc](https://github.com/jorgeepc) | [jondewoo](https://github.com/jondewoo) | [jonathanarbely](https://github.com/jonathanarbely) | [jsanchez034](https://github.com/jsanchez034) | +| :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | +| [jbelej](https://github.com/jbelej) | [jszobody](https://github.com/jszobody) | [jorgeepc](https://github.com/jorgeepc) | [jondewoo](https://github.com/jondewoo) | [jonathanarbely](https://github.com/jonathanarbely) | [jsanchez034](https://github.com/jsanchez034) | -[Jokcy](https://github.com/Jokcy) |[chromacoma](https://github.com/chromacoma) |[profsmallpine](https://github.com/profsmallpine) |[theJoeBiz](https://github.com/theJoeBiz) |[huydod](https://github.com/huydod) |[lucax88x](https://github.com/lucax88x) | -:---: |:---: |:---: |:---: |:---: |:---: | -[Jokcy](https://github.com/Jokcy) |[chromacoma](https://github.com/chromacoma) |[profsmallpine](https://github.com/profsmallpine) |[theJoeBiz](https://github.com/theJoeBiz) |[huydod](https://github.com/huydod) |[lucax88x](https://github.com/lucax88x) | +| [Jokcy](https://github.com/Jokcy) | [chromacoma](https://github.com/chromacoma) | [profsmallpine](https://github.com/profsmallpine) | [theJoeBiz](https://github.com/theJoeBiz) | [huydod](https://github.com/huydod) | [lucax88x](https://github.com/lucax88x) | +| :-----------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | +| [Jokcy](https://github.com/Jokcy) | [chromacoma](https://github.com/chromacoma) | [profsmallpine](https://github.com/profsmallpine) | [theJoeBiz](https://github.com/theJoeBiz) | [huydod](https://github.com/huydod) | [lucax88x](https://github.com/lucax88x) | -[lucaperret](https://github.com/lucaperret) |[ombr](https://github.com/ombr) |[louim](https://github.com/louim) |[dolphinigle](https://github.com/dolphinigle) |[leomelzer](https://github.com/leomelzer) |[leods92](https://github.com/leods92) | -:---: |:---: |:---: |:---: |:---: |:---: | -[lucaperret](https://github.com/lucaperret) |[ombr](https://github.com/ombr) |[louim](https://github.com/louim) |[dolphinigle](https://github.com/dolphinigle) |[leomelzer](https://github.com/leomelzer) |[leods92](https://github.com/leods92) | +| [lucaperret](https://github.com/lucaperret) | [ombr](https://github.com/ombr) | [louim](https://github.com/louim) | [dolphinigle](https://github.com/dolphinigle) | [leomelzer](https://github.com/leomelzer) | [leods92](https://github.com/leods92) | +| :---------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | +| [lucaperret](https://github.com/lucaperret) | [ombr](https://github.com/ombr) | [louim](https://github.com/louim) | [dolphinigle](https://github.com/dolphinigle) | [leomelzer](https://github.com/leomelzer) | [leods92](https://github.com/leods92) | -[galli-leo](https://github.com/galli-leo) |[dviry](https://github.com/dviry) |[larowlan](https://github.com/larowlan) |[leaanthony](https://github.com/leaanthony) |[hoangbits](https://github.com/hoangbits) |[labohkip81](https://github.com/labohkip81) | -:---: |:---: |:---: |:---: |:---: |:---: | -[galli-leo](https://github.com/galli-leo) |[dviry](https://github.com/dviry) |[larowlan](https://github.com/larowlan) |[leaanthony](https://github.com/leaanthony) |[hoangbits](https://github.com/hoangbits) |[labohkip81](https://github.com/labohkip81) | +| [galli-leo](https://github.com/galli-leo) | [dviry](https://github.com/dviry) | [larowlan](https://github.com/larowlan) | [leaanthony](https://github.com/leaanthony) | [hoangbits](https://github.com/hoangbits) | [labohkip81](https://github.com/labohkip81) | +| :-------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | +| [galli-leo](https://github.com/galli-leo) | [dviry](https://github.com/dviry) | [larowlan](https://github.com/larowlan) | [leaanthony](https://github.com/leaanthony) | [hoangbits](https://github.com/hoangbits) | [labohkip81](https://github.com/labohkip81) | -[kyleparisi](https://github.com/kyleparisi) |[elkebab](https://github.com/elkebab) |[kidonng](https://github.com/kidonng) |[kevin-west-10x](https://github.com/kevin-west-10x) |[kergekacsa](https://github.com/kergekacsa) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) | -:---: |:---: |:---: |:---: |:---: |:---: | -[kyleparisi](https://github.com/kyleparisi) |[elkebab](https://github.com/elkebab) |[kidonng](https://github.com/kidonng) |[kevin-west-10x](https://github.com/kevin-west-10x) |[kergekacsa](https://github.com/kergekacsa) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) | +| [kyleparisi](https://github.com/kyleparisi) | [elkebab](https://github.com/elkebab) | [kidonng](https://github.com/kidonng) | [kevin-west-10x](https://github.com/kevin-west-10x) | [kergekacsa](https://github.com/kergekacsa) | [HussainAlkhalifah](https://github.com/HussainAlkhalifah) | +| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------: | +| [kyleparisi](https://github.com/kyleparisi) | [elkebab](https://github.com/elkebab) | [kidonng](https://github.com/kidonng) | [kevin-west-10x](https://github.com/kevin-west-10x) | [kergekacsa](https://github.com/kergekacsa) | [HussainAlkhalifah](https://github.com/HussainAlkhalifah) | -[HughbertD](https://github.com/HughbertD) |[hiromi2424](https://github.com/hiromi2424) |[giacomocerquone](https://github.com/giacomocerquone) |[roenschg](https://github.com/roenschg) |[gjungb](https://github.com/gjungb) |[geoffappleford](https://github.com/geoffappleford) | -:---: |:---: |:---: |:---: |:---: |:---: | -[HughbertD](https://github.com/HughbertD) |[hiromi2424](https://github.com/hiromi2424) |[giacomocerquone](https://github.com/giacomocerquone) |[roenschg](https://github.com/roenschg) |[gjungb](https://github.com/gjungb) |[geoffappleford](https://github.com/geoffappleford) | +| [HughbertD](https://github.com/HughbertD) | [hiromi2424](https://github.com/hiromi2424) | [giacomocerquone](https://github.com/giacomocerquone) | [roenschg](https://github.com/roenschg) | [gjungb](https://github.com/gjungb) | [geoffappleford](https://github.com/geoffappleford) | +| :-------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | +| [HughbertD](https://github.com/HughbertD) | [hiromi2424](https://github.com/hiromi2424) | [giacomocerquone](https://github.com/giacomocerquone) | [roenschg](https://github.com/roenschg) | [gjungb](https://github.com/gjungb) | [geoffappleford](https://github.com/geoffappleford) | -[gabiganam](https://github.com/gabiganam) |[fuadscodes](https://github.com/fuadscodes) |[dtrucs](https://github.com/dtrucs) |[ferdiusa](https://github.com/ferdiusa) |[fgallinari](https://github.com/fgallinari) |[Gkleinereva](https://github.com/Gkleinereva) | -:---: |:---: |:---: |:---: |:---: |:---: | -[gabiganam](https://github.com/gabiganam) |[fuadscodes](https://github.com/fuadscodes) |[dtrucs](https://github.com/dtrucs) |[ferdiusa](https://github.com/ferdiusa) |[fgallinari](https://github.com/fgallinari) |[Gkleinereva](https://github.com/Gkleinereva) | +| [gabiganam](https://github.com/gabiganam) | [fuadscodes](https://github.com/fuadscodes) | [dtrucs](https://github.com/dtrucs) | [ferdiusa](https://github.com/ferdiusa) | [fgallinari](https://github.com/fgallinari) | [Gkleinereva](https://github.com/Gkleinereva) | +| :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | +| [gabiganam](https://github.com/gabiganam) | [fuadscodes](https://github.com/fuadscodes) | [dtrucs](https://github.com/dtrucs) | [ferdiusa](https://github.com/ferdiusa) | [fgallinari](https://github.com/fgallinari) | [Gkleinereva](https://github.com/Gkleinereva) | -[epexa](https://github.com/epexa) |[EnricoSottile](https://github.com/EnricoSottile) |[elliotdickison](https://github.com/elliotdickison) |[eliOcs](https://github.com/eliOcs) |[Jmales](https://github.com/Jmales) |[jessica-coursera](https://github.com/jessica-coursera) | -:---: |:---: |:---: |:---: |:---: |:---: | -[epexa](https://github.com/epexa) |[EnricoSottile](https://github.com/EnricoSottile) |[elliotdickison](https://github.com/elliotdickison) |[eliOcs](https://github.com/eliOcs) |[Jmales](https://github.com/Jmales) |[jessica-coursera](https://github.com/jessica-coursera) | +| [epexa](https://github.com/epexa) | [EnricoSottile](https://github.com/EnricoSottile) | [elliotdickison](https://github.com/elliotdickison) | [eliOcs](https://github.com/eliOcs) | [Jmales](https://github.com/Jmales) | [jessica-coursera](https://github.com/jessica-coursera) | +| :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------: | +| [epexa](https://github.com/epexa) | [EnricoSottile](https://github.com/EnricoSottile) | [elliotdickison](https://github.com/elliotdickison) | [eliOcs](https://github.com/eliOcs) | [Jmales](https://github.com/Jmales) | [jessica-coursera](https://github.com/jessica-coursera) | -[vith](https://github.com/vith) |[janwilts](https://github.com/janwilts) |[janklimo](https://github.com/janklimo) |[jamestiotio](https://github.com/jamestiotio) |[jcjmcclean](https://github.com/jcjmcclean) |[Jbithell](https://github.com/Jbithell) | -:---: |:---: |:---: |:---: |:---: |:---: | -[vith](https://github.com/vith) |[janwilts](https://github.com/janwilts) |[janklimo](https://github.com/janklimo) |[jamestiotio](https://github.com/jamestiotio) |[jcjmcclean](https://github.com/jcjmcclean) |[Jbithell](https://github.com/Jbithell) | +| [vith](https://github.com/vith) | [janwilts](https://github.com/janwilts) | [janklimo](https://github.com/janklimo) | [jamestiotio](https://github.com/jamestiotio) | [jcjmcclean](https://github.com/jcjmcclean) | [Jbithell](https://github.com/Jbithell) | +| :---------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------: | +| [vith](https://github.com/vith) | [janwilts](https://github.com/janwilts) | [janklimo](https://github.com/janklimo) | [jamestiotio](https://github.com/jamestiotio) | [jcjmcclean](https://github.com/jcjmcclean) | [Jbithell](https://github.com/Jbithell) | -[JakubHaladej](https://github.com/JakubHaladej) |[jakemcallister](https://github.com/jakemcallister) |[gaejabong](https://github.com/gaejabong) |[JacobMGEvans](https://github.com/JacobMGEvans) |[mazoruss](https://github.com/mazoruss) |[GreenJimmy](https://github.com/GreenJimmy) | -:---: |:---: |:---: |:---: |:---: |:---: | -[JakubHaladej](https://github.com/JakubHaladej) |[jakemcallister](https://github.com/jakemcallister) |[gaejabong](https://github.com/gaejabong) |[JacobMGEvans](https://github.com/JacobMGEvans) |[mazoruss](https://github.com/mazoruss) |[GreenJimmy](https://github.com/GreenJimmy) | +| [JakubHaladej](https://github.com/JakubHaladej) | [jakemcallister](https://github.com/jakemcallister) | [gaejabong](https://github.com/gaejabong) | [JacobMGEvans](https://github.com/JacobMGEvans) | [mazoruss](https://github.com/mazoruss) | [GreenJimmy](https://github.com/GreenJimmy) | +| :--------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | +| [JakubHaladej](https://github.com/JakubHaladej) | [jakemcallister](https://github.com/jakemcallister) | [gaejabong](https://github.com/gaejabong) | [JacobMGEvans](https://github.com/JacobMGEvans) | [mazoruss](https://github.com/mazoruss) | [GreenJimmy](https://github.com/GreenJimmy) | -[intenzive](https://github.com/intenzive) |[NaxYo](https://github.com/NaxYo) |[ishendyweb](https://github.com/ishendyweb) |[IanVS](https://github.com/IanVS) | -:---: |:---: |:---: |:---: | -[intenzive](https://github.com/intenzive) |[NaxYo](https://github.com/NaxYo) |[ishendyweb](https://github.com/ishendyweb) |[IanVS](https://github.com/IanVS) | +| [intenzive](https://github.com/intenzive) | [NaxYo](https://github.com/NaxYo) | [ishendyweb](https://github.com/ishendyweb) | [IanVS](https://github.com/IanVS) | +| :--------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------: | +| [intenzive](https://github.com/intenzive) | [NaxYo](https://github.com/NaxYo) | [ishendyweb](https://github.com/ishendyweb) | [IanVS](https://github.com/IanVS) | ## Software -We use Browserstack for manual testing BrowserStack logo +We use Browserstack for manual testing + +BrowserStack logo + ## License diff --git a/SECURITY.md b/SECURITY.md index bbdaded17e..33e24c7bbc 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,6 +2,10 @@ ## Reporting a Vulnerability -General security issues and concerns are we welcome in the public Github issue tracker: https://github.com/transloadit/uppy/issues. +General security issues and concerns are we welcome in the public Github issue +tracker: https://github.com/transloadit/uppy/issues. -In case of a high risk of the shared vulnerability being exploited, please report it to support@transloadit.com instead, and visit https://transloadit.com/security/ to read about Transloadit’s security policy, and how we generally handle these cases. +In case of a high risk of the shared vulnerability being exploited, please +report it to support@transloadit.com instead, and visit +https://transloadit.com/security/ to read about Transloadit’s security policy, +and how we generally handle these cases. diff --git a/docs/companion.md b/docs/companion.md index efd9920c84..15ca91cacd 100644 --- a/docs/companion.md +++ b/docs/companion.md @@ -247,11 +247,11 @@ Redis so that any instance can serve the client’s requests. Note that sticky sessions are **not** needed with this setup. Here are the requirements for this setup: -* The instances need to be connected to the same Redis server. -* You need to set `COMPANION_SECRET` to the same value on both servers. -* if you use the `companionKeysParams` feature (Transloadit), you also need +- The instances need to be connected to the same Redis server. +- You need to set `COMPANION_SECRET` to the same value on both servers. +- if you use the `companionKeysParams` feature (Transloadit), you also need `COMPANION_PREAUTH_SECRET` to be the same on each instance. -* All other configuration needs to be the same, except if you’re running many +- All other configuration needs to be the same, except if you’re running many instances on the same machine, then `COMPANION_PORT` should be different for each instance. @@ -479,9 +479,9 @@ The name of the bucket to store uploaded files in. It can be function that returns the name of the bucket as a `string` and takes the following arguments: -* [`http.IncomingMessage`][], the HTTP request (will be `null` for remote +- [`http.IncomingMessage`][], the HTTP request (will be `null` for remote uploads) -* metadata provided by the user for the file (will be `undefined` for local +- metadata provided by the user for the file (will be `undefined` for local uploads) ##### `s3.region` `COMPANION_AWS_REGION` @@ -499,9 +499,9 @@ You can supply any [S3 option supported by the AWS SDK](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#constructor-property) in the `providerOptions.s3.awsClientOptions` object, _except for_ the below: -* `accessKeyId`. Instead, use the `providerOptions.s3.key` property. This is to +- `accessKeyId`. Instead, use the `providerOptions.s3.key` property. This is to make configuration names consistent between different Companion features. -* `secretAccessKey`. Instead, use the `providerOptions.s3.secret` property. This +- `secretAccessKey`. Instead, use the `providerOptions.s3.secret` property. This is to make configuration names consistent between different Companion features. @@ -517,12 +517,12 @@ Get the key name for a file. The key is the file path to which the file will be uploaded in your bucket. This option should be a function receiving three arguments: -* `req` [`http.IncomingMessage`][], the HTTP request, for _regular_ S3 uploads +- `req` [`http.IncomingMessage`][], the HTTP request, for _regular_ S3 uploads using the `@uppy/aws-s3` plugin. This parameter is _not_ available for multipart uploads using the `@uppy/aws-s3` or `@uppy/aws-s3-multipart` plugins. This parameter is `null` for remote uploads. -* `filename`, the original name of the uploaded file; -* `metadata`, user-provided metadata for the file. +- `filename`, the original name of the uploaded file; +- `metadata`, user-provided metadata for the file. This function should return a string `key`. The `req` parameter can be used to upload to a user-specific folder in your bucket, for example: @@ -638,7 +638,7 @@ Allowed CORS Origins (default `true`). Passed as the `origin` option in #### `COMPANION_CLIENT_ORIGINS_REGEX` -Like COMPANION\_CLIENT\_ORIGINS, but allows a single regex instead. +Like COMPANION_CLIENT_ORIGINS, but allows a single regex instead. `COMPANION_CLIENT_ORIGINS` will be ignored if this is used. This is a standalone-only option. @@ -662,14 +662,14 @@ Set this to `false` to disable the The object returned by `companion.app()` also has a property `companionEmitter` which is an `EventEmitter` that emits the following events: -* `upload-start` - When an upload starts, this event is emitted with an object +- `upload-start` - When an upload starts, this event is emitted with an object containing the property `token`, which is a unique ID for the upload. -* **token** - The event name is the token from `upload-start`. The event has an +- **token** - The event name is the token from `upload-start`. The event has an object with the following properties: - * `action` - One of the following strings: - * `success` - When the upload succeeds. - * `error` - When the upload fails with an error. - * `payload` - the error or success payload. + - `action` - One of the following strings: + - `success` - When the upload succeeds. + - `error` - When the upload fails with an error. + - `payload` - the error or success payload. Example code for using the `EventEmitter` to handle a finished file upload: @@ -711,28 +711,28 @@ throughout this section. The following steps describe the actions that take place when a user Authenticates and Uploads from Dropbox through Companion: -* The visitor to a website with Uppy clicks `Connect to Dropbox`. -* Uppy sends a request to Companion, which in turn sends an OAuth request to +- The visitor to a website with Uppy clicks `Connect to Dropbox`. +- Uppy sends a request to Companion, which in turn sends an OAuth request to Dropbox (Requires that OAuth credentials from Dropbox have been added to Companion). -* Dropbox asks the visitor to log in, and whether the Website should be allowed +- Dropbox asks the visitor to log in, and whether the Website should be allowed to access your files -* If the visitor agrees, Companion will receive a token from Dropbox, with which +- If the visitor agrees, Companion will receive a token from Dropbox, with which we can temporarily download files. -* Companion encrypts the token with a secret key and sends the encrypted token +- Companion encrypts the token with a secret key and sends the encrypted token to Uppy (client) -* Every time the visitor clicks on a folder in Uppy, it asks Companion for the +- Every time the visitor clicks on a folder in Uppy, it asks Companion for the new list of files, with this question, the token (still encrypted by Companion) is sent along. -* Companion decrypts the token, requests the list of files from Dropbox and +- Companion decrypts the token, requests the list of files from Dropbox and sends it to Uppy. -* When a file is selected for upload, Companion receives the token again +- When a file is selected for upload, Companion receives the token again according to this procedure, decrypts it again, and thereby downloads the file from Dropbox. -* As the bytes arrive, Companion uploads the bytes to the final destination +- As the bytes arrive, Companion uploads the bytes to the final destination (depending on the configuration: Apache, a Tus server, S3 bucket, etc). -* Companion reports progress to Uppy, as if it were a local upload. -* Completed! +- Companion reports progress to Uppy, as if it were a local upload. +- Completed! ### How to use provider redirect URIs? @@ -805,9 +805,9 @@ with an `Error`): directory). See [example returned list data structure](#list-data). `token` - authorization token (retrieved from oauth process) to send along with your request - * `directory` - the id/name of the directory from which data is to be + - `directory` - the id/name of the directory from which data is to be retrieved. This may be ignored if it doesn’t apply to your provider - * `query` - expressjs query params object received by the server (in case + - `query` - expressjs query params object received by the server (in case some data you need in there). 2. `async download ({ token, id, query })` - Downloads a particular file from the provider. Returns an object with a single property `{ stream }` - a @@ -815,27 +815,27 @@ with an `Error`): which will be read from and uploaded to the destination. To prevent memory leaks, make sure you release your stream if you reject this method with an error. - * `token` - authorization token (retrieved from oauth process) to send along + - `token` - authorization token (retrieved from oauth process) to send along with your request. - * `id` - ID of the file being downloaded. - * `query` - expressjs query params object received by the server (in case + - `id` - ID of the file being downloaded. + - `query` - expressjs query params object received by the server (in case some data you need in there). 3. `async size ({ token, id, query })` - Returns the byte size of the file that needs to be downloaded as a `Number`. If the size of the object is not known, `null` may be returned. - * `token` - authorization token (retrieved from oauth process) to send along + - `token` - authorization token (retrieved from oauth process) to send along with your request. - * `id` - ID of the file being downloaded. - * `query` - expressjs query params object received by the server (in case + - `id` - ID of the file being downloaded. + - `query` - expressjs query params object received by the server (in case some data you need in there). The class must also have: -* A unique `static authProvider` string property - a lowercased value which +- A unique `static authProvider` string property - a lowercased value which indicates name of the [`grant`](https://github.com/simov/grant) OAuth2 provider to use (e.g `google` for Google). If your provider doesn’t use OAuth2, you can omit this property. -* A `static` property `static version = 2`, which is the current version of the +- A `static` property `static version = 2`, which is the current version of the Companion Provider API. See also @@ -912,24 +912,15 @@ This would get the Companion instance running on `http://localhost:3020`. It uses [nodemon](https://github.com/remy/nodemon) so it will automatically restart when files are changed. -[`http.incomingmessage`]: https://nodejs.org/api/http.html#class-httpincomingmessage - +[`http.incomingmessage`]: + https://nodejs.org/api/http.html#class-httpincomingmessage [box]: /docs/box - [dropbox]: /docs/dropbox - [facebook]: /docs/facebook - [googledrive]: /docs/google-drive - [instagram]: /docs/instagram - [onedrive]: /docs/onedrive - [unsplash]: /docs/unsplash - [url]: /docs/url - [zoom]: /docs/zoom - [transloadit]: https://transloadit.com diff --git a/docs/guides/building-plugins.md b/docs/guides/building-plugins.md index 164d9ab018..11fe7035c1 100644 --- a/docs/guides/building-plugins.md +++ b/docs/guides/building-plugins.md @@ -8,12 +8,12 @@ You can find already a few useful Uppy plugins out there, but there might come a time when you will want to build your own. Plugins can hook into the upload process or render a custom UI, typically to: -* Render some custom UI element, such as [StatusBar](/docs/status-bar) or +- Render some custom UI element, such as [StatusBar](/docs/status-bar) or [Dashboard](/docs/dashboard). -* Do the actual uploading, such as [XHRUpload](/docs/xhr-upload) or +- Do the actual uploading, such as [XHRUpload](/docs/xhr-upload) or [Tus](/docs/tus). -* Do work before the upload, like compressing an image or calling external API. -* Interact with a third-party service to process uploads correctly, such as +- Do work before the upload, like compressing an image or calling external API. +- Interact with a third-party service to process uploads correctly, such as [Transloadit](/docs/transloadit) or [AwsS3](/docs/aws-s3). See a [full example of a plugin](#example-of-a-custom-plugin) below. @@ -220,9 +220,9 @@ encrypting a large file. In those situations, determinate progress is suitable. Here are the relevant events: -* [`preprocess-progress`](/docs/uppy#preprocess-progress) -* [`upload-progress`](/docs/uppy#upload-progress) -* [`postprocess-progress`](/docs/uppy#postprocess-progress) +- [`preprocess-progress`](/docs/uppy#preprocess-progress) +- [`upload-progress`](/docs/uppy#upload-progress) +- [`postprocess-progress`](/docs/uppy#postprocess-progress) ## JSX diff --git a/docs/guides/choosing-uploader.md b/docs/guides/choosing-uploader.md index d7d3acc436..692265365f 100644 --- a/docs/guides/choosing-uploader.md +++ b/docs/guides/choosing-uploader.md @@ -73,21 +73,12 @@ using the powers of Transloadit services. uploads using the HTTP `PUT` method. [s3-robot]: https://transloadit.com/services/file-exporting/s3-store/ - [transloadit-services]: https://transloadit.com/services/ - [transloadit-concepts]: https://transloadit.com/docs/getting-started/concepts/ - [`@uppy/transloadit`]: /docs/transloadit - [`@uppy/tus`]: /docs/tus - [`@uppy/aws-s3-multipart`]: /docs/aws-s3-multipart - [`@uppy/aws-s3`]: /docs/aws-s3-multipart - [`@uppy/xhr-upload`]: /docs/xhr-upload - [tus]: https://tus.io/ - [tus-implementations]: https://tus.io/implementations.html diff --git a/docs/guides/custom-stores.md b/docs/guides/custom-stores.md index cec288bc0e..2370f92621 100644 --- a/docs/guides/custom-stores.md +++ b/docs/guides/custom-stores.md @@ -7,12 +7,12 @@ same way as the other components in the application. Uppy comes with two state management solutions (stores): -* `@uppy/store-default`, a basic object-based store. -* `@uppy/store-redux`, a store that uses a key in a Redux store. +- `@uppy/store-default`, a basic object-based store. +- `@uppy/store-redux`, a store that uses a key in a Redux store. You can also use a third-party store: -* [uppy-store-ngrx](https://github.com/rimlin/uppy-store-ngrx/), keeping Uppy +- [uppy-store-ngrx](https://github.com/rimlin/uppy-store-ngrx/), keeping Uppy state in a key in an [Ngrx](https://github.com/ngrx/platform) store for use with Angular. @@ -92,9 +92,9 @@ work well with this! An Uppy store is an object with three methods. -* `getState()` - Return the current state object. -* `setState(patch)` - Merge the object `patch` into the current state. -* `subscribe(listener)` - Call `listener` whenever the state changes. `listener` +- `getState()` - Return the current state object. +- `setState(patch)` - Merge the object `patch` into the current state. +- `subscribe(listener)` - Call `listener` whenever the state changes. `listener` is a function that should receive three parameters: `(prevState, nextState, patch)` diff --git a/docs/guides/migration-guides.md b/docs/guides/migration-guides.md index ea08c348de..ca09b5f75f 100644 --- a/docs/guides/migration-guides.md +++ b/docs/guides/migration-guides.md @@ -10,9 +10,9 @@ the same features, but with a more ergonomic and minimal API. But, it didn’t come with its own set of new problems: -* It tries to do the exact same, but it looks like a different product. -* It’s confusing for users whether they want to use Robodog or Uppy directly. -* Robodog is more ergonomic because it’s limited. When you hit such a limit, you +- It tries to do the exact same, but it looks like a different product. +- It’s confusing for users whether they want to use Robodog or Uppy directly. +- Robodog is more ergonomic because it’s limited. When you hit such a limit, you need to refactor everything to Uppy with plugins. This has now led us to deprecating Robodog and embrace Uppy for its strong @@ -238,8 +238,8 @@ To migrate: use exposed options only. ### Known issues -* [`ERESOLVE could not resolve` on npm install](https://github.com/transloadit/uppy/issues/4057). -* [@uppy/svelte reports a broken dependency with the Vite bundler](https://github.com/transloadit/uppy/issues/4069). +- [`ERESOLVE could not resolve` on npm install](https://github.com/transloadit/uppy/issues/4057). +- [@uppy/svelte reports a broken dependency with the Vite bundler](https://github.com/transloadit/uppy/issues/4069). ## Migrate from Companion 3.x to 4.x @@ -319,11 +319,11 @@ bundle size is **25% smaller**! If you want your app to still support older browsers (such as IE11), you may need to add the following polyfills to your bundle: -* [abortcontroller-polyfill](https://github.com/mo/abortcontroller-polyfill) -* [core-js](https://github.com/zloirock/core-js) -* [md-gum-polyfill](https://github.com/mozdevs/mediaDevices-getUserMedia-polyfill) -* [resize-observer-polyfill](https://github.com/que-etc/resize-observer-polyfill) -* [whatwg-fetch](https://github.com/github/fetch) +- [abortcontroller-polyfill](https://github.com/mo/abortcontroller-polyfill) +- [core-js](https://github.com/zloirock/core-js) +- [md-gum-polyfill](https://github.com/mozdevs/mediaDevices-getUserMedia-polyfill) +- [resize-observer-polyfill](https://github.com/que-etc/resize-observer-polyfill) +- [whatwg-fetch](https://github.com/github/fetch) If you’re using a bundler, you need import these before Uppy: @@ -589,7 +589,8 @@ obsolete too. ### That’s it! -Uppy 1.0 will continue to receive bug fixes for three more months (until ), security fixes for one more +Uppy 1.0 will continue to receive bug fixes for three more months (until +), security fixes for one more year (until ), but no more new features after today. Exceptions are unlikely, but _can_ be made – to accommodate those with commercial support contracts, for example. @@ -641,11 +642,7 @@ to: [core]: /docs/uppy/ - [xhr]: /docs/xhr-upload/ - [dashboard]: /docs/dashboard/ - [aws-s3-multipart]: /docs/aws-s3-multipart/ - [tus]: /docs/tus/ diff --git a/examples/aws-companion/README.md b/examples/aws-companion/README.md index be2513a692..23f54dfc7f 100644 --- a/examples/aws-companion/README.md +++ b/examples/aws-companion/README.md @@ -1,8 +1,8 @@ # Uppy + AWS S3 Example -This example uses @uppy/companion with a custom AWS S3 configuration. -Files are uploaded to a randomly named directory inside the `whatever/` -directory in a bucket. +This example uses @uppy/companion with a custom AWS S3 configuration. Files are +uploaded to a randomly named directory inside the `whatever/` directory in a +bucket. ## Run it diff --git a/examples/aws-php/readme.md b/examples/aws-php/readme.md index f396b0c543..aab5814116 100644 --- a/examples/aws-php/readme.md +++ b/examples/aws-php/readme.md @@ -4,7 +4,8 @@ This example uses a server-side PHP endpoint to sign uploads to S3. ## Running It -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```bash yarn || corepack yarn install @@ -13,14 +14,18 @@ yarn build || corepack yarn build That will also install the npm dependencies for this example. -This example also uses the AWS PHP SDK. -To install it, [get composer](https://getcomposer.org) and run `composer update` in this folder. +This example also uses the AWS PHP SDK. To install it, +[get composer](https://getcomposer.org) and run `composer update` in this +folder. ```bash corepack yarn workspace @uppy-example/aws-php exec "composer update" ``` -Configure AWS S3 credentials using [environment variables](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#environment-credentials) or a [credentials file in `~/.aws/credentials`](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#credential-profiles). +Configure AWS S3 credentials using +[environment variables](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#environment-credentials) +or a +[credentials file in `~/.aws/credentials`](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#credential-profiles). Configure a bucket name and region in the `s3-sign.php` file. Then, again in the **repository root**, start this example by doing: @@ -31,7 +36,9 @@ corepack yarn workspace @uppy-example/aws-php start The demo should now be available at http://localhost:8080. -You can use a different S3-compatible service like GCS by configuring that service in `~/.aws/config` and `~/.aws/credentials`, and then providing appropriate environment variables: +You can use a different S3-compatible service like GCS by configuring that +service in `~/.aws/config` and `~/.aws/credentials`, and then providing +appropriate environment variables: ```bash AWS_PROFILE="gcs" \ diff --git a/examples/custom-provider/README.md b/examples/custom-provider/README.md index 741b66d3e4..5595f40055 100644 --- a/examples/custom-provider/README.md +++ b/examples/custom-provider/README.md @@ -1,7 +1,7 @@ # Uppy + Companion + Custom Provider Example -This example uses @uppy/companion with a dummy custom provider. -This serves as an illustration on how integrating custom providers would work +This example uses @uppy/companion with a dummy custom provider. This serves as +an illustration on how integrating custom providers would work ## Run it @@ -9,14 +9,15 @@ This serves as an illustration on how integrating custom providers would work First, you want to set up your environment variable. You can copy the content of `.env.example` and save it in a file named `.env`. You can modify in there all -the information needed for the app to work that should not be committed -(Google keys, Unsplash keys, etc.). +the information needed for the app to work that should not be committed (Google +keys, Unsplash keys, etc.). ```sh [ -f .env ] || cp .env.example .env ``` -To run the example, from the root directory of this repo, run the following commands: +To run the example, from the root directory of this repo, run the following +commands: ```sh corepack yarn install diff --git a/examples/digitalocean-spaces/README.md b/examples/digitalocean-spaces/README.md index b17b0f6a22..a9b4a9cabb 100644 --- a/examples/digitalocean-spaces/README.md +++ b/examples/digitalocean-spaces/README.md @@ -1,13 +1,16 @@ # Uploading to DigitalOcean Spaces -This example uses Uppy to upload files to a [DigitalOcean Space](https://digitaloceanspaces.com/). -DigitalOcean Spaces has an identical API to S3, so we can use the -[AwsS3](https://uppy.io/docs/aws-s3-multipart) plugin. We use @uppy/companion with a -[custom `endpoint` configuration](./server.cjs#L39) that points to DigitalOcean. +This example uses Uppy to upload files to a +[DigitalOcean Space](https://digitaloceanspaces.com/). DigitalOcean Spaces has +an identical API to S3, so we can use the +[AwsS3](https://uppy.io/docs/aws-s3-multipart) plugin. We use @uppy/companion +with a [custom `endpoint` configuration](./server.cjs#L39) that points to +DigitalOcean. ## Running it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```bash corepack yarn install @@ -17,10 +20,10 @@ corepack yarn build That will also install the dependencies for this example. First, set up the `COMPANION_AWS_KEY`, `COMPANION_AWS_SECRET`, -`COMPANION_AWS_REGION` (use a DigitalOcean region name for `COMPANION_AWS_REGION`, -e.g. `nyc3`), and `COMPANION_AWS_BUCKET` environment variables for -`@uppy/companion` in a `.env` file. You may find useful to first copy the -`.env.example` file: +`COMPANION_AWS_REGION` (use a DigitalOcean region name for +`COMPANION_AWS_REGION`, e.g. `nyc3`), and `COMPANION_AWS_BUCKET` environment +variables for `@uppy/companion` in a `.env` file. You may find useful to first +copy the `.env.example` file: ```sh [ -f .env ] || cp .env.example .env diff --git a/examples/multiple-instances/README.md b/examples/multiple-instances/README.md index 7a6c9a1fe9..ca6a469b5f 100644 --- a/examples/multiple-instances/README.md +++ b/examples/multiple-instances/README.md @@ -1,11 +1,13 @@ # Multiple Instances -This example uses Uppy with the `@uppy/golden-retriever` plugin. -It has two instances on the same page, side-by-side, but with different `id`s so their stored files don't interfere with each other. +This example uses Uppy with the `@uppy/golden-retriever` plugin. It has two +instances on the same page, side-by-side, but with different `id`s so their +stored files don't interfere with each other. ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```bash corepack yarn install diff --git a/examples/node-xhr/README.md b/examples/node-xhr/README.md index 5913d02e5f..601f8af48f 100644 --- a/examples/node-xhr/README.md +++ b/examples/node-xhr/README.md @@ -1,10 +1,12 @@ # Uppy + Node Example -This example uses Node server and `@uppy/xhr-upload` to upload files to the local file system. +This example uses Node server and `@uppy/xhr-upload` to upload files to the +local file system. ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```sh corepack yarn install diff --git a/examples/php-xhr/README.md b/examples/php-xhr/README.md index 71f74de432..3a743b5849 100644 --- a/examples/php-xhr/README.md +++ b/examples/php-xhr/README.md @@ -1,10 +1,12 @@ # Uppy + PHP Example -This example uses PHP server and `@uppy/xhr-upload` to upload files to the local file system. +This example uses PHP server and `@uppy/xhr-upload` to upload files to the local +file system. ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```sh corepack yarn install diff --git a/examples/python-xhr/README.md b/examples/python-xhr/README.md index 4048247a8d..89a3e77995 100644 --- a/examples/python-xhr/README.md +++ b/examples/python-xhr/README.md @@ -1,10 +1,12 @@ # Uppy + Python Example -This example uses a Python Flask server and `@uppy/xhr-upload` to upload files to the local file system. +This example uses a Python Flask server and `@uppy/xhr-upload` to upload files +to the local file system. ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```sh corepack yarn install @@ -13,7 +15,8 @@ corepack yarn build That will also install the npm dependencies for this example. -Additionally, this example uses python dependencies. Move into this directory, and install them using pip: +Additionally, this example uses python dependencies. Move into this directory, +and install them using pip: ```sh corepack yarn workspace @uppy-example/python-xhr installPythonDeps diff --git a/examples/react-example/README.md b/examples/react-example/README.md index 8237b6177a..8ecd1a3625 100644 --- a/examples/react-example/README.md +++ b/examples/react-example/README.md @@ -11,7 +11,7 @@ corepack yarn build corepack yarn workspace @uppy-example/react dev ``` -If you'd like to use a different package manager than Yarn (e.g. npm) to work +If you'd like to use a different package manager than Yarn (e.g. npm) to work with this example, you can extract it from the workspace like this: ```sh diff --git a/examples/react-native-expo/readme.md b/examples/react-native-expo/readme.md index b389c71e90..aa2933f0bd 100644 --- a/examples/react-native-expo/readme.md +++ b/examples/react-native-expo/readme.md @@ -2,11 +2,14 @@ ⚠️ In Beta -`@uppy/react-native` is a basic Uppy component for React Native with Expo. It is in Beta, and is not full-featured. You can select local images or videos, take a picture with a camera or add any file from a remote url with Uppy Companion. +`@uppy/react-native` is a basic Uppy component for React Native with Expo. It is +in Beta, and is not full-featured. You can select local images or videos, take a +picture with a camera or add any file from a remote url with Uppy Companion. ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```bash yarn install @@ -22,4 +25,5 @@ cd examples/react-native-expo yarn start ``` -Then you'll see a menu within your terminal where you can chose where to open the app (Android, iOS, device etc.) +Then you'll see a menu within your terminal where you can chose where to open +the app (Android, iOS, device etc.) diff --git a/examples/redux/README.md b/examples/redux/README.md index d3dea6e5f0..991066bf63 100644 --- a/examples/redux/README.md +++ b/examples/redux/README.md @@ -1,14 +1,18 @@ # Redux -This example uses Uppy with a Redux store. -The same Redux store is also used for other parts of the application, namely the counter example. -Each action is logged to the console using [redux-logger](https://github.com/theaqua/redux-logger). +This example uses Uppy with a Redux store. The same Redux store is also used for +other parts of the application, namely the counter example. Each action is +logged to the console using +[redux-logger](https://github.com/theaqua/redux-logger). -This example supports the [Redux Devtools extension](https://github.com/zalmoxisus/redux-devtools-extension), including time travel. +This example supports the +[Redux Devtools extension](https://github.com/zalmoxisus/redux-devtools-extension), +including time travel. ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```sh corepack yarn install diff --git a/examples/svelte-example/README.md b/examples/svelte-example/README.md index 9f1da60497..2e1b7e12ed 100644 --- a/examples/svelte-example/README.md +++ b/examples/svelte-example/README.md @@ -2,7 +2,8 @@ ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```sh corepack yarn install diff --git a/examples/transloadit-markdown-bin/README.md b/examples/transloadit-markdown-bin/README.md index 2d22d99563..5a8f2f8783 100644 --- a/examples/transloadit-markdown-bin/README.md +++ b/examples/transloadit-markdown-bin/README.md @@ -4,7 +4,8 @@ This example uses Uppy to handle images in a markdown editor. ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```sh corepack yarn install @@ -17,4 +18,4 @@ Then, again in the **repository root**, start this example by doing: ```sh corepack yarn workspace @uppy-example/transloadit-markdown-bin start -``` \ No newline at end of file +``` diff --git a/examples/transloadit/README.md b/examples/transloadit/README.md index 8fb41a3480..049a8fd7fa 100644 --- a/examples/transloadit/README.md +++ b/examples/transloadit/README.md @@ -5,7 +5,8 @@ This example shows how to make advantage of Uppy API to upload files to ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```sh corepack yarn install diff --git a/examples/uppy-with-companion/README.md b/examples/uppy-with-companion/README.md index 0ed7a0cc9c..9be00ecf37 100644 --- a/examples/uppy-with-companion/README.md +++ b/examples/uppy-with-companion/README.md @@ -1,10 +1,12 @@ # @uppy/companion example -This is a simple, lean example that combines the usage of @uppy/companion and uppy client. +This is a simple, lean example that combines the usage of @uppy/companion and +uppy client. ## Test it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```bash corepack yarn install diff --git a/examples/vue/README.md b/examples/vue/README.md index eb9b3722c0..b9e2194a81 100644 --- a/examples/vue/README.md +++ b/examples/vue/README.md @@ -3,7 +3,8 @@ You’re browsing the documentation for Vue v2.x and earlier. Check out [Vue 3 example](../vue3/) for new projects. -To run the example, from the root directory of this repo, run the following commands: +To run the example, from the root directory of this repo, run the following +commands: ```sh corepack yarn install diff --git a/examples/vue3/README.md b/examples/vue3/README.md index 442c7414ec..41378f1554 100644 --- a/examples/vue3/README.md +++ b/examples/vue3/README.md @@ -1,6 +1,7 @@ # Vue 3 example -To run the example, from the root directory of this repo, run the following commands: +To run the example, from the root directory of this repo, run the following +commands: ```sh cp .env.example .env diff --git a/examples/xhr-bundle/README.md b/examples/xhr-bundle/README.md index fef3e256f7..ab0bc931b6 100644 --- a/examples/xhr-bundle/README.md +++ b/examples/xhr-bundle/README.md @@ -1,12 +1,19 @@ # XHR Bundle Upload -This example uses Uppy with XHRUpload plugin in `bundle` mode. Bundle mode uploads all files to the endpoint in a single request, instead of firing off a new request for each file. This makes uploading a bit slower, but it may be easier to handle on the server side, depending on your setup. +This example uses Uppy with XHRUpload plugin in `bundle` mode. Bundle mode +uploads all files to the endpoint in a single request, instead of firing off a +new request for each file. This makes uploading a bit slower, but it may be +easier to handle on the server side, depending on your setup. -[`server.cjs`](./server.cjs) contains an example express.js server that receives a multipart form-data upload and responds with some information about the files that were received (name, size) as JSON. It uses [multer](https://npmjs.com/package/multer) to parse the upload stream. +[`server.cjs`](./server.cjs) contains an example express.js server that receives +a multipart form-data upload and responds with some information about the files +that were received (name, size) as JSON. It uses +[multer](https://npmjs.com/package/multer) to parse the upload stream. ## Run it -To run this example, make sure you've correctly installed the **repository root**: +To run this example, make sure you've correctly installed the **repository +root**: ```sh corepack yarn install diff --git a/packages/@uppy/audio/README.md b/packages/@uppy/audio/README.md index 4f149935f9..5a56280169 100644 --- a/packages/@uppy/audio/README.md +++ b/packages/@uppy/audio/README.md @@ -2,11 +2,16 @@ Uppy logo: a smiling puppy above a pink upwards arrow -CI status for Uppy testsCI status for Companion testsCI status for browser tests + +CI status for Uppy tests +CI status for Companion tests +CI status for browser tests -The Audio plugin for Uppy lets you record audio using a built-in or external microphone, or any other audio device, on desktop and mobile. +The Audio plugin for Uppy lets you record audio using a built-in or external +microphone, or any other audio device, on desktop and mobile. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -24,11 +29,15 @@ uppy.use(Audio) $ npm install @uppy/audio ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/webcam). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/webcam). ## License diff --git a/packages/@uppy/aws-s3-multipart/README.md b/packages/@uppy/aws-s3-multipart/README.md index 02e189b551..4b6ea35cc6 100644 --- a/packages/@uppy/aws-s3-multipart/README.md +++ b/packages/@uppy/aws-s3-multipart/README.md @@ -7,9 +7,13 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The AwsS3Multipart plugin can be used to upload files directly to an S3 bucket using S3’s Multipart upload strategy. With this strategy, files are chopped up in parts of 5MB+ each, so they can be uploaded concurrently. It’s also reliable: if a single part fails to upload, only that 5MB has to be retried. +The AwsS3Multipart plugin can be used to upload files directly to an S3 bucket +using S3’s Multipart upload strategy. With this strategy, files are chopped up +in parts of 5MB+ each, so they can be uploaded concurrently. It’s also reliable: +if a single part fails to upload, only that 5MB has to be retried. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -30,11 +34,15 @@ uppy.use(AwsS3Multipart, { $ npm install @uppy/aws-s3-multipart ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/aws-s3-multipart). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/aws-s3-multipart). ## License diff --git a/packages/@uppy/aws-s3/README.md b/packages/@uppy/aws-s3/README.md index 2754ea6c00..d3707973c4 100644 --- a/packages/@uppy/aws-s3/README.md +++ b/packages/@uppy/aws-s3/README.md @@ -7,9 +7,11 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The AwsS3 plugin can be used to upload files directly to an S3 bucket. Uploads can be signed using Companion or a custom signing function. +The AwsS3 plugin can be used to upload files directly to an S3 bucket. Uploads +can be signed using Companion or a custom signing function. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -31,11 +33,15 @@ uppy.use(AwsS3, { $ npm install @uppy/aws-s3 ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/aws-s3). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/aws-s3). ## License diff --git a/packages/@uppy/box/README.md b/packages/@uppy/box/README.md index 4bcc609157..baefa9e003 100644 --- a/packages/@uppy/box/README.md +++ b/packages/@uppy/box/README.md @@ -9,9 +9,13 @@ The Box plugin for Uppy lets users import files from their Box account. -A Companion instance is required for the Box plugin to work. Companion handles authentication with Box, downloads files from Box and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection. +A Companion instance is required for the Box plugin to work. Companion handles +authentication with Box, downloads files from Box and uploads them to the +destination. This saves the user bandwidth, especially helpful if they are on a +mobile connection. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -31,11 +35,15 @@ uppy.use(Box, { $ npm install @uppy/box ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/box). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/box). ## License diff --git a/packages/@uppy/companion-client/README.md b/packages/@uppy/companion-client/README.md index 09b5a5a814..f66f294661 100644 --- a/packages/@uppy/companion-client/README.md +++ b/packages/@uppy/companion-client/README.md @@ -7,9 +7,11 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -Client library for communication with Companion. Intended for use in Uppy plugins. +Client library for communication with Companion. Intended for use in Uppy +plugins. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -19,7 +21,9 @@ import { Provider, RequestClient, Socket } from '@uppy/companion-client' const uppy = new Uppy() -const client = new RequestClient(uppy, { companionUrl: 'https://uppy.mywebsite.com/' }) +const client = new RequestClient(uppy, { + companionUrl: 'https://uppy.mywebsite.com/', +}) client.get('/drive/list').then(() => {}) const provider = new Provider(uppy, { @@ -34,7 +38,8 @@ socket.on('progress', () => {}) ## Installation -> Unless you are writing a custom provider plugin, you do not need to install this. +> Unless you are writing a custom provider plugin, you do not need to install +> this. ```bash $ npm install @uppy/companion-client diff --git a/packages/@uppy/companion/ARCHITECTURE.md b/packages/@uppy/companion/ARCHITECTURE.md index 71b46386cb..f98efedc99 100644 --- a/packages/@uppy/companion/ARCHITECTURE.md +++ b/packages/@uppy/companion/ARCHITECTURE.md @@ -1,13 +1,15 @@ -Companion is the server side component for Uppy. It’s built with Express.js. -The purpose of Companion is to interface with third party APIs and handle remote file uploading from them. +Companion is the server side component for Uppy. It’s built with Express.js. The +purpose of Companion is to interface with third party APIs and handle remote +file uploading from them. # How it works ## oAuth with Grant, Sessions -Companion uses an oAuth middleware library called `Grant` to simplify oAuth authentication. -Inside of `config/grant.js`, you configure the oAuth providers you wish to use, providing things like client key, -client secret, scopes, and the callback URL you wish to use. For example: +Companion uses an oAuth middleware library called `Grant` to simplify oAuth +authentication. Inside of `config/grant.js`, you configure the oAuth providers +you wish to use, providing things like client key, client secret, scopes, and +the callback URL you wish to use. For example: ```js const config = { @@ -23,13 +25,20 @@ const config = { } ``` -Once this `google` config is added to `config/grant.js`, Grant automatically creates a route `/connect/google` that -redirects to Google’s oAuth page. So on the client side, you need to link the user to `https://your-server/connect/google`. - -After the user completes the oAuth flow, they should always be redirected to `https://your-server/:provider/redirect`. This endpoint will in turn redirect to `https://your-server/:provider/callback`. -The `/:provider/callback` routes are handled by the `callback` controller at `server/controllers/callback.js`. -This controller receives the oAuth token, generates a json web token with it, and sends the generated json web token to the client by adding it to the cookies. This way companion doesn’t have to save users’ oAuth tokens (which is good from the security perspective). -This json web token would be sent to companion in later requests and the oAuth token can be read from it. +Once this `google` config is added to `config/grant.js`, Grant automatically +creates a route `/connect/google` that redirects to Google’s oAuth page. So on +the client side, you need to link the user to +`https://your-server/connect/google`. + +After the user completes the oAuth flow, they should always be redirected to +`https://your-server/:provider/redirect`. This endpoint will in turn redirect to +`https://your-server/:provider/callback`. The `/:provider/callback` routes are +handled by the `callback` controller at `server/controllers/callback.js`. This +controller receives the oAuth token, generates a json web token with it, and +sends the generated json web token to the client by adding it to the cookies. +This way companion doesn’t have to save users’ oAuth tokens (which is good from +the security perspective). This json web token would be sent to companion in +later requests and the oAuth token can be read from it. ## Routing And Controllers @@ -42,37 +51,61 @@ router.post('/:provider/:action', dispatcher) router.post('/:provider/:action/:id', dispatcher) ``` -Each route is handled by the `dispatcher` controller in `server/controllers/dispatcher.js`, which calls the correct controller based on `:action`. +Each route is handled by the `dispatcher` controller in +`server/controllers/dispatcher.js`, which calls the correct controller based on +`:action`. Here’s the list of provided controllers: -| controller | description | -| ---------- | ----------- | -| `authorized` | checks if the current user is authorized | -| `callback` | handles redirect from oAuth. Stores oAuth token in user session and redirects user | -| `get` | downloads files from third party APIs, writes them to disk, and uploads them to the target server | -| `list` | fetches a list of files, usually from a specified directory | -| `logout` | removes all token info from the user session | +| controller | description | +| ------------ | ------------------------------------------------------------------------------------------------- | +| `authorized` | checks if the current user is authorized | +| `callback` | handles redirect from oAuth. Stores oAuth token in user session and redirects user | +| `get` | downloads files from third party APIs, writes them to disk, and uploads them to the target server | +| `list` | fetches a list of files, usually from a specified directory | +| `logout` | removes all token info from the user session | -These controllers are generalized to work for any provider. The provider specific implementation code for each provider can be found under `server/providers`. +These controllers are generalized to work for any provider. The provider +specific implementation code for each provider can be found under +`server/providers`. ## Adding new providers -To add a new provider to Companion, you need to do two things: add the provider config to `config/grant.js`, and then create a new file in `server/providers` that describes how to interface with the provider’s API. +To add a new provider to Companion, you need to do two things: add the provider +config to `config/grant.js`, and then create a new file in `server/providers` +that describes how to interface with the provider’s API. -We are using a library called [got](https://github.com/sindresorhus/got) to make it easier to interface with third party APIs. +We are using a library called [got](https://github.com/sindresorhus/got) to make +it easier to interface with third party APIs. -Since each API works differently, we need to describe how to `download` and `list` files from the provider in a file within `server/providers`. The name of the file should be the same as what endpoint it will use. For example, `server/providers/foobar.js` if the client requests a list of files from `https://our-server/foobar/list`. +Since each API works differently, we need to describe how to `download` and +`list` files from the provider in a file within `server/providers`. The name of +the file should be the same as what endpoint it will use. For example, +`server/providers/foobar.js` if the client requests a list of files from +`https://our-server/foobar/list`. -**Note:** As of right now, you only need to implement `YourProvider.prototype.list` and `YourProvider.prototype.download` for each provider, I believe. `stats` seems to be used by Dropbox to get a list of files, so that’s required there, but `upload` is optional unless you all decide to allow uploading to third parties. I got that code from an example. +**Note:** As of right now, you only need to implement +`YourProvider.prototype.list` and `YourProvider.prototype.download` for each +provider, I believe. `stats` seems to be used by Dropbox to get a list of files, +so that’s required there, but `upload` is optional unless you all decide to +allow uploading to third parties. I got that code from an example. ## WebSockets -Companion uses WebSockets to transfer `progress` events to the client during file transfers. It’s only set up to transfer progress during Tus uploads to the target server. +Companion uses WebSockets to transfer `progress` events to the client during +file transfers. It’s only set up to transfer progress during Tus uploads to the +target server. -When a request is made to `/:provider/get` to start a transfer, a token is generated and sent back to the client in response. The client then connects to `wss://your-server/whatever-their-token-is`. Any events that are emitted using the token as the name (as in `emitter.emit('whatever-their-token-is', progressData)`) are sent back to the client. +When a request is made to `/:provider/get` to start a transfer, a token is +generated and sent back to the client in response. The client then connects to +`wss://your-server/whatever-their-token-is`. Any events that are emitted using +the token as the name (as in +`emitter.emit('whatever-their-token-is', progressData)`) are sent back to the +client. -WebSockets aren’t particularly secure, but we feel this is safe because the token is only usable during the corresponding file transfer, and no sensitive information is being sent, only a file id and the progress. +WebSockets aren’t particularly secure, but we feel this is safe because the +token is only usable during the corresponding file transfer, and no sensitive +information is being sent, only a file id and the progress. # Design Goals @@ -80,12 +113,22 @@ These are the goals I had in mind while designing and building Companion. ## Standalone Server / Pluggable Module -Companion works as a standalone server. It should also work as a module that can be incorporated into an existing server, so people don’t have to manage another server to use Uppy. +Companion works as a standalone server. It should also work as a module that can +be incorporated into an existing server, so people don’t have to manage another +server to use Uppy. -One issue here is that `Grant` has different versions for Koa, Express, and Hapi. We’re using `grant-express` right now, and also use all express modules. This becomes a problem if someone is using Koa, or Hapi, or something else. I don’t think we can make Companion completely framework agnostic, so best case scenario would be to follow Grant and make versions for Koa, Hapi, and Express. +One issue here is that `Grant` has different versions for Koa, Express, and +Hapi. We’re using `grant-express` right now, and also use all express modules. +This becomes a problem if someone is using Koa, or Hapi, or something else. I +don’t think we can make Companion completely framework agnostic, so best case +scenario would be to follow Grant and make versions for Koa, Hapi, and Express. -All this may be more trouble than it’s worth if no one needs it, so I’d get some community feedback beforehand. +All this may be more trouble than it’s worth if no one needs it, so I’d get some +community feedback beforehand. ## Allow users to add new providers -Suppose a developer wants to use Uppy with a third party API provider that we don’t support. There needs to be some way for them to be able to add their own custom providers, hopefully without having to edit `companion`’s source (adding files to `server/providers`). +Suppose a developer wants to use Uppy with a third party API provider that we +don’t support. There needs to be some way for them to be able to add their own +custom providers, hopefully without having to edit `companion`’s source (adding +files to `server/providers`). diff --git a/packages/@uppy/companion/KUBERNETES.md b/packages/@uppy/companion/KUBERNETES.md index ef7643119b..b9c908bb3a 100644 --- a/packages/@uppy/companion/KUBERNETES.md +++ b/packages/@uppy/companion/KUBERNETES.md @@ -1,12 +1,14 @@ ### Run companion on kubernetes -You can use our docker container to run companion on kubernetes with the following configuration. +You can use our docker container to run companion on kubernetes with the +following configuration. ```bash kubectl create ns uppy ``` -We will need a Redis container that we can get through [helm](https://github.com/kubernetes/helm): +We will need a Redis container that we can get through +[helm](https://github.com/kubernetes/helm): ```bash helm install --name redis \ @@ -20,30 +22,30 @@ We will need a Redis container that we can get through [helm](https://github.com ```yaml apiVersion: v1 data: - COMPANION_CLIENT_ORIGINS: "localhost:3452,uppy.io" - COMPANION_DATADIR: "PATH/TO/DOWNLOAD/DIRECTORY" - COMPANION_DOMAIN: "YOUR SERVER DOMAIN" - COMPANION_DOMAINS: "sub1.domain.com,sub2.domain.com,sub3.domain.com" - COMPANION_PROTOCOL: "YOUR SERVER PROTOCOL" + COMPANION_CLIENT_ORIGINS: 'localhost:3452,uppy.io' + COMPANION_DATADIR: 'PATH/TO/DOWNLOAD/DIRECTORY' + COMPANION_DOMAIN: 'YOUR SERVER DOMAIN' + COMPANION_DOMAINS: 'sub1.domain.com,sub2.domain.com,sub3.domain.com' + COMPANION_PROTOCOL: 'YOUR SERVER PROTOCOL' COMPANION_STREAMING_UPLOAD: true COMPANION_REDIS_URL: redis://:superSecretPassword@uppy-redis.uppy.svc.cluster.local:6379 - COMPANION_SECRET: "shh!Issa Secret!" - COMPANION_PREAUTH_SECRET: "another secret" - COMPANION_DROPBOX_KEY: "YOUR DROPBOX KEY" - COMPANION_DROPBOX_SECRET: "YOUR DROPBOX SECRET" - COMPANION_BOX_KEY: "YOUR BOX KEY" - COMPANION_BOX_SECRET: "YOUR BOX SECRET" - COMPANION_GOOGLE_KEY: "YOUR GOOGLE KEY" - COMPANION_GOOGLE_SECRET: "YOUR GOOGLE SECRET" - COMPANION_INSTAGRAM_KEY: "YOUR INSTAGRAM KEY" - COMPANION_INSTAGRAM_SECRET: "YOUR INSTAGRAM SECRET" - COMPANION_AWS_KEY: "YOUR AWS KEY" - COMPANION_AWS_SECRET: "YOUR AWS SECRET" - COMPANION_AWS_BUCKET: "YOUR AWS S3 BUCKET" - COMPANION_AWS_REGION: "AWS REGION" - COMPANION_AWS_PREFIX: "AWS PREFIX" - COMPANION_OAUTH_DOMAIN: "sub.domain.com" - COMPANION_UPLOAD_URLS: "http://tusd.tusdemo.net/files/,https://tusd.tusdemo.net/files/" + COMPANION_SECRET: 'shh!Issa Secret!' + COMPANION_PREAUTH_SECRET: 'another secret' + COMPANION_DROPBOX_KEY: 'YOUR DROPBOX KEY' + COMPANION_DROPBOX_SECRET: 'YOUR DROPBOX SECRET' + COMPANION_BOX_KEY: 'YOUR BOX KEY' + COMPANION_BOX_SECRET: 'YOUR BOX SECRET' + COMPANION_GOOGLE_KEY: 'YOUR GOOGLE KEY' + COMPANION_GOOGLE_SECRET: 'YOUR GOOGLE SECRET' + COMPANION_INSTAGRAM_KEY: 'YOUR INSTAGRAM KEY' + COMPANION_INSTAGRAM_SECRET: 'YOUR INSTAGRAM SECRET' + COMPANION_AWS_KEY: 'YOUR AWS KEY' + COMPANION_AWS_SECRET: 'YOUR AWS SECRET' + COMPANION_AWS_BUCKET: 'YOUR AWS S3 BUCKET' + COMPANION_AWS_REGION: 'AWS REGION' + COMPANION_AWS_PREFIX: 'AWS PREFIX' + COMPANION_OAUTH_DOMAIN: 'sub.domain.com' + COMPANION_UPLOAD_URLS: 'http://tusd.tusdemo.net/files/,https://tusd.tusdemo.net/files/' kind: Secret metadata: name: companion-env @@ -73,25 +75,25 @@ spec: app: companion spec: containers: - - image: docker.io/transloadit/companion:latest - imagePullPolicy: ifNotPresent - name: companion - resources: - limits: - memory: 150Mi - requests: - memory: 100Mi - envFrom: - - secretRef: - name: companion-env - ports: - - containerPort: 3020 - volumeMounts: - - name: companion-data - mountPath: /mnt/companion-data + - image: docker.io/transloadit/companion:latest + imagePullPolicy: ifNotPresent + name: companion + resources: + limits: + memory: 150Mi + requests: + memory: 100Mi + envFrom: + - secretRef: + name: companion-env + ports: + - containerPort: 3020 + volumeMounts: + - name: companion-data + mountPath: /mnt/companion-data volumes: - - name: companion-data - emptyDir: {} + - name: companion-data + emptyDir: {} ``` ```bash @@ -108,9 +110,9 @@ metadata: namespace: uppy spec: ports: - - port: 80 - targetPort: 3020 - protocol: TCP + - port: 80 + targetPort: 3020 + protocol: TCP selector: app: companion ``` diff --git a/packages/@uppy/companion/README.md b/packages/@uppy/companion/README.md index 5ca4df61d6..bed8ac7829 100644 --- a/packages/@uppy/companion/README.md +++ b/packages/@uppy/companion/README.md @@ -4,10 +4,14 @@ [![Build Status](https://travis-ci.org/transloadit/uppy.svg?branch=main)](https://travis-ci.org/transloadit/uppy) -Companion is a server integration for [Uppy](https://github.com/transloadit/uppy) file uploader. +Companion is a server integration for +[Uppy](https://github.com/transloadit/uppy) file uploader. -It handles the server-to-server communication between your server and file storage providers such as Google Drive, Dropbox, -Instagram, etc. **Companion is not a target to upload files to**. For this, use a server (if you want resumable) or your existing Apache/Nginx server (if you don’t). [See here for full documentation](https://uppy.io/docs/companion/) +It handles the server-to-server communication between your server and file +storage providers such as Google Drive, Dropbox, Instagram, etc. **Companion is +not a target to upload files to**. For this, use a server (if +you want resumable) or your existing Apache/Nginx server (if you don’t). +[See here for full documentation](https://uppy.io/docs/companion/) ## Install @@ -15,11 +19,16 @@ Instagram, etc. **Companion is not a target to upload files to**. For this, use npm install @uppy/companion ``` -If you don’t have a Node.js project with a `package.json` you might want to install/run Companion globally like so: `[sudo] npm install -g @uppy/companion@1.x` (best check the actual latest version, and use that, so (re)installs are reproducible, and upgrades intentional). +If you don’t have a Node.js project with a `package.json` you might want to +install/run Companion globally like so: +`[sudo] npm install -g @uppy/companion@1.x` (best check the actual latest +version, and use that, so (re)installs are reproducible, and upgrades +intentional). ## Usage -companion may either be used as pluggable express app, which you plug to your existing server, or it may also be run as a standalone server: +companion may either be used as pluggable express app, which you plug to your +existing server, or it may also be run as a standalone server: ### Plug to an existing server @@ -52,7 +61,8 @@ const { app: companionApp } = companion.app(options) app.use(companionApp) ``` -To enable companion socket for realtime feed to the client while upload is going on, you call the `socket` method like so. +To enable companion socket for realtime feed to the client while upload is going +on, you call the `socket` method like so. ```javascript // ... @@ -63,14 +73,16 @@ companion.socket(server) ### Run as standalone server -Please make sure that the required env variables are set before runnning/using companion as a standalone server. [See](https://uppy.io/docs/companion/#Configure-Standalone). +Please make sure that the required env variables are set before runnning/using +companion as a standalone server. +[See](https://uppy.io/docs/companion/#Configure-Standalone). ```bash $ companion ``` -If you cloned the repo from GitHub and want to run it as a standalone server, you may also run the following command from within its -directory +If you cloned the repo from GitHub and want to run it as a standalone server, +you may also run the following command from within its directory ```bash npm start @@ -107,6 +119,7 @@ heroku create git push heroku master ``` -Make sure you set the required [environment variables](https://uppy.io/docs/companion/#Configure-Standalone). +Make sure you set the required +[environment variables](https://uppy.io/docs/companion/#Configure-Standalone). See [full documentation](https://uppy.io/docs/companion/) diff --git a/packages/@uppy/compressor/README.md b/packages/@uppy/compressor/README.md index c61d316d7e..aecb028f9e 100644 --- a/packages/@uppy/compressor/README.md +++ b/packages/@uppy/compressor/README.md @@ -2,11 +2,17 @@ Uppy logo: a smiling puppy above a pink upwards arrow - CI status for Uppy tests CI status for Companion tests CI status for browser tests + +CI status for Uppy tests +CI status for Companion tests +CI status for browser tests -The Compressor plugin for Uppy optimizes images (JPEG, PNG, WEBP), saving on average up to 60% in size (roughly 18 MB for 10 images). It uses [Compressor.js](https://github.com/fengyuanchen/compressorjs). +The Compressor plugin for Uppy optimizes images (JPEG, PNG, WEBP), saving on +average up to 60% in size (roughly 18 MB for 10 images). It uses +[Compressor.js](https://github.com/fengyuanchen/compressorjs). -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -24,13 +30,19 @@ uppy.use(Compressor) npm install @uppy/compressor ``` -We recommend installing from yarn or npm, and then using a module bundler such as [Parcel](https://parceljs.org/), [Vite](https://vitejs.dev/) or [Webpack](https://webpack.js.org/). +We recommend installing from yarn or npm, and then using a module bundler such +as [Parcel](https://parceljs.org/), [Vite](https://vitejs.dev/) or +[Webpack](https://webpack.js.org/). -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/compressor). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/compressor). ## License diff --git a/packages/@uppy/core/README.md b/packages/@uppy/core/README.md index ba2bf3cda6..1e9be10554 100644 --- a/packages/@uppy/core/README.md +++ b/packages/@uppy/core/README.md @@ -7,15 +7,20 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly with any application. It’s fast, provides a comprehensible API and lets you worry about more important problems than building a file uploader. +Uppy is a sleek, modular JavaScript file uploader that integrates seamlessly +with any application. It’s fast, provides a comprehensible API and lets you +worry about more important problems than building a file uploader. -* **Fetch** files from local disk, remote urls, Google Drive, Dropbox, Instagram, or snap and record selfies with a camera; -* **Preview** and edit metadata with a nice interface; -* **Upload** to the final destination, optionally process/encode +- **Fetch** files from local disk, remote urls, Google Drive, Dropbox, + Instagram, or snap and record selfies with a camera; +- **Preview** and edit metadata with a nice interface; +- **Upload** to the final destination, optionally process/encode -**[Read the docs](https://uppy.io/docs)** | **[Try Uppy](https://uppy.io/examples/dashboard/)** +**[Read the docs](https://uppy.io/docs)** | +**[Try Uppy](https://uppy.io/examples/dashboard/)** -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -32,11 +37,15 @@ uppy.use(SomePlugin) $ npm install @uppy/core ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/uppy). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/uppy). ## License diff --git a/packages/@uppy/dashboard/README.md b/packages/@uppy/dashboard/README.md index 93d579d923..b879713137 100644 --- a/packages/@uppy/dashboard/README.md +++ b/packages/@uppy/dashboard/README.md @@ -9,16 +9,20 @@ Dashboard is a universal UI plugin for Uppy: -* Drag and Drop, paste, select from local disk / my device -* UI for Webcam and remote sources: Google Drive, Dropbox, Instagram (all optional, added via plugins) -* File previews and info -* Metadata editor -* Progress: total and for individual files -* Ability to pause/resume or cancel (depending on uploader plugin) individual or all files +- Drag and Drop, paste, select from local disk / my device +- UI for Webcam and remote sources: Google Drive, Dropbox, Instagram (all + optional, added via plugins) +- File previews and info +- Metadata editor +- Progress: total and for individual files +- Ability to pause/resume or cancel (depending on uploader plugin) individual or + all files -**[Read the docs](https://uppy.io/docs/dashboard/)** | **[Try it](https://uppy.io/examples/dashboard/)** +**[Read the docs](https://uppy.io/docs/dashboard/)** | +**[Try it](https://uppy.io/examples/dashboard/)** -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -39,11 +43,15 @@ uppy.use(Dashboard, { $ npm install @uppy/dashboard ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/dashboard). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/dashboard). ## License diff --git a/packages/@uppy/drag-drop/README.md b/packages/@uppy/drag-drop/README.md index 52fa83a586..fa6619552c 100644 --- a/packages/@uppy/drag-drop/README.md +++ b/packages/@uppy/drag-drop/README.md @@ -9,9 +9,11 @@ Droppable zone UI for Uppy. Drag and drop files into it to upload. -**[Read the docs](https://uppy.io/docs/dragdrop)** | **[Try it](https://uppy.io/examples/dragdrop/)** +**[Read the docs](https://uppy.io/docs/dragdrop)** | +**[Try it](https://uppy.io/examples/dragdrop/)** -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -31,11 +33,15 @@ uppy.use(DragDrop, { $ npm install @uppy/drag-drop ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/dragdrop). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/dragdrop). ## License diff --git a/packages/@uppy/dropbox/README.md b/packages/@uppy/dropbox/README.md index 31f2660d31..fa47f5039f 100644 --- a/packages/@uppy/dropbox/README.md +++ b/packages/@uppy/dropbox/README.md @@ -9,9 +9,13 @@ The Dropbox plugin for Uppy lets users import files from their Dropbox account. -A Companion instance is required for the Dropbox plugin to work. Companion handles authentication with Dropbox, downloads files from Dropbox and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection. +A Companion instance is required for the Dropbox plugin to work. Companion +handles authentication with Dropbox, downloads files from Dropbox and uploads +them to the destination. This saves the user bandwidth, especially helpful if +they are on a mobile connection. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -31,11 +35,15 @@ uppy.use(Dropbox, { $ npm install @uppy/dropbox ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/dropbox). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/dropbox). ## License diff --git a/packages/@uppy/facebook/README.md b/packages/@uppy/facebook/README.md index b17637dc4f..e2a2edd7e9 100644 --- a/packages/@uppy/facebook/README.md +++ b/packages/@uppy/facebook/README.md @@ -7,11 +7,16 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The Facebook plugin for Uppy lets users import files from their Facebook account. +The Facebook plugin for Uppy lets users import files from their Facebook +account. -A Companion instance is required for the Facebook plugin to work. Companion handles authentication with Facebook, downloads files from Facebook and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection. +A Companion instance is required for the Facebook plugin to work. Companion +handles authentication with Facebook, downloads files from Facebook and uploads +them to the destination. This saves the user bandwidth, especially helpful if +they are on a mobile connection. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -31,11 +36,15 @@ uppy.use(Facebook, { $ npm install @uppy/facebook ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/facebook). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/facebook). ## License diff --git a/packages/@uppy/file-input/README.md b/packages/@uppy/file-input/README.md index 309ccb834e..71b872e725 100644 --- a/packages/@uppy/file-input/README.md +++ b/packages/@uppy/file-input/README.md @@ -7,11 +7,14 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -FileInput is the most barebones UI for selecting files—it shows a single button that, when clicked, opens up the browser’s file selector. +FileInput is the most barebones UI for selecting files—it shows a single button +that, when clicked, opens up the browser’s file selector. -**[Read the docs](https://uppy.io/docs/fileinput)** | **[Try it](https://uppy.io/examples/xhrupload/)** +**[Read the docs](https://uppy.io/docs/fileinput)** | +**[Try it](https://uppy.io/examples/xhrupload/)** -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -31,11 +34,15 @@ uppy.use(FileInput, { $ npm install @uppy/file-input ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/fileinput). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/fileinput). ## License diff --git a/packages/@uppy/form/README.md b/packages/@uppy/form/README.md index 39100e567e..33b478eeef 100644 --- a/packages/@uppy/form/README.md +++ b/packages/@uppy/form/README.md @@ -7,9 +7,13 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The Form plugin collects metadata from any specified `
    ` element, right before Uppy begins uploading/processing files. It optionally appends results back to the form. The appended result is a stringified version of a result returned from `uppy.upload()`. +The Form plugin collects metadata from any specified `` element, right +before Uppy begins uploading/processing files. It optionally appends results +back to the form. The appended result is a stringified version of a result +returned from `uppy.upload()`. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -33,11 +37,15 @@ uppy.use(Form, { $ npm install @uppy/form ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/form). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/form). ## License diff --git a/packages/@uppy/golden-retriever/README.md b/packages/@uppy/golden-retriever/README.md index 0c0134e974..c634040d3d 100644 --- a/packages/@uppy/golden-retriever/README.md +++ b/packages/@uppy/golden-retriever/README.md @@ -7,9 +7,14 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The GoldenRetriever plugin saves selected files in your browser cache (Local Storage for metadata, then Service Worker for all blobs + IndexedDB for small blobs), so that if the browser crashes, Uppy can restore everything and continue uploading like nothing happened. Read more about it [on the blog](https://uppy.io/blog/2017/07/golden-retriever/). +The GoldenRetriever plugin saves selected files in your browser cache (Local +Storage for metadata, then Service Worker for all blobs + IndexedDB for small +blobs), so that if the browser crashes, Uppy can restore everything and continue +uploading like nothing happened. Read more about it +[on the blog](https://uppy.io/blog/2017/07/golden-retriever/). -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -29,11 +34,15 @@ uppy.use(GoldenRetriever, { $ npm install @uppy/golden-retriever ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/golden-retriever). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/golden-retriever). ## License diff --git a/packages/@uppy/google-drive/README.md b/packages/@uppy/google-drive/README.md index b70bb5e041..0ea7370304 100644 --- a/packages/@uppy/google-drive/README.md +++ b/packages/@uppy/google-drive/README.md @@ -7,11 +7,16 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The Google Drive plugin for Uppy lets users import files from their Google Drive account. +The Google Drive plugin for Uppy lets users import files from their Google Drive +account. -A Companion instance is required for the GoogleDrive plugin to work. Companion handles authentication with Google, downloads files from the Drive and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection. +A Companion instance is required for the GoogleDrive plugin to work. Companion +handles authentication with Google, downloads files from the Drive and uploads +them to the destination. This saves the user bandwidth, especially helpful if +they are on a mobile connection. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -31,11 +36,15 @@ uppy.use(GoogleDrive, { $ npm install @uppy/google-drive ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/google-drive). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/google-drive). ## License diff --git a/packages/@uppy/image-editor/README.md b/packages/@uppy/image-editor/README.md index 84a6726399..38185b2a2a 100644 --- a/packages/@uppy/image-editor/README.md +++ b/packages/@uppy/image-editor/README.md @@ -7,13 +7,16 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -Image Editor is an image cropping and editing plugin for Uppy. Designed to be used with the Dashboard UI (can in theory work without it). +Image Editor is an image cropping and editing plugin for Uppy. Designed to be +used with the Dashboard UI (can in theory work without it). ⚠ In beta. -**[Read the docs](https://uppy.io/docs/image-editor)** | **[Try it](https://uppy.io/examples/dashboard/)** +**[Read the docs](https://uppy.io/docs/image-editor)** | +**[Try it](https://uppy.io/examples/dashboard/)** -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -36,11 +39,15 @@ uppy.use(ImageEditor, { $ npm install @uppy/image-editor ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/image-editor). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/image-editor). ## License diff --git a/packages/@uppy/informer/README.md b/packages/@uppy/informer/README.md index 1621aa58f7..eb3d2a37d1 100644 --- a/packages/@uppy/informer/README.md +++ b/packages/@uppy/informer/README.md @@ -7,9 +7,11 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The Informer is a pop-up bar for showing notifications. When other plugins have some exciting news (or error) to share, they can show a notification here. +The Informer is a pop-up bar for showing notifications. When other plugins have +some exciting news (or error) to share, they can show a notification here. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -29,11 +31,15 @@ uppy.use(Informer, { $ npm install @uppy/informer ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/informer). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/informer). ## License diff --git a/packages/@uppy/instagram/README.md b/packages/@uppy/instagram/README.md index cb592d9ec7..283741b427 100644 --- a/packages/@uppy/instagram/README.md +++ b/packages/@uppy/instagram/README.md @@ -9,9 +9,13 @@ The Instagram plugin lets users import photos from their Instagram account. -A [Companion](https://uppy.io/docs/companion) instance is required for the Instagram plugin to work. Companion handles authentication with Instagram, downloads the pictures and videos, and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection. +A [Companion](https://uppy.io/docs/companion) instance is required for the +Instagram plugin to work. Companion handles authentication with Instagram, +downloads the pictures and videos, and uploads them to the destination. This +saves the user bandwidth, especially helpful if they are on a mobile connection. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -20,8 +24,7 @@ import Uppy from '@uppy/core' import Instagram from '@uppy/instagram' const uppy = new Uppy() -uppy.use(Instagram, { -}) +uppy.use(Instagram, {}) ``` ## Installation @@ -30,11 +33,15 @@ uppy.use(Instagram, { $ npm install @uppy/instagram ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/instagram). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/instagram). ## License diff --git a/packages/@uppy/locales/README.md b/packages/@uppy/locales/README.md index 9cf98f04b5..cc3431d17f 100644 --- a/packages/@uppy/locales/README.md +++ b/packages/@uppy/locales/README.md @@ -7,7 +7,10 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -This package includes all the locale packs that you can use to make Uppy speak your language! If your language is missing, please consider [contributing](https://github.com/transloadit/uppy/tree/main/packages/%40uppy/locales/src), starting with `en_US`, which is always up-to-date automatically. +This package includes all the locale packs that you can use to make Uppy speak +your language! If your language is missing, please consider +[contributing](https://github.com/transloadit/uppy/tree/main/packages/%40uppy/locales/src), +starting with `en_US`, which is always up-to-date automatically. ## Installation diff --git a/packages/@uppy/onedrive/README.md b/packages/@uppy/onedrive/README.md index 586c41743e..9279d4d8a4 100644 --- a/packages/@uppy/onedrive/README.md +++ b/packages/@uppy/onedrive/README.md @@ -7,11 +7,16 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The OneDrive plugin for Uppy lets users import files from their OneDrive account. +The OneDrive plugin for Uppy lets users import files from their OneDrive +account. -A Companion instance is required for the OneDrive plugin to work. Companion handles authentication with Microsoft OneDrive, downloads files from OneDrive and uploads them to the destination. This saves the user bandwidth, especially helpful if they are on a mobile connection. +A Companion instance is required for the OneDrive plugin to work. Companion +handles authentication with Microsoft OneDrive, downloads files from OneDrive +and uploads them to the destination. This saves the user bandwidth, especially +helpful if they are on a mobile connection. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -31,11 +36,15 @@ uppy.use(OneDrive, { $ npm install @uppy/onedrive ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/facebook). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/facebook). ## License diff --git a/packages/@uppy/progress-bar/README.md b/packages/@uppy/progress-bar/README.md index d593f4a1d9..ec07a9e5ea 100644 --- a/packages/@uppy/progress-bar/README.md +++ b/packages/@uppy/progress-bar/README.md @@ -7,9 +7,12 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -ProgressBar is a minimalist plugin that shows the current upload progress in a thin bar element. Like the ones used by YouTube and GitHub when navigating between pages. +ProgressBar is a minimalist plugin that shows the current upload progress in a +thin bar element. Like the ones used by YouTube and GitHub when navigating +between pages. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -29,11 +32,15 @@ uppy.use(ProgressBar, { $ npm install @uppy/progress-bar ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/progressbar). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/progressbar). ## License diff --git a/packages/@uppy/provider-views/README.md b/packages/@uppy/provider-views/README.md index c3be4986bb..3081d5f131 100644 --- a/packages/@uppy/provider-views/README.md +++ b/packages/@uppy/provider-views/README.md @@ -9,7 +9,8 @@ View library for Uppy remote provider plugins. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -18,19 +19,19 @@ import Plugin from '@uppy/core/lib/plugin' import { ProviderViews } from '@uppy/provider-views' class GoogleDrive extends UIPlugin { - install () { + install() { this.view = new ProviderViews(this) // snip } - onFirstRender () { + onFirstRender() { return Promise.all([ this.provider.fetchPreAuthToken(), this.view.getFolder('root'), ]) } - render (state) { + render(state) { return this.view.render(state) } } @@ -38,7 +39,8 @@ class GoogleDrive extends UIPlugin { ## Installation -> Unless you are creating a custom provider plugin, you do not need to install this. +> Unless you are creating a custom provider plugin, you do not need to install +> this. ```bash $ npm install @uppy/provider-views diff --git a/packages/@uppy/react-native/README.md b/packages/@uppy/react-native/README.md index 69a9522ee7..d5dc65f70f 100644 --- a/packages/@uppy/react-native/README.md +++ b/packages/@uppy/react-native/README.md @@ -9,7 +9,11 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -Basic Uppy component for React Native with Expo. It’s in Beta, and is not full-featured. You can select local images or videos, take pictures with a camera or add any files from [remote urls](https://uppy.io/docs/url), with the help of our server-side component, [Uppy Companion](https://uppy.io/docs/companion). +Basic Uppy component for React Native with Expo. It’s in Beta, and is not +full-featured. You can select local images or videos, take pictures with a +camera or add any files from [remote urls](https://uppy.io/docs/url), with the +help of our server-side component, +[Uppy Companion](https://uppy.io/docs/companion). ## Installation @@ -19,7 +23,8 @@ $ npm install @uppy/react-native ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/react/native/). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/react/native/). ## License diff --git a/packages/@uppy/react/README.md b/packages/@uppy/react/README.md index f1a7b0b413..d04c33dea4 100644 --- a/packages/@uppy/react/README.md +++ b/packages/@uppy/react/README.md @@ -9,7 +9,8 @@ React component wrappers around Uppy’s officially maintained UI plugins. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -25,7 +26,7 @@ const uppy = new Uppy() class Example extends React.Component { state = { open: false } - render () { + render() { return ( - CI status for Uppy tests CI status for Companion tests CI status for browser tests + +CI status for Uppy tests +CI status for Companion tests +CI status for browser tests ## Example @@ -24,11 +27,15 @@ npm install @uppy/remote-sources yarn add @uppy/remote-sources ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy.RemoteSources` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy.RemoteSources` will attach itself +to the global `window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/remote-sources). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/remote-sources). ## License diff --git a/packages/@uppy/screen-capture/README.md b/packages/@uppy/screen-capture/README.md index b17f7d4467..55e0cb4373 100644 --- a/packages/@uppy/screen-capture/README.md +++ b/packages/@uppy/screen-capture/README.md @@ -7,9 +7,11 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The screen capture plugin for Uppy lets you take photos and record videos with a built-in camera on desktop and mobile devices. +The screen capture plugin for Uppy lets you take photos and record videos with a +built-in camera on desktop and mobile devices. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -27,11 +29,15 @@ uppy.use(ScreenCapture) $ npm install @uppy/screen-capture ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/screen-capture). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/screen-capture). ## License diff --git a/packages/@uppy/status-bar/README.md b/packages/@uppy/status-bar/README.md index 30dad6bc95..69d7e34639 100644 --- a/packages/@uppy/status-bar/README.md +++ b/packages/@uppy/status-bar/README.md @@ -7,10 +7,16 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The status-bar shows upload progress and speed, ETAs, pre- and post-processing information, and allows users to control (pause/resume/cancel) the upload. -Best used together with a basic file source plugin, such as [@uppy/file-input](https://uppy.io/docs/file-input) or [@uppy/drag-drop](https://uppy.io/docs/drag-drop), or a custom implementation. It’s also included in the [@uppy/dashboard](https://uppy.io/docs/dashboard) plugin. +The status-bar shows upload progress and speed, ETAs, pre- and post-processing +information, and allows users to control (pause/resume/cancel) the upload. Best +used together with a basic file source plugin, such as +[@uppy/file-input](https://uppy.io/docs/file-input) or +[@uppy/drag-drop](https://uppy.io/docs/drag-drop), or a custom implementation. +It’s also included in the [@uppy/dashboard](https://uppy.io/docs/dashboard) +plugin. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -33,11 +39,15 @@ uppy.use(StatusBar, { $ npm install @uppy/status-bar ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/status-bar). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/status-bar). ## License diff --git a/packages/@uppy/store-default/README.md b/packages/@uppy/store-default/README.md index e41a153d34..d4319b18a9 100644 --- a/packages/@uppy/store-default/README.md +++ b/packages/@uppy/store-default/README.md @@ -7,9 +7,11 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -A basic object-based store for Uppy. This one is used by default, you do not need to add it manually. +A basic object-based store for Uppy. This one is used by default, you do not +need to add it manually. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -28,11 +30,15 @@ const uppy = new Uppy({ $ npm install @uppy/store-default ``` -Alternatively, you can also use this package in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this package in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/stores#DefaultStore). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/stores#DefaultStore). ## License diff --git a/packages/@uppy/store-redux/README.md b/packages/@uppy/store-redux/README.md index 10e035d757..13d1589ae8 100644 --- a/packages/@uppy/store-redux/README.md +++ b/packages/@uppy/store-redux/README.md @@ -7,12 +7,13 @@ ![CI status for Companion tests](https://github.com/transloadit/uppy/workflows/Companion/badge.svg) ![CI status for browser tests](https://github.com/transloadit/uppy/workflows/End-to-end%20tests/badge.svg) -The `ReduxStore` stores Uppy state on a key in an existing Redux store. -The `ReduxStore` dispatches `uppy/STATE_UPDATE` actions to update state. -When the state in Redux changes, it notifies Uppy. -This way, you get most of the benefits of Redux, including support for the Redux Devtools and time traveling! +The `ReduxStore` stores Uppy state on a key in an existing Redux store. The +`ReduxStore` dispatches `uppy/STATE_UPDATE` actions to update state. When the +state in Redux changes, it notifies Uppy. This way, you get most of the benefits +of Redux, including support for the Redux Devtools and time traveling! -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -21,8 +22,11 @@ import Uppy from '@uppy/core' import * as ReduxStore from '@uppy/store-redux' import * as Redux from 'redux' -function createStore (reducers = {}) { - const reducer = Redux.combineReducers({ ...reducers, uppy: ReduxStore.reducer }) +function createStore(reducers = {}) { + const reducer = Redux.combineReducers({ + ...reducers, + uppy: ReduxStore.reducer, + }) return Redux.createStore(reducer) } @@ -36,11 +40,15 @@ const uppy = new Uppy({ store }) $ npm install @uppy/store-redux ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/stores#ReduxStore). +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/stores#ReduxStore). ## License diff --git a/packages/@uppy/svelte/README.md b/packages/@uppy/svelte/README.md index e6d285a911..d834030fa6 100644 --- a/packages/@uppy/svelte/README.md +++ b/packages/@uppy/svelte/README.md @@ -9,7 +9,8 @@ Svelte component wrappers around Uppy’s officially maintained UI plugins. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Installation @@ -25,7 +26,9 @@ yarn add @uppy/svelte ## Documentation -Documentation for this plugin can be found on the [Uppy website](https://uppy.io/docs/svelte). At the moment, there’s no documentation yet, so this link won’t work. Stay tuned for more info +Documentation for this plugin can be found on the +[Uppy website](https://uppy.io/docs/svelte). At the moment, there’s no +documentation yet, so this link won’t work. Stay tuned for more info ## License diff --git a/packages/@uppy/thumbnail-generator/README.md b/packages/@uppy/thumbnail-generator/README.md index c4946cfe4b..13c6825f3d 100644 --- a/packages/@uppy/thumbnail-generator/README.md +++ b/packages/@uppy/thumbnail-generator/README.md @@ -9,7 +9,8 @@ Uppy plugin that generates small previews of images to show on your upload UI. -Uppy is being developed by the folks at [Transloadit](https://transloadit.com), a versatile file encoding service. +Uppy is being developed by the folks at [Transloadit](https://transloadit.com), +a versatile file encoding service. ## Example @@ -29,7 +30,10 @@ uppy.use(ThumbnailGenerator, { $ npm install @uppy/thumbnail-generator ``` -Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global `window.Uppy` object. See the [main Uppy documentation](https://uppy.io/docs/#Installation) for instructions. +Alternatively, you can also use this plugin in a pre-built bundle from +Transloadit’s CDN: Edgly. In that case `Uppy` will attach itself to the global +`window.Uppy` object. See the +[main Uppy documentation](https://uppy.io/docs/#Installation) for instructions.
    TestsCI status for Uppy testsCI status for Companion testsCI status for browser tests