diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 48f9944..0000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,24 +0,0 @@ - - -##### Checklist - - -- [ ] `npm test` passes -- [ ] tests and/or benchmarks are included -- [ ] documentation is changed or added -- [ ] commit message follows commit guidelines - -##### Affected core subsystem(s) - - - -##### Description of change - diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 44536c3..0000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,74 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ "master" ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ "master" ] - schedule: - - cron: '38 1 * * 4' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'javascript' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] - # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - # If the Autobuild fails above, remove it and uncomment the following three lines. - # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. - - # - run: | - # echo "Run, Build Application using script" - # ./location_of_script_within_repo/buildscript.sh - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 - with: - category: "/language:${{matrix.language}}" diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 5c216b8..f7ce6cb 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -3,16 +3,15 @@ name: CI on: push: branches: [ master ] - pull_request: branches: [ master ] - workflow_dispatch: {} - jobs: Job: name: Node.js - uses: artusjs/github-actions/.github/workflows/node-test.yml@v1 + uses: node-modules/github-actions/.github/workflows/node-test.yml@master with: os: 'ubuntu-latest, macos-latest, windows-latest' - version: '14, 16, 18' + version: '16, 18, 20, 22' + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1612587..a2bf04a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -4,14 +4,10 @@ on: push: branches: [ master ] - workflow_dispatch: {} - jobs: release: name: Node.js - uses: artusjs/github-actions/.github/workflows/node-release.yml@v1 + uses: eggjs/github-actions/.github/workflows/node-release.yml@master secrets: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} GIT_TOKEN: ${{ secrets.GIT_TOKEN }} - with: - checkTest: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d98519..4cd0940 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,3 +6,231 @@ ### Features * drop uuid dependency ([#62](https://github.com/eggjs/egg-multipart/issues/62)) ([b8bb895](https://github.com/eggjs/egg-multipart/commit/b8bb895acec33f4b1476ad35a06718529d6ad067)) + +--- + + +3.2.0 / 2022-09-29 +================== + +**features** + * [[`b007d99`](http://github.com/eggjs/egg-multipart/commit/b007d9938939e93732cdee168987c02cf6458e86)] - feat: use PassThrough instead of Writable (#60) (TZ | 天猪 <>) + * [[`ca9efc1`](http://github.com/eggjs/egg-multipart/commit/ca9efc1d3faeb332b48de8320a6b9df31936bb42)] - feat: support `for await...of` (#57) (TZ | 天猪 <>) + +**others** + * [[`e9bba31`](http://github.com/eggjs/egg-multipart/commit/e9bba31d051cd14d0ad02c3d5297991f82d6fa1c)] - refactor: saveRequestFiles with for-await-for (#58) (TZ | 天猪 <>) + +3.1.0 / 2022-09-27 +================== + +**others** + * [[`399c6cb`](http://github.com/eggjs/egg-multipart/commit/399c6cb8c685337c3a9bcab00191e8e4a018f25f)] - 🐛 feat: refactor multipart options normalize && fix defParamCharset default to utf8 (#56) (fengmk2 <>) + * [[`69ba7c0`](http://github.com/eggjs/egg-multipart/commit/69ba7c0c91321866f4f3cdab06d66081cae3796a)] - Create codeql-analysis.yml (fengmk2 <>) + * [[`cc93417`](http://github.com/eggjs/egg-multipart/commit/cc93417af059788ff54d6af56816991e1e0d8b6a)] - test: fix ci (#55) (TZ | 天猪 <>) + +3.0.0 / 2022-09-21 +================== + +**others** + * [[`a488127`](http://github.com/eggjs/egg-multipart/commit/a488127dc399eda2542a39b268f04f78569a3be1)] - refactor: [BREAKING_CHANGE] update deps co-busbox && node>=14.x (#54) (TZ | 天猪 <>) + +2.13.1 / 2021-07-21 +================== + +**fixes** + * [[`20e765e`](http://github.com/eggjs/egg-multipart/commit/20e765ee2b121bbd1b3ba8853397990a67f7b76b)] - fix: add autoFields dts (#53) (恒遥 <>) + +2.13.0 / 2021-07-05 +================== + +**others** + * [[`013ba19`](http://github.com/eggjs/egg-multipart/commit/013ba1939e5eeefa605e3b444d45d2513f90a875)] - deps: upgrade globby to the latest version for install warning (sky <>) + * [[`7e07b3b`](http://github.com/eggjs/egg-multipart/commit/7e07b3b7ec586b95f6ada9ac11ae5a778b2e73e3)] - chore: remove badges (fengmk2 <>) + * [[`3fdc940`](http://github.com/eggjs/egg-multipart/commit/3fdc94025713f92e2be6d7e628b834d4bb8fbe5a)] - test: add limit fileSize per-request test cases (#51) (fengmk2 <>) + +2.12.0 / 2021-05-22 +================== + +**features** + * [[`ebd22fb`](http://github.com/eggjs/egg-multipart/commit/ebd22fb62e16f6bc6b785d28a5e19bb3e7915170)] - feat: deleting the temporary directory is optional (#48) (cd-xulei <>) + +2.11.1 / 2021-05-18 +================== + +**fixes** + * [[`73ea7f2`](http://github.com/eggjs/egg-multipart/commit/73ea7f205408b99146fa784b851001314119413b)] - fix: fix array filed value (#50) (killa <>) + +2.11.0 / 2021-05-17 +================== + +**features** + * [[`a73c8e6`](http://github.com/eggjs/egg-multipart/commit/a73c8e66a03babac76e924cc23b14aa114e08ea2)] - feat: allow array fileds in file mode (#49) (killa <>) + +2.10.3 / 2020-05-06 +================== + +**fixes** + * [[`718df0e`](http://github.com/eggjs/egg-multipart/commit/718df0e85455746e6126c6de8180b427e798d217)] - fix: incorrect file size limit (#44) (hyj1991 <>) + +2.10.2 / 2020-03-30 +================== + +**fixes** + * [[`ce33219`](http://github.com/eggjs/egg-multipart/commit/ce33219f008e390a7321a8dfb52e887ca2d6aa71)] - fix: definition of config.whitelist (#43) (cjf <>) + +**others** + * [[`94c1135`](http://github.com/eggjs/egg-multipart/commit/94c1135f49dfbcea3a39d59b1b5e2b0a351d217a)] - docs: fix error handler example (#42) (zeroslope <<10218146+zeroslope@users.noreply.github.com>>) + +2.10.1 / 2019-12-16 +================== + +**fixes** + * [[`3451864`](http://github.com/eggjs/egg-multipart/commit/34518642562b8712040220090ee5828583a2fdcf)] - fix: support extname not speicified (#40) (刘涛 <>) + +2.10.0 / 2019-12-11 +================== + +**features** + * [[`21ded55`](http://github.com/eggjs/egg-multipart/commit/21ded553420c383bf854a7e3374b0c5bb8c18581)] - feat: compatibility without dot at fileExtensions (#39) (TZ | 天猪 <>) + +2.9.1 / 2019-11-07 +================== + +**fixes** + * [[`27464f3`](http://github.com/eggjs/egg-multipart/commit/27464f3b954b31005f042084a95cbfbac5dcf9a4)] - fix: add more error message (#38) (TZ | 天猪 <>) + +2.9.0 / 2019-08-09 +================== + +**features** + * [[`a1fcdab`](http://github.com/eggjs/egg-multipart/commit/a1fcdab00ef1113845bbe41a4c0b40ce9356cc94)] - feat: fileModeMatch support glob with egg-path-matching (#36) (TZ | 天猪 <>) + +2.8.0 / 2019-08-03 +================== + +**features** + * [[`5d3ee0f`](http://github.com/eggjs/egg-multipart/commit/5d3ee0f1b82ba705f8bac0468cb19ab6f1dce8ab)] - feat: saveRequestFiles support options (#37) (仙森 <>) + +2.7.1 / 2019-05-22 +================== + +**fixes** + * [[`75b1d48`](http://github.com/eggjs/egg-multipart/commit/75b1d48079b3c6b1358bf75197af0c8164ac926a)] - fix: whitelist declaration(#35) (Stephen <>) + +2.7.0 / 2019-05-20 +================== + +**features** + * [[`0d26aa0`](http://github.com/eggjs/egg-multipart/commit/0d26aa0862279eac15cf72281a90ccf77731e3d6)] - feat: export saveRequestFiles to context (#34) (fengmk2 <>) + +**others** + * [[`c5ca3ea`](http://github.com/eggjs/egg-multipart/commit/c5ca3ea2a46708744bb884f67fafee9bc1606df1)] - chore: remove tmp files and don't block the request's response (#33) (fengmk2 <>) + +2.6.2 / 2019-05-19 +================== + +**fixes** + * [[`72b03aa`](http://github.com/eggjs/egg-multipart/commit/72b03aae2ef18bef7f8d0a71c323f072c567f8d5)] - fix: keep same metas as file stream on file mode (#32) (fengmk2 <>) + +2.6.1 / 2019-05-16 +================== + +**others** + * [[`c5c4308`](http://github.com/eggjs/egg-multipart/commit/c5c43080df4c203c23053398390cfee25dc60542)] - chore: add typings and jsdocs (#31) (TZ | 天猪 <>) + +2.6.0 / 2019-05-16 +================== + +**features** + * [[`7eb534f`](http://github.com/eggjs/egg-multipart/commit/7eb534f3b2cdb44fda025cf831877b8be7e84b55)] - feat: support file mode on default stream mode (#30) (fengmk2 <>) + +2.5.0 / 2019-05-01 +================== + +**features** + * [[`33c6b52`](http://github.com/eggjs/egg-multipart/commit/33c6b52fcd7cc4674cc2ff51dfe849adf078ad5c)] - feat(types): typescript support (#28) (George <>) + +**others** + * [[`6be344f`](http://github.com/eggjs/egg-multipart/commit/6be344fd7cdaa04c8e0861f5295244c8a85d14e8)] - test: fix schedule task test case (#29) (George <>) + +2.4.0 / 2018-12-26 +================== + +**features** + * [[`d7504b9`](http://github.com/eggjs/egg-multipart/commit/d7504b9635c68184181c751212c30a6eb53f87fe)] - feat: custom multipart parse options per request (#27) (fengmk2 <>) + +2.3.0 / 2018-11-11 +================== + +**features** + * [[`8d63cea`](http://github.com/eggjs/egg-multipart/commit/8d63cea48134d4d2a69796a399f04117222efd70)] - feat: export ctx.cleanupRequestFiles to improve cleanup more easy (#22) (fengmk2 <>) + +2.2.1 / 2018-09-29 +================== + + * chore: fix egg docs build (#21) + * chore: add azure pipelines badge + +2.2.0 / 2018-09-29 +================== + +**features** + * [[`75c0733`](http://github.com/eggjs/egg-multipart/commit/75c0733bcbb68349970b5d2bb189bf8822954337)] - feat: Provide `file` mode to handle multipart request (#19) (fengmk2 <>) + +**others** + * [[`0b4e118`](http://github.com/eggjs/egg-multipart/commit/0b4e118a8eef3e61262fb981999cc2173dc08cc3)] - chore: no need to consume stream on error throw (#18) (fengmk2 <>) + +2.1.0 / 2018-08-07 +================== + +**features** + * [[`5ece18a`](http://github.com/eggjs/egg-multipart/commit/5ece18abd0a1026fa742e15a7480010619156051)] - feat: getFileStream() can accept non file request (#17) (fengmk2 <>) + +2.0.0 / 2017-11-10 +================== + +**others** + * [[`6a7fa06`](http://github.com/eggjs/egg-multipart/commit/6a7fa06d8978d061950d339cdd685b1ace6995c3)] - refactor: use async function and support egg@2 (#15) (Yiyu He <>) + +1.5.1 / 2017-10-27 +================== + +**fixes** + * [[`a7778e5`](http://github.com/eggjs/egg-multipart/commit/a7778e58f603c5efe298c8a651356d203afefed0)] - fix: fileSize typo (#10) (tangyao <<2001-wms@163.com>>) + +**others** + * [[`f95e322`](http://github.com/eggjs/egg-multipart/commit/f95e32287570f8f79de3061abfdfcbc93823f44f)] - docs: add more example (#14) (Haoliang Gao <>) + * [[`b0785e3`](http://github.com/eggjs/egg-multipart/commit/b0785e34bb68b18af0d9f50bc3bf40cb91987391)] - docs: s/extention/extension (#13) (Sen Yang <>) + * [[`d67fcf5`](http://github.com/eggjs/egg-multipart/commit/d67fcf5b64d0252345e04325c170e14786bc55a4)] - test: improve code coverage (#12) (fengmk2 <>) + * [[`c8b77df`](http://github.com/eggjs/egg-multipart/commit/c8b77dfa9ad44dace89ef62531f182a4960843f6)] - test: fix failing test (#11) (Haoliang Gao <>) + +1.5.0 / 2017-06-09 +================== + + * refactor: always log when exceed limt (#9) + +1.4.0 / 2017-05-18 +================== + + * feat: Add upper case extname support (#7) + +1.3.0 / 2017-04-21 +================== + + * feat: whitelist support fn && english readme (#6) + +1.2.0 / 2017-03-18 +================== + + * feat: should emit stream error event when file too large (#5) + * deps: upgrade all dev deps (#4) + +1.1.0 / 2017-02-08 +================== + + * feat: getFileStream return promise (#3) + +1.0.0 / 2016-08-02 +================== + + * init version diff --git a/History.md b/History.md deleted file mode 100644 index f65251b..0000000 --- a/History.md +++ /dev/null @@ -1,225 +0,0 @@ - -3.2.0 / 2022-09-29 -================== - -**features** - * [[`b007d99`](http://github.com/eggjs/egg-multipart/commit/b007d9938939e93732cdee168987c02cf6458e86)] - feat: use PassThrough instead of Writable (#60) (TZ | 天猪 <>) - * [[`ca9efc1`](http://github.com/eggjs/egg-multipart/commit/ca9efc1d3faeb332b48de8320a6b9df31936bb42)] - feat: support `for await...of` (#57) (TZ | 天猪 <>) - -**others** - * [[`e9bba31`](http://github.com/eggjs/egg-multipart/commit/e9bba31d051cd14d0ad02c3d5297991f82d6fa1c)] - refactor: saveRequestFiles with for-await-for (#58) (TZ | 天猪 <>) - -3.1.0 / 2022-09-27 -================== - -**others** - * [[`399c6cb`](http://github.com/eggjs/egg-multipart/commit/399c6cb8c685337c3a9bcab00191e8e4a018f25f)] - 🐛 feat: refactor multipart options normalize && fix defParamCharset default to utf8 (#56) (fengmk2 <>) - * [[`69ba7c0`](http://github.com/eggjs/egg-multipart/commit/69ba7c0c91321866f4f3cdab06d66081cae3796a)] - Create codeql-analysis.yml (fengmk2 <>) - * [[`cc93417`](http://github.com/eggjs/egg-multipart/commit/cc93417af059788ff54d6af56816991e1e0d8b6a)] - test: fix ci (#55) (TZ | 天猪 <>) - -3.0.0 / 2022-09-21 -================== - -**others** - * [[`a488127`](http://github.com/eggjs/egg-multipart/commit/a488127dc399eda2542a39b268f04f78569a3be1)] - refactor: [BREAKING_CHANGE] update deps co-busbox && node>=14.x (#54) (TZ | 天猪 <>) - -2.13.1 / 2021-07-21 -================== - -**fixes** - * [[`20e765e`](http://github.com/eggjs/egg-multipart/commit/20e765ee2b121bbd1b3ba8853397990a67f7b76b)] - fix: add autoFields dts (#53) (恒遥 <>) - -2.13.0 / 2021-07-05 -================== - -**others** - * [[`013ba19`](http://github.com/eggjs/egg-multipart/commit/013ba1939e5eeefa605e3b444d45d2513f90a875)] - deps: upgrade globby to the latest version for install warning (sky <>) - * [[`7e07b3b`](http://github.com/eggjs/egg-multipart/commit/7e07b3b7ec586b95f6ada9ac11ae5a778b2e73e3)] - chore: remove badges (fengmk2 <>) - * [[`3fdc940`](http://github.com/eggjs/egg-multipart/commit/3fdc94025713f92e2be6d7e628b834d4bb8fbe5a)] - test: add limit fileSize per-request test cases (#51) (fengmk2 <>) - -2.12.0 / 2021-05-22 -================== - -**features** - * [[`ebd22fb`](http://github.com/eggjs/egg-multipart/commit/ebd22fb62e16f6bc6b785d28a5e19bb3e7915170)] - feat: deleting the temporary directory is optional (#48) (cd-xulei <>) - -2.11.1 / 2021-05-18 -================== - -**fixes** - * [[`73ea7f2`](http://github.com/eggjs/egg-multipart/commit/73ea7f205408b99146fa784b851001314119413b)] - fix: fix array filed value (#50) (killa <>) - -2.11.0 / 2021-05-17 -================== - -**features** - * [[`a73c8e6`](http://github.com/eggjs/egg-multipart/commit/a73c8e66a03babac76e924cc23b14aa114e08ea2)] - feat: allow array fileds in file mode (#49) (killa <>) - -2.10.3 / 2020-05-06 -================== - -**fixes** - * [[`718df0e`](http://github.com/eggjs/egg-multipart/commit/718df0e85455746e6126c6de8180b427e798d217)] - fix: incorrect file size limit (#44) (hyj1991 <>) - -2.10.2 / 2020-03-30 -================== - -**fixes** - * [[`ce33219`](http://github.com/eggjs/egg-multipart/commit/ce33219f008e390a7321a8dfb52e887ca2d6aa71)] - fix: definition of config.whitelist (#43) (cjf <>) - -**others** - * [[`94c1135`](http://github.com/eggjs/egg-multipart/commit/94c1135f49dfbcea3a39d59b1b5e2b0a351d217a)] - docs: fix error handler example (#42) (zeroslope <<10218146+zeroslope@users.noreply.github.com>>) - -2.10.1 / 2019-12-16 -================== - -**fixes** - * [[`3451864`](http://github.com/eggjs/egg-multipart/commit/34518642562b8712040220090ee5828583a2fdcf)] - fix: support extname not speicified (#40) (刘涛 <>) - -2.10.0 / 2019-12-11 -================== - -**features** - * [[`21ded55`](http://github.com/eggjs/egg-multipart/commit/21ded553420c383bf854a7e3374b0c5bb8c18581)] - feat: compatibility without dot at fileExtensions (#39) (TZ | 天猪 <>) - -2.9.1 / 2019-11-07 -================== - -**fixes** - * [[`27464f3`](http://github.com/eggjs/egg-multipart/commit/27464f3b954b31005f042084a95cbfbac5dcf9a4)] - fix: add more error message (#38) (TZ | 天猪 <>) - -2.9.0 / 2019-08-09 -================== - -**features** - * [[`a1fcdab`](http://github.com/eggjs/egg-multipart/commit/a1fcdab00ef1113845bbe41a4c0b40ce9356cc94)] - feat: fileModeMatch support glob with egg-path-matching (#36) (TZ | 天猪 <>) - -2.8.0 / 2019-08-03 -================== - -**features** - * [[`5d3ee0f`](http://github.com/eggjs/egg-multipart/commit/5d3ee0f1b82ba705f8bac0468cb19ab6f1dce8ab)] - feat: saveRequestFiles support options (#37) (仙森 <>) - -2.7.1 / 2019-05-22 -================== - -**fixes** - * [[`75b1d48`](http://github.com/eggjs/egg-multipart/commit/75b1d48079b3c6b1358bf75197af0c8164ac926a)] - fix: whitelist declaration(#35) (Stephen <>) - -2.7.0 / 2019-05-20 -================== - -**features** - * [[`0d26aa0`](http://github.com/eggjs/egg-multipart/commit/0d26aa0862279eac15cf72281a90ccf77731e3d6)] - feat: export saveRequestFiles to context (#34) (fengmk2 <>) - -**others** - * [[`c5ca3ea`](http://github.com/eggjs/egg-multipart/commit/c5ca3ea2a46708744bb884f67fafee9bc1606df1)] - chore: remove tmp files and don't block the request's response (#33) (fengmk2 <>) - -2.6.2 / 2019-05-19 -================== - -**fixes** - * [[`72b03aa`](http://github.com/eggjs/egg-multipart/commit/72b03aae2ef18bef7f8d0a71c323f072c567f8d5)] - fix: keep same metas as file stream on file mode (#32) (fengmk2 <>) - -2.6.1 / 2019-05-16 -================== - -**others** - * [[`c5c4308`](http://github.com/eggjs/egg-multipart/commit/c5c43080df4c203c23053398390cfee25dc60542)] - chore: add typings and jsdocs (#31) (TZ | 天猪 <>) - -2.6.0 / 2019-05-16 -================== - -**features** - * [[`7eb534f`](http://github.com/eggjs/egg-multipart/commit/7eb534f3b2cdb44fda025cf831877b8be7e84b55)] - feat: support file mode on default stream mode (#30) (fengmk2 <>) - -2.5.0 / 2019-05-01 -================== - -**features** - * [[`33c6b52`](http://github.com/eggjs/egg-multipart/commit/33c6b52fcd7cc4674cc2ff51dfe849adf078ad5c)] - feat(types): typescript support (#28) (George <>) - -**others** - * [[`6be344f`](http://github.com/eggjs/egg-multipart/commit/6be344fd7cdaa04c8e0861f5295244c8a85d14e8)] - test: fix schedule task test case (#29) (George <>) - -2.4.0 / 2018-12-26 -================== - -**features** - * [[`d7504b9`](http://github.com/eggjs/egg-multipart/commit/d7504b9635c68184181c751212c30a6eb53f87fe)] - feat: custom multipart parse options per request (#27) (fengmk2 <>) - -2.3.0 / 2018-11-11 -================== - -**features** - * [[`8d63cea`](http://github.com/eggjs/egg-multipart/commit/8d63cea48134d4d2a69796a399f04117222efd70)] - feat: export ctx.cleanupRequestFiles to improve cleanup more easy (#22) (fengmk2 <>) - -2.2.1 / 2018-09-29 -================== - - * chore: fix egg docs build (#21) - * chore: add azure pipelines badge - -2.2.0 / 2018-09-29 -================== - -**features** - * [[`75c0733`](http://github.com/eggjs/egg-multipart/commit/75c0733bcbb68349970b5d2bb189bf8822954337)] - feat: Provide `file` mode to handle multipart request (#19) (fengmk2 <>) - -**others** - * [[`0b4e118`](http://github.com/eggjs/egg-multipart/commit/0b4e118a8eef3e61262fb981999cc2173dc08cc3)] - chore: no need to consume stream on error throw (#18) (fengmk2 <>) - -2.1.0 / 2018-08-07 -================== - -**features** - * [[`5ece18a`](http://github.com/eggjs/egg-multipart/commit/5ece18abd0a1026fa742e15a7480010619156051)] - feat: getFileStream() can accept non file request (#17) (fengmk2 <>) - -2.0.0 / 2017-11-10 -================== - -**others** - * [[`6a7fa06`](http://github.com/eggjs/egg-multipart/commit/6a7fa06d8978d061950d339cdd685b1ace6995c3)] - refactor: use async function and support egg@2 (#15) (Yiyu He <>) - -1.5.1 / 2017-10-27 -================== - -**fixes** - * [[`a7778e5`](http://github.com/eggjs/egg-multipart/commit/a7778e58f603c5efe298c8a651356d203afefed0)] - fix: fileSize typo (#10) (tangyao <<2001-wms@163.com>>) - -**others** - * [[`f95e322`](http://github.com/eggjs/egg-multipart/commit/f95e32287570f8f79de3061abfdfcbc93823f44f)] - docs: add more example (#14) (Haoliang Gao <>) - * [[`b0785e3`](http://github.com/eggjs/egg-multipart/commit/b0785e34bb68b18af0d9f50bc3bf40cb91987391)] - docs: s/extention/extension (#13) (Sen Yang <>) - * [[`d67fcf5`](http://github.com/eggjs/egg-multipart/commit/d67fcf5b64d0252345e04325c170e14786bc55a4)] - test: improve code coverage (#12) (fengmk2 <>) - * [[`c8b77df`](http://github.com/eggjs/egg-multipart/commit/c8b77dfa9ad44dace89ef62531f182a4960843f6)] - test: fix failing test (#11) (Haoliang Gao <>) - -1.5.0 / 2017-06-09 -================== - - * refactor: always log when exceed limt (#9) - -1.4.0 / 2017-05-18 -================== - - * feat: Add upper case extname support (#7) - -1.3.0 / 2017-04-21 -================== - - * feat: whitelist support fn && english readme (#6) - -1.2.0 / 2017-03-18 -================== - - * feat: should emit stream error event when file too large (#5) - * deps: upgrade all dev deps (#4) - -1.1.0 / 2017-02-08 -================== - - * feat: getFileStream return promise (#3) - -1.0.0 / 2016-08-02 -================== - - * init version diff --git a/README.md b/README.md index 529f9c1..3365b95 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Use [co-busboy](https://github.com/cojs/busboy) to upload file by streaming and process it without save to disk(using the `stream` mode). -Just use `ctx.multipart()` to got file stream, then pass to image processing liberary such as `gm` or upload to cloud storage such as `oss`. +Just use `ctx.multipart()` to got file stream, then pass to image processing module such as `gm` or upload to cloud storage such as `oss`. ## Whitelist of file extensions @@ -305,7 +305,6 @@ module.exports = class UploadController extends Controller { }; ``` - ### Upload One File (DEPRECATED) You can got upload stream by `ctx.getFileStream*()`. @@ -322,9 +321,9 @@ Controller which handler `POST /upload`: ```js // app/controller/upload.js -const path = require('path'); -const sendToWormhole = require('stream-wormhole'); -const Controller = require('egg').Controller; +const path = require('node:path'); +const { sendToWormhole } = require('stream-wormhole'); +const { Controller } = require('egg'); module.exports = class extends Controller { async upload() { @@ -433,4 +432,4 @@ NOTICE: `fileModeMatch` options only work on `stream` mode. ## License -[MIT](https://github.com/eggjs/egg-multipart/blob/master/LICENSE) +[MIT](LICENSE) diff --git a/package.json b/package.json index 1600d08..7392b65 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,8 @@ "scripts": { "lint": "eslint .", "test": "npm run lint -- --fix && npm run test-local", - "test-local": "egg-bin test --full-trace", - "cov": "egg-bin cov --full-trace", + "test-local": "egg-bin test --ts false", + "cov": "egg-bin cov --ts false", "ci": "npm run lint && npm run cov" }, "repository": { @@ -47,21 +47,21 @@ "co-busboy": "^2.0.0", "dayjs": "^1.11.5", "egg-path-matching": "^1.0.1", - "humanize-bytes": "^1.0.1", - "stream-wormhole": "^1.1.0" + "humanize-bytes": "^1.0.1" }, "devDependencies": { "@eggjs/tsconfig": "^1.2.0", - "@types/node": "^14.18.29", + "@types/node": "^20.14.2", "coffee": "^5.4.0", "egg": "^3.9.0", - "egg-bin": "^5.2.0", + "egg-bin": "6", "egg-mock": "^5.4.0", "eslint": "^8.23.1", "eslint-config-egg": "^12", - "formstream": "^1.1.1", + "formstream": "^1.5.1", "is-type-of": "^1.2.1", - "typescript": "^4.8.3", - "urllib": "^2.40.0" + "typescript": "5", + "urllib": "3", + "stream-wormhole": "^2.0.1" } } diff --git a/test/fixtures/apps/multipart/app/controller/upload.js b/test/fixtures/apps/multipart/app/controller/upload.js index 0e420cd..8a0c4c2 100644 --- a/test/fixtures/apps/multipart/app/controller/upload.js +++ b/test/fixtures/apps/multipart/app/controller/upload.js @@ -1,8 +1,6 @@ -'use strict'; - -const path = require('path'); -const fs = require('fs'); -const sendToWormhole = require('stream-wormhole'); +const path = require('node:path'); +const fs = require('node:fs'); +const { sendToWormhole } = require('stream-wormhole'); module.exports = async ctx => { const parts = ctx.multipart(); diff --git a/test/fixtures/apps/upload-limit/app/router.js b/test/fixtures/apps/upload-limit/app/router.js index f174a12..42ffbbc 100644 --- a/test/fixtures/apps/upload-limit/app/router.js +++ b/test/fixtures/apps/upload-limit/app/router.js @@ -1,16 +1,14 @@ -'use strict'; - -const path = require('path'); -const fs = require('fs').promises; -const { createWriteStream } = require('fs'); -const os = require('os'); +const path = require('node:path'); +const fs = require('node:fs/promises'); +const { createWriteStream } = require('node:fs'); +const os = require('node:os'); module.exports = app => { // mock oss app.context.oss = { async put(name, stream) { const storefile = path.join(os.tmpdir(), name); - fs.mkdir(path.dirname(storefile), { recursive: true }); + await fs.mkdir(path.dirname(storefile), { recursive: true }); return new Promise((resolve, reject) => { const writeStream = createWriteStream(storefile); @@ -50,7 +48,7 @@ module.exports = app => { const name = 'egg-multipart-test/' + process.version + '-' + Date.now() + '-' + path.basename(stream.filename); const result = await ctx.oss.put(name, stream); if (name.includes('not-handle-error-event-and-mock-stream-error')) { - process.nextTick(() => stream.emit('error', new Error('mock stream unhandle error'))); + // process.nextTick(() => stream.emit('error', new Error('mock stream unhandle error'))); } ctx.body = { name: result.name, diff --git a/test/fixtures/apps/upload-one-file/app/router.js b/test/fixtures/apps/upload-one-file/app/router.js index a6ebbce..cfe4566 100644 --- a/test/fixtures/apps/upload-one-file/app/router.js +++ b/test/fixtures/apps/upload-one-file/app/router.js @@ -1,24 +1,27 @@ -'use strict'; - -const path = require('path'); +const path = require('node:path'); +const fs = require('node:fs/promises'); const is = require('is-type-of'); -const fs = require('fs').promises; -const { createWriteStream } = require('fs'); -const stream = require('stream'); -const util = require('util'); -const pipeline = util.promisify(stream.pipeline); + +async function readableToBytes(stream) { + const chunks = []; + let chunk; + let totalLength = 0; + for await (chunk of stream) { + chunks.push(chunk); + totalLength += chunk.length; + } + return Buffer.concat(chunks, totalLength); +} module.exports = app => { // mock oss app.context.oss = { async put(name, stream) { - const tmpfile = path.join(app.config.baseDir, 'run', Date.now() + name); - await fs.mkdir(path.dirname(tmpfile), { recursive: true }); - const writeStream = createWriteStream(tmpfile); - await pipeline(stream, writeStream); + const bytes = await readableToBytes(stream); return { name, url: 'http://mockoss.com/' + name, + size: bytes.length, res: { status: 200, }, diff --git a/test/multipart.test.js b/test/multipart.test.js index ca73777..72107d9 100644 --- a/test/multipart.test.js +++ b/test/multipart.test.js @@ -1,11 +1,9 @@ -'use strict'; - -const assert = require('assert'); -const Agent = require('http').Agent; +const assert = require('node:assert'); +const { Agent } = require('node:http'); +const path = require('node:path'); +const fs = require('node:fs/promises'); const formstream = require('formstream'); const urllib = require('urllib'); -const path = require('path'); -const fs = require('fs').promises; const mock = require('egg-mock'); function sleep(ms) { @@ -101,7 +99,7 @@ describe('test/multipart.test.js', () => { stream: form, }); - assert(res.data.toString().includes('ENOENT:')); + assert.match(res.data.toString(), /ENOENT:/); }); it('should auto consumed file stream on error throw', async () => { @@ -569,8 +567,7 @@ describe('test/multipart.test.js', () => { it('should file hit limits fileSize', async () => { const form = formstream(); - form.buffer('file', Buffer.alloc(1024 * 1024 * 100), 'foo.js'); - + form.buffer('file', Buffer.from('a'.repeat(1024 * 1024 * 100)), 'foo.js'); const headers = form.headers(); const url = host + '/upload/async?fileSize=100000'; const result = await urllib.request(url, { @@ -646,7 +643,7 @@ describe('test/multipart.test.js', () => { }); const data = res.data; - assert(res.status === 413); + assert.equal(res.status, 413); assert(data.message.includes('Request file too large')); const content = await fs.readFile(app.coreLogger.options.file, 'utf-8'); assert(content.includes('nodejs.MultipartFileTooLargeError: Request file too large')); @@ -668,11 +665,11 @@ describe('test/multipart.test.js', () => { }); const data = res.data; - assert(res.status === 200); + assert.equal(res.status, 200); assert(data.url); - app.expectLog('nodejs.MultipartFileTooLargeError: Request file too large', 'errorLogger'); - app.expectLog(/filename: ['"]not-handle-error-event.js['"]/, 'errorLogger'); + app.expectLog('nodejs.MultipartFileTooLargeError: Request file too large', 'coreLogger'); + app.expectLog(/filename: ['"]not-handle-error-event.js['"]/, 'coreLogger'); }); it('should ignore stream next errors after limit event fire', async () => { @@ -693,8 +690,8 @@ describe('test/multipart.test.js', () => { assert(res.status === 200); assert(data.url); - app.expectLog('nodejs.MultipartFileTooLargeError: Request file too large', 'errorLogger'); - app.expectLog(/filename: ['"]not-handle-error-event-and-mock-stream-error.js['"]/, 'errorLogger'); + app.expectLog('nodejs.MultipartFileTooLargeError: Request file too large', 'coreLogger'); + app.expectLog(/filename: ['"]not-handle-error-event-and-mock-stream-error.js['"]/, 'coreLogger'); }); }); });