@drupal-kit/jsonapi
Advanced tools
+9
-0
| # @drupal-kit/jsonapi | ||
| ## 0.12.1 | ||
| ### Patch Changes | ||
| - [#105](https://github.com/wunderwerkio/drupal-kit/pull/105) [`8d57a2e`](https://github.com/wunderwerkio/drupal-kit/commit/8d57a2e75459ff6ebc4ad1817cc93b2f46fed0ab) Thanks [@chfoidl](https://github.com/chfoidl)! - Properly detect JSON:API errors from response content-type | ||
| - Updated dependencies []: | ||
| - @drupal-kit/core@0.12.1 | ||
| ## 0.12.0 | ||
@@ -4,0 +13,0 @@ |
+10
-1
@@ -68,2 +68,11 @@ import { Result } from '@wunderwerk/ts-functional/results'; | ||
| }; | ||
| const isJsonApiResponse = (response) => { | ||
| if (!response?.headers) { | ||
| return false; | ||
| } | ||
| const contentType = Object.keys(response.headers).find( | ||
| (key) => key.toLowerCase() === "content-type" | ||
| ); | ||
| return response.headers[contentType ?? ""] === "application/vnd.api+json"; | ||
| }; | ||
@@ -215,3 +224,3 @@ const DrupalkitJsonApi = (drupalkit, drupalkitOptions) => { | ||
| drupalkit.hook.error("request", (error) => { | ||
| if (isJsonApiRequest(error.request)) { | ||
| if (isJsonApiRequest(error.request) || isJsonApiResponse(error.response)) { | ||
| throw DrupalkitJsonApiError.fromDrupalkitError(error); | ||
@@ -218,0 +227,0 @@ } |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.mjs","sources":["../src/DrupalkitJsonApiError.ts","../src/utils.ts","../src/DrupalkitJsonApi.ts"],"sourcesContent":["import { DrupalkitError } 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 * 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","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 } 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 // Only care about JSON:API requests.\n if (isJsonApiRequest(error.request)) {\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":"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"} | ||
| {"version":3,"file":"index.mjs","sources":["../src/DrupalkitJsonApiError.ts","../src/utils.ts","../src/DrupalkitJsonApi.ts"],"sourcesContent":["import { DrupalkitError } 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 * 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":"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"} |
+5
-5
| { | ||
| "name": "@drupal-kit/jsonapi", | ||
| "version": "0.12.0", | ||
| "version": "0.12.1", | ||
| "type": "module", | ||
| "types": "./dist/index.d.ts", | ||
| "dependencies": { | ||
| "@drupal-kit/core": "0.12.0", | ||
| "@drupal-kit/core": "0.12.1", | ||
| "@wunderwerk/ts-functional": "1.0.0-beta.3", | ||
@@ -14,5 +14,5 @@ "drupal-jsonapi-params": "^2.2.0", | ||
| "devDependencies": { | ||
| "@drupal-kit/config-typescript": "0.12.0", | ||
| "@drupal-kit/eslint-config": "0.12.0", | ||
| "@drupal-kit/types": "0.12.0", | ||
| "@drupal-kit/config-typescript": "0.12.1", | ||
| "@drupal-kit/eslint-config": "0.12.1", | ||
| "@drupal-kit/types": "0.12.1", | ||
| "@rollup/plugin-typescript": "^11.1.1", | ||
@@ -19,0 +19,0 @@ "@swc/core": "^1.6.5", |
56698
3.1%551
1.66%+ Added
- Removed
Updated