@chayns-components/core 5.5.59 → 5.5.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,7 @@ var _uploadUrls = require("../../config/uploadUrls");
12
12
  const postImage = async ({
13
13
  file,
14
14
  shouldUploadImageToSite,
15
+ uploadPath,
15
16
  uploadUrls
16
17
  }) => {
17
18
  const {
@@ -31,7 +32,8 @@ const postImage = async ({
31
32
  imageServiceUrl,
32
33
  imageResizerUrl
33
34
  } = (0, _uploadUrls.getUploadUrls)(uploadUrls);
34
- const url = file.size > 10 * 1024 * 1024 ? `${imageResizerUrl}/${shouldUploadImageToSite ? site.id : user.personId}` : `${imageServiceUrl}/${shouldUploadImageToSite ? site.id : user.personId}`;
35
+ const targetPath = uploadPath ?? (shouldUploadImageToSite ? site.id : user.personId);
36
+ const url = file.size > 10 * 1024 * 1024 ? `${imageResizerUrl}/${targetPath}` : `${imageServiceUrl}/${targetPath}`;
35
37
  const response = await fetch(url, {
36
38
  body,
37
39
  headers: {
@@ -1 +1 @@
1
- {"version":3,"file":"post.js","names":["_chaynsApi","require","_uploadUrls","postImage","file","shouldUploadImageToSite","uploadUrls","accessToken","getAccessToken","user","getUser","site","getSite","personId","undefined","body","FormData","append","imageServiceUrl","imageResizerUrl","getUploadUrls","url","size","id","response","fetch","headers","Accept","Authorization","method","ok","image","baseDomain","json","key","path","base","endsWith","slice","meta","preview","width","String","height","Error","status","exports"],"sources":["../../../../src/api/image/post.ts"],"sourcesContent":["import { getAccessToken, getSite, getUser } from 'chayns-api';\nimport { getUploadUrls, type UploadUrls } from '../../config/uploadUrls';\nimport type { Meta } from '../../types/file';\n\nexport interface PostImageResult {\n key: string;\n base: string;\n meta?: Meta;\n}\n\ninterface Result {\n requestId: string;\n image: Image;\n baseDomain: string;\n signature: Signature;\n}\n\nexport interface Image {\n path: string;\n width: number;\n height: number;\n size: number;\n hash: string;\n preview: string;\n isSecured: boolean;\n format: string;\n fileExtension: string;\n}\n\nexport interface Signature {\n verify: string;\n signature: string;\n expires: Date;\n}\n\ninterface PostImageOptions {\n file: File;\n shouldUploadImageToSite?: boolean;\n /**\n * Overrides the globally configured upload service URLs for this upload.\n */\n uploadUrls?: Partial<UploadUrls>;\n}\n\n/**\n * Uploads an image to the tsimg cloud service\n */\nexport const postImage = async ({\n file,\n shouldUploadImageToSite,\n uploadUrls,\n}: PostImageOptions): Promise<PostImageResult | undefined> => {\n const { accessToken } = await getAccessToken();\n const user = getUser();\n const site = getSite();\n\n if (!accessToken || !user?.personId) {\n return undefined;\n }\n\n // const body = await getFileAsArrayBuffer(file);\n\n const body = new FormData();\n\n body.append('File', file);\n\n const { imageServiceUrl, imageResizerUrl } = getUploadUrls(uploadUrls);\n\n const url =\n file.size > 10 * 1024 * 1024\n ? `${imageResizerUrl}/${shouldUploadImageToSite ? site.id : user.personId}`\n : `${imageServiceUrl}/${shouldUploadImageToSite ? site.id : user.personId}`;\n\n const response = await fetch(url, {\n body,\n headers: {\n Accept: 'application/json',\n Authorization: `bearer ${accessToken}`,\n },\n method: 'POST',\n });\n\n if (response.ok) {\n const { image, baseDomain } = (await response.json()) as Result;\n // Maps image-service-api-v3 result to v2 result.\n return {\n key: image.path,\n // Removes trailing slash from baseDomain, since image-service-api-v2 doesn't have a trailing slash on base.\n base: baseDomain.endsWith('/') ? baseDomain.slice(0, -1) : baseDomain,\n meta: {\n preview: image.preview,\n width: String(image.width),\n height: String(image.height),\n },\n };\n }\n\n throw Error(`Failed to POST image (status code: ${response.status}).`);\n};\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AA2CA;AACA;AACA;AACO,MAAME,SAAS,GAAG,MAAAA,CAAO;EAC5BC,IAAI;EACJC,uBAAuB;EACvBC;AACc,CAAC,KAA2C;EAC1D,MAAM;IAAEC;EAAY,CAAC,GAAG,MAAM,IAAAC,yBAAc,EAAC,CAAC;EAC9C,MAAMC,IAAI,GAAG,IAAAC,kBAAO,EAAC,CAAC;EACtB,MAAMC,IAAI,GAAG,IAAAC,kBAAO,EAAC,CAAC;EAEtB,IAAI,CAACL,WAAW,IAAI,EAACE,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEI,QAAQ,GAAE;IACjC,OAAOC,SAAS;EACpB;;EAEA;;EAEA,MAAMC,IAAI,GAAG,IAAIC,QAAQ,CAAC,CAAC;EAE3BD,IAAI,CAACE,MAAM,CAAC,MAAM,EAAEb,IAAI,CAAC;EAEzB,MAAM;IAAEc,eAAe;IAAEC;EAAgB,CAAC,GAAG,IAAAC,yBAAa,EAACd,UAAU,CAAC;EAEtE,MAAMe,GAAG,GACLjB,IAAI,CAACkB,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GACtB,GAAGH,eAAe,IAAId,uBAAuB,GAAGM,IAAI,CAACY,EAAE,GAAGd,IAAI,CAACI,QAAQ,EAAE,GACzE,GAAGK,eAAe,IAAIb,uBAAuB,GAAGM,IAAI,CAACY,EAAE,GAAGd,IAAI,CAACI,QAAQ,EAAE;EAEnF,MAAMW,QAAQ,GAAG,MAAMC,KAAK,CAACJ,GAAG,EAAE;IAC9BN,IAAI;IACJW,OAAO,EAAE;MACLC,MAAM,EAAE,kBAAkB;MAC1BC,aAAa,EAAE,UAAUrB,WAAW;IACxC,CAAC;IACDsB,MAAM,EAAE;EACZ,CAAC,CAAC;EAEF,IAAIL,QAAQ,CAACM,EAAE,EAAE;IACb,MAAM;MAAEC,KAAK;MAAEC;IAAW,CAAC,GAAI,MAAMR,QAAQ,CAACS,IAAI,CAAC,CAAY;IAC/D;IACA,OAAO;MACHC,GAAG,EAAEH,KAAK,CAACI,IAAI;MACf;MACAC,IAAI,EAAEJ,UAAU,CAACK,QAAQ,CAAC,GAAG,CAAC,GAAGL,UAAU,CAACM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAGN,UAAU;MACrEO,IAAI,EAAE;QACFC,OAAO,EAAET,KAAK,CAACS,OAAO;QACtBC,KAAK,EAAEC,MAAM,CAACX,KAAK,CAACU,KAAK,CAAC;QAC1BE,MAAM,EAAED,MAAM,CAACX,KAAK,CAACY,MAAM;MAC/B;IACJ,CAAC;EACL;EAEA,MAAMC,KAAK,CAAC,sCAAsCpB,QAAQ,CAACqB,MAAM,IAAI,CAAC;AAC1E,CAAC;AAACC,OAAA,CAAA3C,SAAA,GAAAA,SAAA","ignoreList":[]}
1
+ {"version":3,"file":"post.js","names":["_chaynsApi","require","_uploadUrls","postImage","file","shouldUploadImageToSite","uploadPath","uploadUrls","accessToken","getAccessToken","user","getUser","site","getSite","personId","undefined","body","FormData","append","imageServiceUrl","imageResizerUrl","getUploadUrls","targetPath","id","url","size","response","fetch","headers","Accept","Authorization","method","ok","image","baseDomain","json","key","path","base","endsWith","slice","meta","preview","width","String","height","Error","status","exports"],"sources":["../../../../src/api/image/post.ts"],"sourcesContent":["import { getAccessToken, getSite, getUser } from 'chayns-api';\nimport { getUploadUrls, type UploadUrls } from '../../config/uploadUrls';\nimport type { Meta } from '../../types/file';\n\nexport interface PostImageResult {\n key: string;\n base: string;\n meta?: Meta;\n}\n\ninterface Result {\n requestId: string;\n image: Image;\n baseDomain: string;\n signature: Signature;\n}\n\nexport interface Image {\n path: string;\n width: number;\n height: number;\n size: number;\n hash: string;\n preview: string;\n isSecured: boolean;\n format: string;\n fileExtension: string;\n}\n\nexport interface Signature {\n verify: string;\n signature: string;\n expires: Date;\n}\n\ninterface PostImageOptions {\n file: File;\n shouldUploadImageToSite?: boolean;\n /**\n * Relative target path appended to the image service URL. When set, it\n * takes precedence over the default user or site ID path.\n */\n uploadPath?: string;\n /**\n * Overrides the globally configured upload service URLs for this upload.\n */\n uploadUrls?: Partial<UploadUrls>;\n}\n\n/**\n * Uploads an image to the tsimg cloud service\n */\nexport const postImage = async ({\n file,\n shouldUploadImageToSite,\n uploadPath,\n uploadUrls,\n}: PostImageOptions): Promise<PostImageResult | undefined> => {\n const { accessToken } = await getAccessToken();\n const user = getUser();\n const site = getSite();\n\n if (!accessToken || !user?.personId) {\n return undefined;\n }\n\n // const body = await getFileAsArrayBuffer(file);\n\n const body = new FormData();\n\n body.append('File', file);\n\n const { imageServiceUrl, imageResizerUrl } = getUploadUrls(uploadUrls);\n const targetPath = uploadPath ?? (shouldUploadImageToSite ? site.id : user.personId);\n\n const url =\n file.size > 10 * 1024 * 1024\n ? `${imageResizerUrl}/${targetPath}`\n : `${imageServiceUrl}/${targetPath}`;\n\n const response = await fetch(url, {\n body,\n headers: {\n Accept: 'application/json',\n Authorization: `bearer ${accessToken}`,\n },\n method: 'POST',\n });\n\n if (response.ok) {\n const { image, baseDomain } = (await response.json()) as Result;\n // Maps image-service-api-v3 result to v2 result.\n return {\n key: image.path,\n // Removes trailing slash from baseDomain, since image-service-api-v2 doesn't have a trailing slash on base.\n base: baseDomain.endsWith('/') ? baseDomain.slice(0, -1) : baseDomain,\n meta: {\n preview: image.preview,\n width: String(image.width),\n height: String(image.height),\n },\n };\n }\n\n throw Error(`Failed to POST image (status code: ${response.status}).`);\n};\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAgDA;AACA;AACA;AACO,MAAME,SAAS,GAAG,MAAAA,CAAO;EAC5BC,IAAI;EACJC,uBAAuB;EACvBC,UAAU;EACVC;AACc,CAAC,KAA2C;EAC1D,MAAM;IAAEC;EAAY,CAAC,GAAG,MAAM,IAAAC,yBAAc,EAAC,CAAC;EAC9C,MAAMC,IAAI,GAAG,IAAAC,kBAAO,EAAC,CAAC;EACtB,MAAMC,IAAI,GAAG,IAAAC,kBAAO,EAAC,CAAC;EAEtB,IAAI,CAACL,WAAW,IAAI,EAACE,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEI,QAAQ,GAAE;IACjC,OAAOC,SAAS;EACpB;;EAEA;;EAEA,MAAMC,IAAI,GAAG,IAAIC,QAAQ,CAAC,CAAC;EAE3BD,IAAI,CAACE,MAAM,CAAC,MAAM,EAAEd,IAAI,CAAC;EAEzB,MAAM;IAAEe,eAAe;IAAEC;EAAgB,CAAC,GAAG,IAAAC,yBAAa,EAACd,UAAU,CAAC;EACtE,MAAMe,UAAU,GAAGhB,UAAU,KAAKD,uBAAuB,GAAGO,IAAI,CAACW,EAAE,GAAGb,IAAI,CAACI,QAAQ,CAAC;EAEpF,MAAMU,GAAG,GACLpB,IAAI,CAACqB,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GACtB,GAAGL,eAAe,IAAIE,UAAU,EAAE,GAClC,GAAGH,eAAe,IAAIG,UAAU,EAAE;EAE5C,MAAMI,QAAQ,GAAG,MAAMC,KAAK,CAACH,GAAG,EAAE;IAC9BR,IAAI;IACJY,OAAO,EAAE;MACLC,MAAM,EAAE,kBAAkB;MAC1BC,aAAa,EAAE,UAAUtB,WAAW;IACxC,CAAC;IACDuB,MAAM,EAAE;EACZ,CAAC,CAAC;EAEF,IAAIL,QAAQ,CAACM,EAAE,EAAE;IACb,MAAM;MAAEC,KAAK;MAAEC;IAAW,CAAC,GAAI,MAAMR,QAAQ,CAACS,IAAI,CAAC,CAAY;IAC/D;IACA,OAAO;MACHC,GAAG,EAAEH,KAAK,CAACI,IAAI;MACf;MACAC,IAAI,EAAEJ,UAAU,CAACK,QAAQ,CAAC,GAAG,CAAC,GAAGL,UAAU,CAACM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAGN,UAAU;MACrEO,IAAI,EAAE;QACFC,OAAO,EAAET,KAAK,CAACS,OAAO;QACtBC,KAAK,EAAEC,MAAM,CAACX,KAAK,CAACU,KAAK,CAAC;QAC1BE,MAAM,EAAED,MAAM,CAACX,KAAK,CAACY,MAAM;MAC/B;IACJ,CAAC;EACL;EAEA,MAAMC,KAAK,CAAC,sCAAsCpB,QAAQ,CAACqB,MAAM,IAAI,CAAC;AAC1E,CAAC;AAACC,OAAA,CAAA7C,SAAA,GAAAA,SAAA","ignoreList":[]}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+
3
+ var _vitest = require("vitest");
4
+ var _uploadUrls = require("../../config/uploadUrls");
5
+ var _post = require("./post");
6
+ _vitest.vi.mock('chayns-api', () => ({
7
+ getAccessToken: _vitest.vi.fn().mockResolvedValue({
8
+ accessToken: 'access-token'
9
+ }),
10
+ getSite: _vitest.vi.fn().mockReturnValue({
11
+ id: 'site-id'
12
+ }),
13
+ getUser: _vitest.vi.fn().mockReturnValue({
14
+ personId: 'person-id'
15
+ })
16
+ }));
17
+ (0, _vitest.describe)('postImage', () => {
18
+ (0, _vitest.afterEach)(() => {
19
+ (0, _uploadUrls.resetUploadUrls)();
20
+ _vitest.vi.unstubAllGlobals();
21
+ });
22
+ (0, _vitest.it)('uses an explicitly provided upload path instead of the default user path', async () => {
23
+ const fetchMock = _vitest.vi.fn().mockResolvedValue({
24
+ ok: true,
25
+ json: _vitest.vi.fn().mockResolvedValue({
26
+ baseDomain: 'https://tsimg.cloud/',
27
+ image: {
28
+ path: 'image-path',
29
+ preview: 'preview',
30
+ width: 1,
31
+ height: 1
32
+ }
33
+ })
34
+ });
35
+ _vitest.vi.stubGlobal('fetch', fetchMock);
36
+ await (0, _post.postImage)({
37
+ file: new File(['image'], 'image.png', {
38
+ type: 'image/png'
39
+ }),
40
+ uploadPath: 'threads/thread-id'
41
+ });
42
+ (0, _vitest.expect)(fetchMock).toHaveBeenCalledWith('https://cube.tobit.cloud/image-service/v3/Images/threads/thread-id', _vitest.expect.objectContaining({
43
+ method: 'POST'
44
+ }));
45
+ });
46
+ });
47
+ //# sourceMappingURL=post.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.test.js","names":["_vitest","require","_uploadUrls","_post","vi","mock","getAccessToken","fn","mockResolvedValue","accessToken","getSite","mockReturnValue","id","getUser","personId","describe","afterEach","resetUploadUrls","unstubAllGlobals","it","fetchMock","ok","json","baseDomain","image","path","preview","width","height","stubGlobal","postImage","file","File","type","uploadPath","expect","toHaveBeenCalledWith","objectContaining","method"],"sources":["../../../../src/api/image/post.test.ts"],"sourcesContent":["import { afterEach, describe, expect, it, vi } from 'vitest';\nimport { resetUploadUrls } from '../../config/uploadUrls';\nimport { postImage } from './post';\n\nvi.mock('chayns-api', () => ({\n getAccessToken: vi.fn().mockResolvedValue({ accessToken: 'access-token' }),\n getSite: vi.fn().mockReturnValue({ id: 'site-id' }),\n getUser: vi.fn().mockReturnValue({ personId: 'person-id' }),\n}));\n\ndescribe('postImage', () => {\n afterEach(() => {\n resetUploadUrls();\n vi.unstubAllGlobals();\n });\n\n it('uses an explicitly provided upload path instead of the default user path', async () => {\n const fetchMock = vi.fn().mockResolvedValue({\n ok: true,\n json: vi.fn().mockResolvedValue({\n baseDomain: 'https://tsimg.cloud/',\n image: {\n path: 'image-path',\n preview: 'preview',\n width: 1,\n height: 1,\n },\n }),\n });\n vi.stubGlobal('fetch', fetchMock);\n\n await postImage({\n file: new File(['image'], 'image.png', { type: 'image/png' }),\n uploadPath: 'threads/thread-id',\n });\n\n expect(fetchMock).toHaveBeenCalledWith(\n 'https://cube.tobit.cloud/image-service/v3/Images/threads/thread-id',\n expect.objectContaining({ method: 'POST' }),\n );\n });\n});\n"],"mappings":";;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AAEAG,UAAE,CAACC,IAAI,CAAC,YAAY,EAAE,OAAO;EACzBC,cAAc,EAAEF,UAAE,CAACG,EAAE,CAAC,CAAC,CAACC,iBAAiB,CAAC;IAAEC,WAAW,EAAE;EAAe,CAAC,CAAC;EAC1EC,OAAO,EAAEN,UAAE,CAACG,EAAE,CAAC,CAAC,CAACI,eAAe,CAAC;IAAEC,EAAE,EAAE;EAAU,CAAC,CAAC;EACnDC,OAAO,EAAET,UAAE,CAACG,EAAE,CAAC,CAAC,CAACI,eAAe,CAAC;IAAEG,QAAQ,EAAE;EAAY,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEH,IAAAC,gBAAQ,EAAC,WAAW,EAAE,MAAM;EACxB,IAAAC,iBAAS,EAAC,MAAM;IACZ,IAAAC,2BAAe,EAAC,CAAC;IACjBb,UAAE,CAACc,gBAAgB,CAAC,CAAC;EACzB,CAAC,CAAC;EAEF,IAAAC,UAAE,EAAC,0EAA0E,EAAE,YAAY;IACvF,MAAMC,SAAS,GAAGhB,UAAE,CAACG,EAAE,CAAC,CAAC,CAACC,iBAAiB,CAAC;MACxCa,EAAE,EAAE,IAAI;MACRC,IAAI,EAAElB,UAAE,CAACG,EAAE,CAAC,CAAC,CAACC,iBAAiB,CAAC;QAC5Be,UAAU,EAAE,sBAAsB;QAClCC,KAAK,EAAE;UACHC,IAAI,EAAE,YAAY;UAClBC,OAAO,EAAE,SAAS;UAClBC,KAAK,EAAE,CAAC;UACRC,MAAM,EAAE;QACZ;MACJ,CAAC;IACL,CAAC,CAAC;IACFxB,UAAE,CAACyB,UAAU,CAAC,OAAO,EAAET,SAAS,CAAC;IAEjC,MAAM,IAAAU,eAAS,EAAC;MACZC,IAAI,EAAE,IAAIC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE;QAAEC,IAAI,EAAE;MAAY,CAAC,CAAC;MAC7DC,UAAU,EAAE;IAChB,CAAC,CAAC;IAEF,IAAAC,cAAM,EAACf,SAAS,CAAC,CAACgB,oBAAoB,CAClC,oEAAoE,EACpED,cAAM,CAACE,gBAAgB,CAAC;MAAEC,MAAM,EAAE;IAAO,CAAC,CAC9C,CAAC;EACL,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
@@ -10,6 +10,7 @@ const uploadFile = async ({
10
10
  fileToUpload,
11
11
  callback,
12
12
  shouldUploadImageToSite,
13
+ uploadPath,
13
14
  uploadUrls
14
15
  }) => {
15
16
  var _fileToUpload$file, _fileToUpload$file2;
@@ -32,6 +33,7 @@ const uploadFile = async ({
32
33
  const uploadedImage = await (0, _post.postImage)({
33
34
  file: fileToUpload.file,
34
35
  shouldUploadImageToSite,
36
+ uploadPath,
35
37
  uploadUrls
36
38
  });
37
39
  if (uploadedImage) {
@@ -1 +1 @@
1
- {"version":3,"file":"uploadFile.js","names":["_post","require","_post2","uploadFile","fileToUpload","callback","shouldUploadImageToSite","uploadUrls","_fileToUpload$file","_fileToUpload$file2","state","undefined","file","type","includes","uploadedVideo","postVideo","id","toString","uploadedImage","postImage","_uploadedImage$meta","_uploadedImage$meta2","_uploadedImage$meta3","_uploadedImage$meta4","url","base","key","meta","ratio","width","height","Number","exports"],"sources":["../../../src/utils/uploadFile.ts"],"sourcesContent":["import { postImage } from '../api/image/post';\nimport { postVideo } from '../api/video/post';\nimport type { UploadUrls } from '../config/uploadUrls';\nimport type { Image, InternalFileItem, Video } from '../types/file';\n\ninterface UploadFilesOptions {\n fileToUpload: InternalFileItem;\n callback: (UploadedFile: Video | Image) => void;\n shouldUploadImageToSite?: boolean;\n /**\n * Overrides the globally configured upload service URLs for this upload.\n */\n uploadUrls?: Partial<UploadUrls>;\n}\n\nexport const uploadFile = async ({\n fileToUpload,\n callback,\n shouldUploadImageToSite,\n uploadUrls,\n}: UploadFilesOptions): Promise<void> => {\n if (!fileToUpload || (fileToUpload.state !== undefined && fileToUpload.state !== 'none')) {\n return;\n }\n\n if (fileToUpload.file?.type.includes('video/')) {\n const uploadedVideo = await postVideo({ file: fileToUpload.file, uploadUrls });\n\n if (uploadedVideo) {\n callback({\n ...uploadedVideo,\n id: uploadedVideo.id.toString(),\n });\n }\n }\n\n if (fileToUpload.file?.type.includes('image/')) {\n const uploadedImage = await postImage({\n file: fileToUpload.file,\n shouldUploadImageToSite,\n uploadUrls,\n });\n\n if (uploadedImage) {\n callback({\n url: `${uploadedImage.base}/${uploadedImage.key}`,\n id: uploadedImage.key,\n meta: uploadedImage.meta,\n ratio:\n uploadedImage.meta?.width && uploadedImage.meta?.height\n ? Number(uploadedImage.meta?.width) / Number(uploadedImage.meta?.height)\n : undefined,\n });\n }\n }\n};\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAcO,MAAME,UAAU,GAAG,MAAAA,CAAO;EAC7BC,YAAY;EACZC,QAAQ;EACRC,uBAAuB;EACvBC;AACgB,CAAC,KAAoB;EAAA,IAAAC,kBAAA,EAAAC,mBAAA;EACrC,IAAI,CAACL,YAAY,IAAKA,YAAY,CAACM,KAAK,KAAKC,SAAS,IAAIP,YAAY,CAACM,KAAK,KAAK,MAAO,EAAE;IACtF;EACJ;EAEA,KAAAF,kBAAA,GAAIJ,YAAY,CAACQ,IAAI,cAAAJ,kBAAA,eAAjBA,kBAAA,CAAmBK,IAAI,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAC5C,MAAMC,aAAa,GAAG,MAAM,IAAAC,gBAAS,EAAC;MAAEJ,IAAI,EAAER,YAAY,CAACQ,IAAI;MAAEL;IAAW,CAAC,CAAC;IAE9E,IAAIQ,aAAa,EAAE;MACfV,QAAQ,CAAC;QACL,GAAGU,aAAa;QAChBE,EAAE,EAAEF,aAAa,CAACE,EAAE,CAACC,QAAQ,CAAC;MAClC,CAAC,CAAC;IACN;EACJ;EAEA,KAAAT,mBAAA,GAAIL,YAAY,CAACQ,IAAI,cAAAH,mBAAA,eAAjBA,mBAAA,CAAmBI,IAAI,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAC5C,MAAMK,aAAa,GAAG,MAAM,IAAAC,eAAS,EAAC;MAClCR,IAAI,EAAER,YAAY,CAACQ,IAAI;MACvBN,uBAAuB;MACvBC;IACJ,CAAC,CAAC;IAEF,IAAIY,aAAa,EAAE;MAAA,IAAAE,mBAAA,EAAAC,oBAAA,EAAAC,oBAAA,EAAAC,oBAAA;MACfnB,QAAQ,CAAC;QACLoB,GAAG,EAAE,GAAGN,aAAa,CAACO,IAAI,IAAIP,aAAa,CAACQ,GAAG,EAAE;QACjDV,EAAE,EAAEE,aAAa,CAACQ,GAAG;QACrBC,IAAI,EAAET,aAAa,CAACS,IAAI;QACxBC,KAAK,EACD,CAAAR,mBAAA,GAAAF,aAAa,CAACS,IAAI,cAAAP,mBAAA,eAAlBA,mBAAA,CAAoBS,KAAK,KAAAR,oBAAA,GAAIH,aAAa,CAACS,IAAI,cAAAN,oBAAA,eAAlBA,oBAAA,CAAoBS,MAAM,GACjDC,MAAM,EAAAT,oBAAA,GAACJ,aAAa,CAACS,IAAI,cAAAL,oBAAA,uBAAlBA,oBAAA,CAAoBO,KAAK,CAAC,GAAGE,MAAM,EAAAR,oBAAA,GAACL,aAAa,CAACS,IAAI,cAAAJ,oBAAA,uBAAlBA,oBAAA,CAAoBO,MAAM,CAAC,GACtEpB;MACd,CAAC,CAAC;IACN;EACJ;AACJ,CAAC;AAACsB,OAAA,CAAA9B,UAAA,GAAAA,UAAA","ignoreList":[]}
1
+ {"version":3,"file":"uploadFile.js","names":["_post","require","_post2","uploadFile","fileToUpload","callback","shouldUploadImageToSite","uploadPath","uploadUrls","_fileToUpload$file","_fileToUpload$file2","state","undefined","file","type","includes","uploadedVideo","postVideo","id","toString","uploadedImage","postImage","_uploadedImage$meta","_uploadedImage$meta2","_uploadedImage$meta3","_uploadedImage$meta4","url","base","key","meta","ratio","width","height","Number","exports"],"sources":["../../../src/utils/uploadFile.ts"],"sourcesContent":["import { postImage } from '../api/image/post';\nimport { postVideo } from '../api/video/post';\nimport type { UploadUrls } from '../config/uploadUrls';\nimport type { Image, InternalFileItem, Video } from '../types/file';\n\ninterface UploadFilesOptions {\n fileToUpload: InternalFileItem;\n callback: (UploadedFile: Video | Image) => void;\n shouldUploadImageToSite?: boolean;\n /**\n * Relative target path appended to the image service URL. When set, it\n * takes precedence over the default user or site ID path.\n */\n uploadPath?: string;\n /**\n * Overrides the globally configured upload service URLs for this upload.\n */\n uploadUrls?: Partial<UploadUrls>;\n}\n\nexport const uploadFile = async ({\n fileToUpload,\n callback,\n shouldUploadImageToSite,\n uploadPath,\n uploadUrls,\n}: UploadFilesOptions): Promise<void> => {\n if (!fileToUpload || (fileToUpload.state !== undefined && fileToUpload.state !== 'none')) {\n return;\n }\n\n if (fileToUpload.file?.type.includes('video/')) {\n const uploadedVideo = await postVideo({ file: fileToUpload.file, uploadUrls });\n\n if (uploadedVideo) {\n callback({\n ...uploadedVideo,\n id: uploadedVideo.id.toString(),\n });\n }\n }\n\n if (fileToUpload.file?.type.includes('image/')) {\n const uploadedImage = await postImage({\n file: fileToUpload.file,\n shouldUploadImageToSite,\n uploadPath,\n uploadUrls,\n });\n\n if (uploadedImage) {\n callback({\n url: `${uploadedImage.base}/${uploadedImage.key}`,\n id: uploadedImage.key,\n meta: uploadedImage.meta,\n ratio:\n uploadedImage.meta?.width && uploadedImage.meta?.height\n ? Number(uploadedImage.meta?.width) / Number(uploadedImage.meta?.height)\n : undefined,\n });\n }\n }\n};\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAmBO,MAAME,UAAU,GAAG,MAAAA,CAAO;EAC7BC,YAAY;EACZC,QAAQ;EACRC,uBAAuB;EACvBC,UAAU;EACVC;AACgB,CAAC,KAAoB;EAAA,IAAAC,kBAAA,EAAAC,mBAAA;EACrC,IAAI,CAACN,YAAY,IAAKA,YAAY,CAACO,KAAK,KAAKC,SAAS,IAAIR,YAAY,CAACO,KAAK,KAAK,MAAO,EAAE;IACtF;EACJ;EAEA,KAAAF,kBAAA,GAAIL,YAAY,CAACS,IAAI,cAAAJ,kBAAA,eAAjBA,kBAAA,CAAmBK,IAAI,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAC5C,MAAMC,aAAa,GAAG,MAAM,IAAAC,gBAAS,EAAC;MAAEJ,IAAI,EAAET,YAAY,CAACS,IAAI;MAAEL;IAAW,CAAC,CAAC;IAE9E,IAAIQ,aAAa,EAAE;MACfX,QAAQ,CAAC;QACL,GAAGW,aAAa;QAChBE,EAAE,EAAEF,aAAa,CAACE,EAAE,CAACC,QAAQ,CAAC;MAClC,CAAC,CAAC;IACN;EACJ;EAEA,KAAAT,mBAAA,GAAIN,YAAY,CAACS,IAAI,cAAAH,mBAAA,eAAjBA,mBAAA,CAAmBI,IAAI,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAC5C,MAAMK,aAAa,GAAG,MAAM,IAAAC,eAAS,EAAC;MAClCR,IAAI,EAAET,YAAY,CAACS,IAAI;MACvBP,uBAAuB;MACvBC,UAAU;MACVC;IACJ,CAAC,CAAC;IAEF,IAAIY,aAAa,EAAE;MAAA,IAAAE,mBAAA,EAAAC,oBAAA,EAAAC,oBAAA,EAAAC,oBAAA;MACfpB,QAAQ,CAAC;QACLqB,GAAG,EAAE,GAAGN,aAAa,CAACO,IAAI,IAAIP,aAAa,CAACQ,GAAG,EAAE;QACjDV,EAAE,EAAEE,aAAa,CAACQ,GAAG;QACrBC,IAAI,EAAET,aAAa,CAACS,IAAI;QACxBC,KAAK,EACD,CAAAR,mBAAA,GAAAF,aAAa,CAACS,IAAI,cAAAP,mBAAA,eAAlBA,mBAAA,CAAoBS,KAAK,KAAAR,oBAAA,GAAIH,aAAa,CAACS,IAAI,cAAAN,oBAAA,eAAlBA,oBAAA,CAAoBS,MAAM,GACjDC,MAAM,EAAAT,oBAAA,GAACJ,aAAa,CAACS,IAAI,cAAAL,oBAAA,uBAAlBA,oBAAA,CAAoBO,KAAK,CAAC,GAAGE,MAAM,EAAAR,oBAAA,GAACL,aAAa,CAACS,IAAI,cAAAJ,oBAAA,uBAAlBA,oBAAA,CAAoBO,MAAM,CAAC,GACtEpB;MACd,CAAC,CAAC;IACN;EACJ;AACJ,CAAC;AAACsB,OAAA,CAAA/B,UAAA,GAAAA,UAAA","ignoreList":[]}
@@ -6,6 +6,7 @@ import { getUploadUrls } from '../../config/uploadUrls';
6
6
  export const postImage = async ({
7
7
  file,
8
8
  shouldUploadImageToSite,
9
+ uploadPath,
9
10
  uploadUrls
10
11
  }) => {
11
12
  const {
@@ -25,7 +26,8 @@ export const postImage = async ({
25
26
  imageServiceUrl,
26
27
  imageResizerUrl
27
28
  } = getUploadUrls(uploadUrls);
28
- const url = file.size > 10 * 1024 * 1024 ? `${imageResizerUrl}/${shouldUploadImageToSite ? site.id : user.personId}` : `${imageServiceUrl}/${shouldUploadImageToSite ? site.id : user.personId}`;
29
+ const targetPath = uploadPath ?? (shouldUploadImageToSite ? site.id : user.personId);
30
+ const url = file.size > 10 * 1024 * 1024 ? `${imageResizerUrl}/${targetPath}` : `${imageServiceUrl}/${targetPath}`;
29
31
  const response = await fetch(url, {
30
32
  body,
31
33
  headers: {
@@ -1 +1 @@
1
- {"version":3,"file":"post.js","names":["getAccessToken","getSite","getUser","getUploadUrls","postImage","file","shouldUploadImageToSite","uploadUrls","accessToken","user","site","personId","undefined","body","FormData","append","imageServiceUrl","imageResizerUrl","url","size","id","response","fetch","headers","Accept","Authorization","method","ok","image","baseDomain","json","key","path","base","endsWith","slice","meta","preview","width","String","height","Error","status"],"sources":["../../../../src/api/image/post.ts"],"sourcesContent":["import { getAccessToken, getSite, getUser } from 'chayns-api';\nimport { getUploadUrls, type UploadUrls } from '../../config/uploadUrls';\nimport type { Meta } from '../../types/file';\n\nexport interface PostImageResult {\n key: string;\n base: string;\n meta?: Meta;\n}\n\ninterface Result {\n requestId: string;\n image: Image;\n baseDomain: string;\n signature: Signature;\n}\n\nexport interface Image {\n path: string;\n width: number;\n height: number;\n size: number;\n hash: string;\n preview: string;\n isSecured: boolean;\n format: string;\n fileExtension: string;\n}\n\nexport interface Signature {\n verify: string;\n signature: string;\n expires: Date;\n}\n\ninterface PostImageOptions {\n file: File;\n shouldUploadImageToSite?: boolean;\n /**\n * Overrides the globally configured upload service URLs for this upload.\n */\n uploadUrls?: Partial<UploadUrls>;\n}\n\n/**\n * Uploads an image to the tsimg cloud service\n */\nexport const postImage = async ({\n file,\n shouldUploadImageToSite,\n uploadUrls,\n}: PostImageOptions): Promise<PostImageResult | undefined> => {\n const { accessToken } = await getAccessToken();\n const user = getUser();\n const site = getSite();\n\n if (!accessToken || !user?.personId) {\n return undefined;\n }\n\n // const body = await getFileAsArrayBuffer(file);\n\n const body = new FormData();\n\n body.append('File', file);\n\n const { imageServiceUrl, imageResizerUrl } = getUploadUrls(uploadUrls);\n\n const url =\n file.size > 10 * 1024 * 1024\n ? `${imageResizerUrl}/${shouldUploadImageToSite ? site.id : user.personId}`\n : `${imageServiceUrl}/${shouldUploadImageToSite ? site.id : user.personId}`;\n\n const response = await fetch(url, {\n body,\n headers: {\n Accept: 'application/json',\n Authorization: `bearer ${accessToken}`,\n },\n method: 'POST',\n });\n\n if (response.ok) {\n const { image, baseDomain } = (await response.json()) as Result;\n // Maps image-service-api-v3 result to v2 result.\n return {\n key: image.path,\n // Removes trailing slash from baseDomain, since image-service-api-v2 doesn't have a trailing slash on base.\n base: baseDomain.endsWith('/') ? baseDomain.slice(0, -1) : baseDomain,\n meta: {\n preview: image.preview,\n width: String(image.width),\n height: String(image.height),\n },\n };\n }\n\n throw Error(`Failed to POST image (status code: ${response.status}).`);\n};\n"],"mappings":"AAAA,SAASA,cAAc,EAAEC,OAAO,EAAEC,OAAO,QAAQ,YAAY;AAC7D,SAASC,aAAa,QAAyB,yBAAyB;AA2CxE;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAG,MAAAA,CAAO;EAC5BC,IAAI;EACJC,uBAAuB;EACvBC;AACc,CAAC,KAA2C;EAC1D,MAAM;IAAEC;EAAY,CAAC,GAAG,MAAMR,cAAc,CAAC,CAAC;EAC9C,MAAMS,IAAI,GAAGP,OAAO,CAAC,CAAC;EACtB,MAAMQ,IAAI,GAAGT,OAAO,CAAC,CAAC;EAEtB,IAAI,CAACO,WAAW,IAAI,CAACC,IAAI,EAAEE,QAAQ,EAAE;IACjC,OAAOC,SAAS;EACpB;;EAEA;;EAEA,MAAMC,IAAI,GAAG,IAAIC,QAAQ,CAAC,CAAC;EAE3BD,IAAI,CAACE,MAAM,CAAC,MAAM,EAAEV,IAAI,CAAC;EAEzB,MAAM;IAAEW,eAAe;IAAEC;EAAgB,CAAC,GAAGd,aAAa,CAACI,UAAU,CAAC;EAEtE,MAAMW,GAAG,GACLb,IAAI,CAACc,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GACtB,GAAGF,eAAe,IAAIX,uBAAuB,GAAGI,IAAI,CAACU,EAAE,GAAGX,IAAI,CAACE,QAAQ,EAAE,GACzE,GAAGK,eAAe,IAAIV,uBAAuB,GAAGI,IAAI,CAACU,EAAE,GAAGX,IAAI,CAACE,QAAQ,EAAE;EAEnF,MAAMU,QAAQ,GAAG,MAAMC,KAAK,CAACJ,GAAG,EAAE;IAC9BL,IAAI;IACJU,OAAO,EAAE;MACLC,MAAM,EAAE,kBAAkB;MAC1BC,aAAa,EAAE,UAAUjB,WAAW;IACxC,CAAC;IACDkB,MAAM,EAAE;EACZ,CAAC,CAAC;EAEF,IAAIL,QAAQ,CAACM,EAAE,EAAE;IACb,MAAM;MAAEC,KAAK;MAAEC;IAAW,CAAC,GAAI,MAAMR,QAAQ,CAACS,IAAI,CAAC,CAAY;IAC/D;IACA,OAAO;MACHC,GAAG,EAAEH,KAAK,CAACI,IAAI;MACf;MACAC,IAAI,EAAEJ,UAAU,CAACK,QAAQ,CAAC,GAAG,CAAC,GAAGL,UAAU,CAACM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAGN,UAAU;MACrEO,IAAI,EAAE;QACFC,OAAO,EAAET,KAAK,CAACS,OAAO;QACtBC,KAAK,EAAEC,MAAM,CAACX,KAAK,CAACU,KAAK,CAAC;QAC1BE,MAAM,EAAED,MAAM,CAACX,KAAK,CAACY,MAAM;MAC/B;IACJ,CAAC;EACL;EAEA,MAAMC,KAAK,CAAC,sCAAsCpB,QAAQ,CAACqB,MAAM,IAAI,CAAC;AAC1E,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"post.js","names":["getAccessToken","getSite","getUser","getUploadUrls","postImage","file","shouldUploadImageToSite","uploadPath","uploadUrls","accessToken","user","site","personId","undefined","body","FormData","append","imageServiceUrl","imageResizerUrl","targetPath","id","url","size","response","fetch","headers","Accept","Authorization","method","ok","image","baseDomain","json","key","path","base","endsWith","slice","meta","preview","width","String","height","Error","status"],"sources":["../../../../src/api/image/post.ts"],"sourcesContent":["import { getAccessToken, getSite, getUser } from 'chayns-api';\nimport { getUploadUrls, type UploadUrls } from '../../config/uploadUrls';\nimport type { Meta } from '../../types/file';\n\nexport interface PostImageResult {\n key: string;\n base: string;\n meta?: Meta;\n}\n\ninterface Result {\n requestId: string;\n image: Image;\n baseDomain: string;\n signature: Signature;\n}\n\nexport interface Image {\n path: string;\n width: number;\n height: number;\n size: number;\n hash: string;\n preview: string;\n isSecured: boolean;\n format: string;\n fileExtension: string;\n}\n\nexport interface Signature {\n verify: string;\n signature: string;\n expires: Date;\n}\n\ninterface PostImageOptions {\n file: File;\n shouldUploadImageToSite?: boolean;\n /**\n * Relative target path appended to the image service URL. When set, it\n * takes precedence over the default user or site ID path.\n */\n uploadPath?: string;\n /**\n * Overrides the globally configured upload service URLs for this upload.\n */\n uploadUrls?: Partial<UploadUrls>;\n}\n\n/**\n * Uploads an image to the tsimg cloud service\n */\nexport const postImage = async ({\n file,\n shouldUploadImageToSite,\n uploadPath,\n uploadUrls,\n}: PostImageOptions): Promise<PostImageResult | undefined> => {\n const { accessToken } = await getAccessToken();\n const user = getUser();\n const site = getSite();\n\n if (!accessToken || !user?.personId) {\n return undefined;\n }\n\n // const body = await getFileAsArrayBuffer(file);\n\n const body = new FormData();\n\n body.append('File', file);\n\n const { imageServiceUrl, imageResizerUrl } = getUploadUrls(uploadUrls);\n const targetPath = uploadPath ?? (shouldUploadImageToSite ? site.id : user.personId);\n\n const url =\n file.size > 10 * 1024 * 1024\n ? `${imageResizerUrl}/${targetPath}`\n : `${imageServiceUrl}/${targetPath}`;\n\n const response = await fetch(url, {\n body,\n headers: {\n Accept: 'application/json',\n Authorization: `bearer ${accessToken}`,\n },\n method: 'POST',\n });\n\n if (response.ok) {\n const { image, baseDomain } = (await response.json()) as Result;\n // Maps image-service-api-v3 result to v2 result.\n return {\n key: image.path,\n // Removes trailing slash from baseDomain, since image-service-api-v2 doesn't have a trailing slash on base.\n base: baseDomain.endsWith('/') ? baseDomain.slice(0, -1) : baseDomain,\n meta: {\n preview: image.preview,\n width: String(image.width),\n height: String(image.height),\n },\n };\n }\n\n throw Error(`Failed to POST image (status code: ${response.status}).`);\n};\n"],"mappings":"AAAA,SAASA,cAAc,EAAEC,OAAO,EAAEC,OAAO,QAAQ,YAAY;AAC7D,SAASC,aAAa,QAAyB,yBAAyB;AAgDxE;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAG,MAAAA,CAAO;EAC5BC,IAAI;EACJC,uBAAuB;EACvBC,UAAU;EACVC;AACc,CAAC,KAA2C;EAC1D,MAAM;IAAEC;EAAY,CAAC,GAAG,MAAMT,cAAc,CAAC,CAAC;EAC9C,MAAMU,IAAI,GAAGR,OAAO,CAAC,CAAC;EACtB,MAAMS,IAAI,GAAGV,OAAO,CAAC,CAAC;EAEtB,IAAI,CAACQ,WAAW,IAAI,CAACC,IAAI,EAAEE,QAAQ,EAAE;IACjC,OAAOC,SAAS;EACpB;;EAEA;;EAEA,MAAMC,IAAI,GAAG,IAAIC,QAAQ,CAAC,CAAC;EAE3BD,IAAI,CAACE,MAAM,CAAC,MAAM,EAAEX,IAAI,CAAC;EAEzB,MAAM;IAAEY,eAAe;IAAEC;EAAgB,CAAC,GAAGf,aAAa,CAACK,UAAU,CAAC;EACtE,MAAMW,UAAU,GAAGZ,UAAU,KAAKD,uBAAuB,GAAGK,IAAI,CAACS,EAAE,GAAGV,IAAI,CAACE,QAAQ,CAAC;EAEpF,MAAMS,GAAG,GACLhB,IAAI,CAACiB,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,GACtB,GAAGJ,eAAe,IAAIC,UAAU,EAAE,GAClC,GAAGF,eAAe,IAAIE,UAAU,EAAE;EAE5C,MAAMI,QAAQ,GAAG,MAAMC,KAAK,CAACH,GAAG,EAAE;IAC9BP,IAAI;IACJW,OAAO,EAAE;MACLC,MAAM,EAAE,kBAAkB;MAC1BC,aAAa,EAAE,UAAUlB,WAAW;IACxC,CAAC;IACDmB,MAAM,EAAE;EACZ,CAAC,CAAC;EAEF,IAAIL,QAAQ,CAACM,EAAE,EAAE;IACb,MAAM;MAAEC,KAAK;MAAEC;IAAW,CAAC,GAAI,MAAMR,QAAQ,CAACS,IAAI,CAAC,CAAY;IAC/D;IACA,OAAO;MACHC,GAAG,EAAEH,KAAK,CAACI,IAAI;MACf;MACAC,IAAI,EAAEJ,UAAU,CAACK,QAAQ,CAAC,GAAG,CAAC,GAAGL,UAAU,CAACM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAGN,UAAU;MACrEO,IAAI,EAAE;QACFC,OAAO,EAAET,KAAK,CAACS,OAAO;QACtBC,KAAK,EAAEC,MAAM,CAACX,KAAK,CAACU,KAAK,CAAC;QAC1BE,MAAM,EAAED,MAAM,CAACX,KAAK,CAACY,MAAM;MAC/B;IACJ,CAAC;EACL;EAEA,MAAMC,KAAK,CAAC,sCAAsCpB,QAAQ,CAACqB,MAAM,IAAI,CAAC;AAC1E,CAAC","ignoreList":[]}
@@ -0,0 +1,45 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { resetUploadUrls } from '../../config/uploadUrls';
3
+ import { postImage } from './post';
4
+ vi.mock('chayns-api', () => ({
5
+ getAccessToken: vi.fn().mockResolvedValue({
6
+ accessToken: 'access-token'
7
+ }),
8
+ getSite: vi.fn().mockReturnValue({
9
+ id: 'site-id'
10
+ }),
11
+ getUser: vi.fn().mockReturnValue({
12
+ personId: 'person-id'
13
+ })
14
+ }));
15
+ describe('postImage', () => {
16
+ afterEach(() => {
17
+ resetUploadUrls();
18
+ vi.unstubAllGlobals();
19
+ });
20
+ it('uses an explicitly provided upload path instead of the default user path', async () => {
21
+ const fetchMock = vi.fn().mockResolvedValue({
22
+ ok: true,
23
+ json: vi.fn().mockResolvedValue({
24
+ baseDomain: 'https://tsimg.cloud/',
25
+ image: {
26
+ path: 'image-path',
27
+ preview: 'preview',
28
+ width: 1,
29
+ height: 1
30
+ }
31
+ })
32
+ });
33
+ vi.stubGlobal('fetch', fetchMock);
34
+ await postImage({
35
+ file: new File(['image'], 'image.png', {
36
+ type: 'image/png'
37
+ }),
38
+ uploadPath: 'threads/thread-id'
39
+ });
40
+ expect(fetchMock).toHaveBeenCalledWith('https://cube.tobit.cloud/image-service/v3/Images/threads/thread-id', expect.objectContaining({
41
+ method: 'POST'
42
+ }));
43
+ });
44
+ });
45
+ //# sourceMappingURL=post.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.test.js","names":["afterEach","describe","expect","it","vi","resetUploadUrls","postImage","mock","getAccessToken","fn","mockResolvedValue","accessToken","getSite","mockReturnValue","id","getUser","personId","unstubAllGlobals","fetchMock","ok","json","baseDomain","image","path","preview","width","height","stubGlobal","file","File","type","uploadPath","toHaveBeenCalledWith","objectContaining","method"],"sources":["../../../../src/api/image/post.test.ts"],"sourcesContent":["import { afterEach, describe, expect, it, vi } from 'vitest';\nimport { resetUploadUrls } from '../../config/uploadUrls';\nimport { postImage } from './post';\n\nvi.mock('chayns-api', () => ({\n getAccessToken: vi.fn().mockResolvedValue({ accessToken: 'access-token' }),\n getSite: vi.fn().mockReturnValue({ id: 'site-id' }),\n getUser: vi.fn().mockReturnValue({ personId: 'person-id' }),\n}));\n\ndescribe('postImage', () => {\n afterEach(() => {\n resetUploadUrls();\n vi.unstubAllGlobals();\n });\n\n it('uses an explicitly provided upload path instead of the default user path', async () => {\n const fetchMock = vi.fn().mockResolvedValue({\n ok: true,\n json: vi.fn().mockResolvedValue({\n baseDomain: 'https://tsimg.cloud/',\n image: {\n path: 'image-path',\n preview: 'preview',\n width: 1,\n height: 1,\n },\n }),\n });\n vi.stubGlobal('fetch', fetchMock);\n\n await postImage({\n file: new File(['image'], 'image.png', { type: 'image/png' }),\n uploadPath: 'threads/thread-id',\n });\n\n expect(fetchMock).toHaveBeenCalledWith(\n 'https://cube.tobit.cloud/image-service/v3/Images/threads/thread-id',\n expect.objectContaining({ method: 'POST' }),\n );\n });\n});\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,QAAQ;AAC5D,SAASC,eAAe,QAAQ,yBAAyB;AACzD,SAASC,SAAS,QAAQ,QAAQ;AAElCF,EAAE,CAACG,IAAI,CAAC,YAAY,EAAE,OAAO;EACzBC,cAAc,EAAEJ,EAAE,CAACK,EAAE,CAAC,CAAC,CAACC,iBAAiB,CAAC;IAAEC,WAAW,EAAE;EAAe,CAAC,CAAC;EAC1EC,OAAO,EAAER,EAAE,CAACK,EAAE,CAAC,CAAC,CAACI,eAAe,CAAC;IAAEC,EAAE,EAAE;EAAU,CAAC,CAAC;EACnDC,OAAO,EAAEX,EAAE,CAACK,EAAE,CAAC,CAAC,CAACI,eAAe,CAAC;IAAEG,QAAQ,EAAE;EAAY,CAAC;AAC9D,CAAC,CAAC,CAAC;AAEHf,QAAQ,CAAC,WAAW,EAAE,MAAM;EACxBD,SAAS,CAAC,MAAM;IACZK,eAAe,CAAC,CAAC;IACjBD,EAAE,CAACa,gBAAgB,CAAC,CAAC;EACzB,CAAC,CAAC;EAEFd,EAAE,CAAC,0EAA0E,EAAE,YAAY;IACvF,MAAMe,SAAS,GAAGd,EAAE,CAACK,EAAE,CAAC,CAAC,CAACC,iBAAiB,CAAC;MACxCS,EAAE,EAAE,IAAI;MACRC,IAAI,EAAEhB,EAAE,CAACK,EAAE,CAAC,CAAC,CAACC,iBAAiB,CAAC;QAC5BW,UAAU,EAAE,sBAAsB;QAClCC,KAAK,EAAE;UACHC,IAAI,EAAE,YAAY;UAClBC,OAAO,EAAE,SAAS;UAClBC,KAAK,EAAE,CAAC;UACRC,MAAM,EAAE;QACZ;MACJ,CAAC;IACL,CAAC,CAAC;IACFtB,EAAE,CAACuB,UAAU,CAAC,OAAO,EAAET,SAAS,CAAC;IAEjC,MAAMZ,SAAS,CAAC;MACZsB,IAAI,EAAE,IAAIC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE;QAAEC,IAAI,EAAE;MAAY,CAAC,CAAC;MAC7DC,UAAU,EAAE;IAChB,CAAC,CAAC;IAEF7B,MAAM,CAACgB,SAAS,CAAC,CAACc,oBAAoB,CAClC,oEAAoE,EACpE9B,MAAM,CAAC+B,gBAAgB,CAAC;MAAEC,MAAM,EAAE;IAAO,CAAC,CAC9C,CAAC;EACL,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
@@ -4,6 +4,7 @@ export const uploadFile = async ({
4
4
  fileToUpload,
5
5
  callback,
6
6
  shouldUploadImageToSite,
7
+ uploadPath,
7
8
  uploadUrls
8
9
  }) => {
9
10
  if (!fileToUpload || fileToUpload.state !== undefined && fileToUpload.state !== 'none') {
@@ -25,6 +26,7 @@ export const uploadFile = async ({
25
26
  const uploadedImage = await postImage({
26
27
  file: fileToUpload.file,
27
28
  shouldUploadImageToSite,
29
+ uploadPath,
28
30
  uploadUrls
29
31
  });
30
32
  if (uploadedImage) {
@@ -1 +1 @@
1
- {"version":3,"file":"uploadFile.js","names":["postImage","postVideo","uploadFile","fileToUpload","callback","shouldUploadImageToSite","uploadUrls","state","undefined","file","type","includes","uploadedVideo","id","toString","uploadedImage","url","base","key","meta","ratio","width","height","Number"],"sources":["../../../src/utils/uploadFile.ts"],"sourcesContent":["import { postImage } from '../api/image/post';\nimport { postVideo } from '../api/video/post';\nimport type { UploadUrls } from '../config/uploadUrls';\nimport type { Image, InternalFileItem, Video } from '../types/file';\n\ninterface UploadFilesOptions {\n fileToUpload: InternalFileItem;\n callback: (UploadedFile: Video | Image) => void;\n shouldUploadImageToSite?: boolean;\n /**\n * Overrides the globally configured upload service URLs for this upload.\n */\n uploadUrls?: Partial<UploadUrls>;\n}\n\nexport const uploadFile = async ({\n fileToUpload,\n callback,\n shouldUploadImageToSite,\n uploadUrls,\n}: UploadFilesOptions): Promise<void> => {\n if (!fileToUpload || (fileToUpload.state !== undefined && fileToUpload.state !== 'none')) {\n return;\n }\n\n if (fileToUpload.file?.type.includes('video/')) {\n const uploadedVideo = await postVideo({ file: fileToUpload.file, uploadUrls });\n\n if (uploadedVideo) {\n callback({\n ...uploadedVideo,\n id: uploadedVideo.id.toString(),\n });\n }\n }\n\n if (fileToUpload.file?.type.includes('image/')) {\n const uploadedImage = await postImage({\n file: fileToUpload.file,\n shouldUploadImageToSite,\n uploadUrls,\n });\n\n if (uploadedImage) {\n callback({\n url: `${uploadedImage.base}/${uploadedImage.key}`,\n id: uploadedImage.key,\n meta: uploadedImage.meta,\n ratio:\n uploadedImage.meta?.width && uploadedImage.meta?.height\n ? Number(uploadedImage.meta?.width) / Number(uploadedImage.meta?.height)\n : undefined,\n });\n }\n }\n};\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,mBAAmB;AAC7C,SAASC,SAAS,QAAQ,mBAAmB;AAc7C,OAAO,MAAMC,UAAU,GAAG,MAAAA,CAAO;EAC7BC,YAAY;EACZC,QAAQ;EACRC,uBAAuB;EACvBC;AACgB,CAAC,KAAoB;EACrC,IAAI,CAACH,YAAY,IAAKA,YAAY,CAACI,KAAK,KAAKC,SAAS,IAAIL,YAAY,CAACI,KAAK,KAAK,MAAO,EAAE;IACtF;EACJ;EAEA,IAAIJ,YAAY,CAACM,IAAI,EAAEC,IAAI,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAC5C,MAAMC,aAAa,GAAG,MAAMX,SAAS,CAAC;MAAEQ,IAAI,EAAEN,YAAY,CAACM,IAAI;MAAEH;IAAW,CAAC,CAAC;IAE9E,IAAIM,aAAa,EAAE;MACfR,QAAQ,CAAC;QACL,GAAGQ,aAAa;QAChBC,EAAE,EAAED,aAAa,CAACC,EAAE,CAACC,QAAQ,CAAC;MAClC,CAAC,CAAC;IACN;EACJ;EAEA,IAAIX,YAAY,CAACM,IAAI,EAAEC,IAAI,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAC5C,MAAMI,aAAa,GAAG,MAAMf,SAAS,CAAC;MAClCS,IAAI,EAAEN,YAAY,CAACM,IAAI;MACvBJ,uBAAuB;MACvBC;IACJ,CAAC,CAAC;IAEF,IAAIS,aAAa,EAAE;MACfX,QAAQ,CAAC;QACLY,GAAG,EAAE,GAAGD,aAAa,CAACE,IAAI,IAAIF,aAAa,CAACG,GAAG,EAAE;QACjDL,EAAE,EAAEE,aAAa,CAACG,GAAG;QACrBC,IAAI,EAAEJ,aAAa,CAACI,IAAI;QACxBC,KAAK,EACDL,aAAa,CAACI,IAAI,EAAEE,KAAK,IAAIN,aAAa,CAACI,IAAI,EAAEG,MAAM,GACjDC,MAAM,CAACR,aAAa,CAACI,IAAI,EAAEE,KAAK,CAAC,GAAGE,MAAM,CAACR,aAAa,CAACI,IAAI,EAAEG,MAAM,CAAC,GACtEd;MACd,CAAC,CAAC;IACN;EACJ;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"uploadFile.js","names":["postImage","postVideo","uploadFile","fileToUpload","callback","shouldUploadImageToSite","uploadPath","uploadUrls","state","undefined","file","type","includes","uploadedVideo","id","toString","uploadedImage","url","base","key","meta","ratio","width","height","Number"],"sources":["../../../src/utils/uploadFile.ts"],"sourcesContent":["import { postImage } from '../api/image/post';\nimport { postVideo } from '../api/video/post';\nimport type { UploadUrls } from '../config/uploadUrls';\nimport type { Image, InternalFileItem, Video } from '../types/file';\n\ninterface UploadFilesOptions {\n fileToUpload: InternalFileItem;\n callback: (UploadedFile: Video | Image) => void;\n shouldUploadImageToSite?: boolean;\n /**\n * Relative target path appended to the image service URL. When set, it\n * takes precedence over the default user or site ID path.\n */\n uploadPath?: string;\n /**\n * Overrides the globally configured upload service URLs for this upload.\n */\n uploadUrls?: Partial<UploadUrls>;\n}\n\nexport const uploadFile = async ({\n fileToUpload,\n callback,\n shouldUploadImageToSite,\n uploadPath,\n uploadUrls,\n}: UploadFilesOptions): Promise<void> => {\n if (!fileToUpload || (fileToUpload.state !== undefined && fileToUpload.state !== 'none')) {\n return;\n }\n\n if (fileToUpload.file?.type.includes('video/')) {\n const uploadedVideo = await postVideo({ file: fileToUpload.file, uploadUrls });\n\n if (uploadedVideo) {\n callback({\n ...uploadedVideo,\n id: uploadedVideo.id.toString(),\n });\n }\n }\n\n if (fileToUpload.file?.type.includes('image/')) {\n const uploadedImage = await postImage({\n file: fileToUpload.file,\n shouldUploadImageToSite,\n uploadPath,\n uploadUrls,\n });\n\n if (uploadedImage) {\n callback({\n url: `${uploadedImage.base}/${uploadedImage.key}`,\n id: uploadedImage.key,\n meta: uploadedImage.meta,\n ratio:\n uploadedImage.meta?.width && uploadedImage.meta?.height\n ? Number(uploadedImage.meta?.width) / Number(uploadedImage.meta?.height)\n : undefined,\n });\n }\n }\n};\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,mBAAmB;AAC7C,SAASC,SAAS,QAAQ,mBAAmB;AAmB7C,OAAO,MAAMC,UAAU,GAAG,MAAAA,CAAO;EAC7BC,YAAY;EACZC,QAAQ;EACRC,uBAAuB;EACvBC,UAAU;EACVC;AACgB,CAAC,KAAoB;EACrC,IAAI,CAACJ,YAAY,IAAKA,YAAY,CAACK,KAAK,KAAKC,SAAS,IAAIN,YAAY,CAACK,KAAK,KAAK,MAAO,EAAE;IACtF;EACJ;EAEA,IAAIL,YAAY,CAACO,IAAI,EAAEC,IAAI,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAC5C,MAAMC,aAAa,GAAG,MAAMZ,SAAS,CAAC;MAAES,IAAI,EAAEP,YAAY,CAACO,IAAI;MAAEH;IAAW,CAAC,CAAC;IAE9E,IAAIM,aAAa,EAAE;MACfT,QAAQ,CAAC;QACL,GAAGS,aAAa;QAChBC,EAAE,EAAED,aAAa,CAACC,EAAE,CAACC,QAAQ,CAAC;MAClC,CAAC,CAAC;IACN;EACJ;EAEA,IAAIZ,YAAY,CAACO,IAAI,EAAEC,IAAI,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IAC5C,MAAMI,aAAa,GAAG,MAAMhB,SAAS,CAAC;MAClCU,IAAI,EAAEP,YAAY,CAACO,IAAI;MACvBL,uBAAuB;MACvBC,UAAU;MACVC;IACJ,CAAC,CAAC;IAEF,IAAIS,aAAa,EAAE;MACfZ,QAAQ,CAAC;QACLa,GAAG,EAAE,GAAGD,aAAa,CAACE,IAAI,IAAIF,aAAa,CAACG,GAAG,EAAE;QACjDL,EAAE,EAAEE,aAAa,CAACG,GAAG;QACrBC,IAAI,EAAEJ,aAAa,CAACI,IAAI;QACxBC,KAAK,EACDL,aAAa,CAACI,IAAI,EAAEE,KAAK,IAAIN,aAAa,CAACI,IAAI,EAAEG,MAAM,GACjDC,MAAM,CAACR,aAAa,CAACI,IAAI,EAAEE,KAAK,CAAC,GAAGE,MAAM,CAACR,aAAa,CAACI,IAAI,EAAEG,MAAM,CAAC,GACtEd;MACd,CAAC,CAAC;IACN;EACJ;AACJ,CAAC","ignoreList":[]}
@@ -24,6 +24,11 @@ export interface Signature {
24
24
  interface PostImageOptions {
25
25
  file: File;
26
26
  shouldUploadImageToSite?: boolean;
27
+ /**
28
+ * Relative target path appended to the image service URL. When set, it
29
+ * takes precedence over the default user or site ID path.
30
+ */
31
+ uploadPath?: string;
27
32
  /**
28
33
  * Overrides the globally configured upload service URLs for this upload.
29
34
  */
@@ -32,5 +37,5 @@ interface PostImageOptions {
32
37
  /**
33
38
  * Uploads an image to the tsimg cloud service
34
39
  */
35
- export declare const postImage: ({ file, shouldUploadImageToSite, uploadUrls, }: PostImageOptions) => Promise<PostImageResult | undefined>;
40
+ export declare const postImage: ({ file, shouldUploadImageToSite, uploadPath, uploadUrls, }: PostImageOptions) => Promise<PostImageResult | undefined>;
36
41
  export {};
@@ -4,10 +4,15 @@ interface UploadFilesOptions {
4
4
  fileToUpload: InternalFileItem;
5
5
  callback: (UploadedFile: Video | Image) => void;
6
6
  shouldUploadImageToSite?: boolean;
7
+ /**
8
+ * Relative target path appended to the image service URL. When set, it
9
+ * takes precedence over the default user or site ID path.
10
+ */
11
+ uploadPath?: string;
7
12
  /**
8
13
  * Overrides the globally configured upload service URLs for this upload.
9
14
  */
10
15
  uploadUrls?: Partial<UploadUrls>;
11
16
  }
12
- export declare const uploadFile: ({ fileToUpload, callback, shouldUploadImageToSite, uploadUrls, }: UploadFilesOptions) => Promise<void>;
17
+ export declare const uploadFile: ({ fileToUpload, callback, shouldUploadImageToSite, uploadPath, uploadUrls, }: UploadFilesOptions) => Promise<void>;
13
18
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-components/core",
3
- "version": "5.5.59",
3
+ "version": "5.5.60",
4
4
  "description": "A set of beautiful React components for developing your own applications with chayns.",
5
5
  "sideEffects": false,
6
6
  "browserslist": [
@@ -93,5 +93,5 @@
93
93
  "publishConfig": {
94
94
  "access": "public"
95
95
  },
96
- "gitHead": "46fe35b742c2a48451ed2392ec0bb58aa26985e2"
96
+ "gitHead": "a45152d24144818f31b5633e587ebae807142945"
97
97
  }