{"version":3,"file":"uploadResource.mjs","names":[],"sources":["../../../src/requester/requests/uploadResource.ts"],"sourcesContent":["import { guaranteeFetch } from \"../../util/guaranteeFetch\";\nimport { UnexpectedResourceError } from \"@ldo/connected\";\nimport { HttpErrorResult } from \"../results/error/HttpErrorResult\";\nimport type {\n  LeafCreateAndOverwriteResult,\n  LeafCreateIfAbsentResult,\n} from \"./createDataResource\";\nimport { deleteResource } from \"./deleteResource\";\nimport { readResource } from \"./readResource\";\nimport type { DatasetRequestOptions } from \"./requestOptions\";\nimport type { SolidLeaf } from \"../../resources/SolidLeaf\";\nimport { CreateSuccess } from \"../results/success/CreateSuccess\";\nimport {\n  addResourceRdfToContainer,\n  getParentUri,\n  getSlug,\n} from \"../../util/rdfUtils\";\n\n/**\n * @internal\n * Uploads a binary resource at the provided URI\n *\n * @param uri - The URI of the resource\n * @param overwrite - If true, the request will overwrite any previous resource\n * at this URI.\n * @param options - Options to provide a fetch function and a local dataset to\n * update.\n * @returns One of many create results depending on the input\n */\nexport function uploadResource(\n  resource: SolidLeaf,\n  blob: Blob,\n  mimeType: string,\n  overwrite: true,\n  options?: DatasetRequestOptions,\n): Promise<LeafCreateAndOverwriteResult>;\nexport function uploadResource(\n  resource: SolidLeaf,\n  blob: Blob,\n  mimeType: string,\n  overwrite?: false,\n  options?: DatasetRequestOptions,\n): Promise<LeafCreateIfAbsentResult>;\nexport async function uploadResource(\n  resource: SolidLeaf,\n  blob: Blob,\n  mimeType: string,\n  overwrite?: boolean,\n  options?: DatasetRequestOptions,\n): Promise<LeafCreateIfAbsentResult | LeafCreateAndOverwriteResult> {\n  try {\n    const fetch = guaranteeFetch(options?.fetch);\n    let didOverwrite = false;\n    if (overwrite) {\n      const deleteResult = await deleteResource(resource, options);\n      // Return if it wasn't deleted\n      if (deleteResult.isError) return deleteResult;\n      didOverwrite = deleteResult.resourceExisted;\n    } else {\n      // Perform a read to check if it exists\n      const readResult = await readResource(resource, options);\n      // If it does exist stop and return.\n      if (readResult.type !== \"absentReadSuccess\") {\n        return readResult;\n      }\n    }\n    // Create the document\n    const parentUri = getParentUri(resource.uri)!;\n    const response = await fetch(parentUri, {\n      method: \"post\",\n      headers: {\n        \"content-type\": mimeType,\n        slug: getSlug(resource.uri),\n      },\n      body: blob,\n    });\n\n    const httpError = HttpErrorResult.checkResponse(resource, response);\n    if (httpError) return httpError;\n\n    if (options?.dataset) {\n      addResourceRdfToContainer(resource.uri, options.dataset);\n    }\n    return new CreateSuccess(resource, didOverwrite);\n  } catch (err) {\n    const thing = UnexpectedResourceError.fromThrown(resource, err);\n    return thing;\n  }\n}\n"],"mappings":";;;;;;;;AA2CA,eAAsB,eACpB,UACA,MACA,UACA,WACA,SACkE;AAClE,KAAI;EACF,MAAM,QAAQ,eAAe,SAAS,MAAM;EAC5C,IAAI,eAAe;AACnB,MAAI,WAAW;GACb,MAAM,eAAe,MAAM,eAAe,UAAU,QAAQ;AAE5D,OAAI,aAAa,QAAS,QAAO;AACjC,kBAAe,aAAa;SACvB;GAEL,MAAM,aAAa,MAAM,aAAa,UAAU,QAAQ;AAExD,OAAI,WAAW,SAAS,oBACtB,QAAO;;EAKX,MAAM,WAAW,MAAM,MADL,aAAa,SAAS,IACF,EAAE;GACtC,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,MAAM,QAAQ,SAAS,IAAI;IAC5B;GACD,MAAM;GACP,CAAC;EAEF,MAAM,YAAY,gBAAgB,cAAc,UAAU,SAAS;AACnE,MAAI,UAAW,QAAO;AAEtB,MAAI,SAAS,QACX,2BAA0B,SAAS,KAAK,QAAQ,QAAQ;AAE1D,SAAO,IAAI,cAAc,UAAU,aAAa;UACzC,KAAK;AAEZ,SADc,wBAAwB,WAAW,UAAU,IAC/C"}