@drupal-kit/jsonapi
Advanced tools
+14
-0
| # @drupal-kit/jsonapi | ||
| ## 0.13.0 | ||
| ### Minor Changes | ||
| - [#111](https://github.com/wunderwerkio/drupal-kit/pull/111) [`b472287`](https://github.com/wunderwerkio/drupal-kit/commit/b472287c88bbf7f96be46bd29197c117d7e82ff7) Thanks [@chfoidl](https://github.com/chfoidl)! - Support file uploads via JSON:API | ||
| ### Patch Changes | ||
| - [#113](https://github.com/wunderwerkio/drupal-kit/pull/113) [`941bfd9`](https://github.com/wunderwerkio/drupal-kit/commit/941bfd9fce6e3423b67794069ce023c33829e011) Thanks [@chfoidl](https://github.com/chfoidl)! - - Update rollup from ^4.18.0 to ^4.59.0 to fix high severity CVE across all packages | ||
| - Update esbuild from ^0.21.5 to ^0.27.3 to address medium severity vulnerability across all packages | ||
| - Update qs from ~6.12.1 to ~6.14.2 to fix low/medium severity vulnerability in packages/core | ||
| - Updated dependencies [[`941bfd9`](https://github.com/wunderwerkio/drupal-kit/commit/941bfd9fce6e3423b67794069ce023c33829e011)]: | ||
| - @drupal-kit/core@0.13.0 | ||
| ## 0.12.2 | ||
@@ -4,0 +18,0 @@ |
+32
-3
| import { Result } from '@wunderwerk/ts-functional/results'; | ||
| import { DrupalJsonApiParamsInterface } from 'drupal-jsonapi-params'; | ||
| import { Attributes, Links, Meta, Response, LinkObject, Link, Relationship, ResourceObject } from 'ts-json-api'; | ||
| import { Attributes, Links, Meta, Link, Relationship, Response, LinkObject, ResourceObject } from 'ts-json-api'; | ||
| import { DrupalkitError, DrupalkitErrorOptions, Drupalkit, DrupalkitOptions, Query } from '@drupal-kit/core'; | ||
@@ -257,2 +257,20 @@ import * as _drupal_kit_types from '@drupal-kit/types'; | ||
| type JsonApiUpdatePayload<TResource extends JsonApiResource> = UpdateParameters<TResource>["payload"]; | ||
| /** | ||
| * Extract keys from a resource's relationships that are file relationships. | ||
| * | ||
| * A file relationship is one where the type is "file--file" (single or array). | ||
| */ | ||
| type FileRelationshipKeys<T extends keyof JsonApiResources> = { | ||
| [K in keyof JsonApiResources[T]["resource"]["relationships"]]: JsonApiResources[T]["resource"]["relationships"][K] extends { | ||
| type: "file--file"; | ||
| } | { | ||
| type: "file--file"; | ||
| }[] ? K : never; | ||
| }[keyof JsonApiResources[T]["resource"]["relationships"]]; | ||
| /** | ||
| * Derive file resource object type from a file relationship. | ||
| * | ||
| * Maps JsonApiResource or JsonApiResource[] to DeriveResourceObject variants. | ||
| */ | ||
| type DerivedFileResource<T> = T extends (infer U extends JsonApiResource)[] ? DeriveResourceObject<U>[] : T extends JsonApiResource ? DeriveResourceObject<T> : never; | ||
@@ -279,6 +297,17 @@ declare module "@drupal-kit/core" { | ||
| getMenuItems: (menu: string, requestOptions?: OverrideableRequestOptions) => Promise<Result<Response<DeriveResourceObject<MenuLinkContentResource>[]>, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>>>; | ||
| resource<Type extends keyof JsonApiResources, Resource extends JsonApiResources[Type]["resource"], Operation extends JsonApiResources[Type]["operations"], Params extends ToParameters<Operation, Resource>, Return extends Record<Operation, "readSingle" extends Operation ? Result<Response<DeriveResourceObject<Resource>>, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : "readMany" extends Operation ? Result<Response<DeriveResourceObject<Resource>[]>, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : "create" extends Operation ? Result<Response<DeriveResourceObject<Resource>>, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : "update" extends Operation ? Result<Response<DeriveResourceObject<Resource>>, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : "delete" extends Operation ? Result<true, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : Result<never, Error>>>(type: Type, operation: Operation, parameters: Params, requestOptions?: OverrideableRequestOptions): Promise<Return[Operation]>; | ||
| uploadFile: <Type extends keyof JsonApiResources, TField extends FileRelationshipKeys<Type>, TFileResource extends JsonApiResources[Type]["resource"]["relationships"][TField]>(type: Type, uuid: string, fieldName: TField, file: File | Blob, filenameWithExt: string, requestOptions?: OverrideableRequestOptions) => Promise<Result<Response<DerivedFileResource<TFileResource>>, DrupalkitJsonApiError>>; | ||
| resource<Type_1 extends never, Resource extends JsonApiResources[Type_1]["resource"], Operation extends JsonApiResources[Type_1]["operations"], Params extends ToParameters<Operation, Resource>, Return extends Record<Operation, "readSingle" extends Operation ? Result<Response<DeriveResourceObject<Resource>>, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : "readMany" extends Operation ? Result<Response<DeriveResourceObject<Resource>[]>, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : "create" extends Operation ? Result<Response<DeriveResourceObject<Resource>>, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : "update" extends Operation ? Result<Response<DeriveResourceObject<Resource>>, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : "delete" extends Operation ? Result<true, DrupalkitJsonApiError<_drupal_kit_types.JsonApiError>> : Result<never, Error>>>(type: Type_1, operation: Operation, parameters: Params, requestOptions?: OverrideableRequestOptions): Promise<Return[Operation]>; | ||
| }; | ||
| }; | ||
| export { type CreateParameters, type DeleteParameters, type DeriveResourceObject, type DeriveSimpleJsonApiResource, DrupalkitJsonApi, DrupalkitJsonApiError, type InternalJsonApiResources, type JsonApiCreatePayload, type JsonApiIndex, type JsonApiResource, type JsonApiResources, type JsonApiUpdatePayload, type MenuLinkContentResource, type ReadManyParameters, type ReadSingleParameters, type RelationshipLinkage, type RemoveIndex, type ResourceResponse, type ResourceResult, type ResourceType, type SimpleFromResourceObject, type ToParameters, type UpdateParameters, type ValidOperation }; | ||
| /** | ||
| * Sanitize filename for safe use in Content-Disposition header. | ||
| * | ||
| * Removes illegal/unsafe chars, control codes, Windows reserved names. | ||
| * Transliterates umlauts and removes other diacritics. | ||
| * | ||
| * @param filename - The filename to sanitize. | ||
| */ | ||
| declare const sanitizeFilename: (filename: string) => string; | ||
| export { type CreateParameters, type DeleteParameters, type DeriveResourceObject, type DeriveSimpleJsonApiResource, type DerivedFileResource, DrupalkitJsonApi, DrupalkitJsonApiError, type FileRelationshipKeys, type InternalJsonApiResources, type JsonApiCreatePayload, type JsonApiIndex, type JsonApiResource, type JsonApiResources, type JsonApiUpdatePayload, type MenuLinkContentResource, type ReadManyParameters, type ReadSingleParameters, type RelationshipLinkage, type RemoveIndex, type ResourceResponse, type ResourceResult, type ResourceType, type SimpleFromResourceObject, type ToParameters, type UpdateParameters, type ValidOperation, sanitizeFilename }; |
+51
-1
@@ -71,2 +71,12 @@ import { Result } from '@wunderwerk/ts-functional/results'; | ||
| const sanitizeFilename = (filename) => { | ||
| const dotIdx = filename.lastIndexOf("."); | ||
| const ext = dotIdx > 0 ? filename.slice(dotIdx) : ""; | ||
| const name = dotIdx > 0 ? filename.slice(0, dotIdx) : filename; | ||
| const clean = (s) => s.replace(/ä/g, "ae").replace(/ö/g, "oe").replace(/ü/g, "ue").replace(/Ä/g, "Ae").replace(/Ö/g, "Oe").replace(/Ü/g, "Ue").replace(/ß/g, "ss").normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[/?<>\\:*|"]/g, "").replace(/[\x00-\x1f\x80-\x9f]/g, "").replace(/[. ]+$/, ""); | ||
| const sanitizedName = clean(name); | ||
| const sanitizedExt = clean(ext); | ||
| const baseName = /^\.+$/.test(sanitizedName) || /^(con|prn|aux|nul|com\d|lpt\d)$/i.test(sanitizedName) ? "file" : sanitizedName || "file"; | ||
| return (baseName + sanitizedExt).slice(0, 255); | ||
| }; | ||
| const isJsonApiRequest = (req) => { | ||
@@ -241,2 +251,41 @@ const contentType = getHeader("content-type", req); | ||
| }; | ||
| const uploadFile = async (type, uuid, fieldName, file, filenameWithExt, requestOptions) => { | ||
| const sanitizedFilename = sanitizeFilename(filenameWithExt); | ||
| const path = type.replace("--", "/") + "/" + uuid + "/" + String(fieldName); | ||
| const url = buildJsonApiUrl(path, { | ||
| localeOverride: requestOptions?.locale | ||
| }); | ||
| if (!filenameWithExt.includes(".") || filenameWithExt.endsWith(".")) { | ||
| return Result.Err( | ||
| new DrupalkitJsonApiError( | ||
| "Filename must include a file extension", | ||
| 400, | ||
| { | ||
| request: { | ||
| url, | ||
| baseUrl: drupalkitOptions.baseUrl, | ||
| method: "POST", | ||
| headers: {} | ||
| } | ||
| } | ||
| ) | ||
| ); | ||
| } | ||
| const result = await drupalkit.request( | ||
| url, | ||
| { | ||
| method: "POST", | ||
| body: file, | ||
| headers: { | ||
| "Content-Type": "application/octet-stream", | ||
| "Content-Disposition": `file; filename="${sanitizedFilename}"` | ||
| } | ||
| }, | ||
| requestOptions | ||
| ); | ||
| if (result.err) { | ||
| return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val)); | ||
| } | ||
| return Result.Ok(result.val.data); | ||
| }; | ||
| drupalkit.hook.error("request", (error) => { | ||
@@ -254,2 +303,3 @@ if (isJsonApiRequest(error.request) || isJsonApiResponse(error.response)) { | ||
| getMenuItems, | ||
| uploadFile, | ||
| async resource(type, operation, parameters, requestOptions) { | ||
@@ -297,3 +347,3 @@ switch (operation) { | ||
| export { DrupalkitJsonApi, DrupalkitJsonApiError }; | ||
| export { DrupalkitJsonApi, DrupalkitJsonApiError, sanitizeFilename }; | ||
| //# sourceMappingURL=index.mjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.mjs","sources":["../src/DrupalkitJsonApiError.ts","../src/utils.ts","../src/DrupalkitJsonApi.ts"],"sourcesContent":["import {\n DrupalkitError,\n DrupalkitErrorOptions,\n UNKNOWN_ERROR_PREFIX,\n} from \"@drupal-kit/core\";\nimport { JsonApiError } from \"@drupal-kit/types\";\n\n/**\n * Enhanced DrupalkitError with JSON:API specific data.\n */\nexport class DrupalkitJsonApiError<\n T extends JsonApiError = JsonApiError,\n> extends DrupalkitError<T> {\n /**\n * Construct a new DrupalkitJsonApiError.\n *\n * @param message - Error message.\n * @param statusCode - HTTP status code.\n * @param options - Error options (request/response).\n */\n constructor(\n message: string,\n statusCode: number,\n options: DrupalkitErrorOptions,\n ) {\n super(message, statusCode, options);\n // If the message uses the generic unknown error prefix, try to replace it\n // with a more specific detail from the first JSON:API error if available.\n if (message.startsWith(UNKNOWN_ERROR_PREFIX) && this.errors?.length) {\n const first = this.errors[0] as JsonApiError;\n if (first?.detail) {\n this.message = first.detail;\n } else if (first?.title) {\n this.message = first.title;\n }\n }\n }\n /**\n * Checks if this error instance contains validation errors.\n */\n public hasValidationErrors() {\n if (!this.isJsonApiError()) {\n return false;\n }\n\n return this.errors.some((error) => error.status == \"422\");\n }\n\n /**\n * Get an array of all fields with invalid values.\n */\n public getInvalidFields() {\n return this.getErrorsByStatus(422)\n .map((error) => {\n const pointer = error?.source?.pointer;\n\n if (!pointer) {\n return null;\n }\n\n return pointer.split(\"/\").pop();\n })\n .filter((field) => field !== null);\n }\n\n /**\n * Get all errors with the given status code.\n *\n * @param statusCode - The status code to filter by.\n */\n public getErrorsByStatus(statusCode: number) {\n if (!this.isJsonApiError()) {\n return [];\n }\n\n return this.errors.filter(\n (error) => error.status?.toString() == statusCode.toString(),\n );\n }\n\n /**\n * Create new error instance from a DrupalkitError.\n *\n * @param error - The DrupalkitError to create an instance from.\n */\n public static fromDrupalkitError(error: DrupalkitError) {\n return new DrupalkitJsonApiError(error.message, error.statusCode, {\n request: error.request,\n response: error.response,\n });\n }\n}\n","import { RequestOptions } from \"@drupal-kit/types\";\n\n/**\n * Checks if request is a JSON:API request.\n *\n * @param req - The request options.\n */\nexport const isJsonApiRequest = (req: RequestOptions) => {\n const contentType = getHeader(\"content-type\", req);\n\n return contentType === \"application/vnd.api+json\";\n};\n\n/**\n * Get header from request.\n *\n * Gets the header as case insensitive.\n *\n * @param name - The header name.\n * @param req - Either request options or a request object.\n */\nexport const getHeader = (name: string, req: RequestOptions) => {\n if (!req.headers) {\n return null;\n }\n\n for (const header of Object.keys(req.headers)) {\n if (header.toLowerCase() === name.toLowerCase()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (req.headers as unknown as any)[header];\n }\n }\n\n return null;\n};\n\n/**\n * Checks if response has JSON:API content-type.\n *\n * @param response - The response object.\n * @param response.headers - The response headers.\n */\nexport const isJsonApiResponse = (response?: {\n headers?: Record<string, string | number | undefined>;\n}) => {\n if (!response?.headers) {\n return false;\n }\n\n const contentType = Object.keys(response.headers).find(\n (key) => key.toLowerCase() === \"content-type\",\n );\n\n return response.headers[contentType ?? \"\"] === \"application/vnd.api+json\";\n};\n","import { Result } from \"@wunderwerk/ts-functional/results\";\nimport { Jsona } from \"jsona\";\nimport { Response } from \"ts-json-api\";\nimport { Drupalkit, DrupalkitOptions, Query } from \"@drupal-kit/core\";\nimport { OverrideableRequestOptions, RequestHeaders } from \"@drupal-kit/types\";\n\nimport { DrupalkitJsonApiError } from \"./DrupalkitJsonApiError.js\";\nimport {\n CreateParameters,\n DeleteParameters,\n DeriveResourceObject,\n JsonApiIndex,\n JsonApiResource,\n JsonApiResources,\n MenuLinkContentResource,\n ReadManyParameters,\n ReadSingleParameters,\n ResourceType,\n SimpleFromResourceObject,\n ToParameters,\n UpdateParameters,\n ValidOperation,\n} from \"./resources.js\";\nimport { isJsonApiRequest, isJsonApiResponse } from \"./utils.js\";\n\ndeclare module \"@drupal-kit/core\" {\n interface DrupalkitOptions {\n jsonApiPrefix?: string;\n }\n}\n\n/**\n * Drupalkit plugin that provides integration with the Drupal JSON:API.\n *\n * @param drupalkit - The Drupalkit instance.\n * @param drupalkitOptions - The options for the Drupalkit instance.\n */\nexport const DrupalkitJsonApi = (\n drupalkit: Drupalkit,\n drupalkitOptions: DrupalkitOptions,\n) => {\n const defaultHeaders: RequestHeaders = {\n Accept: \"application/vnd.api+json\",\n \"Content-Type\": \"application/vnd.api+json\",\n };\n\n const serializer = new Jsona();\n\n /**\n * Retrieves the JSON:API index.\n *\n * @param requestOptions - Optional request options.\n *\n * @returns A result object containing the JSON:API index or an error.\n */\n const getIndex = async (\n requestOptions?: OverrideableRequestOptions,\n ): Promise<Result<JsonApiIndex, DrupalkitJsonApiError>> => {\n const url = buildJsonApiUrl(\"\");\n\n const result = await drupalkit.request<JsonApiIndex>(\n url,\n {\n method: \"GET\",\n headers: {\n ...defaultHeaders,\n },\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Get menu items for given menu.\n *\n * @param menu - System name of the menu.\n * @param requestOptions - Optional request options.\n */\n const getMenuItems = async (\n menu: string,\n requestOptions?: OverrideableRequestOptions,\n ) => {\n return await getResourceCollection<MenuLinkContentResource>(\n \"drupalkit_internal--menu_items\",\n {},\n requestOptions,\n {\n path: `menu_items/${menu}`,\n },\n );\n };\n\n /**\n * Retrieves a single JSON:API resource object.\n *\n * @param type - The type of resource object to retrieve.\n * @param parameters - The parameters to use for the query.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const getResource = async <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> = DeriveResourceObject<R>,\n >(\n type: ResourceType,\n parameters: ReadSingleParameters,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<Response<TResourceObject>, DrupalkitJsonApiError>> => {\n const path =\n options?.path ?? type.replace(\"--\", \"/\") + \"/\" + parameters.uuid;\n\n const url = buildJsonApiUrl(path, {\n localeOverride: requestOptions?.locale,\n query: parameters.queryParams?.getQueryObject(),\n });\n\n const result = await drupalkit.request<Response<TResourceObject>>(\n url,\n {\n method: \"GET\",\n headers: defaultHeaders,\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Simplified the given resource response (single or many).\n *\n * Related entities which are included in the response are embedded\n * into the resulting resource object.\n *\n * @param data - The resource response to simplify.\n */\n const simplifyResourceResponse = <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> | DeriveResourceObject<R>[],\n TSimpleResource extends SimpleFromResourceObject<TResourceObject>,\n >(\n data: Response<TResourceObject>,\n ): TSimpleResource => {\n return serializer.deserialize(JSON.stringify(data)) as TSimpleResource;\n };\n\n /**\n * Retrieves multiple JSON:API resource objects.\n *\n * @param type - The type of resource object to retrieve.\n * @param parameters - The parameters to use for the query.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const getResourceCollection = async <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> = DeriveResourceObject<R>,\n >(\n type: ResourceType,\n parameters: ReadManyParameters,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<Response<TResourceObject[]>, DrupalkitJsonApiError>> => {\n const path = options?.path ?? type.replace(\"--\", \"/\");\n\n const url = buildJsonApiUrl(path, {\n localeOverride: requestOptions?.locale,\n query: parameters.queryParams?.getQueryObject(),\n });\n\n const result = await drupalkit.request<Response<TResourceObject[]>>(\n url,\n {\n method: \"GET\",\n headers: defaultHeaders,\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Create a JSON:API resource.\n *\n * @param type - The type of resource object to create.\n * @param parameters - The parameters to use for the request.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const createResource = async <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> = DeriveResourceObject<R>,\n >(\n type: ResourceType,\n parameters: CreateParameters<R>,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<Response<TResourceObject>, DrupalkitJsonApiError>> => {\n const path = options?.path ?? type.replace(\"--\", \"/\");\n\n const url = buildJsonApiUrl(path, {\n localeOverride: requestOptions?.locale,\n });\n\n // Set the type if not already set.\n if (!parameters.payload.type) {\n parameters.payload.type = type;\n }\n\n const result = await drupalkit.request<Response<TResourceObject>>(\n url,\n {\n method: \"POST\",\n headers: defaultHeaders,\n body: JSON.stringify({\n data: parameters.payload,\n }),\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Update a JSON:API resource.\n *\n * @param type - The type of resource object to update.\n * @param parameters - The parameters to use for the request.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const updateResource = async <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> = DeriveResourceObject<R>,\n >(\n type: ResourceType,\n parameters: UpdateParameters<R>,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<Response<TResourceObject>, DrupalkitJsonApiError>> => {\n const path =\n options?.path ?? type.replace(\"--\", \"/\") + \"/\" + parameters.uuid;\n\n const url = buildJsonApiUrl(path, {\n localeOverride: requestOptions?.locale,\n });\n\n parameters.payload.id = parameters.uuid;\n\n // Set the type if not already set.\n if (!parameters.payload.type) {\n parameters.payload.type = type;\n }\n\n const result = await drupalkit.request<Response<TResourceObject>>(\n url,\n {\n method: \"PATCH\",\n headers: defaultHeaders,\n body: JSON.stringify({ data: parameters.payload }),\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Delete a JSON:API resource.\n *\n * @param type - The type of resource object to delete.\n * @param parameters - The parameters to use for the request.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const deleteResource = async (\n type: ResourceType,\n parameters: DeleteParameters,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<true, DrupalkitJsonApiError>> => {\n const path =\n options?.path ?? type.replace(\"--\", \"/\") + \"/\" + parameters.uuid;\n\n const url = buildJsonApiUrl(path);\n\n const result = await drupalkit.request(\n url,\n {\n method: \"DELETE\",\n headers: defaultHeaders,\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(true as const);\n };\n\n /**\n * Constructs a JSON API URL for use with Drupal.\n *\n * @param path - The path to the JSON API endpoint.\n * @param options - An optional object containing additional options.\n * @param options.localeOverride - An optional override for the locale.\n * @param options.query - An optional object containing query parameters.\n * @returns The constructed URL as a string.\n */\n const buildJsonApiUrl = (\n path: string,\n options?: {\n localeOverride?: string;\n query?: Query;\n },\n ) => {\n const prefix = drupalkitOptions.jsonApiPrefix ?? \"jsonapi\";\n\n return drupalkit.buildUrl(path, {\n ...options,\n customPrefix: prefix,\n });\n };\n\n /**\n * Create DrupalkitJsonApiError for JSON:API failed requests.\n */\n drupalkit.hook.error(\"request\", (error) => {\n // Throw DrupalkitJsonApiError if either the request or response uses JSON:API content-type.\n if (isJsonApiRequest(error.request) || isJsonApiResponse(error.response)) {\n throw DrupalkitJsonApiError.fromDrupalkitError(error);\n }\n\n throw error;\n });\n\n /**\n * Extend the Drupalkit instance.\n */\n return {\n jsonApi: {\n buildJsonApiUrl,\n getIndex,\n simplifyResourceResponse,\n getMenuItems,\n async resource<\n Type extends keyof JsonApiResources,\n Resource extends JsonApiResources[Type][\"resource\"],\n Operation extends JsonApiResources[Type][\"operations\"],\n Params extends ToParameters<Operation, Resource>,\n Return extends Record<\n Operation,\n \"readSingle\" extends Operation\n ? Awaited<ReturnType<typeof getResource<Resource>>>\n : \"readMany\" extends Operation\n ? Awaited<ReturnType<typeof getResourceCollection<Resource>>>\n : \"create\" extends Operation\n ? Awaited<ReturnType<typeof createResource<Resource>>>\n : \"update\" extends Operation\n ? Awaited<ReturnType<typeof updateResource<Resource>>>\n : \"delete\" extends Operation\n ? Awaited<ReturnType<typeof deleteResource>>\n : Result<never, Error>\n >,\n >(\n type: Type,\n operation: Operation,\n parameters: Params,\n requestOptions?: OverrideableRequestOptions,\n ): Promise<Return[Operation]> {\n switch (operation as ValidOperation) {\n case \"readSingle\":\n return (await getResource(\n type,\n parameters as ReadSingleParameters,\n requestOptions,\n )) as Return[Operation];\n\n case \"readMany\":\n return (await getResourceCollection(\n type,\n parameters as ReadManyParameters,\n requestOptions,\n )) as Return[Operation];\n\n case \"create\":\n return (await createResource(\n type,\n parameters as CreateParameters<Resource>,\n requestOptions,\n )) as Return[Operation];\n\n case \"update\":\n return (await updateResource(\n type,\n parameters as UpdateParameters<Resource>,\n requestOptions,\n )) as Return[Operation];\n\n case \"delete\":\n return (await deleteResource(\n type,\n parameters as DeleteParameters,\n requestOptions,\n )) as Return[Operation];\n\n default:\n return Result.Err(\n new Error(`Unknown operation \"${operation}\"`),\n ) as Return[Operation];\n }\n },\n },\n };\n};\n"],"names":[],"mappings":";;;;AAUO,MAAM,8BAEH,cAAkB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ1B,WAAA,CACE,OACA,EAAA,UAAA,EACA,OACA,EAAA;AACA,IAAM,KAAA,CAAA,OAAA,EAAS,YAAY,OAAO,CAAA,CAAA;AAGlC,IAAA,IAAI,QAAQ,UAAW,CAAA,oBAAoB,CAAK,IAAA,IAAA,CAAK,QAAQ,MAAQ,EAAA;AACnE,MAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,MAAA,CAAO,CAAC,CAAA,CAAA;AAC3B,MAAA,IAAI,OAAO,MAAQ,EAAA;AACjB,QAAA,IAAA,CAAK,UAAU,KAAM,CAAA,MAAA,CAAA;AAAA,OACvB,MAAA,IAAW,OAAO,KAAO,EAAA;AACvB,QAAA,IAAA,CAAK,UAAU,KAAM,CAAA,KAAA,CAAA;AAAA,OACvB;AAAA,KACF;AAAA,GACF;AAAA;AAAA;AAAA;AAAA,EAIO,mBAAsB,GAAA;AAC3B,IAAI,IAAA,CAAC,IAAK,CAAA,cAAA,EAAkB,EAAA;AAC1B,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAA,OAAO,KAAK,MAAO,CAAA,IAAA,CAAK,CAAC,KAAU,KAAA,KAAA,CAAM,UAAU,KAAK,CAAA,CAAA;AAAA,GAC1D;AAAA;AAAA;AAAA;AAAA,EAKO,gBAAmB,GAAA;AACxB,IAAA,OAAO,KAAK,iBAAkB,CAAA,GAAG,CAC9B,CAAA,GAAA,CAAI,CAAC,KAAU,KAAA;AACd,MAAM,MAAA,OAAA,GAAU,OAAO,MAAQ,EAAA,OAAA,CAAA;AAE/B,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAA,OAAO,OAAQ,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,GAAI,EAAA,CAAA;AAAA,KAC/B,CACA,CAAA,MAAA,CAAO,CAAC,KAAA,KAAU,UAAU,IAAI,CAAA,CAAA;AAAA,GACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,kBAAkB,UAAoB,EAAA;AAC3C,IAAI,IAAA,CAAC,IAAK,CAAA,cAAA,EAAkB,EAAA;AAC1B,MAAA,OAAO,EAAC,CAAA;AAAA,KACV;AAEA,IAAA,OAAO,KAAK,MAAO,CAAA,MAAA;AAAA,MACjB,CAAC,KAAU,KAAA,KAAA,CAAM,QAAQ,QAAS,EAAA,IAAK,WAAW,QAAS,EAAA;AAAA,KAC7D,CAAA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,mBAAmB,KAAuB,EAAA;AACtD,IAAA,OAAO,IAAI,qBAAA,CAAsB,KAAM,CAAA,OAAA,EAAS,MAAM,UAAY,EAAA;AAAA,MAChE,SAAS,KAAM,CAAA,OAAA;AAAA,MACf,UAAU,KAAM,CAAA,QAAA;AAAA,KACjB,CAAA,CAAA;AAAA,GACH;AACF;;ACpFa,MAAA,gBAAA,GAAmB,CAAC,GAAwB,KAAA;AACvD,EAAM,MAAA,WAAA,GAAc,SAAU,CAAA,cAAA,EAAgB,GAAG,CAAA,CAAA;AAEjD,EAAA,OAAO,WAAgB,KAAA,0BAAA,CAAA;AACzB,CAAA,CAAA;AAUa,MAAA,SAAA,GAAY,CAAC,IAAA,EAAc,GAAwB,KAAA;AAC9D,EAAI,IAAA,CAAC,IAAI,OAAS,EAAA;AAChB,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,KAAA,MAAW,MAAU,IAAA,MAAA,CAAO,IAAK,CAAA,GAAA,CAAI,OAAO,CAAG,EAAA;AAC7C,IAAA,IAAI,MAAO,CAAA,WAAA,EAAkB,KAAA,IAAA,CAAK,aAAe,EAAA;AAE/C,MAAQ,OAAA,GAAA,CAAI,QAA2B,MAAM,CAAA,CAAA;AAAA,KAC/C;AAAA,GACF;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA,CAAA;AAQa,MAAA,iBAAA,GAAoB,CAAC,QAE5B,KAAA;AACJ,EAAI,IAAA,CAAC,UAAU,OAAS,EAAA;AACtB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,WAAc,GAAA,MAAA,CAAO,IAAK,CAAA,QAAA,CAAS,OAAO,CAAE,CAAA,IAAA;AAAA,IAChD,CAAC,GAAA,KAAQ,GAAI,CAAA,WAAA,EAAkB,KAAA,cAAA;AAAA,GACjC,CAAA;AAEA,EAAA,OAAO,QAAS,CAAA,OAAA,CAAQ,WAAe,IAAA,EAAE,CAAM,KAAA,0BAAA,CAAA;AACjD,CAAA;;ACjBa,MAAA,gBAAA,GAAmB,CAC9B,SAAA,EACA,gBACG,KAAA;AACH,EAAA,MAAM,cAAiC,GAAA;AAAA,IACrC,MAAQ,EAAA,0BAAA;AAAA,IACR,cAAgB,EAAA,0BAAA;AAAA,GAClB,CAAA;AAEA,EAAM,MAAA,UAAA,GAAa,IAAI,KAAM,EAAA,CAAA;AAS7B,EAAM,MAAA,QAAA,GAAW,OACf,cACyD,KAAA;AACzD,IAAM,MAAA,GAAA,GAAM,gBAAgB,EAAE,CAAA,CAAA;AAE9B,IAAM,MAAA,MAAA,GAAS,MAAM,SAAU,CAAA,OAAA;AAAA,MAC7B,GAAA;AAAA,MACA;AAAA,QACE,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA;AAAA,UACP,GAAG,cAAA;AAAA,SACL;AAAA,OACF;AAAA,MACA,cAAA;AAAA,KACF,CAAA;AAEA,IAAA,IAAI,OAAO,GAAK,EAAA;AACd,MAAA,OAAO,OAAO,GAAI,CAAA,qBAAA,CAAsB,kBAAmB,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,KACxE;AAEA,IAAA,OAAO,MAAO,CAAA,EAAA,CAAG,MAAO,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,GAClC,CAAA;AAQA,EAAM,MAAA,YAAA,GAAe,OACnB,IAAA,EACA,cACG,KAAA;AACH,IAAA,OAAO,MAAM,qBAAA;AAAA,MACX,gCAAA;AAAA,MACA,EAAC;AAAA,MACD,cAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,cAAc,IAAI,CAAA,CAAA;AAAA,OAC1B;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AAYA,EAAA,MAAM,WAAc,GAAA,OAIlB,IACA,EAAA,UAAA,EACA,gBACA,OAGsE,KAAA;AACtE,IAAM,MAAA,IAAA,GACa,IAAA,CAAK,QAAQ,IAAM,EAAA,GAAG,CAAI,GAAA,GAAA,GAAM,UAAW,CAAA,IAAA,CAAA;AAE9D,IAAM,MAAA,GAAA,GAAM,gBAAgB,IAAM,EAAA;AAAA,MAChC,gBAAgB,cAAgB,EAAA,MAAA;AAAA,MAChC,KAAA,EAAO,UAAW,CAAA,WAAA,EAAa,cAAe,EAAA;AAAA,KAC/C,CAAA,CAAA;AAED,IAAM,MAAA,MAAA,GAAS,MAAM,SAAU,CAAA,OAAA;AAAA,MAC7B,GAAA;AAAA,MACA;AAAA,QACE,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA,cAAA;AAAA,OACX;AAAA,MACA,cAAA;AAAA,KACF,CAAA;AAEA,IAAA,IAAI,OAAO,GAAK,EAAA;AACd,MAAA,OAAO,OAAO,GAAI,CAAA,qBAAA,CAAsB,kBAAmB,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,KACxE;AAEA,IAAA,OAAO,MAAO,CAAA,EAAA,CAAG,MAAO,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,GAClC,CAAA;AAUA,EAAM,MAAA,wBAAA,GAA2B,CAK/B,IACoB,KAAA;AACpB,IAAA,OAAO,UAAW,CAAA,WAAA,CAAY,IAAK,CAAA,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA;AAAA,GACpD,CAAA;AAYA,EAAA,MAAM,qBAAwB,GAAA,OAI5B,IACA,EAAA,UAAA,EACA,gBACA,OAGwE,KAAA;AACxE,IAAA,MAAM,OAAO,OAAS,EAAA,IAAA,IAAQ,IAAK,CAAA,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAA;AAEpD,IAAM,MAAA,GAAA,GAAM,gBAAgB,IAAM,EAAA;AAAA,MAChC,gBAAgB,cAAgB,EAAA,MAAA;AAAA,MAChC,KAAA,EAAO,UAAW,CAAA,WAAA,EAAa,cAAe,EAAA;AAAA,KAC/C,CAAA,CAAA;AAED,IAAM,MAAA,MAAA,GAAS,MAAM,SAAU,CAAA,OAAA;AAAA,MAC7B,GAAA;AAAA,MACA;AAAA,QACE,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA,cAAA;AAAA,OACX;AAAA,MACA,cAAA;AAAA,KACF,CAAA;AAEA,IAAA,IAAI,OAAO,GAAK,EAAA;AACd,MAAA,OAAO,OAAO,GAAI,CAAA,qBAAA,CAAsB,kBAAmB,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,KACxE;AAEA,IAAA,OAAO,MAAO,CAAA,EAAA,CAAG,MAAO,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,GAClC,CAAA;AAYA,EAAA,MAAM,cAAiB,GAAA,OAIrB,IACA,EAAA,UAAA,EACA,gBACA,OAGsE,KAAA;AACtE,IAAA,MAAM,OAAwB,IAAK,CAAA,OAAA,CAAQ,MAAM,GAAG,CAAA,CAAA;AAEpD,IAAM,MAAA,GAAA,GAAM,gBAAgB,IAAM,EAAA;AAAA,MAChC,gBAAgB,cAAgB,EAAA,MAAA;AAAA,KACjC,CAAA,CAAA;AAGD,IAAI,IAAA,CAAC,UAAW,CAAA,OAAA,CAAQ,IAAM,EAAA;AAC5B,MAAA,UAAA,CAAW,QAAQ,IAAO,GAAA,IAAA,CAAA;AAAA,KAC5B;AAEA,IAAM,MAAA,MAAA,GAAS,MAAM,SAAU,CAAA,OAAA;AAAA,MAC7B,GAAA;AAAA,MACA;AAAA,QACE,MAAQ,EAAA,MAAA;AAAA,QACR,OAAS,EAAA,cAAA;AAAA,QACT,IAAA,EAAM,KAAK,SAAU,CAAA;AAAA,UACnB,MAAM,UAAW,CAAA,OAAA;AAAA,SAClB,CAAA;AAAA,OACH;AAAA,MACA,cAAA;AAAA,KACF,CAAA;AAEA,IAAA,IAAI,OAAO,GAAK,EAAA;AACd,MAAA,OAAO,OAAO,GAAI,CAAA,qBAAA,CAAsB,kBAAmB,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,KACxE;AAEA,IAAA,OAAO,MAAO,CAAA,EAAA,CAAG,MAAO,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,GAClC,CAAA;AAYA,EAAA,MAAM,cAAiB,GAAA,OAIrB,IACA,EAAA,UAAA,EACA,gBACA,OAGsE,KAAA;AACtE,IAAM,MAAA,IAAA,GACa,IAAA,CAAK,QAAQ,IAAM,EAAA,GAAG,CAAI,GAAA,GAAA,GAAM,UAAW,CAAA,IAAA,CAAA;AAE9D,IAAM,MAAA,GAAA,GAAM,gBAAgB,IAAM,EAAA;AAAA,MAChC,gBAAgB,cAAgB,EAAA,MAAA;AAAA,KACjC,CAAA,CAAA;AAED,IAAW,UAAA,CAAA,OAAA,CAAQ,KAAK,UAAW,CAAA,IAAA,CAAA;AAGnC,IAAI,IAAA,CAAC,UAAW,CAAA,OAAA,CAAQ,IAAM,EAAA;AAC5B,MAAA,UAAA,CAAW,QAAQ,IAAO,GAAA,IAAA,CAAA;AAAA,KAC5B;AAEA,IAAM,MAAA,MAAA,GAAS,MAAM,SAAU,CAAA,OAAA;AAAA,MAC7B,GAAA;AAAA,MACA;AAAA,QACE,MAAQ,EAAA,OAAA;AAAA,QACR,OAAS,EAAA,cAAA;AAAA,QACT,MAAM,IAAK,CAAA,SAAA,CAAU,EAAE,IAAM,EAAA,UAAA,CAAW,SAAS,CAAA;AAAA,OACnD;AAAA,MACA,cAAA;AAAA,KACF,CAAA;AAEA,IAAA,IAAI,OAAO,GAAK,EAAA;AACd,MAAA,OAAO,OAAO,GAAI,CAAA,qBAAA,CAAsB,kBAAmB,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,KACxE;AAEA,IAAA,OAAO,MAAO,CAAA,EAAA,CAAG,MAAO,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AAAA,GAClC,CAAA;AAYA,EAAA,MAAM,cAAiB,GAAA,OACrB,IACA,EAAA,UAAA,EACA,gBACA,OAGiD,KAAA;AACjD,IAAM,MAAA,IAAA,GACa,IAAA,CAAK,QAAQ,IAAM,EAAA,GAAG,CAAI,GAAA,GAAA,GAAM,UAAW,CAAA,IAAA,CAAA;AAE9D,IAAM,MAAA,GAAA,GAAM,gBAAgB,IAAI,CAAA,CAAA;AAEhC,IAAM,MAAA,MAAA,GAAS,MAAM,SAAU,CAAA,OAAA;AAAA,MAC7B,GAAA;AAAA,MACA;AAAA,QACE,MAAQ,EAAA,QAAA;AAAA,QACR,OAAS,EAAA,cAAA;AAAA,OACX;AAAA,MACA,cAAA;AAAA,KACF,CAAA;AAEA,IAAA,IAAI,OAAO,GAAK,EAAA;AACd,MAAA,OAAO,OAAO,GAAI,CAAA,qBAAA,CAAsB,kBAAmB,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,KACxE;AAEA,IAAO,OAAA,MAAA,CAAO,GAAG,IAAa,CAAA,CAAA;AAAA,GAChC,CAAA;AAWA,EAAM,MAAA,eAAA,GAAkB,CACtB,IAAA,EACA,OAIG,KAAA;AACH,IAAM,MAAA,MAAA,GAAS,iBAAiB,aAAiB,IAAA,SAAA,CAAA;AAEjD,IAAO,OAAA,SAAA,CAAU,SAAS,IAAM,EAAA;AAAA,MAC9B,GAAG,OAAA;AAAA,MACH,YAAc,EAAA,MAAA;AAAA,KACf,CAAA,CAAA;AAAA,GACH,CAAA;AAKA,EAAA,SAAA,CAAU,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA,CAAC,KAAU,KAAA;AAEzC,IAAA,IAAI,iBAAiB,KAAM,CAAA,OAAO,KAAK,iBAAkB,CAAA,KAAA,CAAM,QAAQ,CAAG,EAAA;AACxE,MAAM,MAAA,qBAAA,CAAsB,mBAAmB,KAAK,CAAA,CAAA;AAAA,KACtD;AAEA,IAAM,MAAA,KAAA,CAAA;AAAA,GACP,CAAA,CAAA;AAKD,EAAO,OAAA;AAAA,IACL,OAAS,EAAA;AAAA,MACP,eAAA;AAAA,MACA,QAAA;AAAA,MACA,wBAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAM,QAAA,CAoBJ,IACA,EAAA,SAAA,EACA,YACA,cAC4B,EAAA;AAC5B,QAAA,QAAQ,SAA6B;AAAA,UACnC,KAAK,YAAA;AACH,YAAA,OAAQ,MAAM,WAAA;AAAA,cACZ,IAAA;AAAA,cACA,UAAA;AAAA,cACA,cAAA;AAAA,aACF,CAAA;AAAA,UAEF,KAAK,UAAA;AACH,YAAA,OAAQ,MAAM,qBAAA;AAAA,cACZ,IAAA;AAAA,cACA,UAAA;AAAA,cACA,cAAA;AAAA,aACF,CAAA;AAAA,UAEF,KAAK,QAAA;AACH,YAAA,OAAQ,MAAM,cAAA;AAAA,cACZ,IAAA;AAAA,cACA,UAAA;AAAA,cACA,cAAA;AAAA,aACF,CAAA;AAAA,UAEF,KAAK,QAAA;AACH,YAAA,OAAQ,MAAM,cAAA;AAAA,cACZ,IAAA;AAAA,cACA,UAAA;AAAA,cACA,cAAA;AAAA,aACF,CAAA;AAAA,UAEF,KAAK,QAAA;AACH,YAAA,OAAQ,MAAM,cAAA;AAAA,cACZ,IAAA;AAAA,cACA,UAAA;AAAA,cACA,cAAA;AAAA,aACF,CAAA;AAAA,UAEF;AACE,YAAA,OAAO,MAAO,CAAA,GAAA;AAAA,cACZ,IAAI,KAAA,CAAM,CAAsB,mBAAA,EAAA,SAAS,CAAG,CAAA,CAAA,CAAA;AAAA,aAC9C,CAAA;AAAA,SACJ;AAAA,OACF;AAAA,KACF;AAAA,GACF,CAAA;AACF;;;;"} | ||
| {"version":3,"file":"index.mjs","sources":["../src/DrupalkitJsonApiError.ts","../src/utils.ts","../src/DrupalkitJsonApi.ts"],"sourcesContent":["import {\n DrupalkitError,\n DrupalkitErrorOptions,\n UNKNOWN_ERROR_PREFIX,\n} from \"@drupal-kit/core\";\nimport { JsonApiError } from \"@drupal-kit/types\";\n\n/**\n * Enhanced DrupalkitError with JSON:API specific data.\n */\nexport class DrupalkitJsonApiError<\n T extends JsonApiError = JsonApiError,\n> extends DrupalkitError<T> {\n /**\n * Construct a new DrupalkitJsonApiError.\n *\n * @param message - Error message.\n * @param statusCode - HTTP status code.\n * @param options - Error options (request/response).\n */\n constructor(\n message: string,\n statusCode: number,\n options: DrupalkitErrorOptions,\n ) {\n super(message, statusCode, options);\n // If the message uses the generic unknown error prefix, try to replace it\n // with a more specific detail from the first JSON:API error if available.\n if (message.startsWith(UNKNOWN_ERROR_PREFIX) && this.errors?.length) {\n const first = this.errors[0] as JsonApiError;\n if (first?.detail) {\n this.message = first.detail;\n } else if (first?.title) {\n this.message = first.title;\n }\n }\n }\n /**\n * Checks if this error instance contains validation errors.\n */\n public hasValidationErrors() {\n if (!this.isJsonApiError()) {\n return false;\n }\n\n return this.errors.some((error) => error.status == \"422\");\n }\n\n /**\n * Get an array of all fields with invalid values.\n */\n public getInvalidFields() {\n return this.getErrorsByStatus(422)\n .map((error) => {\n const pointer = error?.source?.pointer;\n\n if (!pointer) {\n return null;\n }\n\n return pointer.split(\"/\").pop();\n })\n .filter((field) => field !== null);\n }\n\n /**\n * Get all errors with the given status code.\n *\n * @param statusCode - The status code to filter by.\n */\n public getErrorsByStatus(statusCode: number) {\n if (!this.isJsonApiError()) {\n return [];\n }\n\n return this.errors.filter(\n (error) => error.status?.toString() == statusCode.toString(),\n );\n }\n\n /**\n * Create new error instance from a DrupalkitError.\n *\n * @param error - The DrupalkitError to create an instance from.\n */\n public static fromDrupalkitError(error: DrupalkitError) {\n return new DrupalkitJsonApiError(error.message, error.statusCode, {\n request: error.request,\n response: error.response,\n });\n }\n}\n","import { RequestOptions } from \"@drupal-kit/types\";\n\n/**\n * Sanitize filename for safe use in Content-Disposition header.\n *\n * Removes illegal/unsafe chars, control codes, Windows reserved names.\n * Transliterates umlauts and removes other diacritics.\n *\n * @param filename - The filename to sanitize.\n */\nexport const sanitizeFilename = (filename: string): string => {\n const dotIdx = filename.lastIndexOf(\".\");\n const ext = dotIdx > 0 ? filename.slice(dotIdx) : \"\";\n const name = dotIdx > 0 ? filename.slice(0, dotIdx) : filename;\n\n const clean = (s: string) =>\n s\n // German umlauts → ae/oe/ue/ss\n .replace(/ä/g, \"ae\")\n .replace(/ö/g, \"oe\")\n .replace(/ü/g, \"ue\")\n .replace(/Ä/g, \"Ae\")\n .replace(/Ö/g, \"Oe\")\n .replace(/Ü/g, \"Ue\")\n .replace(/ß/g, \"ss\")\n // Other diacritics → base char\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n // Illegal chars & control codes\n .replace(/[/?<>\\\\:*|\"]/g, \"\")\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Needed for file upload.\n .replace(/[\\x00-\\x1f\\x80-\\x9f]/g, \"\")\n .replace(/[. ]+$/, \"\");\n\n const sanitizedName = clean(name);\n const sanitizedExt = clean(ext);\n\n // Handle reserved names (., .., Windows reserved)\n const baseName =\n /^\\.+$/.test(sanitizedName) ||\n /^(con|prn|aux|nul|com\\d|lpt\\d)$/i.test(sanitizedName)\n ? \"file\"\n : sanitizedName || \"file\";\n\n return (baseName + sanitizedExt).slice(0, 255);\n};\n\n/**\n * Checks if request is a JSON:API request.\n *\n * @param req - The request options.\n */\nexport const isJsonApiRequest = (req: RequestOptions) => {\n const contentType = getHeader(\"content-type\", req);\n\n return contentType === \"application/vnd.api+json\";\n};\n\n/**\n * Get header from request.\n *\n * Gets the header as case insensitive.\n *\n * @param name - The header name.\n * @param req - Either request options or a request object.\n */\nexport const getHeader = (name: string, req: RequestOptions) => {\n if (!req.headers) {\n return null;\n }\n\n for (const header of Object.keys(req.headers)) {\n if (header.toLowerCase() === name.toLowerCase()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (req.headers as unknown as any)[header];\n }\n }\n\n return null;\n};\n\n/**\n * Checks if response has JSON:API content-type.\n *\n * @param response - The response object.\n * @param response.headers - The response headers.\n */\nexport const isJsonApiResponse = (response?: {\n headers?: Record<string, string | number | undefined>;\n}) => {\n if (!response?.headers) {\n return false;\n }\n\n const contentType = Object.keys(response.headers).find(\n (key) => key.toLowerCase() === \"content-type\",\n );\n\n return response.headers[contentType ?? \"\"] === \"application/vnd.api+json\";\n};\n","import { Result } from \"@wunderwerk/ts-functional/results\";\nimport { Jsona } from \"jsona\";\nimport { Response } from \"ts-json-api\";\nimport { Drupalkit, DrupalkitOptions, Query } from \"@drupal-kit/core\";\nimport { OverrideableRequestOptions, RequestHeaders } from \"@drupal-kit/types\";\n\nimport { DrupalkitJsonApiError } from \"./DrupalkitJsonApiError.js\";\nimport {\n CreateParameters,\n DeleteParameters,\n DerivedFileResource,\n DeriveResourceObject,\n FileRelationshipKeys,\n JsonApiIndex,\n JsonApiResource,\n JsonApiResources,\n MenuLinkContentResource,\n ReadManyParameters,\n ReadSingleParameters,\n ResourceType,\n SimpleFromResourceObject,\n ToParameters,\n UpdateParameters,\n ValidOperation,\n} from \"./resources.js\";\nimport {\n isJsonApiRequest,\n isJsonApiResponse,\n sanitizeFilename,\n} from \"./utils.js\";\n\ndeclare module \"@drupal-kit/core\" {\n interface DrupalkitOptions {\n jsonApiPrefix?: string;\n }\n}\n\n/**\n * Drupalkit plugin that provides integration with the Drupal JSON:API.\n *\n * @param drupalkit - The Drupalkit instance.\n * @param drupalkitOptions - The options for the Drupalkit instance.\n */\nexport const DrupalkitJsonApi = (\n drupalkit: Drupalkit,\n drupalkitOptions: DrupalkitOptions,\n) => {\n const defaultHeaders: RequestHeaders = {\n Accept: \"application/vnd.api+json\",\n \"Content-Type\": \"application/vnd.api+json\",\n };\n\n const serializer = new Jsona();\n\n /**\n * Retrieves the JSON:API index.\n *\n * @param requestOptions - Optional request options.\n *\n * @returns A result object containing the JSON:API index or an error.\n */\n const getIndex = async (\n requestOptions?: OverrideableRequestOptions,\n ): Promise<Result<JsonApiIndex, DrupalkitJsonApiError>> => {\n const url = buildJsonApiUrl(\"\");\n\n const result = await drupalkit.request<JsonApiIndex>(\n url,\n {\n method: \"GET\",\n headers: {\n ...defaultHeaders,\n },\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Get menu items for given menu.\n *\n * @param menu - System name of the menu.\n * @param requestOptions - Optional request options.\n */\n const getMenuItems = async (\n menu: string,\n requestOptions?: OverrideableRequestOptions,\n ) => {\n return await getResourceCollection<MenuLinkContentResource>(\n \"drupalkit_internal--menu_items\",\n {},\n requestOptions,\n {\n path: `menu_items/${menu}`,\n },\n );\n };\n\n /**\n * Retrieves a single JSON:API resource object.\n *\n * @param type - The type of resource object to retrieve.\n * @param parameters - The parameters to use for the query.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const getResource = async <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> = DeriveResourceObject<R>,\n >(\n type: ResourceType,\n parameters: ReadSingleParameters,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<Response<TResourceObject>, DrupalkitJsonApiError>> => {\n const path =\n options?.path ?? type.replace(\"--\", \"/\") + \"/\" + parameters.uuid;\n\n const url = buildJsonApiUrl(path, {\n localeOverride: requestOptions?.locale,\n query: parameters.queryParams?.getQueryObject(),\n });\n\n const result = await drupalkit.request<Response<TResourceObject>>(\n url,\n {\n method: \"GET\",\n headers: defaultHeaders,\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Simplified the given resource response (single or many).\n *\n * Related entities which are included in the response are embedded\n * into the resulting resource object.\n *\n * @param data - The resource response to simplify.\n */\n const simplifyResourceResponse = <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> | DeriveResourceObject<R>[],\n TSimpleResource extends SimpleFromResourceObject<TResourceObject>,\n >(\n data: Response<TResourceObject>,\n ): TSimpleResource => {\n return serializer.deserialize(JSON.stringify(data)) as TSimpleResource;\n };\n\n /**\n * Retrieves multiple JSON:API resource objects.\n *\n * @param type - The type of resource object to retrieve.\n * @param parameters - The parameters to use for the query.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const getResourceCollection = async <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> = DeriveResourceObject<R>,\n >(\n type: ResourceType,\n parameters: ReadManyParameters,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<Response<TResourceObject[]>, DrupalkitJsonApiError>> => {\n const path = options?.path ?? type.replace(\"--\", \"/\");\n\n const url = buildJsonApiUrl(path, {\n localeOverride: requestOptions?.locale,\n query: parameters.queryParams?.getQueryObject(),\n });\n\n const result = await drupalkit.request<Response<TResourceObject[]>>(\n url,\n {\n method: \"GET\",\n headers: defaultHeaders,\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Create a JSON:API resource.\n *\n * @param type - The type of resource object to create.\n * @param parameters - The parameters to use for the request.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const createResource = async <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> = DeriveResourceObject<R>,\n >(\n type: ResourceType,\n parameters: CreateParameters<R>,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<Response<TResourceObject>, DrupalkitJsonApiError>> => {\n const path = options?.path ?? type.replace(\"--\", \"/\");\n\n const url = buildJsonApiUrl(path, {\n localeOverride: requestOptions?.locale,\n });\n\n // Set the type if not already set.\n if (!parameters.payload.type) {\n parameters.payload.type = type;\n }\n\n const result = await drupalkit.request<Response<TResourceObject>>(\n url,\n {\n method: \"POST\",\n headers: defaultHeaders,\n body: JSON.stringify({\n data: parameters.payload,\n }),\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Update a JSON:API resource.\n *\n * @param type - The type of resource object to update.\n * @param parameters - The parameters to use for the request.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const updateResource = async <\n R extends JsonApiResource,\n TResourceObject extends DeriveResourceObject<R> = DeriveResourceObject<R>,\n >(\n type: ResourceType,\n parameters: UpdateParameters<R>,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<Response<TResourceObject>, DrupalkitJsonApiError>> => {\n const path =\n options?.path ?? type.replace(\"--\", \"/\") + \"/\" + parameters.uuid;\n\n const url = buildJsonApiUrl(path, {\n localeOverride: requestOptions?.locale,\n });\n\n parameters.payload.id = parameters.uuid;\n\n // Set the type if not already set.\n if (!parameters.payload.type) {\n parameters.payload.type = type;\n }\n\n const result = await drupalkit.request<Response<TResourceObject>>(\n url,\n {\n method: \"PATCH\",\n headers: defaultHeaders,\n body: JSON.stringify({ data: parameters.payload }),\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Delete a JSON:API resource.\n *\n * @param type - The type of resource object to delete.\n * @param parameters - The parameters to use for the request.\n * @param requestOptions - Optional request options.\n * @param options - Optional settings to override locale and default locale.\n * @param options.path - An optional override for the request path.\n * @returns A result object containing the resource object or an error.\n */\n const deleteResource = async (\n type: ResourceType,\n parameters: DeleteParameters,\n requestOptions?: OverrideableRequestOptions,\n options?: {\n path?: string;\n },\n ): Promise<Result<true, DrupalkitJsonApiError>> => {\n const path =\n options?.path ?? type.replace(\"--\", \"/\") + \"/\" + parameters.uuid;\n\n const url = buildJsonApiUrl(path);\n\n const result = await drupalkit.request(\n url,\n {\n method: \"DELETE\",\n headers: defaultHeaders,\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(true as const);\n };\n\n /**\n * Constructs a JSON API URL for use with Drupal.\n *\n * @param path - The path to the JSON API endpoint.\n * @param options - An optional object containing additional options.\n * @param options.localeOverride - An optional override for the locale.\n * @param options.query - An optional object containing query parameters.\n * @returns The constructed URL as a string.\n */\n const buildJsonApiUrl = (\n path: string,\n options?: {\n localeOverride?: string;\n query?: Query;\n },\n ) => {\n const prefix = drupalkitOptions.jsonApiPrefix ?? \"jsonapi\";\n\n return drupalkit.buildUrl(path, {\n ...options,\n customPrefix: prefix,\n });\n };\n\n /**\n * Upload a file to an entity's file relationship field.\n *\n * @param type - Entity type (e.g. \"node--article\").\n * @param uuid - Entity uuid.\n * @param fieldName - File relationship field name.\n * @param file - File or Blob to upload.\n * @param filenameWithExt - Filename with extension.\n * @param requestOptions - Optional request options.\n */\n const uploadFile = async <\n Type extends keyof JsonApiResources,\n TField extends FileRelationshipKeys<Type>,\n TFileResource extends\n JsonApiResources[Type][\"resource\"][\"relationships\"][TField],\n >(\n type: Type,\n uuid: string,\n fieldName: TField,\n file: File | Blob,\n filenameWithExt: string,\n requestOptions?: OverrideableRequestOptions,\n ): Promise<\n Result<Response<DerivedFileResource<TFileResource>>, DrupalkitJsonApiError>\n > => {\n const sanitizedFilename = sanitizeFilename(filenameWithExt);\n const path =\n (type as string).replace(\"--\", \"/\") +\n \"/\" +\n uuid +\n \"/\" +\n String(fieldName);\n const url = buildJsonApiUrl(path, {\n localeOverride: requestOptions?.locale,\n });\n\n if (!filenameWithExt.includes(\".\") || filenameWithExt.endsWith(\".\")) {\n return Result.Err(\n new DrupalkitJsonApiError(\n \"Filename must include a file extension\",\n 400,\n {\n request: {\n url,\n baseUrl: drupalkitOptions.baseUrl,\n method: \"POST\",\n headers: {},\n },\n },\n ),\n );\n }\n\n const result = await drupalkit.request<\n Response<DerivedFileResource<TFileResource>>\n >(\n url,\n {\n method: \"POST\",\n body: file,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n \"Content-Disposition\": `file; filename=\"${sanitizedFilename}\"`,\n },\n },\n requestOptions,\n );\n\n if (result.err) {\n return Result.Err(DrupalkitJsonApiError.fromDrupalkitError(result.val));\n }\n\n return Result.Ok(result.val.data);\n };\n\n /**\n * Create DrupalkitJsonApiError for JSON:API failed requests.\n */\n drupalkit.hook.error(\"request\", (error) => {\n // Throw DrupalkitJsonApiError if either the request or response uses JSON:API content-type.\n if (isJsonApiRequest(error.request) || isJsonApiResponse(error.response)) {\n throw DrupalkitJsonApiError.fromDrupalkitError(error);\n }\n\n throw error;\n });\n\n /**\n * Extend the Drupalkit instance.\n */\n return {\n jsonApi: {\n buildJsonApiUrl,\n getIndex,\n simplifyResourceResponse,\n getMenuItems,\n uploadFile,\n async resource<\n Type extends keyof JsonApiResources,\n Resource extends JsonApiResources[Type][\"resource\"],\n Operation extends JsonApiResources[Type][\"operations\"],\n Params extends ToParameters<Operation, Resource>,\n Return extends Record<\n Operation,\n \"readSingle\" extends Operation\n ? Awaited<ReturnType<typeof getResource<Resource>>>\n : \"readMany\" extends Operation\n ? Awaited<ReturnType<typeof getResourceCollection<Resource>>>\n : \"create\" extends Operation\n ? Awaited<ReturnType<typeof createResource<Resource>>>\n : \"update\" extends Operation\n ? Awaited<ReturnType<typeof updateResource<Resource>>>\n : \"delete\" extends Operation\n ? Awaited<ReturnType<typeof deleteResource>>\n : Result<never, Error>\n >,\n >(\n type: Type,\n operation: Operation,\n parameters: Params,\n requestOptions?: OverrideableRequestOptions,\n ): Promise<Return[Operation]> {\n switch (operation as ValidOperation) {\n case \"readSingle\":\n return (await getResource(\n type,\n parameters as ReadSingleParameters,\n requestOptions,\n )) as Return[Operation];\n\n case \"readMany\":\n return (await getResourceCollection(\n type,\n parameters as ReadManyParameters,\n requestOptions,\n )) as Return[Operation];\n\n case \"create\":\n return (await createResource(\n type,\n parameters as CreateParameters<Resource>,\n requestOptions,\n )) as Return[Operation];\n\n case \"update\":\n return (await updateResource(\n type,\n parameters as UpdateParameters<Resource>,\n requestOptions,\n )) as Return[Operation];\n\n case \"delete\":\n return (await deleteResource(\n type,\n parameters as DeleteParameters,\n requestOptions,\n )) as Return[Operation];\n\n default:\n return Result.Err(\n new Error(`Unknown operation \"${operation}\"`),\n ) as Return[Operation];\n }\n },\n },\n };\n};\n"],"names":[],"mappings":"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"} |
+7
-7
| { | ||
| "name": "@drupal-kit/jsonapi", | ||
| "version": "0.12.2", | ||
| "version": "0.13.0", | ||
| "type": "module", | ||
| "types": "./dist/index.d.ts", | ||
| "dependencies": { | ||
| "@drupal-kit/core": "0.12.2", | ||
| "@drupal-kit/core": "0.13.0", | ||
| "@wunderwerk/ts-functional": "1.0.0-beta.3", | ||
@@ -14,11 +14,11 @@ "drupal-jsonapi-params": "^2.2.0", | ||
| "devDependencies": { | ||
| "@drupal-kit/config-typescript": "0.12.2", | ||
| "@drupal-kit/eslint-config": "0.12.2", | ||
| "@drupal-kit/types": "0.12.2", | ||
| "@drupal-kit/config-typescript": "0.13.0", | ||
| "@drupal-kit/eslint-config": "0.13.0", | ||
| "@drupal-kit/types": "0.13.0", | ||
| "@rollup/plugin-typescript": "^11.1.1", | ||
| "@swc/core": "^1.6.5", | ||
| "ava": "^6.1.3", | ||
| "esbuild": "^0.21.5", | ||
| "esbuild": "^0.27.3", | ||
| "msw": "^2.3.1", | ||
| "rollup": "^4.18.0", | ||
| "rollup": "^4.59.0", | ||
| "rollup-plugin-dts": "^6.1.1", | ||
@@ -25,0 +25,0 @@ "rollup-plugin-esbuild": "^6.1.1", |
69336
16.79%657
13.86%+ Added
+ Added
- Removed
- Removed
Updated