npm package diff

Package: @forge/bridge

Versions: 5.8.0-next.8 - 5.8.0-next.9

Modified: package/out/object-store/upload.js

Index: package/out/object-store/upload.js
===================================================================
--- package/out/object-store/upload.js
+++ package/out/object-store/upload.js
@@ -2,8 +2,17 @@
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.upload = void 0;
 const invoke_1 = require("../invoke");
 const errors_1 = require("../errors");
+const base64ToBlob = (base64, mimeType) => {
+    const byteCharacters = atob(base64);
+    const byteNumbers = new Array(byteCharacters.length);
+    for (let i = 0; i < byteCharacters.length; i++) {
+        byteNumbers[i] = byteCharacters.charCodeAt(i);
+    }
+    const byteArray = new Uint8Array(byteNumbers);
+    return new Blob([byteArray], { type: mimeType || 'application/octet-stream' });
+};
 const getObjectMetadata = async (blob) => {
     const length = blob.size;
     const arrayBuffer = await blob.arrayBuffer();
     const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
@@ -22,17 +31,32 @@
     }
     if (!Array.isArray(objects) || objects.length === 0) {
         throw new errors_1.BridgeAPIError('objects array is required and must not be empty');
     }
-    const allObjectMetadata = await Promise.all(objects.map((obj) => getObjectMetadata(obj)));
+    const blobs = objects.map((obj, index) => {
+        if (obj instanceof Blob) {
+            return obj;
+        }
+        const isBase64Object = obj && typeof obj === 'object' && 'data' in obj && typeof obj.data === 'string';
+        if (!isBase64Object) {
+            throw new errors_1.BridgeAPIError(`Invalid object type at index ${index}. Only Blob or Base64Object (with data string and optional mimeType) are accepted.`);
+        }
+        try {
+            return base64ToBlob(obj.data, obj.mimeType);
+        }
+        catch (e) {
+            throw new errors_1.BridgeAPIError(`Invalid base64 data at index ${index}. The data string must be valid base64 encoded.`);
+        }
+    });
+    const allObjectMetadata = await Promise.all(blobs.map((blob) => getObjectMetadata(blob)));
     const presignedURLsToObjectMetadata = (await (0, invoke_1.invoke)(functionKey, {
         allObjectMetadata
     }));
     if (!presignedURLsToObjectMetadata || typeof presignedURLsToObjectMetadata !== 'object') {
         throw new errors_1.BridgeAPIError('Invalid response from functionKey');
     }
     const checksumToBlobMap = new Map();
-    objects.forEach((blob, index) => {
+    blobs.forEach((blob, index) => {
         const metadata = allObjectMetadata[index];
         checksumToBlobMap.set(metadata.checksum, blob);
     });
     const uploadPromises = Object.entries(presignedURLsToObjectMetadata).map(async ([presignedUrl, metadata]) => {

Modified: package/package.json

Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/bridge",
-  "version": "5.8.0-next.8",
+  "version": "5.8.0-next.9",
   "description": "Forge bridge API for custom UI apps",
   "author": "Atlassian",
   "license": "SEE LICENSE IN LICENSE.txt",
   "main": "out/index.js",

Modified: package/out/object-store/types.d.ts.map

Index: package/out/object-store/types.d.ts.map
===================================================================
--- package/out/object-store/types.d.ts.map
+++ package/out/object-store/types.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/object-store/types.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,oBAAY,YAAY,GAAG,cAAc,GAAG;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,oBAAY,cAAc,GAAG;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,oBAAY,mBAAmB,GAAG;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;CAC7B,CAAC;AAEF,oBAAY,kBAAkB,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAE3D,oBAAY,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
\ No newline at end of file
+{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/object-store/types.ts"],"names":[],"mappings":"AAAA,oBAAY,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,oBAAY,YAAY,GAAG,IAAI,GAAG,YAAY,CAAC;AAE/C,oBAAY,YAAY,GAAG,cAAc,GAAG;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,oBAAY,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,oBAAY,cAAc,GAAG;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,oBAAY,mBAAmB,GAAG;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;CAC7B,CAAC;AAEF,oBAAY,kBAAkB,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAE3D,oBAAY,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
\ No newline at end of file

Modified: package/out/object-store/upload.d.ts.map

Index: package/out/object-store/upload.d.ts.map
===================================================================
--- package/out/object-store/upload.d.ts.map
+++ package/out/object-store/upload.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/object-store/upload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuC,YAAY,EAAE,MAAM,SAAS,CAAC;AA+BjF,eAAO,MAAM,MAAM;iBAIJ,MAAM;aACV,IAAI,EAAE;MACb,QAAQ,YAAY,EAAE,CAkEzB,CAAC"}
\ No newline at end of file
+{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/object-store/upload.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAuC,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA4C/F,eAAO,MAAM,MAAM;iBAIJ,MAAM;aACV,YAAY,EAAE;MACrB,QAAQ,YAAY,EAAE,CAuFzB,CAAC"}
\ No newline at end of file

Modified: package/CHANGELOG.md

Index: package/CHANGELOG.md
===================================================================
--- package/CHANGELOG.md
+++ package/CHANGELOG.md
@@ -1,6 +1,12 @@
 # @forge/bridge
 
+## 5.8.0-next.9
+
+### Minor Changes
+
+- 617c3d9: Add base64 support to upload bridge method
+
 ## 5.8.0-next.8
 
 ### Patch Changes

Modified: package/out/object-store/objectStore.d.ts

Index: package/out/object-store/objectStore.d.ts
===================================================================
--- package/out/object-store/objectStore.d.ts
+++ package/out/object-store/objectStore.d.ts
@@ -1,8 +1,8 @@
 export declare const objectStore: {
     upload: ({ functionKey, objects }: {
         functionKey: string;
-        objects: Blob[];
+        objects: import("./types").UploadObject[];
     }) => Promise<import("./types").UploadResult[]>;
     download: ({ functionKey, keys }: {
         functionKey: string;
         keys: string[];

Modified: package/out/object-store/types.d.ts

Index: package/out/object-store/types.d.ts
===================================================================
--- package/out/object-store/types.d.ts
+++ package/out/object-store/types.d.ts
@@ -2,8 +2,13 @@
     length: number;
     checksum: string;
     checksumType: string;
 };
+export declare type Base64Object = {
+    data: string;
+    mimeType?: string;
+};
+export declare type UploadObject = Blob | Base64Object;
 export declare type FileMetadata = ObjectMetadata & {
     key: string;
     ttlSeconds?: number;
     overwrite?: boolean;

Modified: package/out/object-store/upload.d.ts

Index: package/out/object-store/upload.d.ts
===================================================================
--- package/out/object-store/upload.d.ts
+++ package/out/object-store/upload.d.ts
@@ -1,6 +1,6 @@
-import type { UploadResult } from './types';
+import type { UploadResult, UploadObject } from './types';
 export declare const upload: ({ functionKey, objects }: {
     functionKey: string;
-    objects: Blob[];
+    objects: UploadObject[];
 }) => Promise<UploadResult[]>;
 //# sourceMappingURL=upload.d.ts.map
\ No newline at end of file