{"version":3,"file":"index.mjs","names":["getAwsClient","getDownloadUrl","getMetadata","stream","uploadSingle","deleteSingle","deleteMultiple","rename"],"sources":["../src/clients/aws-client.ts","../src/services/delete-multiple.ts","../src/services/delete-single.ts","../src/constants.ts","../src/utils/build-download-content-disposition.ts","../src/services/get-download-url.ts","../src/utils/metadata-headers.ts","../src/services/get-metadata.ts","../src/services/rename.ts","../src/services/stream.ts","../src/services/upload-session/helpers.ts","../src/services/upload-session/abort-upload-session.ts","../src/services/upload-session/complete-upload-session.ts","../src/services/upload-session/create-upload-session.ts","../src/services/upload-session/get-upload-part-urls.ts","../src/services/upload-session/list-upload-parts.ts","../src/services/upload-single.ts","../src/adapter.ts","../src/plugin.ts","../src/index.ts"],"sourcesContent":["import { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../types/types.js\";\n\nlet awsClient: AwsClient | null = null;\n\nconst getS3Client = (pluginOptions: PluginOptions) => {\n\tif (!awsClient) {\n\t\tawsClient = new AwsClient(pluginOptions.clientOptions);\n\t}\n\n\treturn awsClient;\n};\n\nexport default getS3Client;\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceDeleteMultiple } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../types/types.js\";\n\nexport default (client: AwsClient, pluginOptions: PluginOptions) => {\n\tconst deleteMultiple: MediaAdapterServiceDeleteMultiple = async (\n\t\t_context,\n\t\t{ keys },\n\t) => {\n\t\ttry {\n\t\t\tconst deleteXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Delete>\n${keys.map((key) => `<Object><Key>${key}</Key></Object>`).join(\"\")}\n</Delete>`;\n\n\t\t\tconst response = await client.sign(\n\t\t\t\tnew Request(\n\t\t\t\t\t`${pluginOptions.endpoint}/${pluginOptions.bucket}?delete`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\tbody: deleteXml,\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\"Content-Type\": \"application/xml\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = await fetch(response);\n\n\t\t\tif (!result.ok) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.delete.multiple.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t\tstatusText: result.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\te instanceof Error\n\t\t\t\t\t\t\t? copy.literal(e.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n\n\treturn deleteMultiple;\n};\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceDeleteSingle } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../types/types.js\";\n\nexport default (client: AwsClient, pluginOptions: PluginOptions) => {\n\tconst deleteSingle: MediaAdapterServiceDeleteSingle = async (\n\t\t_context,\n\t\t{ key },\n\t) => {\n\t\ttry {\n\t\t\tconst response = await client.sign(\n\t\t\t\tnew Request(\n\t\t\t\t\t`${pluginOptions.endpoint}/${pluginOptions.bucket}/${key}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"DELETE\",\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = await fetch(response);\n\n\t\t\tif (!result.ok) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.delete.single.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t\tstatusText: result.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\te instanceof Error\n\t\t\t\t\t\t\t? copy.literal(e.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n\n\treturn deleteSingle;\n};\n","export const PLUGIN_KEY = \"plugin-s3\";\nexport const LUCID_VERSION = \"0.x.x\";\n\nexport const PRESIGNED_URL_EXPIRY = 3600; // 1 hour\nexport const DEFAULT_PART_SIZE = 8 * 1024 * 1024; // 8 MiB\n","const replaceControlCharacters = (value: string) =>\n\tArray.from(value, (char) => {\n\t\tconst code = char.charCodeAt(0);\n\t\treturn code <= 31 || code === 127 ? \" \" : char;\n\t}).join(\"\");\n\nconst sanitizeDownloadFileName = (value: string) => {\n\tconst basename =\n\t\tvalue.replace(/\\\\/g, \"/\").split(\"/\").filter(Boolean).at(-1) ?? value;\n\n\tconst normalized = replaceControlCharacters(basename)\n\t\t.replace(/\"/g, \"\")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n\n\treturn normalized || \"download\";\n};\n\nconst buildDownloadContentDisposition = (props: {\n\tkey: string;\n\tfileName?: string | null;\n\textension?: string | null;\n}) => {\n\tconst persistedFileName = props.fileName?.trim();\n\tconst normalizedKey =\n\t\tprops.key.split(\"/\").filter(Boolean).at(-1) ?? props.key;\n\n\tconst fileName = persistedFileName\n\t\t? sanitizeDownloadFileName(persistedFileName)\n\t\t: sanitizeDownloadFileName(\n\t\t\t\tprops.extension && !normalizedKey.endsWith(`.${props.extension}`)\n\t\t\t\t\t? `${normalizedKey}.${props.extension}`\n\t\t\t\t\t: normalizedKey,\n\t\t\t);\n\n\treturn `attachment; filename=\"${fileName}\"`;\n};\n\nexport default buildDownloadContentDisposition;\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceGetDownloadUrl } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport { PRESIGNED_URL_EXPIRY } from \"../constants.js\";\nimport type { PluginOptions } from \"../types/types.js\";\nimport buildDownloadContentDisposition from \"../utils/build-download-content-disposition.js\";\n\nexport default (client: AwsClient, pluginOptions: PluginOptions) => {\n\tconst getDownloadUrl: MediaAdapterServiceGetDownloadUrl = async (\n\t\t_context,\n\t\tprops,\n\t) => {\n\t\ttry {\n\t\t\tconst objectUrl = new URL(\n\t\t\t\t`${pluginOptions.endpoint}/${pluginOptions.bucket}/${props.key}`,\n\t\t\t);\n\t\t\tobjectUrl.searchParams.set(\"X-Amz-Expires\", String(PRESIGNED_URL_EXPIRY));\n\t\t\tobjectUrl.searchParams.set(\n\t\t\t\t\"response-content-disposition\",\n\t\t\t\tbuildDownloadContentDisposition({\n\t\t\t\t\tkey: props.key,\n\t\t\t\t\tfileName: props.fileName,\n\t\t\t\t\textension: props.extension,\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst response = await client.sign(\n\t\t\t\tnew Request(objectUrl.toString(), {\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\taws: { signQuery: true },\n\t\t\t\t},\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: {\n\t\t\t\t\turl: response.url.toString(),\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\te instanceof Error\n\t\t\t\t\t\t\t? copy.literal(e.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n\n\treturn getDownloadUrl;\n};\n","export const METADATA_EXTENSION_HEADER = \"x-amz-meta-extension\";\nexport const METADATA_SIZE_HEADER = \"x-amz-meta-size\";\n\nexport const applyMetadataHeaders = (\n\theaders: Headers,\n\tmeta: {\n\t\tmimeType?: string;\n\t\textension?: string;\n\t\tsize?: number;\n\t},\n) => {\n\tif (meta.mimeType) headers.set(\"Content-Type\", meta.mimeType);\n\tif (meta.extension) headers.set(METADATA_EXTENSION_HEADER, meta.extension);\n\tif (meta.size !== undefined)\n\t\theaders.set(METADATA_SIZE_HEADER, `${meta.size}`);\n};\n\nexport const parseStoredSize = (value: string | null) => {\n\tif (!value) return null;\n\tconst parsed = Number.parseInt(value, 10);\n\treturn Number.isFinite(parsed) && parsed >= 0 ? parsed : null;\n};\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceGetMeta } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../types/types.js\";\nimport {\n\tMETADATA_SIZE_HEADER,\n\tparseStoredSize,\n} from \"../utils/metadata-headers.js\";\n\nexport default (client: AwsClient, pluginOptions: PluginOptions) => {\n\tconst getMetadata: MediaAdapterServiceGetMeta = async (_context, { key }) => {\n\t\ttry {\n\t\t\tconst response = await client.sign(\n\t\t\t\tnew Request(\n\t\t\t\t\t`${pluginOptions.endpoint}/${pluginOptions.bucket}/${key}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"HEAD\",\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = await fetch(response);\n\n\t\t\tif (!result.ok) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.metadata.fetch.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t\tstatusText: result.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst contentLength =\n\t\t\t\tparseStoredSize(result.headers.get(\"content-length\")) ??\n\t\t\t\tparseStoredSize(result.headers.get(METADATA_SIZE_HEADER));\n\n\t\t\tif (contentLength === null) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.metadata.missing\"),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst contentType = result.headers.get(\"content-type\");\n\t\t\tconst etag = result.headers.get(\"etag\");\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: {\n\t\t\t\t\tsize: contentLength,\n\t\t\t\t\tmimeType: contentType || null,\n\t\t\t\t\tetag: etag || null,\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\te instanceof Error\n\t\t\t\t\t\t\t? copy.literal(e.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n\treturn getMetadata;\n};\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceRenameKey } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../types/types.js\";\n\nexport default (client: AwsClient, pluginOptions: PluginOptions) => {\n\tconst rename: MediaAdapterServiceRenameKey = async (_context, props) => {\n\t\ttry {\n\t\t\tconst signObjectRequest = async (\n\t\t\t\tkey: string,\n\t\t\t\tmethod: \"DELETE\" | \"HEAD\" | \"PUT\",\n\t\t\t\theaders?: HeadersInit,\n\t\t\t) =>\n\t\t\t\tclient.sign(\n\t\t\t\t\tnew Request(\n\t\t\t\t\t\t`${pluginOptions.endpoint}/${pluginOptions.bucket}/${key}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmethod,\n\t\t\t\t\t\t\theaders,\n\t\t\t\t\t\t},\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t// copy the object to the new key\n\t\t\tconst copyReq = await signObjectRequest(props.to, \"PUT\", {\n\t\t\t\t\"x-amz-copy-source\": `/${pluginOptions.bucket}/${props.from}`,\n\t\t\t});\n\t\t\tconst copyRes = await fetch(copyReq);\n\t\t\tif (!copyRes.ok) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.copy.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: copyRes.status,\n\t\t\t\t\t\t\t\tstatusText: copyRes.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst headReq = await signObjectRequest(props.to, \"HEAD\");\n\t\t\tconst headRes = await fetch(headReq);\n\t\t\tif (!headRes.ok) {\n\t\t\t\ttry {\n\t\t\t\t\tconst cleanupReq = await signObjectRequest(props.to, \"DELETE\");\n\t\t\t\t\tawait fetch(cleanupReq);\n\t\t\t\t} catch {}\n\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.copy.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: headRes.status,\n\t\t\t\t\t\t\t\tstatusText: headRes.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// delete the old object\n\t\t\tconst deleteReq = await signObjectRequest(props.from, \"DELETE\");\n\t\t\tconst deleteRes = await fetch(deleteReq);\n\t\t\tif (!deleteRes.ok) {\n\t\t\t\t// delete failed - try to clean up the copy we just made\n\t\t\t\ttry {\n\t\t\t\t\tconst cleanupReq = await signObjectRequest(props.to, \"DELETE\");\n\t\t\t\t\tawait fetch(cleanupReq);\n\t\t\t\t} catch {}\n\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.delete.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: deleteRes.status,\n\t\t\t\t\t\t\t\tstatusText: deleteRes.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\te instanceof Error\n\t\t\t\t\t\t\t? copy.literal(e.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n\treturn rename;\n};\n","import type { Readable } from \"node:stream\";\nimport { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceStream } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../types/types.js\";\n\nexport default (client: AwsClient, pluginOptions: PluginOptions) => {\n\tconst stream: MediaAdapterServiceStream = async (\n\t\t_context,\n\t\t{ key, range, ifNoneMatch },\n\t) => {\n\t\ttry {\n\t\t\tconst headers: Record<string, string> = {};\n\n\t\t\tif (range) {\n\t\t\t\tconst start = range.start;\n\t\t\t\tconst end = range.end;\n\t\t\t\theaders.Range =\n\t\t\t\t\tend !== undefined ? `bytes=${start}-${end}` : `bytes=${start}-`;\n\t\t\t}\n\n\t\t\tif (ifNoneMatch) {\n\t\t\t\theaders[\"If-None-Match\"] = ifNoneMatch;\n\t\t\t}\n\n\t\t\tconst response = await client.sign(\n\t\t\t\tnew Request(\n\t\t\t\t\t`${pluginOptions.endpoint}/${pluginOptions.bucket}/${key}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\theaders,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = await fetch(response);\n\n\t\t\tif (result.status === 304) {\n\t\t\t\treturn {\n\t\t\t\t\terror: undefined,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tcontentLength: undefined,\n\t\t\t\t\t\tcontentType: undefined,\n\t\t\t\t\t\tbody: new Uint8Array(),\n\t\t\t\t\t\tetag: result.headers.get(\"etag\"),\n\t\t\t\t\t\tnotModified: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!result.ok) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.stream.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t\tstatusText: result.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (!result.body) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.body.missing\"),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tlet isPartialContent = false;\n\t\t\tlet totalSize: number | undefined;\n\t\t\tlet rangeRes: { start: number; end: number } | undefined;\n\n\t\t\tconst contentRange = result.headers.get(\"content-range\");\n\t\t\tif (contentRange) {\n\t\t\t\tisPartialContent = true;\n\t\t\t\tconst match = contentRange.match(/bytes (\\d+)-(\\d+)\\/(\\d+)/);\n\t\t\t\tif (match?.[1] && match[2] && match[3]) {\n\t\t\t\t\trangeRes = {\n\t\t\t\t\t\tstart: Number.parseInt(match[1], 10),\n\t\t\t\t\t\tend: Number.parseInt(match[2], 10),\n\t\t\t\t\t};\n\t\t\t\t\ttotalSize = Number.parseInt(match[3], 10);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst contentLength = result.headers.get(\"content-length\");\n\t\t\tconst contentType = result.headers.get(\"content-type\");\n\t\t\tconst etag = result.headers.get(\"etag\");\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: {\n\t\t\t\t\tcontentLength: contentLength\n\t\t\t\t\t\t? Number.parseInt(contentLength, 10)\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tcontentType: contentType || undefined,\n\t\t\t\t\tbody: result.body as unknown as Readable,\n\t\t\t\t\tetag: etag || null,\n\t\t\t\t\tisPartialContent,\n\t\t\t\t\ttotalSize:\n\t\t\t\t\t\ttotalSize ||\n\t\t\t\t\t\t(contentLength ? Number.parseInt(contentLength, 10) : undefined),\n\t\t\t\t\trange: rangeRes,\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\te instanceof Error\n\t\t\t\t\t\t\t? copy.literal(e.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n\n\treturn stream;\n};\n","import type { MediaAdapterUploadPart } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport { PRESIGNED_URL_EXPIRY } from \"../../constants.js\";\nimport type { PluginOptions } from \"../../types/types.js\";\nimport { applyMetadataHeaders } from \"../../utils/metadata-headers.js\";\n\n/** Builds the S3 object URL that aws4fetch signs for multipart operations. */\nexport const objectUrl = (\n\tpluginOptions: PluginOptions,\n\tkey: string,\n\tquery = \"\",\n) => `${pluginOptions.endpoint}/${pluginOptions.bucket}/${key}${query}`;\n\n/** Extracts simple S3 XML response values without adding a runtime XML parser. */\nexport const extractXmlValue = (xml: string, tag: string) => {\n\tconst match = xml.match(new RegExp(`<${tag}>(.*?)</${tag}>`));\n\treturn match?.[1];\n};\n\n/** Converts S3 list-parts XML into Lucid's adapter part shape for resume checks. */\nexport const parseParts = (xml: string): MediaAdapterUploadPart[] => {\n\treturn Array.from(xml.matchAll(/<Part>([\\s\\S]*?)<\\/Part>/g)).map((match) => {\n\t\tconst partXml = match[1] ?? \"\";\n\t\treturn {\n\t\t\tpartNumber: Number(extractXmlValue(partXml, \"PartNumber\") ?? 0),\n\t\t\tetag: (extractXmlValue(partXml, \"ETag\") ?? \"\").replace(/\"/g, \"\"),\n\t\t\tsize: Number(extractXmlValue(partXml, \"Size\") ?? 0),\n\t\t};\n\t});\n};\n\n/**\n * Falls back to Lucid's single-upload contract for zero-byte files, where an S3\n * multipart session cannot produce meaningful parts.\n */\nexport const createSingleUploadSession = async (\n\tclient: AwsClient,\n\tpluginOptions: PluginOptions,\n\tkey: string,\n\tmeta: {\n\t\tmimeType: string;\n\t\textension?: string;\n\t\tsize?: number;\n\t},\n) => {\n\tconst headers = new Headers();\n\tapplyMetadataHeaders(headers, meta);\n\n\tconst response = await client.sign(\n\t\tnew Request(\n\t\t\tobjectUrl(pluginOptions, key, `?X-Amz-Expires=${PRESIGNED_URL_EXPIRY}`),\n\t\t\t{ method: \"PUT\" },\n\t\t),\n\t\t{\n\t\t\theaders,\n\t\t\taws: { signQuery: true },\n\t\t},\n\t);\n\n\treturn {\n\t\tmode: \"single\" as const,\n\t\tkey,\n\t\turl: response.url.toString(),\n\t\theaders: Object.fromEntries(response.headers.entries()),\n\t};\n};\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceAbortUploadSession } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../../types/types.js\";\nimport { objectUrl } from \"./helpers.js\";\n\n/**\n * Cancels an unfinished multipart upload so S3 can discard uploaded parts and\n * stop charging for incomplete session storage.\n */\nexport const abortUploadSession = (\n\tclient: AwsClient,\n\tpluginOptions: PluginOptions,\n): MediaAdapterServiceAbortUploadSession => {\n\treturn async (_context, props) => {\n\t\ttry {\n\t\t\tconst signed = await client.sign(\n\t\t\t\tnew Request(\n\t\t\t\t\tobjectUrl(\n\t\t\t\t\t\tpluginOptions,\n\t\t\t\t\t\tprops.key,\n\t\t\t\t\t\t`?uploadId=${encodeURIComponent(props.uploadId)}`,\n\t\t\t\t\t),\n\t\t\t\t\t{ method: \"DELETE\" },\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst response = await fetch(signed);\n\t\t\tif (!response.ok && response.status !== 404) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.delete.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t\t\tstatusText: response.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t? copy.literal(error.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n};\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceCompleteUploadSession } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../../types/types.js\";\nimport { extractXmlValue, objectUrl } from \"./helpers.js\";\n\n/**\n * Finalizes the multipart upload with S3 after Lucid has verified every part is\n * present, making the object available as one media file.\n */\nexport const completeUploadSession = (\n\tclient: AwsClient,\n\tpluginOptions: PluginOptions,\n): MediaAdapterServiceCompleteUploadSession => {\n\treturn async (_context, props) => {\n\t\ttry {\n\t\t\tconst body = `<CompleteMultipartUpload>${props.parts\n\t\t\t\t.sort((a, b) => a.partNumber - b.partNumber)\n\t\t\t\t.map(\n\t\t\t\t\t(part) =>\n\t\t\t\t\t\t`<Part><PartNumber>${part.partNumber}</PartNumber><ETag>\"${part.etag.replace(/\"/g, \"\")}\"</ETag></Part>`,\n\t\t\t\t)\n\t\t\t\t.join(\"\")}</CompleteMultipartUpload>`;\n\t\t\tconst signed = await client.sign(\n\t\t\t\tnew Request(\n\t\t\t\t\tobjectUrl(\n\t\t\t\t\t\tpluginOptions,\n\t\t\t\t\t\tprops.key,\n\t\t\t\t\t\t`?uploadId=${encodeURIComponent(props.uploadId)}`,\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\tbody,\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\"Content-Type\": \"application/xml\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst response = await fetch(signed);\n\t\t\tif (!response.ok) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.upload.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t\t\tstatusText: response.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst etag = extractXmlValue(await response.text(), \"ETag\")?.replace(\n\t\t\t\t/\"/g,\n\t\t\t\t\"\",\n\t\t\t);\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: { etag },\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t? copy.literal(error.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n};\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceCreateUploadSession } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport { DEFAULT_PART_SIZE, PRESIGNED_URL_EXPIRY } from \"../../constants.js\";\nimport type { PluginOptions } from \"../../types/types.js\";\nimport { applyMetadataHeaders } from \"../../utils/metadata-headers.js\";\nimport {\n\tcreateSingleUploadSession,\n\textractXmlValue,\n\tobjectUrl,\n} from \"./helpers.js\";\n\n/**\n * Starts an S3 multipart upload and returns Lucid's resumable session metadata.\n * Zero-byte files stay on a single signed PUT because multipart has no parts.\n */\nexport const createUploadSession = (\n\tclient: AwsClient,\n\tpluginOptions: PluginOptions,\n): MediaAdapterServiceCreateUploadSession => {\n\treturn async (_context, props) => {\n\t\ttry {\n\t\t\tif (props.size === 0) {\n\t\t\t\treturn {\n\t\t\t\t\terror: undefined,\n\t\t\t\t\tdata: await createSingleUploadSession(\n\t\t\t\t\t\tclient,\n\t\t\t\t\t\tpluginOptions,\n\t\t\t\t\t\tprops.key,\n\t\t\t\t\t\tprops,\n\t\t\t\t\t),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst headers = new Headers();\n\t\t\tapplyMetadataHeaders(headers, props);\n\n\t\t\tconst signed = await client.sign(\n\t\t\t\tnew Request(objectUrl(pluginOptions, props.key, \"?uploads\"), {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tconst response = await fetch(signed);\n\t\t\tif (!response.ok) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.upload.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t\t\tstatusText: response.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst uploadId = extractXmlValue(await response.text(), \"UploadId\");\n\t\t\tif (!uploadId) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.upload.sessions.upload.id.missing\"),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: {\n\t\t\t\t\tmode: \"resumable\",\n\t\t\t\t\tkey: props.key,\n\t\t\t\t\tuploadId,\n\t\t\t\t\tpartSize: DEFAULT_PART_SIZE,\n\t\t\t\t\texpiresAt: new Date(\n\t\t\t\t\t\tDate.now() + PRESIGNED_URL_EXPIRY * 1000,\n\t\t\t\t\t).toISOString(),\n\t\t\t\t\tuploadedParts: [],\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t? copy.literal(error.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n};\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceGetUploadPartUrls } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport { PRESIGNED_URL_EXPIRY } from \"../../constants.js\";\nimport type { PluginOptions } from \"../../types/types.js\";\nimport { objectUrl } from \"./helpers.js\";\n\n/**\n * Signs browser-writable URLs for the missing multipart chunks requested by\n * Lucid, keeping AWS credentials on the server.\n */\nexport const getUploadPartUrls = (\n\tclient: AwsClient,\n\tpluginOptions: PluginOptions,\n): MediaAdapterServiceGetUploadPartUrls => {\n\treturn async (_context, props) => {\n\t\ttry {\n\t\t\tconst parts = await Promise.all(\n\t\t\t\tprops.partNumbers.map(async (partNumber) => {\n\t\t\t\t\tconst signed = await client.sign(\n\t\t\t\t\t\tnew Request(\n\t\t\t\t\t\t\tobjectUrl(\n\t\t\t\t\t\t\t\tpluginOptions,\n\t\t\t\t\t\t\t\tprops.key,\n\t\t\t\t\t\t\t\t`?partNumber=${partNumber}&uploadId=${encodeURIComponent(\n\t\t\t\t\t\t\t\t\tprops.uploadId,\n\t\t\t\t\t\t\t\t)}&X-Amz-Expires=${PRESIGNED_URL_EXPIRY}`,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t{ method: \"PUT\" },\n\t\t\t\t\t\t),\n\t\t\t\t\t\t{ aws: { signQuery: true } },\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpartNumber,\n\t\t\t\t\t\turl: signed.url.toString(),\n\t\t\t\t\t\theaders: Object.fromEntries(signed.headers.entries()),\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: { parts },\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t? copy.literal(error.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n};\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceListUploadParts } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../../types/types.js\";\nimport { objectUrl, parseParts } from \"./helpers.js\";\n\n/**\n * Reads S3's multipart state so the admin can resume from the parts the storage\n * provider has already accepted.\n */\nexport const listUploadParts = (\n\tclient: AwsClient,\n\tpluginOptions: PluginOptions,\n): MediaAdapterServiceListUploadParts => {\n\treturn async (_context, props) => {\n\t\ttry {\n\t\t\tconst signed = await client.sign(\n\t\t\t\tnew Request(\n\t\t\t\t\tobjectUrl(\n\t\t\t\t\t\tpluginOptions,\n\t\t\t\t\t\tprops.key,\n\t\t\t\t\t\t`?uploadId=${encodeURIComponent(props.uploadId)}`,\n\t\t\t\t\t),\n\t\t\t\t\t{ method: \"GET\" },\n\t\t\t\t),\n\t\t\t);\n\t\t\tconst response = await fetch(signed);\n\t\t\tif (!response.ok) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.metadata.fetch.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: response.status,\n\t\t\t\t\t\t\t\tstatusText: response.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: {\n\t\t\t\t\tuploadedParts: parseParts(await response.text()),\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\terror instanceof Error\n\t\t\t\t\t\t\t? copy.literal(error.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n};\n","import { copy } from \"@lucidcms/core/plugin\";\nimport type { MediaAdapterServiceUploadSingle } from \"@lucidcms/core/types\";\nimport type { AwsClient } from \"aws4fetch\";\nimport type { PluginOptions } from \"../types/types.js\";\nimport { applyMetadataHeaders } from \"../utils/metadata-headers.js\";\n\nexport default (client: AwsClient, pluginOptions: PluginOptions) => {\n\tconst uploadSingle: MediaAdapterServiceUploadSingle = async (\n\t\t_context,\n\t\tprops,\n\t) => {\n\t\ttry {\n\t\t\tconst headers = new Headers();\n\n\t\t\tapplyMetadataHeaders(headers, props);\n\n\t\t\tconst response = await client.sign(\n\t\t\t\tnew Request(\n\t\t\t\t\t`${pluginOptions.endpoint}/${pluginOptions.bucket}/${props.key}`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: \"PUT\",\n\t\t\t\t\t\tbody: props.body as unknown as BodyInit,\n\t\t\t\t\t\theaders: headers,\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tconst result = await fetch(response);\n\n\t\t\tif (!result.ok) {\n\t\t\t\treturn {\n\t\t\t\t\terror: {\n\t\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\t\tmessage: copy(\"server:plugin.s3.objects.upload.failed\", {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus: result.status,\n\t\t\t\t\t\t\t\tstatusText: result.statusText,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t\tdata: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst etag = result.headers.get(\"etag\")?.replace(/\"/g, \"\");\n\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: {\n\t\t\t\t\tetag,\n\t\t\t\t},\n\t\t\t};\n\t\t} catch (e) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\ttype: \"plugin\",\n\t\t\t\t\tmessage:\n\t\t\t\t\t\te instanceof Error\n\t\t\t\t\t\t\t? copy.literal(e.message)\n\t\t\t\t\t\t\t: copy(\"server:plugin.s3.errors.unknown\"),\n\t\t\t\t},\n\t\t\t\tdata: undefined,\n\t\t\t};\n\t\t}\n\t};\n\n\treturn uploadSingle;\n};\n","import type { MediaAdapter } from \"@lucidcms/core/types\";\nimport getAwsClient from \"./clients/aws-client.js\";\nimport deleteMultiple from \"./services/delete-multiple.js\";\nimport deleteSingle from \"./services/delete-single.js\";\nimport getDownloadUrl from \"./services/get-download-url.js\";\nimport getMetadata from \"./services/get-metadata.js\";\nimport rename from \"./services/rename.js\";\nimport stream from \"./services/stream.js\";\nimport { abortUploadSession } from \"./services/upload-session/abort-upload-session.js\";\nimport { completeUploadSession } from \"./services/upload-session/complete-upload-session.js\";\nimport { createUploadSession } from \"./services/upload-session/create-upload-session.js\";\nimport { getUploadPartUrls } from \"./services/upload-session/get-upload-part-urls.js\";\nimport { listUploadParts } from \"./services/upload-session/list-upload-parts.js\";\nimport uploadSingle from \"./services/upload-single.js\";\nimport type { PluginOptions } from \"./types/types.js\";\n\nconst s3MediaAdapter: MediaAdapter<PluginOptions> = (options) => {\n\tconst client = getAwsClient(options);\n\n\treturn {\n\t\ttype: \"media-adapter\",\n\t\tkey: \"s3\",\n\t\tcreateUploadSession: createUploadSession(client, options),\n\t\tgetUploadPartUrls: getUploadPartUrls(client, options),\n\t\tlistUploadParts: listUploadParts(client, options),\n\t\tcompleteUploadSession: completeUploadSession(client, options),\n\t\tabortUploadSession: abortUploadSession(client, options),\n\t\tgetDownloadUrl: getDownloadUrl(client, options),\n\t\tgetMeta: getMetadata(client, options),\n\t\tstream: stream(client, options),\n\t\tupload: uploadSingle(client, options),\n\t\tdelete: deleteSingle(client, options),\n\t\tdeleteMultiple: deleteMultiple(client, options),\n\t\trename: rename(client, options),\n\t\tgetOptions: () => options,\n\t};\n};\n\nexport default s3MediaAdapter;\n","import type { LucidPlugin } from \"@lucidcms/core/types\";\nimport s3MediaAdapter from \"./adapter.js\";\nimport { LUCID_VERSION, PLUGIN_KEY } from \"./constants.js\";\nimport type { PluginOptions } from \"./types/types.js\";\n\nconst plugin: LucidPlugin<PluginOptions> = (pluginOptions) => {\n\treturn {\n\t\tkey: PLUGIN_KEY,\n\t\tlucid: LUCID_VERSION,\n\t\trecipe: (draft) => {\n\t\t\tdraft.i18n.sources.push(\"@lucidcms/plugin-s3/translations\");\n\t\t\tdraft.media.adapter = s3MediaAdapter(pluginOptions);\n\t\t},\n\t};\n};\n\nexport default plugin;\n","import plugin from \"./plugin.js\";\n\nexport { default as s3Plugin } from \"./plugin.js\";\n\nexport default plugin;\n"],"mappings":"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"}