diff --git a/package-lock.json b/package-lock.json index 627cad04..414b3bd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@js-soft/docdb-access-mongo": "1.1.9", "@js-soft/node-logger": "1.2.0", "@js-soft/ts-utils": "^2.3.3", - "@nmshd/runtime": "6.16.0", + "@nmshd/runtime": "6.20.0", "@nmshd/typescript-ioc": "^3.2.4", "@nmshd/typescript-rest": "^3.0.5", "agentkeepalive": "4.5.0", @@ -25,7 +25,7 @@ "compression": "1.7.5", "correlation-id": "^5.2.0", "cors": "2.8.5", - "eventsource": "^3.0.1", + "eventsource": "3.0.1", "express": "4.21.2", "helmet": "8.0.0", "json-stringify-safe": "5.0.1", @@ -37,7 +37,7 @@ "redis": "^4.7.0", "reflect-metadata": "0.2.2", "swagger-ui-express": "5.0.1", - "undici": "^7.1.0", + "undici": "^7.2.0", "yamljs": "0.3.0", "yargs": "^17.7.2" }, @@ -46,8 +46,8 @@ "@js-soft/eslint-config-ts": "1.6.13", "@js-soft/license-check": "1.0.9", "@nmshd/connector-sdk": "*", - "@nmshd/content": "6.16.0", - "@nmshd/core-types": "6.16.0", + "@nmshd/content": "6.20.0", + "@nmshd/core-types": "6.20.0", "@nmshd/typescript-rest-swagger": "^1.4.1", "@types/amqplib": "^0.10.6", "@types/compression": "^1.7.5", @@ -60,18 +60,18 @@ "@types/lodash": "^4.17.13", "@types/luxon": "^3.4.2", "@types/nconf": "^0.10.7", - "@types/node": "^22.10.1", + "@types/node": "^22.10.2", "@types/on-headers": "^1.0.3", "@types/swagger-ui-express": "^4.1.7", "@types/yamljs": "^0.2.34", - "c8": "^10.1.2", + "c8": "^10.1.3", "cpx2": "^8.0.0", "eslint": "^8.57.1", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "jest-json-schema": "^6.1.0", "lodash": "^4.17.21", - "nodemon": "^3.1.7", + "nodemon": "^3.1.9", "npm-run-all": "^4.1.5", "openapi-types": "^12.1.3", "prettier": "^3.4.2", @@ -1714,39 +1714,39 @@ "link": true }, "node_modules/@nmshd/consumption": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@nmshd/consumption/-/consumption-6.16.0.tgz", - "integrity": "sha512-P4LSGdIE11h0zfa0Z5wAQZOhgYe/htWJ8e5a2SOpZrIOqoXv0NucH16vDdnuZipPN6+QqR5OCUI8VV4rp1J67Q==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@nmshd/consumption/-/consumption-6.20.0.tgz", + "integrity": "sha512-0jSoknBynFAPQ6RMTH0SLIZxI3tlVvtLMKcQsEL+Mfym/DZoN8XtQ+68MF8lJI0MiDl8rX3wy4YUeBxjX9CiVQ==", "license": "MIT", "dependencies": { "@js-soft/docdb-querytranslator": "^1.1.5", "@js-soft/ts-serval": "2.0.11", "@js-soft/ts-utils": "2.3.3", - "@nmshd/content": "6.16.0", - "@nmshd/core-types": "6.16.0", + "@nmshd/content": "6.20.0", + "@nmshd/core-types": "6.20.0", "@nmshd/iql": "^1.0.2", - "@nmshd/transport": "6.16.0", + "@nmshd/transport": "6.20.0", "lodash": "^4.17.21", "ts-simple-nameof": "^1.3.1" } }, "node_modules/@nmshd/content": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@nmshd/content/-/content-6.16.0.tgz", - "integrity": "sha512-5q3eImQi5YhJlqP5aSRNY51bAXRgHB0sd2OPVVezQp808bOvwK0+pRyPQdEIqU4wKE+vk5xsUonvzqSpzMgJWA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@nmshd/content/-/content-6.20.0.tgz", + "integrity": "sha512-ApdHz/PTXRNyoQnOl++Te2aUE1La+iCJiBDgpj8J5g9MC7p/xBfPCm2xD5KZ7fofAYB1Pm7x6RwSehpPxcae7w==", "license": "MIT", "dependencies": { "@js-soft/ts-serval": "2.0.11", - "@nmshd/core-types": "6.16.0", + "@nmshd/core-types": "6.20.0", "@nmshd/iql": "^1.0.2", "luxon": "^3.5.0", "ts-simple-nameof": "^1.3.1" } }, "node_modules/@nmshd/core-types": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@nmshd/core-types/-/core-types-6.16.0.tgz", - "integrity": "sha512-iU0mnAlMitzFgdfD0uafDlr2GAvb0XTY3EfAxyl7yf0YtVywu6zbLx3yQ5fdj+4H/FGq4vzMormiBkaRjCDo3g==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@nmshd/core-types/-/core-types-6.20.0.tgz", + "integrity": "sha512-tF6hrdZhJe35Om4YMzlXaBwUEkuXYfDcBhO4/QIolMEMHAc7aur5InuF1maol8bi/4G6YVQ7QNuWpeGRQb0EAg==", "license": "MIT", "dependencies": { "@js-soft/logging-abstractions": "^1.0.1", @@ -1772,21 +1772,21 @@ "license": "MIT" }, "node_modules/@nmshd/runtime": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@nmshd/runtime/-/runtime-6.16.0.tgz", - "integrity": "sha512-LKFUfYC1+YzMgZDLgRpLADUd27GlAjUU+4b5vj8mQvRpBAykHT7dmp79L6Y9uEpG5iGKB03ue5X93tmOCvK3BA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@nmshd/runtime/-/runtime-6.20.0.tgz", + "integrity": "sha512-SdXUJ0PWLE5K+THWHGSs7jH+j+DHI2S1Vq52t9REWDy4uXHD2+O0/+aIozc8cwt3MR7QaRt1hZDk6+sQ/33Ofw==", "license": "MIT", "dependencies": { "@js-soft/docdb-querytranslator": "^1.1.5", "@js-soft/logging-abstractions": "^1.0.1", "@js-soft/ts-serval": "2.0.11", "@js-soft/ts-utils": "^2.3.3", - "@nmshd/consumption": "6.16.0", - "@nmshd/content": "6.16.0", - "@nmshd/core-types": "6.16.0", + "@nmshd/consumption": "6.20.0", + "@nmshd/content": "6.20.0", + "@nmshd/core-types": "6.20.0", "@nmshd/crypto": "2.1.0", "@nmshd/iql": "^1.0.2", - "@nmshd/transport": "6.16.0", + "@nmshd/transport": "6.20.0", "@nmshd/typescript-ioc": "3.2.4", "ajv": "^8.17.1", "ajv-errors": "^3.0.0", @@ -1800,16 +1800,16 @@ } }, "node_modules/@nmshd/transport": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@nmshd/transport/-/transport-6.16.0.tgz", - "integrity": "sha512-KUcU37KNwVY5qbDMBLWaLL+ML++oqidXg2kPPuSQRCpkQiDUf1SVfic34rHsQM+ent4bT7AZIG50EfgirwWxBg==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@nmshd/transport/-/transport-6.20.0.tgz", + "integrity": "sha512-Iaj53EVPsWgqChA3G6BKqreduW5Cs8Two9g2U5PqZWzUTpPV5qX6MNdmUIivORBKtepviJQ0ZoO6oaOt/blR+Q==", "license": "MIT", "dependencies": { "@js-soft/docdb-access-abstractions": "1.0.4", "@js-soft/logging-abstractions": "^1.0.1", "@js-soft/simple-logger": "1.0.5", "@js-soft/ts-utils": "^2.3.3", - "@nmshd/core-types": "6.16.0", + "@nmshd/core-types": "6.20.0", "@nmshd/crypto": "2.1.0", "axios": "^1.7.9", "fast-json-patch": "^3.1.1", @@ -2964,9 +2964,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "version": "22.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", + "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", "license": "MIT", "dependencies": { "undici-types": "~6.20.0" @@ -4232,13 +4232,13 @@ } }, "node_modules/c8": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.2.tgz", - "integrity": "sha512-Qr6rj76eSshu5CgRYvktW0uM0CFY0yi4Fd5D0duDXO6sYinyopmftUiJVuzBQxQcwQLor7JWDVRP+dUfCmzgJw==", + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/c8/-/c8-10.1.3.tgz", + "integrity": "sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==", "dev": true, "license": "ISC", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", + "@bcoe/v8-coverage": "^1.0.1", "@istanbuljs/schema": "^0.1.3", "find-up": "^5.0.0", "foreground-child": "^3.1.1", @@ -4265,6 +4265,16 @@ } } }, + "node_modules/c8/node_modules/@bcoe/v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.1.tgz", + "integrity": "sha512-W+a0/JpU28AqH4IKtwUPcEUnUyXMDLALcn5/JLczGGT9fHE2sIby/xP/oQnx3nxkForzgzPy201RAKcB4xPAFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -9829,9 +9839,9 @@ "license": "MIT" }, "node_modules/nodemon": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", - "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", + "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", "dev": true, "license": "MIT", "dependencies": { @@ -13216,9 +13226,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.1.0.tgz", - "integrity": "sha512-3+mdX2R31khuLCm2mKExSlMdJsfol7bJkIMH80tdXA74W34rT1jKemUTlYR7WY3TqsV4wfOgpatWmmB2Jl1+5g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.2.0.tgz", + "integrity": "sha512-klt+0S55GBViA9nsq48/NSCo4YX5mjydjypxD7UmHh/brMu8h/Mhd/F7qAeoH2NOO8SDTk6kjnTFc4WpzmfYpQ==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -13856,7 +13866,7 @@ "name": "@nmshd/connector-sdk", "license": "MIT", "dependencies": { - "@nmshd/content": "6.16.0", + "@nmshd/content": "6.20.0", "axios": "^1.7.9", "form-data": "^4.0.1", "qs": "^6.13.1" diff --git a/package.json b/package.json index f4c1af30..1ce85a7f 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "@js-soft/docdb-access-mongo": "1.1.9", "@js-soft/node-logger": "1.2.0", "@js-soft/ts-utils": "^2.3.3", - "@nmshd/runtime": "6.16.0", + "@nmshd/runtime": "6.20.0", "@nmshd/typescript-ioc": "^3.2.4", "@nmshd/typescript-rest": "^3.0.5", "agentkeepalive": "4.5.0", @@ -92,7 +92,7 @@ "compression": "1.7.5", "correlation-id": "^5.2.0", "cors": "2.8.5", - "eventsource": "^3.0.1", + "eventsource": "3.0.1", "express": "4.21.2", "helmet": "8.0.0", "json-stringify-safe": "5.0.1", @@ -104,7 +104,7 @@ "redis": "^4.7.0", "reflect-metadata": "0.2.2", "swagger-ui-express": "5.0.1", - "undici": "^7.1.0", + "undici": "^7.2.0", "yamljs": "0.3.0", "yargs": "^17.7.2" }, @@ -113,8 +113,8 @@ "@js-soft/eslint-config-ts": "1.6.13", "@js-soft/license-check": "1.0.9", "@nmshd/connector-sdk": "*", - "@nmshd/content": "6.16.0", - "@nmshd/core-types": "6.16.0", + "@nmshd/content": "6.20.0", + "@nmshd/core-types": "6.20.0", "@nmshd/typescript-rest-swagger": "^1.4.1", "@types/amqplib": "^0.10.6", "@types/compression": "^1.7.5", @@ -127,18 +127,18 @@ "@types/lodash": "^4.17.13", "@types/luxon": "^3.4.2", "@types/nconf": "^0.10.7", - "@types/node": "^22.10.1", + "@types/node": "^22.10.2", "@types/on-headers": "^1.0.3", "@types/swagger-ui-express": "^4.1.7", "@types/yamljs": "^0.2.34", - "c8": "^10.1.2", + "c8": "^10.1.3", "cpx2": "^8.0.0", "eslint": "^8.57.1", "jest": "^29.7.0", "jest-expect-message": "^1.1.3", "jest-json-schema": "^6.1.0", "lodash": "^4.17.21", - "nodemon": "^3.1.7", + "nodemon": "^3.1.9", "npm-run-all": "^4.1.5", "openapi-types": "^12.1.3", "prettier": "^3.4.2", diff --git a/packages/sdk/package.json b/packages/sdk/package.json index d478a472..3abb4c33 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -30,7 +30,7 @@ "build:schemas:watch": "npx nodemon -e ts -w 'src/types' --exec 'npm run build:schemas'" }, "dependencies": { - "@nmshd/content": "6.16.0", + "@nmshd/content": "6.20.0", "axios": "^1.7.9", "form-data": "^4.0.1", "qs": "^6.13.1" diff --git a/src/modules/coreHttpApi/common/BaseController.ts b/src/modules/coreHttpApi/common/BaseController.ts index f62d3a59..1fd370a5 100644 --- a/src/modules/coreHttpApi/common/BaseController.ts +++ b/src/modules/coreHttpApi/common/BaseController.ts @@ -42,9 +42,7 @@ export abstract class BaseController { const filename = filenamePredicate(result); const mimetype = mimetypePredicate(result); - if (!content || content.length <= 0) { - throw new Error("'content' cannot be empty or undefined"); - } + if (!content) throw new Error("'content' cannot be undefined"); let buffer: Buffer; if (content instanceof Buffer) { diff --git a/test/files.test.ts b/test/files.test.ts index c486d3a7..0cd2fddb 100644 --- a/test/files.test.ts +++ b/test/files.test.ts @@ -87,9 +87,13 @@ describe("File Upload", () => { expect(response.result.byteLength).toBe(4); }); - test("cannot upload an empty file", async () => { + test("can upload an empty file", async () => { const response = await client1.files.uploadOwnFile(await makeUploadRequest({ file: Buffer.of() })); - expect(response).toBeAnError("'content' is empty", "error.runtime.validation.invalidPropertyValue"); + expect(response).toBeSuccessful(ValidationSchema.File); + + const downloadResponse = await client1.files.downloadFile(response.result.id); + expect(downloadResponse.isSuccess).toBeTruthy(); + expect(downloadResponse.result.byteLength).toBe(0); }); test("cannot upload a file that is null", async () => {