diff --git a/.eslintrc.js b/.eslintrc.js index 0b6c416759..df44d24e58 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -357,11 +357,13 @@ module.exports = { 'test/**/*.js', 'test/**/*.ts', '*.test.js', + '*.test.ts', '*.test-d.ts', '*.test-d.tsx', 'postcss.config.js', '.eslintrc.js', 'private/**/*.js', + 'private/**/*.mjs', ], rules: { 'no-console': 'off', @@ -461,9 +463,17 @@ module.exports = { rules: { 'import/prefer-default-export': 'off', '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-extra-semi': 'off', '@typescript-eslint/no-namespace': 'off', }, }, + { + files: ['packages/@uppy/*/src/**/*.ts', 'packages/@uppy/*/src/**/*.tsx'], + excludedFiles: ['packages/@uppy/**/*.test.ts'], + rules: { + '@typescript-eslint/explicit-function-return-type': 'error', + }, + }, { files: ['**/*.md/*.*'], rules: { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fbb46ee309..2fbb6471ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,8 +34,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - # todo put back? - node-version: [18.16.0, 20.x] + node-version: [18.x, 20.x] steps: - name: Checkout sources uses: actions/checkout@v3 @@ -104,3 +103,22 @@ jobs: corepack yarn run build:locale-pack - name: Run type tests run: corepack yarn run test:type + - name: Drop manual tyoes + # For backward compatiblity reasons, Uppy plugins ship a manual crafted d.ts file. + # We don't want to remove that file to not break users. + # However, we want to validate the types based on the types inferred from source. + run: | + node --input-type=module <<'EOF' + import { existsSync } from 'node:fs'; + import { opendir, readFile, writeFile } from 'node:fs/promises'; + for await (const dirent of await opendir('./packages/@uppy')) { + if (existsSync(`./packages/@uppy/${dirent.name}/tsconfig.build.json`)) { + const pjsonPath = `./packages/@uppy/${dirent.name}/package.json` + const pjson = JSON.parse(await readFile(pjsonPath)); + delete pjson.types + await writeFile(pjsonPath, JSON.stringify(pjson)) + } + } + EOF + - name: Attempt building TS packages + run: corepack yarn run build:ts diff --git a/.gitignore b/.gitignore index c95631cf94..3a76062d03 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ node_modules yarn-error.log .idea .env +tsconfig.tsbuildinfo +tsconfig.build.tsbuildinfo dist/ lib/ diff --git a/.prettierignore b/.prettierignore index cfebd2d979..ba14940c1a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -3,5 +3,6 @@ node_modules/ *.jsx *.cjs *.mjs +!private/js2ts/* *.md *.lock diff --git a/.yarn/patches/p-queue-npm-7.4.1-e0cf0a6f17.patch b/.yarn/patches/p-queue-npm-7.4.1-e0cf0a6f17.patch new file mode 100644 index 0000000000..aaef0b1243 --- /dev/null +++ b/.yarn/patches/p-queue-npm-7.4.1-e0cf0a6f17.patch @@ -0,0 +1,12 @@ +diff --git a/package.json b/package.json +index 8367745346fffd144a817ccf04912bb799e18b66..66dd17a4cd736089a332d72a70040701b0cd9c93 100644 +--- a/package.json ++++ b/package.json +@@ -6,6 +6,7 @@ + "repository": "sindresorhus/p-queue", + "funding": "https://github.com/sponsors/sindresorhus", + "type": "module", ++ "main": "./dist/index.js", + "exports": "./dist/index.js", + "engines": { + "node": ">=12" diff --git a/BUNDLE-README.md b/BUNDLE-README.md index 70a9c3ff85..4772ca2ec2 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 8509df25c2..48e75d90d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,139 @@ Please add your entries in this format: In the current stage we aim to release a new version at least every month. +## 3.20.0 + +Released: 2023-11-24 + +| Package | Version | Package | Version | +| ---------------------- | ------- | ---------------------- | ------- | +| @uppy/companion-client | 3.6.1 | @uppy/store-default | 3.1.0 | +| @uppy/locales | 3.5.0 | uppy | 3.20.0 | + +- meta: uppy CDN: Export UIPlugin and BasePlugin (Artur Paikin / #4774) +- @uppy/locales: Add missing translations to de_DE (Leonhard Melzer / #4800) +- @uppy/store-default: refactor to typescript (Antoine du Hamel / #4785) +- meta: improve js2ts script (Antoine du Hamel / #4786) +- @uppy/companion-client: fix log type error (Mikael Finstad / #4766) +- @uppy/companion-client: revert breaking change (Antoine du Hamel / #4801) +- @uppy/locales: use TypeScript for source files (Antoine du Hamel / #4779) +- meta: migrate AWS SDK v2 to v3 in `bin/uploadcdn` (Trivikram Kamat / #4776) + + +## 3.19.1 + +Released: 2023-11-12 + +| Package | Version | Package | Version | +| ------------------ | ------- | ------------------ | ------- | +| @uppy/core | 3.7.1 | @uppy/react-native | 0.5.2 | +| @uppy/dashboard | 3.7.1 | uppy | 3.19.1 | +| @uppy/react | 3.2.1 | | | + +- @uppy/react: Revert "@uppy/react: add useUppyState (#4711)" (Artur Paikin / #4789) +- @uppy/dashboard: fix(@uppy/dashboard): fix wrong option type in index.d.ts (dzcpy / #4788) +- meta: fix build of TypeScript plugins (Antoine du Hamel / #4784) +- @uppy/core,@uppy/dashboard,@uppy/react-native: Update Uppy's blue color to meet WCAG contrast requirements (Alexander Zaytsev / #4777) +- meta: fix JS2TS script (Antoine du Hamel / #4778) + + +## 3.19.0 + +Released: 2023-11-08 + +| Package | Version | Package | Version | +| ---------------------- | ------- | ---------------------- | ------- | +| @uppy/aws-s3 | 3.5.0 | @uppy/provider-views | 3.7.0 | +| @uppy/aws-s3-multipart | 3.9.0 | @uppy/react | 3.2.0 | +| @uppy/companion | 4.11.0 | @uppy/transloadit | 3.4.0 | +| @uppy/companion-client | 3.6.0 | @uppy/tus | 3.4.0 | +| @uppy/core | 3.7.0 | @uppy/url | 3.4.0 | +| @uppy/dashboard | 3.7.0 | @uppy/utils | 5.6.0 | +| @uppy/image-editor | 2.3.0 | @uppy/xhr-upload | 3.5.0 | +| @uppy/locales | 3.4.0 | uppy | 3.19.0 | + +- @uppy/dashboard: Remove uppy-Dashboard-isFixed when uppy.close() is invoked (Artur Paikin / #4775) +- @uppy/core,@uppy/dashboard: don't cancel all files when clicking "done" (Mikael Finstad / #4771) +- @uppy/utils: refactor to TS (Antoine du Hamel / #4699) +- @uppy/locales: locales: add ca_ES (ordago / #4772) +- @uppy/companion: Companion+client stability fixes, error handling and retry (Mikael Finstad / #4734) +- @uppy/companion: add getBucket metadata argument (Mikael Finstad / #4770) +- @uppy/core: simplify types with class generic (JokcyLou / #4761) +- @uppy/image-editor: More image editor improvements (Evgenia Karunus / #4676) +- @uppy/react: add useUppyState (Merlijn Vos / #4711) + + +## 3.18.1 + +Released: 2023-10-23 + +| Package | Version | Package | Version | +| --------------- | ------- | --------------- | ------- | +| @uppy/companion | 4.10.1 | uppy | 3.18.1 | +| @uppy/core | 3.6.1 | | | + +- @uppy/companion: Bump jsonwebtoken from 8.5.1 to 9.0.0 in /packages/@uppy/companion (dependabot[bot] / #4751) +- meta: Bump react-devtools-core from 4.25.0 to 4.28.4 (dependabot[bot] / #4756) +- meta: Bump webpack from 5.74.0 to 5.88.2 (dependabot[bot] / #4740) +- meta: Bump @babel/traverse from 7.22.5 to 7.23.2 (dependabot[bot] / #4739) +- @uppy/core: fix `sideEffects` declaration (Antoine du Hamel / #4759) + + +## 3.18.0 + +Released: 2023-10-20 + +| Package | Version | Package | Version | +| ------------------------- | ------- | ------------------------- | ------- | +| @uppy/angular | 0.6.1 | @uppy/progress-bar | 3.0.4 | +| @uppy/audio | 1.1.4 | @uppy/provider-views | 3.6.0 | +| @uppy/aws-s3 | 3.4.0 | @uppy/react | 3.1.4 | +| @uppy/aws-s3-multipart | 3.8.0 | @uppy/remote-sources | 1.1.0 | +| @uppy/box | 2.1.4 | @uppy/screen-capture | 3.1.3 | +| @uppy/companion | 4.10.0 | @uppy/status-bar | 3.2.5 | +| @uppy/companion-client | 3.5.0 | @uppy/store-default | 3.0.5 | +| @uppy/compressor | 1.0.5 | @uppy/store-redux | 3.0.5 | +| @uppy/core | 3.6.0 | @uppy/svelte | 3.1.1 | +| @uppy/dashboard | 3.6.0 | @uppy/thumbnail-generator | 3.0.6 | +| @uppy/drop-target | 2.0.2 | @uppy/transloadit | 3.3.2 | +| @uppy/dropbox | 3.1.4 | @uppy/tus | 3.3.2 | +| @uppy/facebook | 3.1.3 | @uppy/unsplash | 3.2.3 | +| @uppy/file-input | 3.0.4 | @uppy/url | 3.3.4 | +| @uppy/form | 3.0.3 | @uppy/utils | 5.5.2 | +| @uppy/golden-retriever | 3.1.1 | @uppy/vue | 1.1.0 | +| @uppy/google-drive | 3.3.0 | @uppy/webcam | 3.3.4 | +| @uppy/image-editor | 2.2.2 | @uppy/xhr-upload | 3.4.2 | +| @uppy/informer | 3.0.4 | @uppy/zoom | 2.1.3 | +| @uppy/instagram | 3.1.3 | uppy | 3.18.0 | +| @uppy/onedrive | 3.1.4 | | | + +- @uppy/aws-s3-multipart: fix `TypeError` (Antoine du Hamel / #4748) +- meta: Bump tough-cookie from 4.1.2 to 4.1.3 (dependabot[bot] / #4750) +- meta: example: simplify code by using built-in `throwIfAborted` (Antoine du Hamel / #4749) +- @uppy/aws-s3-multipart: pass `signal` as separate arg for backward compat (Antoine du Hamel / #4746) +- meta: fix TS integration (Antoine du Hamel / #4741) +- meta: fix js2ts check (Antoine du Hamel) +- meta: add support for TypeScript plugins (Antoine du Hamel / #4640) +- @uppy/vue: export FileInput (mdxiaohu / #4736) +- meta: examples: update `server.py` (codehero7386 / #4732) +- @uppy/aws-s3-multipart: fix `uploadURL` when using `PUT` (Antoine du Hamel / #4701) +- @uppy/dashboard: auto discover and install plugins without target (Artur Paikin / #4343) +- meta: e2e: upgrade Cypress (Antoine du Hamel / #4731) +- @uppy/core: mark the package as side-effect free (Antoine du Hamel / #4730) +- meta: Bump postcss from 8.4.16 to 8.4.31 (dependabot[bot] / #4723) +- meta: test with the latest versions of Node.js (Antoine du Hamel / #4729) +- meta: e2e: update Parcel (Antoine du Hamel / #4726) +- meta: uppy: fix types (Antoine du Hamel / #4721) +- @uppy/core: type more events (Antoine du Hamel / #4719) +- @uppy/svelte: fix TS build command (Antoine du Hamel / #4720) +- @uppy/companion: Bucket fn also remote files (Mikael Finstad / #4693) +- @uppy/companion-client: fixup! Added Companion OAuth Key type (Murderlon / #4668) +- @uppy/companion-client: Added Companion OAuth Key type (Chris Pratt / #4668) +- meta: check for formatting in CI (Antoine du Hamel / #4714) +- meta: bump get-func-name from 2.0.0 to 2.0.2 (dependabot[bot] / #4709) +- meta: run Prettier on existing files (Antoine du Hamel / #4713) + + ## 3.17.0 Released: 2023-09-29 diff --git a/README.md b/README.md index 14ac3e3093..73723e5b69 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.17.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.20.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 @@ -311,9 +311,9 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [muhammadInam](https://github.com/muhammadInam) |[rettgerst](https://github.com/rettgerst) |[Acconut](https://github.com/Acconut) |[mkabatek](https://github.com/mkabatek) |[jukakoski](https://github.com/jukakoski) |[olemoign](https://github.com/olemoign) | -[ajschmidt8](https://github.com/ajschmidt8) |[superhawk610](https://github.com/superhawk610) |[abannach](https://github.com/abannach) |[adamelmore](https://github.com/adamelmore) |[ajh-sr](https://github.com/ajh-sr) |[adamvigneault](https://github.com/adamvigneault) | +[ajschmidt8](https://github.com/ajschmidt8) |[superhawk610](https://github.com/superhawk610) |[abannach](https://github.com/abannach) |[adamdottv](https://github.com/adamdottv) |[ajh-sr](https://github.com/ajh-sr) |[adamvigneault](https://github.com/adamvigneault) | :---: |:---: |:---: |:---: |:---: |:---: | -[ajschmidt8](https://github.com/ajschmidt8) |[superhawk610](https://github.com/superhawk610) |[abannach](https://github.com/abannach) |[adamelmore](https://github.com/adamelmore) |[ajh-sr](https://github.com/ajh-sr) |[adamvigneault](https://github.com/adamvigneault) | +[ajschmidt8](https://github.com/ajschmidt8) |[superhawk610](https://github.com/superhawk610) |[abannach](https://github.com/abannach) |[adamdottv](https://github.com/adamdottv) |[ajh-sr](https://github.com/ajh-sr) |[adamvigneault](https://github.com/adamvigneault) | [Adrrei](https://github.com/Adrrei) |[adritasharma](https://github.com/adritasharma) |[ahmadissa](https://github.com/ahmadissa) |[asmt3](https://github.com/asmt3) |[alexnj](https://github.com/alexnj) |[aalepis](https://github.com/aalepis) | :---: |:---: |:---: |:---: |:---: |:---: | @@ -335,157 +335,165 @@ Use Uppy in your project? [Let us know](https://github.com/transloadit/uppy/issu :---: |:---: |:---: |:---: |:---: |:---: | [bducharme](https://github.com/bducharme) |[Quorafind](https://github.com/Quorafind) |[wbaaron](https://github.com/wbaaron) |[bedgerotto](https://github.com/bedgerotto) |[bryanjswift](https://github.com/bryanjswift) |[cyu](https://github.com/cyu) | -[cartfisk](https://github.com/cartfisk) |[cellvinchung](https://github.com/cellvinchung) |[chao](https://github.com/chao) |[Cretezy](https://github.com/Cretezy) |[charlybillaud](https://github.com/charlybillaud) |[csprance](https://github.com/csprance) | +[cartfisk](https://github.com/cartfisk) |[cellvinchung](https://github.com/cellvinchung) |[chao](https://github.com/chao) |[Cretezy](https://github.com/Cretezy) |[charlybillaud](https://github.com/charlybillaud) |[prattcmp](https://github.com/prattcmp) | :---: |:---: |:---: |:---: |:---: |:---: | -[cartfisk](https://github.com/cartfisk) |[cellvinchung](https://github.com/cellvinchung) |[chao](https://github.com/chao) |[Cretezy](https://github.com/Cretezy) |[charlybillaud](https://github.com/charlybillaud) |[csprance](https://github.com/csprance) | +[cartfisk](https://github.com/cartfisk) |[cellvinchung](https://github.com/cellvinchung) |[chao](https://github.com/chao) |[Cretezy](https://github.com/Cretezy) |[charlybillaud](https://github.com/charlybillaud) |[prattcmp](https://github.com/prattcmp) | -[cfra](https://github.com/cfra) |[Aarbel](https://github.com/Aarbel) |[cbush06](https://github.com/cbush06) |[czj](https://github.com/czj) |[CommanderRoot](https://github.com/CommanderRoot) |[ardeois](https://github.com/ardeois) | +[csprance](https://github.com/csprance) |[cfra](https://github.com/cfra) |[Aarbel](https://github.com/Aarbel) |[cbush06](https://github.com/cbush06) |[czj](https://github.com/czj) |[CommanderRoot](https://github.com/CommanderRoot) | :---: |:---: |:---: |:---: |:---: |:---: | -[cfra](https://github.com/cfra) |[Aarbel](https://github.com/Aarbel) |[cbush06](https://github.com/cbush06) |[czj](https://github.com/czj) |[CommanderRoot](https://github.com/CommanderRoot) |[ardeois](https://github.com/ardeois) | +[csprance](https://github.com/csprance) |[cfra](https://github.com/cfra) |[Aarbel](https://github.com/Aarbel) |[cbush06](https://github.com/cbush06) |[czj](https://github.com/czj) |[CommanderRoot](https://github.com/CommanderRoot) | -[sercraig](https://github.com/sercraig) |[Cruaier](https://github.com/Cruaier) |[danmichaelo](https://github.com/danmichaelo) |[danschalow](https://github.com/danschalow) |[danilat](https://github.com/danilat) |[mrboomer](https://github.com/mrboomer) | +[ardeois](https://github.com/ardeois) |[sercraig](https://github.com/sercraig) |[Cruaier](https://github.com/Cruaier) |[danmichaelo](https://github.com/danmichaelo) |[danschalow](https://github.com/danschalow) |[danilat](https://github.com/danilat) | :---: |:---: |:---: |:---: |:---: |:---: | -[sercraig](https://github.com/sercraig) |[Cruaier](https://github.com/Cruaier) |[danmichaelo](https://github.com/danmichaelo) |[danschalow](https://github.com/danschalow) |[danilat](https://github.com/danilat) |[mrboomer](https://github.com/mrboomer) | +[ardeois](https://github.com/ardeois) |[sercraig](https://github.com/sercraig) |[Cruaier](https://github.com/Cruaier) |[danmichaelo](https://github.com/danmichaelo) |[danschalow](https://github.com/danschalow) |[danilat](https://github.com/danilat) | -[Cantabar](https://github.com/Cantabar) |[KaminskiDaniell](https://github.com/KaminskiDaniell) |[akizor](https://github.com/akizor) |[davilima6](https://github.com/davilima6) |[DennisKofflard](https://github.com/DennisKofflard) |[jeetiss](https://github.com/jeetiss) | +[mrboomer](https://github.com/mrboomer) |[Cantabar](https://github.com/Cantabar) |[KaminskiDaniell](https://github.com/KaminskiDaniell) |[akizor](https://github.com/akizor) |[davilima6](https://github.com/davilima6) |[DennisKofflard](https://github.com/DennisKofflard) | :---: |:---: |:---: |:---: |:---: |:---: | -[Cantabar](https://github.com/Cantabar) |[KaminskiDaniell](https://github.com/KaminskiDaniell) |[akizor](https://github.com/akizor) |[davilima6](https://github.com/davilima6) |[DennisKofflard](https://github.com/DennisKofflard) |[jeetiss](https://github.com/jeetiss) | +[mrboomer](https://github.com/mrboomer) |[Cantabar](https://github.com/Cantabar) |[KaminskiDaniell](https://github.com/KaminskiDaniell) |[akizor](https://github.com/akizor) |[davilima6](https://github.com/davilima6) |[DennisKofflard](https://github.com/DennisKofflard) | -[sweetro](https://github.com/sweetro) |[EdgarSantiago93](https://github.com/EdgarSantiago93) |[emuell](https://github.com/emuell) |[efbautista](https://github.com/efbautista) |[yoldar](https://github.com/yoldar) |[eliOcs](https://github.com/eliOcs) | +[jeetiss](https://github.com/jeetiss) |[sweetro](https://github.com/sweetro) |[EdgarSantiago93](https://github.com/EdgarSantiago93) |[emuell](https://github.com/emuell) |[efbautista](https://github.com/efbautista) |[yoldar](https://github.com/yoldar) | :---: |:---: |:---: |:---: |:---: |:---: | -[sweetro](https://github.com/sweetro) |[EdgarSantiago93](https://github.com/EdgarSantiago93) |[emuell](https://github.com/emuell) |[efbautista](https://github.com/efbautista) |[yoldar](https://github.com/yoldar) |[eliOcs](https://github.com/eliOcs) | +[jeetiss](https://github.com/jeetiss) |[sweetro](https://github.com/sweetro) |[EdgarSantiago93](https://github.com/EdgarSantiago93) |[emuell](https://github.com/emuell) |[efbautista](https://github.com/efbautista) |[yoldar](https://github.com/yoldar) | -[elliotdickison](https://github.com/elliotdickison) |[EnricoSottile](https://github.com/EnricoSottile) |[epexa](https://github.com/epexa) |[Gkleinereva](https://github.com/Gkleinereva) |[fgallinari](https://github.com/fgallinari) |[ferdiusa](https://github.com/ferdiusa) | +[eliOcs](https://github.com/eliOcs) |[elliotdickison](https://github.com/elliotdickison) |[EnricoSottile](https://github.com/EnricoSottile) |[epexa](https://github.com/epexa) |[Gkleinereva](https://github.com/Gkleinereva) |[fgallinari](https://github.com/fgallinari) | :---: |:---: |:---: |:---: |:---: |:---: | -[elliotdickison](https://github.com/elliotdickison) |[EnricoSottile](https://github.com/EnricoSottile) |[epexa](https://github.com/epexa) |[Gkleinereva](https://github.com/Gkleinereva) |[fgallinari](https://github.com/fgallinari) |[ferdiusa](https://github.com/ferdiusa) | +[eliOcs](https://github.com/eliOcs) |[elliotdickison](https://github.com/elliotdickison) |[EnricoSottile](https://github.com/EnricoSottile) |[epexa](https://github.com/epexa) |[Gkleinereva](https://github.com/Gkleinereva) |[fgallinari](https://github.com/fgallinari) | -[dtrucs](https://github.com/dtrucs) |[fuadscodes](https://github.com/fuadscodes) |[gabiganam](https://github.com/gabiganam) |[geoffappleford](https://github.com/geoffappleford) |[gjungb](https://github.com/gjungb) |[roenschg](https://github.com/roenschg) | +[ferdiusa](https://github.com/ferdiusa) |[dtrucs](https://github.com/dtrucs) |[fuadscodes](https://github.com/fuadscodes) |[gabiganam](https://github.com/gabiganam) |[geoffappleford](https://github.com/geoffappleford) |[gjungb](https://github.com/gjungb) | :---: |:---: |:---: |:---: |:---: |:---: | -[dtrucs](https://github.com/dtrucs) |[fuadscodes](https://github.com/fuadscodes) |[gabiganam](https://github.com/gabiganam) |[geoffappleford](https://github.com/geoffappleford) |[gjungb](https://github.com/gjungb) |[roenschg](https://github.com/roenschg) | +[ferdiusa](https://github.com/ferdiusa) |[dtrucs](https://github.com/dtrucs) |[fuadscodes](https://github.com/fuadscodes) |[gabiganam](https://github.com/gabiganam) |[geoffappleford](https://github.com/geoffappleford) |[gjungb](https://github.com/gjungb) | -[giacomocerquone](https://github.com/giacomocerquone) |[HughbertD](https://github.com/HughbertD) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) |[huydod](https://github.com/huydod) |[IanVS](https://github.com/IanVS) |[ishendyweb](https://github.com/ishendyweb) | +[roenschg](https://github.com/roenschg) |[giacomocerquone](https://github.com/giacomocerquone) |[HughbertD](https://github.com/HughbertD) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) |[huydod](https://github.com/huydod) |[IanVS](https://github.com/IanVS) | :---: |:---: |:---: |:---: |:---: |:---: | -[giacomocerquone](https://github.com/giacomocerquone) |[HughbertD](https://github.com/HughbertD) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) |[huydod](https://github.com/huydod) |[IanVS](https://github.com/IanVS) |[ishendyweb](https://github.com/ishendyweb) | +[roenschg](https://github.com/roenschg) |[giacomocerquone](https://github.com/giacomocerquone) |[HughbertD](https://github.com/HughbertD) |[HussainAlkhalifah](https://github.com/HussainAlkhalifah) |[huydod](https://github.com/huydod) |[IanVS](https://github.com/IanVS) | -[NaxYo](https://github.com/NaxYo) |[intenzive](https://github.com/intenzive) |[GreenJimmy](https://github.com/GreenJimmy) |[mazoruss](https://github.com/mazoruss) |[JacobMGEvans](https://github.com/JacobMGEvans) |[gaejabong](https://github.com/gaejabong) | +[ishendyweb](https://github.com/ishendyweb) |[NaxYo](https://github.com/NaxYo) |[intenzive](https://github.com/intenzive) |[GreenJimmy](https://github.com/GreenJimmy) |[mazoruss](https://github.com/mazoruss) |[JacobMGEvans](https://github.com/JacobMGEvans) | :---: |:---: |:---: |:---: |:---: |:---: | -[NaxYo](https://github.com/NaxYo) |[intenzive](https://github.com/intenzive) |[GreenJimmy](https://github.com/GreenJimmy) |[mazoruss](https://github.com/mazoruss) |[JacobMGEvans](https://github.com/JacobMGEvans) |[gaejabong](https://github.com/gaejabong) | +[ishendyweb](https://github.com/ishendyweb) |[NaxYo](https://github.com/NaxYo) |[intenzive](https://github.com/intenzive) |[GreenJimmy](https://github.com/GreenJimmy) |[mazoruss](https://github.com/mazoruss) |[JacobMGEvans](https://github.com/JacobMGEvans) | -[JakubHaladej](https://github.com/JakubHaladej) |[Jbithell](https://github.com/Jbithell) |[jcjmcclean](https://github.com/jcjmcclean) |[jamestiotio](https://github.com/jamestiotio) |[janklimo](https://github.com/janklimo) |[janwilts](https://github.com/janwilts) | +[gaejabong](https://github.com/gaejabong) |[JakubHaladej](https://github.com/JakubHaladej) |[Jbithell](https://github.com/Jbithell) |[jcjmcclean](https://github.com/jcjmcclean) |[jamestiotio](https://github.com/jamestiotio) |[janklimo](https://github.com/janklimo) | :---: |:---: |:---: |:---: |:---: |:---: | -[JakubHaladej](https://github.com/JakubHaladej) |[Jbithell](https://github.com/Jbithell) |[jcjmcclean](https://github.com/jcjmcclean) |[jamestiotio](https://github.com/jamestiotio) |[janklimo](https://github.com/janklimo) |[janwilts](https://github.com/janwilts) | +[gaejabong](https://github.com/gaejabong) |[JakubHaladej](https://github.com/JakubHaladej) |[Jbithell](https://github.com/Jbithell) |[jcjmcclean](https://github.com/jcjmcclean) |[jamestiotio](https://github.com/jamestiotio) |[janklimo](https://github.com/janklimo) | -[vith](https://github.com/vith) |[jessica-coursera](https://github.com/jessica-coursera) |[Jmales](https://github.com/Jmales) |[theJoeBiz](https://github.com/theJoeBiz) |[profsmallpine](https://github.com/profsmallpine) |[chromacoma](https://github.com/chromacoma) | +[janwilts](https://github.com/janwilts) |[vith](https://github.com/vith) |[jessica-coursera](https://github.com/jessica-coursera) |[Jmales](https://github.com/Jmales) |[theJoeBiz](https://github.com/theJoeBiz) |[profsmallpine](https://github.com/profsmallpine) | :---: |:---: |:---: |:---: |:---: |:---: | -[vith](https://github.com/vith) |[jessica-coursera](https://github.com/jessica-coursera) |[Jmales](https://github.com/Jmales) |[theJoeBiz](https://github.com/theJoeBiz) |[profsmallpine](https://github.com/profsmallpine) |[chromacoma](https://github.com/chromacoma) | +[janwilts](https://github.com/janwilts) |[vith](https://github.com/vith) |[jessica-coursera](https://github.com/jessica-coursera) |[Jmales](https://github.com/Jmales) |[theJoeBiz](https://github.com/theJoeBiz) |[profsmallpine](https://github.com/profsmallpine) | -[jsanchez034](https://github.com/jsanchez034) |[jonathanarbely](https://github.com/jonathanarbely) |[jderrough](https://github.com/jderrough) |[jorgeepc](https://github.com/jorgeepc) |[jszobody](https://github.com/jszobody) |[jbelej](https://github.com/jbelej) | +[chromacoma](https://github.com/chromacoma) |[Jokcy](https://github.com/Jokcy) |[jsanchez034](https://github.com/jsanchez034) |[jonathanarbely](https://github.com/jonathanarbely) |[jderrough](https://github.com/jderrough) |[jorgeepc](https://github.com/jorgeepc) | :---: |:---: |:---: |:---: |:---: |:---: | -[jsanchez034](https://github.com/jsanchez034) |[jonathanarbely](https://github.com/jonathanarbely) |[jderrough](https://github.com/jderrough) |[jorgeepc](https://github.com/jorgeepc) |[jszobody](https://github.com/jszobody) |[jbelej](https://github.com/jbelej) | +[chromacoma](https://github.com/chromacoma) |[Jokcy](https://github.com/Jokcy) |[jsanchez034](https://github.com/jsanchez034) |[jonathanarbely](https://github.com/jonathanarbely) |[jderrough](https://github.com/jderrough) |[jorgeepc](https://github.com/jorgeepc) | -[jcalonso](https://github.com/jcalonso) |[jmontoyaa](https://github.com/jmontoyaa) |[mellow-fellow](https://github.com/mellow-fellow) |[jvelten](https://github.com/jvelten) |[tykarol](https://github.com/tykarol) |[kaspermeinema](https://github.com/kaspermeinema) | +[jszobody](https://github.com/jszobody) |[jbelej](https://github.com/jbelej) |[jcalonso](https://github.com/jcalonso) |[jmontoyaa](https://github.com/jmontoyaa) |[mellow-fellow](https://github.com/mellow-fellow) |[jvelten](https://github.com/jvelten) | :---: |:---: |:---: |:---: |:---: |:---: | -[jcalonso](https://github.com/jcalonso) |[jmontoyaa](https://github.com/jmontoyaa) |[mellow-fellow](https://github.com/mellow-fellow) |[jvelten](https://github.com/jvelten) |[tykarol](https://github.com/tykarol) |[kaspermeinema](https://github.com/kaspermeinema) | +[jszobody](https://github.com/jszobody) |[jbelej](https://github.com/jbelej) |[jcalonso](https://github.com/jcalonso) |[jmontoyaa](https://github.com/jmontoyaa) |[mellow-fellow](https://github.com/mellow-fellow) |[jvelten](https://github.com/jvelten) | -[firesharkstudios](https://github.com/firesharkstudios) |[kergekacsa](https://github.com/kergekacsa) |[kevin-west-10x](https://github.com/kevin-west-10x) |[kidonng](https://github.com/kidonng) |[elkebab](https://github.com/elkebab) |[kyleparisi](https://github.com/kyleparisi) | +[tykarol](https://github.com/tykarol) |[kaspermeinema](https://github.com/kaspermeinema) |[firesharkstudios](https://github.com/firesharkstudios) |[kergekacsa](https://github.com/kergekacsa) |[kevin-west-10x](https://github.com/kevin-west-10x) |[kidonng](https://github.com/kidonng) | :---: |:---: |:---: |:---: |:---: |:---: | -[firesharkstudios](https://github.com/firesharkstudios) |[kergekacsa](https://github.com/kergekacsa) |[kevin-west-10x](https://github.com/kevin-west-10x) |[kidonng](https://github.com/kidonng) |[elkebab](https://github.com/elkebab) |[kyleparisi](https://github.com/kyleparisi) | +[tykarol](https://github.com/tykarol) |[kaspermeinema](https://github.com/kaspermeinema) |[firesharkstudios](https://github.com/firesharkstudios) |[kergekacsa](https://github.com/kergekacsa) |[kevin-west-10x](https://github.com/kevin-west-10x) |[kidonng](https://github.com/kidonng) | -[labohkip81](https://github.com/labohkip81) |[hoangbits](https://github.com/hoangbits) |[leaanthony](https://github.com/leaanthony) |[larowlan](https://github.com/larowlan) |[dviry](https://github.com/dviry) |[galli-leo](https://github.com/galli-leo) | +[elkebab](https://github.com/elkebab) |[kyleparisi](https://github.com/kyleparisi) |[labohkip81](https://github.com/labohkip81) |[hoangbits](https://github.com/hoangbits) |[leaanthony](https://github.com/leaanthony) |[larowlan](https://github.com/larowlan) | :---: |:---: |:---: |:---: |:---: |:---: | -[labohkip81](https://github.com/labohkip81) |[hoangbits](https://github.com/hoangbits) |[leaanthony](https://github.com/leaanthony) |[larowlan](https://github.com/larowlan) |[dviry](https://github.com/dviry) |[galli-leo](https://github.com/galli-leo) | +[elkebab](https://github.com/elkebab) |[kyleparisi](https://github.com/kyleparisi) |[labohkip81](https://github.com/labohkip81) |[hoangbits](https://github.com/hoangbits) |[leaanthony](https://github.com/leaanthony) |[larowlan](https://github.com/larowlan) | -[leods92](https://github.com/leods92) |[dolphinigle](https://github.com/dolphinigle) |[louim](https://github.com/louim) |[ombr](https://github.com/ombr) |[lucaperret](https://github.com/lucaperret) |[lucax88x](https://github.com/lucax88x) | +[dviry](https://github.com/dviry) |[galli-leo](https://github.com/galli-leo) |[leods92](https://github.com/leods92) |[leomelzer](https://github.com/leomelzer) |[dolphinigle](https://github.com/dolphinigle) |[louim](https://github.com/louim) | :---: |:---: |:---: |:---: |:---: |:---: | -[leods92](https://github.com/leods92) |[dolphinigle](https://github.com/dolphinigle) |[louim](https://github.com/louim) |[ombr](https://github.com/ombr) |[lucaperret](https://github.com/lucaperret) |[lucax88x](https://github.com/lucax88x) | +[dviry](https://github.com/dviry) |[galli-leo](https://github.com/galli-leo) |[leods92](https://github.com/leods92) |[leomelzer](https://github.com/leomelzer) |[dolphinigle](https://github.com/dolphinigle) |[louim](https://github.com/louim) | -[marc-mabe](https://github.com/marc-mabe) |[onhate](https://github.com/onhate) |[mperrando](https://github.com/mperrando) |[marcosthejew](https://github.com/marcosthejew) |[marcusforsberg](https://github.com/marcusforsberg) |[martin-brennan](https://github.com/martin-brennan) | +[ombr](https://github.com/ombr) |[lucaperret](https://github.com/lucaperret) |[lucax88x](https://github.com/lucax88x) |[marc-mabe](https://github.com/marc-mabe) |[onhate](https://github.com/onhate) |[mperrando](https://github.com/mperrando) | :---: |:---: |:---: |:---: |:---: |:---: | -[marc-mabe](https://github.com/marc-mabe) |[onhate](https://github.com/onhate) |[mperrando](https://github.com/mperrando) |[marcosthejew](https://github.com/marcosthejew) |[marcusforsberg](https://github.com/marcusforsberg) |[martin-brennan](https://github.com/martin-brennan) | +[ombr](https://github.com/ombr) |[lucaperret](https://github.com/lucaperret) |[lucax88x](https://github.com/lucax88x) |[marc-mabe](https://github.com/marc-mabe) |[onhate](https://github.com/onhate) |[mperrando](https://github.com/mperrando) | -[masaok](https://github.com/masaok) |[masumulu28](https://github.com/masumulu28) |[mateuscruz](https://github.com/mateuscruz) |[mattfik](https://github.com/mattfik) |[mjesuele](https://github.com/mjesuele) |[matthewhartstonge](https://github.com/matthewhartstonge) | +[marcosthejew](https://github.com/marcosthejew) |[marcusforsberg](https://github.com/marcusforsberg) |[martin-brennan](https://github.com/martin-brennan) |[masaok](https://github.com/masaok) |[masumulu28](https://github.com/masumulu28) |[mateuscruz](https://github.com/mateuscruz) | :---: |:---: |:---: |:---: |:---: |:---: | -[masaok](https://github.com/masaok) |[masumulu28](https://github.com/masumulu28) |[mateuscruz](https://github.com/mateuscruz) |[mattfik](https://github.com/mattfik) |[mjesuele](https://github.com/mjesuele) |[matthewhartstonge](https://github.com/matthewhartstonge) | +[marcosthejew](https://github.com/marcosthejew) |[marcusforsberg](https://github.com/marcusforsberg) |[martin-brennan](https://github.com/martin-brennan) |[masaok](https://github.com/masaok) |[masumulu28](https://github.com/masumulu28) |[mateuscruz](https://github.com/mateuscruz) | -[mauricioribeiro](https://github.com/mauricioribeiro) |[hrsh](https://github.com/hrsh) |[mhulet](https://github.com/mhulet) |[mkopinsky](https://github.com/mkopinsky) |[ken-kuro](https://github.com/ken-kuro) |[achmiral](https://github.com/achmiral) | +[mattfik](https://github.com/mattfik) |[mjesuele](https://github.com/mjesuele) |[matthewhartstonge](https://github.com/matthewhartstonge) |[mauricioribeiro](https://github.com/mauricioribeiro) |[hrsh](https://github.com/hrsh) |[mhulet](https://github.com/mhulet) | :---: |:---: |:---: |:---: |:---: |:---: | -[mauricioribeiro](https://github.com/mauricioribeiro) |[hrsh](https://github.com/hrsh) |[mhulet](https://github.com/mhulet) |[mkopinsky](https://github.com/mkopinsky) |[ken-kuro](https://github.com/ken-kuro) |[achmiral](https://github.com/achmiral) | +[mattfik](https://github.com/mattfik) |[mjesuele](https://github.com/mjesuele) |[matthewhartstonge](https://github.com/matthewhartstonge) |[mauricioribeiro](https://github.com/mauricioribeiro) |[hrsh](https://github.com/hrsh) |[mhulet](https://github.com/mhulet) | -[boudra](https://github.com/boudra) |[mnafees](https://github.com/mnafees) |[shahimclt](https://github.com/shahimclt) |[mogzol](https://github.com/mogzol) |[navruzm](https://github.com/navruzm) |[marton-laszlo-attila](https://github.com/marton-laszlo-attila) | +[mkopinsky](https://github.com/mkopinsky) |[ken-kuro](https://github.com/ken-kuro) |[achmiral](https://github.com/achmiral) |[boudra](https://github.com/boudra) |[mnafees](https://github.com/mnafees) |[shahimclt](https://github.com/shahimclt) | :---: |:---: |:---: |:---: |:---: |:---: | -[boudra](https://github.com/boudra) |[mnafees](https://github.com/mnafees) |[shahimclt](https://github.com/shahimclt) |[mogzol](https://github.com/mogzol) |[navruzm](https://github.com/navruzm) |[marton-laszlo-attila](https://github.com/marton-laszlo-attila) | +[mkopinsky](https://github.com/mkopinsky) |[ken-kuro](https://github.com/ken-kuro) |[achmiral](https://github.com/achmiral) |[boudra](https://github.com/boudra) |[mnafees](https://github.com/mnafees) |[shahimclt](https://github.com/shahimclt) | -[pleasespammelater](https://github.com/pleasespammelater) |[naveed-ahmad](https://github.com/naveed-ahmad) |[trungcva10a6tn](https://github.com/trungcva10a6tn) |[nicojones](https://github.com/nicojones) |[coreprocess](https://github.com/coreprocess) |[nil1511](https://github.com/nil1511) | +[mogzol](https://github.com/mogzol) |[navruzm](https://github.com/navruzm) |[marton-laszlo-attila](https://github.com/marton-laszlo-attila) |[pleasespammelater](https://github.com/pleasespammelater) |[naveed-ahmad](https://github.com/naveed-ahmad) |[trungcva10a6tn](https://github.com/trungcva10a6tn) | :---: |:---: |:---: |:---: |:---: |:---: | -[pleasespammelater](https://github.com/pleasespammelater) |[naveed-ahmad](https://github.com/naveed-ahmad) |[trungcva10a6tn](https://github.com/trungcva10a6tn) |[nicojones](https://github.com/nicojones) |[coreprocess](https://github.com/coreprocess) |[nil1511](https://github.com/nil1511) | +[mogzol](https://github.com/mogzol) |[navruzm](https://github.com/navruzm) |[marton-laszlo-attila](https://github.com/marton-laszlo-attila) |[pleasespammelater](https://github.com/pleasespammelater) |[naveed-ahmad](https://github.com/naveed-ahmad) |[trungcva10a6tn](https://github.com/trungcva10a6tn) | -[leftdevel](https://github.com/leftdevel) |[Ozodbek1405](https://github.com/Ozodbek1405) |[cryptic022](https://github.com/cryptic022) |[ParsaArvanehPA](https://github.com/ParsaArvanehPA) |[pascalwengerter](https://github.com/pascalwengerter) |[patricklindsay](https://github.com/patricklindsay) | +[nicojones](https://github.com/nicojones) |[coreprocess](https://github.com/coreprocess) |[nil1511](https://github.com/nil1511) |[leftdevel](https://github.com/leftdevel) |[Ozodbek1405](https://github.com/Ozodbek1405) |[cryptic022](https://github.com/cryptic022) | :---: |:---: |:---: |:---: |:---: |:---: | -[leftdevel](https://github.com/leftdevel) |[Ozodbek1405](https://github.com/Ozodbek1405) |[cryptic022](https://github.com/cryptic022) |[ParsaArvanehPA](https://github.com/ParsaArvanehPA) |[pascalwengerter](https://github.com/pascalwengerter) |[patricklindsay](https://github.com/patricklindsay) | +[nicojones](https://github.com/nicojones) |[coreprocess](https://github.com/coreprocess) |[nil1511](https://github.com/nil1511) |[leftdevel](https://github.com/leftdevel) |[Ozodbek1405](https://github.com/Ozodbek1405) |[cryptic022](https://github.com/cryptic022) | -[plneto](https://github.com/plneto) |[pedrofs](https://github.com/pedrofs) |[pmusaraj](https://github.com/pmusaraj) |[phillipalexander](https://github.com/phillipalexander) |[ppadmavilasom](https://github.com/ppadmavilasom) |[Pzoco](https://github.com/Pzoco) | +[ParsaArvanehPA](https://github.com/ParsaArvanehPA) |[pascalwengerter](https://github.com/pascalwengerter) |[patricklindsay](https://github.com/patricklindsay) |[plneto](https://github.com/plneto) |[pedrofs](https://github.com/pedrofs) |[pmusaraj](https://github.com/pmusaraj) | :---: |:---: |:---: |:---: |:---: |:---: | -[plneto](https://github.com/plneto) |[pedrofs](https://github.com/pedrofs) |[pmusaraj](https://github.com/pmusaraj) |[phillipalexander](https://github.com/phillipalexander) |[ppadmavilasom](https://github.com/ppadmavilasom) |[Pzoco](https://github.com/Pzoco) | +[ParsaArvanehPA](https://github.com/ParsaArvanehPA) |[pascalwengerter](https://github.com/pascalwengerter) |[patricklindsay](https://github.com/patricklindsay) |[plneto](https://github.com/plneto) |[pedrofs](https://github.com/pedrofs) |[pmusaraj](https://github.com/pmusaraj) | -[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) | +[phillipalexander](https://github.com/phillipalexander) |[ppadmavilasom](https://github.com/ppadmavilasom) |[Pzoco](https://github.com/Pzoco) |[eman8519](https://github.com/eman8519) |[luarmr](https://github.com/luarmr) |[raulibanez](https://github.com/raulibanez) | :---: |:---: |:---: |:---: |:---: |:---: | -[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) | +[phillipalexander](https://github.com/phillipalexander) |[ppadmavilasom](https://github.com/ppadmavilasom) |[Pzoco](https://github.com/Pzoco) |[eman8519](https://github.com/eman8519) |[luarmr](https://github.com/luarmr) |[raulibanez](https://github.com/raulibanez) | -[scherroman](https://github.com/scherroman) |[rossng](https://github.com/rossng) |[rart](https://github.com/rart) |[GNURub](https://github.com/GNURub) |[fortunto2](https://github.com/fortunto2) |[samuelcolburn](https://github.com/samuelcolburn) | +[refo](https://github.com/refo) |[SxDx](https://github.com/SxDx) |[robwilson1](https://github.com/robwilson1) |[scherroman](https://github.com/scherroman) |[rossng](https://github.com/rossng) |[rart](https://github.com/rart) | :---: |:---: |:---: |:---: |:---: |:---: | -[scherroman](https://github.com/scherroman) |[rossng](https://github.com/rossng) |[rart](https://github.com/rart) |[GNURub](https://github.com/GNURub) |[fortunto2](https://github.com/fortunto2) |[samuelcolburn](https://github.com/samuelcolburn) | +[refo](https://github.com/refo) |[SxDx](https://github.com/SxDx) |[robwilson1](https://github.com/robwilson1) |[scherroman](https://github.com/scherroman) |[rossng](https://github.com/rossng) |[rart](https://github.com/rart) | -[sdebacker](https://github.com/sdebacker) |[sebasegovia01](https://github.com/sebasegovia01) |[sergei-zelinsky](https://github.com/sergei-zelinsky) |[szh](https://github.com/szh) |[SpazzMarticus](https://github.com/SpazzMarticus) |[waptik](https://github.com/waptik) | +[GNURub](https://github.com/GNURub) |[fortunto2](https://github.com/fortunto2) |[samuelcolburn](https://github.com/samuelcolburn) |[sdebacker](https://github.com/sdebacker) |[sebasegovia01](https://github.com/sebasegovia01) |[sergei-zelinsky](https://github.com/sergei-zelinsky) | :---: |:---: |:---: |:---: |:---: |:---: | -[sdebacker](https://github.com/sdebacker) |[sebasegovia01](https://github.com/sebasegovia01) |[sergei-zelinsky](https://github.com/sergei-zelinsky) |[szh](https://github.com/szh) |[SpazzMarticus](https://github.com/SpazzMarticus) |[waptik](https://github.com/waptik) | +[GNURub](https://github.com/GNURub) |[fortunto2](https://github.com/fortunto2) |[samuelcolburn](https://github.com/samuelcolburn) |[sdebacker](https://github.com/sdebacker) |[sebasegovia01](https://github.com/sebasegovia01) |[sergei-zelinsky](https://github.com/sergei-zelinsky) | -[quigebo](https://github.com/quigebo) |[amaitu](https://github.com/amaitu) |[steverob](https://github.com/steverob) |[sjauld](https://github.com/sjauld) |[strayer](https://github.com/strayer) |[taj](https://github.com/taj) | +[szh](https://github.com/szh) |[SpazzMarticus](https://github.com/SpazzMarticus) |[waptik](https://github.com/waptik) |[quigebo](https://github.com/quigebo) |[amaitu](https://github.com/amaitu) |[steverob](https://github.com/steverob) | :---: |:---: |:---: |:---: |:---: |:---: | -[quigebo](https://github.com/quigebo) |[amaitu](https://github.com/amaitu) |[steverob](https://github.com/steverob) |[sjauld](https://github.com/sjauld) |[strayer](https://github.com/strayer) |[taj](https://github.com/taj) | +[szh](https://github.com/szh) |[SpazzMarticus](https://github.com/SpazzMarticus) |[waptik](https://github.com/waptik) |[quigebo](https://github.com/quigebo) |[amaitu](https://github.com/amaitu) |[steverob](https://github.com/steverob) | -[Tashows](https://github.com/Tashows) |[tcgj](https://github.com/tcgj) |[twarlop](https://github.com/twarlop) |[tmaier](https://github.com/tmaier) |[WIStudent](https://github.com/WIStudent) |[tomsaleeba](https://github.com/tomsaleeba) | +[sjauld](https://github.com/sjauld) |[strayer](https://github.com/strayer) |[taj](https://github.com/taj) |[Tashows](https://github.com/Tashows) |[tcgj](https://github.com/tcgj) |[twarlop](https://github.com/twarlop) | :---: |:---: |:---: |:---: |:---: |:---: | -[Tashows](https://github.com/Tashows) |[tcgj](https://github.com/tcgj) |[twarlop](https://github.com/twarlop) |[tmaier](https://github.com/tmaier) |[WIStudent](https://github.com/WIStudent) |[tomsaleeba](https://github.com/tomsaleeba) | +[sjauld](https://github.com/sjauld) |[strayer](https://github.com/strayer) |[taj](https://github.com/taj) |[Tashows](https://github.com/Tashows) |[tcgj](https://github.com/tcgj) |[twarlop](https://github.com/twarlop) | -[tomekp](https://github.com/tomekp) |[tvaliasek](https://github.com/tvaliasek) |[top-master](https://github.com/top-master) |[vially](https://github.com/vially) |[valentinoli](https://github.com/valentinoli) |[stiig](https://github.com/stiig) | +[tmaier](https://github.com/tmaier) |[WIStudent](https://github.com/WIStudent) |[tomsaleeba](https://github.com/tomsaleeba) |[tomekp](https://github.com/tomekp) |[tvaliasek](https://github.com/tvaliasek) |[top-master](https://github.com/top-master) | :---: |:---: |:---: |:---: |:---: |:---: | -[tomekp](https://github.com/tomekp) |[tvaliasek](https://github.com/tvaliasek) |[top-master](https://github.com/top-master) |[vially](https://github.com/vially) |[valentinoli](https://github.com/valentinoli) |[stiig](https://github.com/stiig) | +[tmaier](https://github.com/tmaier) |[WIStudent](https://github.com/WIStudent) |[tomsaleeba](https://github.com/tomsaleeba) |[tomekp](https://github.com/tomekp) |[tvaliasek](https://github.com/tvaliasek) |[top-master](https://github.com/top-master) | -[nagyv](https://github.com/nagyv) |[dwnste](https://github.com/dwnste) |[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[willycamargo](https://github.com/willycamargo) |[xhocquet](https://github.com/xhocquet) |[YehudaKremer](https://github.com/YehudaKremer) | +[trivikr](https://github.com/trivikr) |[vially](https://github.com/vially) |[valentinoli](https://github.com/valentinoli) |[stiig](https://github.com/stiig) |[nagyv](https://github.com/nagyv) |[dwnste](https://github.com/dwnste) | :---: |:---: |:---: |:---: |:---: |:---: | -[nagyv](https://github.com/nagyv) |[dwnste](https://github.com/dwnste) |[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[willycamargo](https://github.com/willycamargo) |[xhocquet](https://github.com/xhocquet) |[YehudaKremer](https://github.com/YehudaKremer) | +[trivikr](https://github.com/trivikr) |[vially](https://github.com/vially) |[valentinoli](https://github.com/valentinoli) |[stiig](https://github.com/stiig) |[nagyv](https://github.com/nagyv) |[dwnste](https://github.com/dwnste) | -[zachconner](https://github.com/zachconner) |[zlawson-ut](https://github.com/zlawson-ut) |[zackbloom](https://github.com/zackbloom) |[sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) |[aduh95-test-account](https://github.com/aduh95-test-account) |[agreene-coursera](https://github.com/agreene-coursera) | +[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[willycamargo](https://github.com/willycamargo) |[xhocquet](https://github.com/xhocquet) |[YehudaKremer](https://github.com/YehudaKremer) |[zachconner](https://github.com/zachconner) |[zlawson-ut](https://github.com/zlawson-ut) | :---: |:---: |:---: |:---: |:---: |:---: | -[zachconner](https://github.com/zachconner) |[zlawson-ut](https://github.com/zlawson-ut) |[zackbloom](https://github.com/zackbloom) |[sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) |[aduh95-test-account](https://github.com/aduh95-test-account) |[agreene-coursera](https://github.com/agreene-coursera) | +[weston-sankey-mark43](https://github.com/weston-sankey-mark43) |[willycamargo](https://github.com/willycamargo) |[xhocquet](https://github.com/xhocquet) |[YehudaKremer](https://github.com/YehudaKremer) |[zachconner](https://github.com/zachconner) |[zlawson-ut](https://github.com/zlawson-ut) | -[alfatv](https://github.com/alfatv) |[arggh](https://github.com/arggh) |[avalla](https://github.com/avalla) |[c0b41](https://github.com/c0b41) |[canvasbh](https://github.com/canvasbh) |[cgoinglove](https://github.com/cgoinglove) | +[zackbloom](https://github.com/zackbloom) |[sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) |[aduh95-test-account](https://github.com/aduh95-test-account) |[agreene-coursera](https://github.com/agreene-coursera) |[alfatv](https://github.com/alfatv) |[arggh](https://github.com/arggh) | :---: |:---: |:---: |:---: |:---: |:---: | -[alfatv](https://github.com/alfatv) |[arggh](https://github.com/arggh) |[avalla](https://github.com/avalla) |[c0b41](https://github.com/c0b41) |[canvasbh](https://github.com/canvasbh) |[cgoinglove](https://github.com/cgoinglove) | +[zackbloom](https://github.com/zackbloom) |[sartoshi-foot-dao](https://github.com/sartoshi-foot-dao) |[aduh95-test-account](https://github.com/aduh95-test-account) |[agreene-coursera](https://github.com/agreene-coursera) |[alfatv](https://github.com/alfatv) |[arggh](https://github.com/arggh) | -[christianwengert](https://github.com/christianwengert) |[craigcbrunner](https://github.com/craigcbrunner) |[darthf1](https://github.com/darthf1) |[dkisic](https://github.com/dkisic) |[elliotsayes](https://github.com/elliotsayes) |[fingul](https://github.com/fingul) | +[avalla](https://github.com/avalla) |[c0b41](https://github.com/c0b41) |[canvasbh](https://github.com/canvasbh) |[cgoinglove](https://github.com/cgoinglove) |[christianwengert](https://github.com/christianwengert) |[codehero7386](https://github.com/codehero7386) | :---: |:---: |:---: |:---: |:---: |:---: | -[christianwengert](https://github.com/christianwengert) |[craigcbrunner](https://github.com/craigcbrunner) |[darthf1](https://github.com/darthf1) |[dkisic](https://github.com/dkisic) |[elliotsayes](https://github.com/elliotsayes) |[fingul](https://github.com/fingul) | +[avalla](https://github.com/avalla) |[c0b41](https://github.com/c0b41) |[canvasbh](https://github.com/canvasbh) |[cgoinglove](https://github.com/cgoinglove) |[christianwengert](https://github.com/christianwengert) |[codehero7386](https://github.com/codehero7386) | + +[craigcbrunner](https://github.com/craigcbrunner) |[darthf1](https://github.com/darthf1) |[dkisic](https://github.com/dkisic) |[dzcpy](https://github.com/dzcpy) |[elliotsayes](https://github.com/elliotsayes) |[fingul](https://github.com/fingul) | +:---: |:---: |:---: |:---: |:---: |:---: | +[craigcbrunner](https://github.com/craigcbrunner) |[darthf1](https://github.com/darthf1) |[dkisic](https://github.com/dkisic) |[dzcpy](https://github.com/dzcpy) |[elliotsayes](https://github.com/elliotsayes) |[fingul](https://github.com/fingul) | [franckl](https://github.com/franckl) |[frederikhors](https://github.com/frederikhors) |[gaelicwinter](https://github.com/gaelicwinter) |[green-mike](https://github.com/green-mike) |[hxgf](https://github.com/hxgf) |[johnmanjiro13](https://github.com/johnmanjiro13) | :---: |:---: |:---: |:---: |:---: |:---: | [franckl](https://github.com/franckl) |[frederikhors](https://github.com/frederikhors) |[gaelicwinter](https://github.com/gaelicwinter) |[green-mike](https://github.com/green-mike) |[hxgf](https://github.com/hxgf) |[johnmanjiro13](https://github.com/johnmanjiro13) | -[jur-ng](https://github.com/jur-ng) |[sontixyou](https://github.com/sontixyou) |[kode-ninja](https://github.com/kode-ninja) |[jx-zyf](https://github.com/jx-zyf) |[magumbo](https://github.com/magumbo) |[mjlumetta](https://github.com/mjlumetta) | +[jur-ng](https://github.com/jur-ng) |[sontixyou](https://github.com/sontixyou) |[kode-ninja](https://github.com/kode-ninja) |[jx-zyf](https://github.com/jx-zyf) |[magumbo](https://github.com/magumbo) |[mdxiaohu](https://github.com/mdxiaohu) | :---: |:---: |:---: |:---: |:---: |:---: | -[jur-ng](https://github.com/jur-ng) |[sontixyou](https://github.com/sontixyou) |[kode-ninja](https://github.com/kode-ninja) |[jx-zyf](https://github.com/jx-zyf) |[magumbo](https://github.com/magumbo) |[mjlumetta](https://github.com/mjlumetta) | +[jur-ng](https://github.com/jur-ng) |[sontixyou](https://github.com/sontixyou) |[kode-ninja](https://github.com/kode-ninja) |[jx-zyf](https://github.com/jx-zyf) |[magumbo](https://github.com/magumbo) |[mdxiaohu](https://github.com/mdxiaohu) | -[mosi-kha](https://github.com/mosi-kha) |[neuronet77](https://github.com/neuronet77) |[ninesalt](https://github.com/ninesalt) |[odselsevier](https://github.com/odselsevier) |[phil714](https://github.com/phil714) |[luntta](https://github.com/luntta) | +[mjlumetta](https://github.com/mjlumetta) |[mosi-kha](https://github.com/mosi-kha) |[neuronet77](https://github.com/neuronet77) |[ninesalt](https://github.com/ninesalt) |[odselsevier](https://github.com/odselsevier) |[ordago](https://github.com/ordago) | :---: |:---: |:---: |:---: |:---: |:---: | -[mosi-kha](https://github.com/mosi-kha) |[neuronet77](https://github.com/neuronet77) |[ninesalt](https://github.com/ninesalt) |[odselsevier](https://github.com/odselsevier) |[phil714](https://github.com/phil714) |[luntta](https://github.com/luntta) | +[mjlumetta](https://github.com/mjlumetta) |[mosi-kha](https://github.com/mosi-kha) |[neuronet77](https://github.com/neuronet77) |[ninesalt](https://github.com/ninesalt) |[odselsevier](https://github.com/odselsevier) |[ordago](https://github.com/ordago) | -[rhymes](https://github.com/rhymes) |[rlebosse](https://github.com/rlebosse) |[rmoura-92](https://github.com/rmoura-92) |[rtaieb](https://github.com/rtaieb) |[slawexxx44](https://github.com/slawexxx44) |[stduhpf](https://github.com/stduhpf) | +[phil714](https://github.com/phil714) |[luntta](https://github.com/luntta) |[rhymes](https://github.com/rhymes) |[rlebosse](https://github.com/rlebosse) |[rmoura-92](https://github.com/rmoura-92) |[rtaieb](https://github.com/rtaieb) | :---: |:---: |:---: |:---: |:---: |:---: | -[rhymes](https://github.com/rhymes) |[rlebosse](https://github.com/rlebosse) |[rmoura-92](https://github.com/rmoura-92) |[rtaieb](https://github.com/rtaieb) |[slawexxx44](https://github.com/slawexxx44) |[stduhpf](https://github.com/stduhpf) | +[phil714](https://github.com/phil714) |[luntta](https://github.com/luntta) |[rhymes](https://github.com/rhymes) |[rlebosse](https://github.com/rlebosse) |[rmoura-92](https://github.com/rmoura-92) |[rtaieb](https://github.com/rtaieb) | -[thanhthot](https://github.com/thanhthot) |[tusharjkhunt](https://github.com/tusharjkhunt) |[vedran555](https://github.com/vedran555) |[yoann-hellopret](https://github.com/yoann-hellopret) |[olitomas](https://github.com/olitomas) |[JimmyLv](https://github.com/JimmyLv) | +[slawexxx44](https://github.com/slawexxx44) |[stduhpf](https://github.com/stduhpf) |[thanhthot](https://github.com/thanhthot) |[tusharjkhunt](https://github.com/tusharjkhunt) |[vedran555](https://github.com/vedran555) |[yoann-hellopret](https://github.com/yoann-hellopret) | :---: |:---: |:---: |:---: |:---: |:---: | -[thanhthot](https://github.com/thanhthot) |[tusharjkhunt](https://github.com/tusharjkhunt) |[vedran555](https://github.com/vedran555) |[yoann-hellopret](https://github.com/yoann-hellopret) |[olitomas](https://github.com/olitomas) |[JimmyLv](https://github.com/JimmyLv) | +[slawexxx44](https://github.com/slawexxx44) |[stduhpf](https://github.com/stduhpf) |[thanhthot](https://github.com/thanhthot) |[tusharjkhunt](https://github.com/tusharjkhunt) |[vedran555](https://github.com/vedran555) |[yoann-hellopret](https://github.com/yoann-hellopret) | + +[olitomas](https://github.com/olitomas) |[JimmyLv](https://github.com/JimmyLv) | +:---: |:---: | +[olitomas](https://github.com/olitomas) |[JimmyLv](https://github.com/JimmyLv) | @@ -496,4 +504,3 @@ We use Browserstack for manual testing Promise.reject(err)), + await once(cp, 'exit') + .then(([code]) => (code && Promise.reject(new Error(`Non-zero exit code when building TS projects: ${code}`)))), +]) diff --git a/bin/upload-to-cdn.js b/bin/upload-to-cdn.js index fa9c909b4f..0abc27e7c4 100644 --- a/bin/upload-to-cdn.js +++ b/bin/upload-to-cdn.js @@ -24,7 +24,8 @@ const path = require('node:path') const { pipeline, finished } = require('node:stream/promises') const { readFile } = require('node:fs/promises') -const AWS = require('aws-sdk') +const { S3 } = require('@aws-sdk/client-s3'); + const packlist = require('npm-packlist') const tar = require('tar') const pacote = require('pacote') @@ -108,11 +109,11 @@ async function main (packageName, version) { // where we force push a local build if (version?.startsWith('-')) version = undefined // eslint-disable-line no-param-reassign - const s3 = new AWS.S3({ - credentials: new AWS.Credentials({ + const s3 = new S3({ + credentials: { accessKeyId: process.env.EDGLY_KEY, secretAccessKey: process.env.EDGLY_SECRET, - }), + }, region: AWS_REGION, }) @@ -146,7 +147,7 @@ async function main (packageName, version) { const { Contents: existing } = await s3.listObjects({ Bucket: AWS_BUCKET, Prefix: outputPath, - }).promise() + }) if (existing.length > 0) { if (process.argv.includes('--force')) { console.warn(`WARN Release files for ${dirName} v${version} already exist, overwriting...`) @@ -178,7 +179,7 @@ async function main (packageName, version) { Key: key, ContentType: mime.lookup(filename), Body: buffer, - }).promise() + }) } } diff --git a/e2e/clients/react/App.jsx b/e2e/clients/react/App.jsx index ba0aa45846..cfd68bcc5c 100644 --- a/e2e/clients/react/App.jsx +++ b/e2e/clients/react/App.jsx @@ -4,13 +4,18 @@ import Uppy from '@uppy/core' import React, { useState } from 'react' import { Dashboard, DashboardModal, DragDrop } from '@uppy/react' import ThumbnailGenerator from '@uppy/thumbnail-generator' +import RemoteSources from '@uppy/remote-sources' import '@uppy/core/dist/style.css' import '@uppy/dashboard/dist/style.css' import '@uppy/drag-drop/dist/style.css' export default function App () { - const uppyDashboard = new Uppy({ id: 'dashboard' }) + const RemoteSourcesOptions = { + companionUrl: 'http://companion.uppy.io', + sources: ['GoogleDrive', 'OneDrive', 'Unsplash', 'Zoom', 'Url'], + } + const uppyDashboard = new Uppy({ id: 'dashboard' }).use(RemoteSources, { ...RemoteSourcesOptions }) const uppyModal = new Uppy({ id: 'modal' }) const uppyDragDrop = new Uppy({ id: 'drag-drop' }).use(ThumbnailGenerator) const [open, setOpen] = useState(false) diff --git a/e2e/cypress/integration/dashboard-transloadit.spec.ts b/e2e/cypress/integration/dashboard-transloadit.spec.ts index 16b50bee45..7991cb9aaa 100644 --- a/e2e/cypress/integration/dashboard-transloadit.spec.ts +++ b/e2e/cypress/integration/dashboard-transloadit.spec.ts @@ -40,6 +40,8 @@ describe('Dashboard with Transloadit', () => { cy.get('.uppy-StatusBar-actionBtn--upload').click() cy.wait(['@createAssemblies']).then(() => { + // eslint-disable-next-line + // @ts-ignore fix me expect( Object.values(uppy.getPlugin('Transloadit').activeAssemblies).every( (a: any) => a.pollInterval, @@ -49,6 +51,8 @@ describe('Dashboard with Transloadit', () => { uppy.cancelAll() cy.wait(['@delete']).then(() => { + // eslint-disable-next-line + // @ts-ignore fix me expect( Object.values(uppy.getPlugin('Transloadit').activeAssemblies).some( (a: any) => a.pollInterval, @@ -67,6 +71,8 @@ describe('Dashboard with Transloadit', () => { const spy = cy.spy() cy.window().then(({ uppy }) => { + // eslint-disable-next-line + // @ts-ignore fix me uppy.on('transloadit:assembly-cancelled', spy) cy.get('@file-input').selectFile( @@ -111,6 +117,8 @@ describe('Dashboard with Transloadit', () => { const spy = cy.spy() cy.window().then(({ uppy }) => { + // eslint-disable-next-line + // @ts-ignore fix me uppy.on('transloadit:assembly-cancelled', spy) cy.get('@file-input').selectFile( @@ -141,6 +149,8 @@ describe('Dashboard with Transloadit', () => { cy.get('.uppy-StatusBar-actionBtn--upload').click() cy.wait('@assemblyPolling') + // eslint-disable-next-line + // @ts-ignore fix me expect( Object.values(uppy.getPlugin('Transloadit').activeAssemblies).every( (a: any) => a.pollInterval, @@ -148,9 +158,13 @@ describe('Dashboard with Transloadit', () => { ).to.equal(true) const { files } = uppy.getState() + // eslint-disable-next-line + // @ts-ignore fix me uppy.removeFiles(Object.keys(files)) cy.wait('@assemblyDeletion').then(() => { + // eslint-disable-next-line + // @ts-ignore fix me expect( Object.values(uppy.getPlugin('Transloadit').activeAssemblies).some( (a: any) => a.pollInterval, @@ -172,14 +186,20 @@ describe('Dashboard with Transloadit', () => { cy.get('.uppy-StatusBar-actionBtn--upload').click() cy.window().then(({ uppy }) => { + // eslint-disable-next-line + // @ts-ignore fix me expect( Object.values(uppy.getPlugin('Transloadit').activeAssemblies).length, ).to.equal(0) const { files } = uppy.getState() + // eslint-disable-next-line + // @ts-ignore fix me uppy.removeFiles(Object.keys(files)) cy.wait('@createAssemblies').then(() => { + // eslint-disable-next-line + // @ts-ignore fix me expect( Object.values(uppy.getPlugin('Transloadit').activeAssemblies).some( (a: any) => a.pollInterval, @@ -201,6 +221,8 @@ describe('Dashboard with Transloadit', () => { cy.get('.uppy-StatusBar-actionBtn--upload').click() cy.window().then(({ uppy }) => { + // eslint-disable-next-line + // @ts-ignore fix me expect( Object.values(uppy.getPlugin('Transloadit').activeAssemblies).length, ).to.equal(0) diff --git a/e2e/cypress/integration/react.spec.ts b/e2e/cypress/integration/react.spec.ts index c937e35070..c206dbc28d 100644 --- a/e2e/cypress/integration/react.spec.ts +++ b/e2e/cypress/integration/react.spec.ts @@ -19,6 +19,22 @@ describe('@uppy/react', () => { .each((element) => expect(element).attr('src').to.include('blob:')) }) + it('should render Dashboard with Remote Sources plugin pack', () => { + const sources = [ + 'My Device', + 'Google Drive', + 'OneDrive', + 'Unsplash', + 'Zoom', + 'Link', + ] + cy.get('#dashboard .uppy-DashboardTab-name').each((item, index, list) => { + expect(list).to.have.length(6) + // Returns the current element from the loop + expect(Cypress.$(item).text()).to.eq(sources[index]) + }) + }) + it('should render Modal in React and show thumbnails', () => { cy.get('#open').click() cy.get('@modal-input').selectFile( @@ -36,6 +52,8 @@ describe('@uppy/react', () => { it('should render Drag & Drop in React and create a thumbail with @uppy/thumbnail-generator', () => { const spy = cy.spy() + // eslint-disable-next-line + // @ts-ignore fix me cy.window().then(({ uppy }) => uppy.on('thumbnail:generated', spy)) cy.get('@dragdrop-input').selectFile( [ diff --git a/e2e/package.json b/e2e/package.json index 0afe2839fb..89a004d932 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -4,7 +4,7 @@ "author": "Merlijn Vos ", "description": "End-to-end test suite for Uppy", "scripts": { - "client:start": "parcel clients/index.html", + "client:start": "parcel --no-autoinstall clients/index.html", "cypress:open": "cypress open", "cypress:headless": "cypress run", "generate-test": "yarn node generate-test.mjs" @@ -45,15 +45,16 @@ "@uppy/zoom": "workspace:^" }, "devDependencies": { - "cypress": "^12.9.0", - "cypress-terminal-report": "^4.1.2", + "@parcel/transformer-vue": "^2.9.3", + "cypress": "^13.0.0", + "cypress-terminal-report": "^5.0.0", "deep-freeze": "^0.0.1", - "execa": "^6.1.0", - "parcel": "2.0.0-nightly.1278", + "parcel": "^2.9.3", + "process": "^0.11.10", "prompts": "^2.4.2", "react": "^18.1.0", "react-dom": "^18.1.0", - "typescript": "~4.8", + "typescript": "~5.1", "vue": "^3.2.33" } } diff --git a/e2e/start-companion-with-load-balancer.mjs b/e2e/start-companion-with-load-balancer.mjs index 28de8fcc71..a0f2be79b0 100755 --- a/e2e/start-companion-with-load-balancer.mjs +++ b/e2e/start-companion-with-load-balancer.mjs @@ -1,8 +1,9 @@ #!/usr/bin/env node -import { execa } from 'execa' +import { spawn } from 'node:child_process' import http from 'node:http' import httpProxy from 'http-proxy' +import process from 'node:process' const numInstances = 3 const lbPort = 3020 @@ -45,20 +46,42 @@ function createLoadBalancer (baseUrls) { return server } -const startCompanion = ({ name, port }) => execa('nodemon', [ - '--watch', 'packages/@uppy/companion/src', '--exec', 'node', '-r', 'dotenv/config', './packages/@uppy/companion/src/standalone/start-server.js', -], { - cwd: new URL('../', import.meta.url), - stdio: 'inherit', - env: { - // Note: these env variables will override anything set in .env - COMPANION_PORT: port, - COMPANION_SECRET: 'development', // multi instance will not work without secret set - COMPANION_PREAUTH_SECRET: 'development', // multi instance will not work without secret set - COMPANION_ALLOW_LOCAL_URLS: 'true', - COMPANION_LOGGER_PROCESS_NAME: name, - }, -}) +const isWindows = process.platform === 'win32' +const isOSX = process.platform === 'darwin' + +const startCompanion = ({ name, port }) => { + const cp = spawn(process.execPath, [ + '-r', 'dotenv/config', + // Watch mode support is limited to Windows and macOS at the time of writing. + ...(isWindows || isOSX ? ['--watch-path', 'packages/@uppy/companion/src', '--watch'] : []), + './packages/@uppy/companion/src/standalone/start-server.js', + ], { + cwd: new URL('../', import.meta.url), + stdio: 'inherit', + env: { + // Note: these env variables will override anything set in .env + ...process.env, + COMPANION_PORT: port, + COMPANION_SECRET: 'development', // multi instance will not work without secret set + COMPANION_PREAUTH_SECRET: 'development', // multi instance will not work without secret set + COMPANION_ALLOW_LOCAL_URLS: 'true', + COMPANION_LOGGER_PROCESS_NAME: name, + }, + }) + // Adding a `then` property so the return value is awaitable: + return Object.defineProperty(cp, 'then', { + __proto__: null, + writable: true, + configurable: true, + value: Promise.prototype.then.bind(new Promise((resolve, reject) => { + cp.on('exit', (code) => { + if (code === 0) resolve(cp) + else reject(new Error(`Non-zero exit code: ${code}`)) + }) + cp.on('error', reject) + })), + }) +} const hosts = Array.from({ length: numInstances }, (_, index) => { const port = companionStartPort + index diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json index fb294941d3..805336a76c 100644 --- a/e2e/tsconfig.json +++ b/e2e/tsconfig.json @@ -1,5 +1,7 @@ { "compilerOptions": { + "moduleResolution": "NodeNext", + "noEmit": true, "target": "es2020", "lib": ["es2020", "dom"], "types": ["cypress"] diff --git a/examples/aws-nodejs/public/drag.html b/examples/aws-nodejs/public/drag.html index ead78d2ff0..84b987a2bf 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.17.0/uppy.min.mjs' + } from 'https://releases.transloadit.com/uppy/v3.20.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 2a5fe2b351..2c436b23be 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.17.0/uppy.min.mjs' + } from 'https://releases.transloadit.com/uppy/v3.20.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. @@ -121,19 +121,7 @@

AWS upload example

// implement them (you'd also need to set `shouldUseMultipart: false` though). async createMultipartUpload(file, signal) { - if (signal?.aborted) { - const err = new DOMException( - 'The operation was aborted', - 'AbortError', - ) - Object.defineProperty(err, 'cause', { - __proto__: null, - configurable: true, - writable: true, - value: signal.reason, - }) - throw err - } + signal?.throwIfAborted() const metadata = {} @@ -191,19 +179,7 @@

AWS upload example

const { uploadId, key, partNumber, signal } = options - if (signal?.aborted) { - const err = new DOMException( - 'The operation was aborted', - 'AbortError', - ) - Object.defineProperty(err, 'cause', { - __proto__: null, - configurable: true, - writable: true, - value: signal.reason, - }) - throw err - } + signal?.throwIfAborted() if (uploadId == null || key == null || partNumber == null) { throw new Error( @@ -226,19 +202,7 @@

AWS upload example

}, async listParts(file, { key, uploadId }, signal) { - if (signal?.aborted) { - const err = new DOMException( - 'The operation was aborted', - 'AbortError', - ) - Object.defineProperty(err, 'cause', { - __proto__: null, - configurable: true, - writable: true, - value: signal.reason, - }) - throw err - } + signal?.throwIfAborted() const filename = encodeURIComponent(key) const response = await fetch( @@ -259,19 +223,7 @@

AWS upload example

{ key, uploadId, parts }, signal, ) { - if (signal?.aborted) { - const err = new DOMException( - 'The operation was aborted', - 'AbortError', - ) - Object.defineProperty(err, 'cause', { - __proto__: null, - configurable: true, - writable: true, - value: signal.reason, - }) - throw err - } + signal?.throwIfAborted() const filename = encodeURIComponent(key) const uploadIdEnc = encodeURIComponent(uploadId) diff --git a/examples/cdn-example/index.html b/examples/cdn-example/index.html index 7e92ab7b27..c5a552e0f4 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.17.0/uppy.min.mjs' + } from 'https://releases.transloadit.com/uppy/v3.20.0/uppy.min.mjs' const uppy = new Uppy({ debug: true, autoProceed: false }) .use(Dashboard, { trigger: '#uppyModalOpener' }) @@ -34,7 +34,7 @@