Edits history of script submission #22496 for ' List objects in a bucket (s3)'

  • bun
    One script reply has been approved by the moderators
    Ap­pro­ved
    import * as Minio from "minio@7";
    
    type S3 = {
      endPoint: string;
      port: number;
      useSSL: boolean;
      pathStyle: boolean;
      bucket: string;
      accessKey: string;
      secretKey: string;
      region: string;
    };
    export async function main(
      s3: S3,
      prefix?: string,
      bucketName?: string,
      maxResults?: number,
      pageSize?: number,
    ) {
      const s3client = new Minio.Client(s3);
      const options = removeObjectEmptyFields({
        prefix,
        bucketName,
        maxResults,
        pageSize,
      });
    
      const stream = s3client.listObjects(
        options.bucketName || s3.bucket,
        options.prefix ?? "",
        true,
      );
    
      const result: any[] = [];
      await new Promise<void>((resolve, reject) => {
        stream.on("data", (obj: any) => {
          if (
            options.maxResults !== undefined &&
            result.length >= options.maxResults
          ) {
            stream.destroy();
            resolve();
            return;
          }
          result.push(obj);
        });
        stream.on("end", () => resolve());
        stream.on("close", () => resolve());
        stream.on("error", (err: any) => reject(err));
      });
    
      return result;
    }
    
    function removeObjectEmptyFields(
      object?: Record<string, any>,
      removeEmptyArraysAndObjects = true,
      createNewObject = true,
    ) {
      if (!object || typeof object !== "object") return {}
      const obj = createNewObject ? { ...object } : object
      const emptyValues = [undefined, null, ""]
      for (const key in obj) {
        const value = obj[key]
        if (emptyValues.includes(value)) {
          delete obj[key]
        } else if (typeof value === "object") {
          if (Object.keys(value).length) {
            obj[key] = removeObjectEmptyFields(value, removeEmptyArraysAndObjects, false)
          }
          if (!Object.keys(value).length && removeEmptyArraysAndObjects) {
            delete obj[key]
          }
        }
      }
      return obj
    }
    

    Submitted by hugo989 6 days ago