{"version":3,"file":"createDataResource.mjs","names":[],"sources":["../../../src/requester/requests/createDataResource.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { guaranteeFetch } from \"../../util/guaranteeFetch\";\nimport type { AbsentReadSuccess, Resource } from \"@ldo/connected\";\nimport { UnexpectedResourceError } from \"@ldo/connected\";\nimport type { HttpErrorResultType } from \"../results/error/HttpErrorResult\";\nimport { HttpErrorResult } from \"../results/error/HttpErrorResult\";\nimport { CreateSuccess } from \"../results/success/CreateSuccess\";\nimport type { DeleteResultError } from \"./deleteResource\";\nimport { deleteResource } from \"./deleteResource\";\nimport type {\n  ReadContainerResult,\n  ReadLeafResult,\n  ReadResultError,\n} from \"./readResource\";\nimport { readResource } from \"./readResource\";\nimport type { DatasetRequestOptions } from \"./requestOptions\";\nimport type { SolidLeaf } from \"../../resources/SolidLeaf\";\nimport type { SolidContainer } from \"../../resources/SolidContainer\";\nimport {\n  addResourceRdfToContainer,\n  getParentUri,\n  getSlug,\n} from \"../../util/rdfUtils\";\n\n/**\n * All possible return values when creating and overwriting a container\n */\nexport type ContainerCreateAndOverwriteResult =\n  | CreateSuccess<SolidContainer>\n  | CreateAndOverwriteResultErrors<SolidContainer>;\n\n/**\n * All possible return values when creating and overwriting a leaf\n */\nexport type LeafCreateAndOverwriteResult =\n  | CreateSuccess<SolidLeaf>\n  | CreateAndOverwriteResultErrors<SolidLeaf>;\n\n/**\n * All possible return values when creating a container if absent\n */\nexport type ContainerCreateIfAbsentResult =\n  | CreateSuccess<SolidContainer>\n  | Exclude<ReadContainerResult, AbsentReadSuccess<any>>\n  | CreateIfAbsentResultErrors<SolidContainer>;\n\n/**\n * All possible return values when creating a leaf if absent\n */\nexport type LeafCreateIfAbsentResult =\n  | CreateSuccess<SolidLeaf>\n  | Exclude<ReadLeafResult, AbsentReadSuccess<any>>\n  | CreateIfAbsentResultErrors<SolidLeaf>;\n\n/**\n * All possible errors returned by creating and overwriting a resource\n */\nexport type CreateAndOverwriteResultErrors<ResourceType extends Resource> =\n  | DeleteResultError<ResourceType>\n  | CreateErrors<ResourceType>;\n\n/**\n * All possible errors returned by creating a resource if absent\n */\nexport type CreateIfAbsentResultErrors<ResourceType extends Resource> =\n  | ReadResultError<ResourceType>\n  | CreateErrors<ResourceType>;\n\n/**\n * All possible errors returned by creating a resource\n */\nexport type CreateErrors<ResourceType extends Resource> =\n  | HttpErrorResultType<ResourceType>\n  | UnexpectedResourceError<ResourceType>;\n\n/**\n * @internal\n * Creates a data resource (RDF resource) at the provided URI. This resource\n * could also be a container.\n *\n * @param resource - 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 createDataResource(\n  resource: SolidLeaf,\n  overwrite: true,\n  options?: DatasetRequestOptions,\n): Promise<ContainerCreateAndOverwriteResult>;\nexport function createDataResource(\n  resouce: SolidLeaf,\n  overwrite: true,\n  options?: DatasetRequestOptions,\n): Promise<LeafCreateAndOverwriteResult>;\nexport function createDataResource(\n  resouce: SolidContainer,\n  overwrite?: false,\n  options?: DatasetRequestOptions,\n): Promise<ContainerCreateIfAbsentResult>;\nexport function createDataResource(\n  resouce: SolidLeaf,\n  overwrite?: false,\n  options?: DatasetRequestOptions,\n): Promise<LeafCreateIfAbsentResult>;\nexport function createDataResource(\n  resouce: SolidContainer,\n  overwrite?: boolean,\n  options?: DatasetRequestOptions,\n): Promise<ContainerCreateIfAbsentResult | ContainerCreateAndOverwriteResult>;\nexport function createDataResource(\n  resouce: SolidLeaf,\n  overwrite?: boolean,\n  options?: DatasetRequestOptions,\n): Promise<LeafCreateIfAbsentResult | LeafCreateAndOverwriteResult>;\nexport function createDataResource(\n  resource: SolidContainer | SolidLeaf,\n  overwrite: true,\n  options?: DatasetRequestOptions,\n): Promise<ContainerCreateAndOverwriteResult | LeafCreateAndOverwriteResult>;\nexport function createDataResource(\n  resource: SolidContainer | SolidLeaf,\n  overwrite?: false,\n  options?: DatasetRequestOptions,\n): Promise<LeafCreateIfAbsentResult | LeafCreateIfAbsentResult>;\nexport function createDataResource(\n  resource: SolidContainer | SolidLeaf,\n  overwrite?: boolean,\n  options?: DatasetRequestOptions,\n): Promise<\n  | ContainerCreateAndOverwriteResult\n  | LeafCreateAndOverwriteResult\n  | ContainerCreateIfAbsentResult\n  | LeafCreateIfAbsentResult\n>;\nexport async function createDataResource(\n  resource: SolidContainer | SolidLeaf,\n  overwrite?: boolean,\n  options?: DatasetRequestOptions,\n): Promise<\n  | ContainerCreateAndOverwriteResult\n  | LeafCreateAndOverwriteResult\n  | ContainerCreateIfAbsentResult\n  | LeafCreateIfAbsentResult\n> {\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)\n        return deleteResult as\n          | DeleteResultError<SolidLeaf>\n          | DeleteResultError<SolidContainer>;\n      didOverwrite = deleteResult.resourceExisted;\n    } else {\n      // Perform a read to check if it exists\n      const readResult = await readResource(resource, options);\n\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 headers: HeadersInit = {\n      \"content-type\": \"text/turtle\",\n      slug: getSlug(resource.uri),\n    };\n    if (resource.type === \"SolidContainer\") {\n      headers.link = '<http://www.w3.org/ns/ldp#BasicContainer>; rel=\"type\"';\n    }\n    const response = await fetch(parentUri, {\n      method: \"post\",\n      headers,\n    });\n\n    const httpError = HttpErrorResult.checkResponse(resource, response);\n    if (httpError)\n      return httpError as\n        | HttpErrorResultType<SolidContainer>\n        | HttpErrorResultType<SolidLeaf>;\n\n    if (options?.dataset) {\n      addResourceRdfToContainer(resource.uri, options.dataset);\n    }\n    return new CreateSuccess(resource, didOverwrite) as\n      | CreateSuccess<SolidLeaf>\n      | CreateSuccess<SolidContainer>;\n  } catch (err) {\n    return UnexpectedResourceError.fromThrown(resource, err) as\n      | UnexpectedResourceError<SolidContainer>\n      | UnexpectedResourceError<SolidLeaf>;\n  }\n}\n"],"mappings":";;;;;;;;AAyIA,eAAsB,mBACpB,UACA,WACA,SAMA;AACA,KAAI;EACF,MAAM,QAAQ,eAAe,SAAS,MAAM;EAC5C,IAAI,eAAe;AACnB,MAAI,WAAW;GACb,MAAM,eAAe,MAAM,eAAe,UAAU,QAAQ;AAE5D,OAAI,aAAa,QACf,QAAO;AAGT,kBAAe,aAAa;SACvB;GAEL,MAAM,aAAa,MAAM,aAAa,UAAU,QAAQ;AAGxD,OAAI,WAAW,SAAS,oBACtB,QAAO;;EAIX,MAAM,YAAY,aAAa,SAAS,IAAI;EAC5C,MAAM,UAAuB;GAC3B,gBAAgB;GAChB,MAAM,QAAQ,SAAS,IAAI;GAC5B;AACD,MAAI,SAAS,SAAS,iBACpB,SAAQ,OAAO;EAEjB,MAAM,WAAW,MAAM,MAAM,WAAW;GACtC,QAAQ;GACR;GACD,CAAC;EAEF,MAAM,YAAY,gBAAgB,cAAc,UAAU,SAAS;AACnE,MAAI,UACF,QAAO;AAIT,MAAI,SAAS,QACX,2BAA0B,SAAS,KAAK,QAAQ,QAAQ;AAE1D,SAAO,IAAI,cAAc,UAAU,aAAa;UAGzC,KAAK;AACZ,SAAO,wBAAwB,WAAW,UAAU,IAAI"}