From a64e1d621b728a295e2cd1923713d27778672adb Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Sat, 9 Aug 2025 14:15:23 +0800 Subject: [PATCH 1/4] fix: patch File to support test on Node.js 18 also use npm trusted publisher https://github.com/node-modules/github-actions/issues/14 --- .github/workflows/release.yml | 5 ++--- .gitignore | 1 + .oxlintrc.json | 11 ++++++++--- package.json | 22 ++++++++++++---------- src/util/sign.ts | 21 ++++++++++++--------- test/hello.cjs | 11 +++++++++++ test/setup.ts | 7 +++++++ vite.config.ts | 7 +++++++ 8 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 test/hello.cjs create mode 100644 test/setup.ts create mode 100644 vite.config.ts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 43b8276b0..1a5669067 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,8 +6,7 @@ on: jobs: release: - name: Node.js - uses: node-modules/github-actions/.github/workflows/node-release.yml@master + name: NPM + uses: node-modules/github-actions/.github/workflows/npm-release.yml@master secrets: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} GIT_TOKEN: ${{ secrets.GIT_TOKEN }} diff --git a/.gitignore b/.gitignore index 7bfa6aa31..44cd4cc20 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ test/node/.tmp test/demo.js yarn.lock package-lock.json +pnpm-lock.yaml .nyc_output/ .env diff --git a/.oxlintrc.json b/.oxlintrc.json index 293dc2938..70deaf58b 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -2,12 +2,17 @@ "$schema": "./node_modules/oxlint/configuration_schema.json", "extends": ["./node_modules/@eggjs/oxlint-config/.oxlintrc.json"], "env": { - "node": true, - "mocha": true + "node": true }, "rules": { "no-console": "warn", "no-empty-function": "allow" }, - "ignorePatterns": ["index.d.ts", "test/fixtures/**", "__snapshots__"] + "ignorePatterns": [ + "index.d.ts", + "test/fixtures/**", + "__snapshots__", + "test/*.cjs", + "test/setup.ts" + ] } diff --git a/package.json b/package.json index 25820304f..341762bdd 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,10 @@ "lint": "oxlint", "pretest": "npm run lint -- --fix", "test": "vitest run --test-timeout 15000", + "test:cjs": "node test/hello.cjs", "cov": "npm run test -- --coverage", "preci": "npm run lint", - "ci": "npm run cov && npm run prepublishOnly && attw --pack", + "ci": "npm run cov && npm run prepublishOnly && attw --pack && npm run test:cjs", "prepublishOnly": "tshy && tshy-after", "prepare": "husky" }, @@ -43,27 +44,27 @@ "ms": "^2.1.3", "oss-interface": "^1.3.0", "stream-wormhole": "^2.0.0", - "urllib": "^4.6.2", + "urllib": "^4.8.1", "utility": "^2.1.0", "xml2js": "^0.6.2" }, "devDependencies": { - "@arethetypeswrong/cli": "^0.15.3", + "@arethetypeswrong/cli": "^0.15.4", "@eggjs/oxlint-config": "^1.0.0", "@eggjs/tsconfig": "^1.1.0", "@types/mime": "^3.0.1", - "@types/ms": "^0.7.31", - "@types/node": "^20.3.1", + "@types/ms": "^0.7.34", + "@types/node": "^20.19.10", "@types/xml2js": "^0.4.12", "@vitest/coverage-v8": "^3.1.3", "husky": "^9.1.7", - "oxlint": "^0.16.10", + "oxlint": "^1.11.0", "prettier": "^3.5.3", - "read-env-value": "^1.0.1", - "tshy": "^1.0.0", + "read-env-value": "^1.1.0", + "tshy": "^1.18.0", "tshy-after": "^1.0.0", "typescript": "^5.2.2", - "vitest": "^3.1.3" + "vitest": "^3.2.4" }, "files": [ "dist", @@ -92,5 +93,6 @@ } }, "types": "./dist/commonjs/index.d.ts", - "main": "./dist/commonjs/index.js" + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js" } diff --git a/src/util/sign.ts b/src/util/sign.ts index ad7b6f2e2..70a8ef8db 100644 --- a/src/util/sign.ts +++ b/src/util/sign.ts @@ -10,6 +10,15 @@ import { encodeCallback } from './encodeCallback.js'; const debug = debuglog('oss-client:sign'); const OSS_PREFIX = 'x-oss-'; +function compareCanonicalizedString(entry1: string, entry2: string) { + if (entry1[0] > entry2[0]) { + return 1; + } else if (entry1[0] < entry2[0]) { + return -1; + } + return 0; +} + /** * build canonicalized resource * @see https://help.aliyun.com/zh/oss/developer-reference/include-signatures-in-the-authorization-header#section-rvv-dx2-xdb @@ -29,14 +38,6 @@ function buildCanonicalizedResource( parameters.sort(); canonicalizedResource += separatorString + parameters.join('&'); } else if (parameters) { - const compareFunc = (entry1: string, entry2: string) => { - if (entry1[0] > entry2[0]) { - return 1; - } else if (entry1[0] < entry2[0]) { - return -1; - } - return 0; - }; const processFunc = (key: string) => { canonicalizedResource += separatorString + key; if (parameters[key] || parameters[key] === 0) { @@ -44,7 +45,9 @@ function buildCanonicalizedResource( } separatorString = '&'; }; - for (const key of Object.keys(parameters).sort(compareFunc)) { + for (const key of Object.keys(parameters).sort( + compareCanonicalizedString + )) { processFunc(key); } } diff --git a/test/hello.cjs b/test/hello.cjs new file mode 100644 index 000000000..9edb016a6 --- /dev/null +++ b/test/hello.cjs @@ -0,0 +1,11 @@ +const { OSSObject } = require('..'); + +const ossObject = new OSSObject({ + region: 'oss-cn-hangzhou', + endpoint: 'https://oss-cn-hangzhou.aliyuncs.com', + accessKeyId: 'LTAI5tG666666666666666', + accessKeySecret: '66666666666666666666666666666666', + bucket: 'foo', +}); + +console.log(ossObject); diff --git a/test/setup.ts b/test/setup.ts new file mode 100644 index 000000000..fed0006ff --- /dev/null +++ b/test/setup.ts @@ -0,0 +1,7 @@ +import { File } from 'node:buffer'; + +// multi undici version in node version less than 20 https://github.com/nodejs/undici/issues/4374 +if (typeof global.File === 'undefined') { + // @ts-ignore + global.File = File; +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 000000000..b72cfd4ab --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + setupFiles: ['test/setup.ts'], + }, +}); From c30d09c2c4cf7ec7e5550f914e709d9e6db36690 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Sat, 9 Aug 2025 14:35:21 +0800 Subject: [PATCH 2/4] f --- test/OSSObject.test.ts | 47 ++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/test/OSSObject.test.ts b/test/OSSObject.test.ts index 47c5ded72..07d95cf6b 100644 --- a/test/OSSObject.test.ts +++ b/test/OSSObject.test.ts @@ -983,26 +983,33 @@ describe('test/OSSObject.test.ts', () => { assert.equal(getResult.res.headers.etag, httpStream.headers.etag); }); - it('should add very big file: 4mb with streaming way', async () => { - name = `${prefix}oss-client/oss/bigfile-4mb.bin`; - const bigFile = path.join(tmpdir, 'bigfile-4mb.bin'); - await writeFile(bigFile, Buffer.alloc(4 * 1024 * 1024).fill('a\n')); - const object = await ossObject.putStream(name, createReadStream(bigFile)); - assert.equal(typeof object.res.headers['x-oss-request-id'], 'string'); - assert.equal(typeof object.res.rt, 'number'); - assert.equal(object.res.size, 0); - assert.equal(object.name, name); - - // check content - const r = await ossObject.get(name); - assert.equal(r.res.status, 200); - assert.equal(r.res.headers['content-type'], 'application/octet-stream'); - assert.equal(r.res.size, 4 * 1024 * 1024); - const buf = await readFile(bigFile); - assert.ok(r.content); - assert.equal(r.content.length, buf.length); - assert.deepEqual(r.content, buf); - }); + // timeout on Node.js 18 + it.skipIf(process.version.startsWith('v18.'))( + 'should add very big file: 4mb with streaming way', + async () => { + name = `${prefix}oss-client/oss/bigfile-4mb.bin`; + const bigFile = path.join(tmpdir, 'bigfile-4mb.bin'); + await writeFile(bigFile, Buffer.alloc(4 * 1024 * 1024).fill('a\n')); + const object = await ossObject.putStream( + name, + createReadStream(bigFile) + ); + assert.equal(typeof object.res.headers['x-oss-request-id'], 'string'); + assert.equal(typeof object.res.rt, 'number'); + assert.equal(object.res.size, 0); + assert.equal(object.name, name); + + // check content + const r = await ossObject.get(name); + assert.equal(r.res.status, 200); + assert.equal(r.res.headers['content-type'], 'application/octet-stream'); + assert.equal(r.res.size, 4 * 1024 * 1024); + const buf = await readFile(bigFile); + assert.ok(r.content); + assert.equal(r.content.length, buf.length); + assert.deepEqual(r.content, buf); + } + ); it('should throw error with stream destroy', async () => { name = `${prefix}oss-client/oss/putStream-source-destroy.js`; From 64d338bef8966a1e89cb90e7545a40081f1c2876 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Sat, 9 Aug 2025 14:37:49 +0800 Subject: [PATCH 3/4] f --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 341762bdd..4be13de0f 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "husky": "^9.1.7", "oxlint": "^1.11.0", "prettier": "^3.5.3", - "read-env-value": "^1.1.0", + "read-env-value": "^2.0.2", "tshy": "^1.18.0", "tshy-after": "^1.0.0", "typescript": "^5.2.2", From 162c56296458f7e0b5cd5fd387c2120e70a710f9 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Sat, 9 Aug 2025 14:44:44 +0800 Subject: [PATCH 4/4] f --- package.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4be13de0f..4fa064e6a 100644 --- a/package.json +++ b/package.json @@ -49,19 +49,19 @@ "xml2js": "^0.6.2" }, "devDependencies": { - "@arethetypeswrong/cli": "^0.15.4", + "@arethetypeswrong/cli": "^0.18.2", "@eggjs/oxlint-config": "^1.0.0", "@eggjs/tsconfig": "^1.1.0", "@types/mime": "^3.0.1", "@types/ms": "^0.7.34", - "@types/node": "^20.19.10", + "@types/node": "^24.2.1", "@types/xml2js": "^0.4.12", "@vitest/coverage-v8": "^3.1.3", "husky": "^9.1.7", "oxlint": "^1.11.0", "prettier": "^3.5.3", "read-env-value": "^2.0.2", - "tshy": "^1.18.0", + "tshy": "^3.0.2", "tshy-after": "^1.0.0", "typescript": "^5.2.2", "vitest": "^3.2.4" @@ -81,12 +81,10 @@ "./package.json": "./package.json", ".": { "import": { - "source": "./src/index.ts", "types": "./dist/esm/index.d.ts", "default": "./dist/esm/index.js" }, "require": { - "source": "./src/index.ts", "types": "./dist/commonjs/index.d.ts", "default": "./dist/commonjs/index.js" }