UNPKG

@azure-utils/storybooks

Version:

Utils to upload and manage Storybooks via Azure Functions and storage.

1 lines 4.13 kB
{"version":3,"file":"upload-utils-DHJHMiPY.mjs","names":["projectId: string","buildSHA: string","zipFile?: File","blobName","readable: Readable","filePath: string"],"sources":["../src/utils/upload-utils.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { HttpResponseInit } from \"@azure/functions\";\nimport { responseError } from \"./response-utils\";\nimport {\n generateAzureStorageContainerName,\n uploadDirToAzureBlobStorage,\n} from \"./azure-storage-blob\";\nimport decompress from \"decompress\";\nimport { Readable } from \"node:stream\";\nimport { once } from \"node:events\";\nimport { BlobServiceClient } from \"@azure/storage-blob\";\nimport { getStore } from \"./store\";\nimport type { ReadableStream } from \"node:stream/web\";\n\nexport async function uploadZipWithDecompressed(\n projectId: string,\n buildSHA: string,\n zipFile?: File\n): Promise<HttpResponseInit | undefined> {\n const { context, connectionString, request } = getStore();\n\n const tmpDir = os.tmpdir();\n const dirpath = fs.mkdtempSync(path.join(tmpDir, \"storybook-\"));\n const zipFilePath = path.join(\n dirpath,\n `${projectId}-${buildSHA}-storybook.zip`\n );\n\n try {\n if (zipFile) {\n await writeStreamToFile(\n Readable.fromWeb(zipFile.stream() as unknown as ReadableStream<any>),\n zipFilePath\n );\n } else {\n await writeStreamToFile(Readable.fromWeb(request.body!), zipFilePath);\n }\n await decompress(zipFilePath, dirpath);\n\n const containerClient = BlobServiceClient.fromConnectionString(\n connectionString\n ).getContainerClient(generateAzureStorageContainerName(projectId));\n const blobName = `${buildSHA}/storybook.zip`;\n\n context.debug(\n `Uploading stream to blob: ${blobName} (container: ${containerClient.containerName})`\n );\n\n const uploadResponse = await containerClient\n .getBlockBlobClient(blobName)\n .uploadFile(zipFilePath, {\n blobHTTPHeaders: {\n blobContentType: \"application/zip\",\n blobContentEncoding: \"utf8\",\n blobCacheControl: \"public, max-age=31536000\",\n },\n });\n\n if (uploadResponse.errorCode) {\n return responseError(\n \"Failed to upload Storybook.\",\n context,\n uploadResponse._response.status\n );\n }\n\n await uploadDirToAzureBlobStorage(\n context,\n containerClient,\n dirpath,\n (blobName) => path.join(buildSHA, blobName)\n );\n\n return;\n } finally {\n fs.rmSync(dirpath, { recursive: true, force: true });\n }\n}\n\nasync function writeStreamToFile(readable: Readable, filePath: string) {\n const writable = fs.createWriteStream(filePath);\n for await (const chunk of readable) {\n if (!writable.write(chunk)) {\n // Wait if backpressure is applied\n await once(writable, \"drain\");\n }\n }\n writable.end();\n await once(writable, \"finish\");\n}\n"],"mappings":";;;;;;;;;;;AAgBA,eAAsB,0BACpBA,WACAC,UACAC,SACuC;CACvC,MAAM,EAAE,SAAS,kBAAkB,SAAS,GAAG,UAAU;CAEzD,MAAM,SAAS,GAAG,QAAQ;CAC1B,MAAM,UAAU,GAAG,YAAY,KAAK,KAAK,QAAQ,aAAa,CAAC;CAC/D,MAAM,cAAc,KAAK,KACvB,SACA,GAAG,UAAU,CAAC,EAAE,SAAS,cAAc,CAAC,CACzC;AAED,KAAI;AACF,MAAI,SACF,MAAM,kBACJ,SAAS,QAAQ,QAAQ,QAAQ,CAAmC,EACpE,YACD;OAED,MAAM,kBAAkB,SAAS,QAAQ,QAAQ,KAAM,EAAE,YAAY;EAEvE,MAAM,WAAW,aAAa,QAAQ;EAEtC,MAAM,kBAAkB,kBAAkB,qBACxC,iBACD,CAAC,mBAAmB,kCAAkC,UAAU,CAAC;EAClE,MAAM,WAAW,GAAG,SAAS,cAAc,CAAC;EAE5C,QAAQ,MACN,CAAC,0BAA0B,EAAE,SAAS,aAAa,EAAE,gBAAgB,cAAc,CAAC,CAAC,CACtF;EAED,MAAM,iBAAiB,MAAM,gBAC1B,mBAAmB,SAAS,CAC5B,WAAW,aAAa,EACvB,iBAAiB;GACf,iBAAiB;GACjB,qBAAqB;GACrB,kBAAkB;EACnB,EACF,EAAC;AAEJ,MAAI,eAAe,UACjB,QAAO,cACL,+BACA,SACA,eAAe,UAAU,OAC1B;EAGH,MAAM,4BACJ,SACA,iBACA,SACA,CAACC,eAAa,KAAK,KAAK,UAAUA,WAAS,CAC5C;AAED;CACD,UAAS;EACR,GAAG,OAAO,SAAS;GAAE,WAAW;GAAM,OAAO;EAAM,EAAC;CACrD;AACF;AAED,eAAe,kBAAkBC,UAAoBC,UAAkB;CACrE,MAAM,WAAW,GAAG,kBAAkB,SAAS;AAC/C,YAAW,MAAM,SAAS,SACxB,KAAI,CAAC,SAAS,MAAM,MAAM,EAExB,MAAM,KAAK,UAAU,QAAQ;CAGjC,SAAS,KAAK;CACd,MAAM,KAAK,UAAU,SAAS;AAC/B"}