@drupal-kit/core
Advanced tools
+6
-0
| # @drupal-kit/core | ||
| ## 0.12.2 | ||
| ### Patch Changes | ||
| - [#108](https://github.com/wunderwerkio/drupal-kit/pull/108) [`f1bfc31`](https://github.com/wunderwerkio/drupal-kit/commit/f1bfc319626ee1b3ad74932353edea51d1863e6f) Thanks [@chfoidl](https://github.com/chfoidl)! - Improve error message for transformed DrupalkitJsonApiErrors | ||
| ## 0.12.1 | ||
@@ -4,0 +10,0 @@ |
+2
-1
@@ -52,2 +52,3 @@ import { Result } from '@wunderwerk/ts-functional/results'; | ||
| declare const UNKNOWN_ERROR_PREFIX = "Unknown error:"; | ||
| type DrupalkitErrorOptions = RequestErrorOptions; | ||
@@ -220,2 +221,2 @@ type GenericJsonApiError = { | ||
| export { type Constructor, Drupalkit, DrupalkitError, type DrupalkitErrorOptions, type DrupalkitOptions, type DrupalkitPlugin, type Hooks, type Query, type RequestErrorOptions, type ReturnTypeOf, type UnionToIntersection }; | ||
| export { type Constructor, Drupalkit, DrupalkitError, type DrupalkitErrorOptions, type DrupalkitOptions, type DrupalkitPlugin, type Hooks, type Query, type RequestErrorOptions, type ReturnTypeOf, UNKNOWN_ERROR_PREFIX, type UnionToIntersection }; |
+4
-3
@@ -6,2 +6,3 @@ import { Result } from '@wunderwerk/ts-functional/results'; | ||
| const UNKNOWN_ERROR_PREFIX = "Unknown error:"; | ||
| class DrupalkitError extends Error { | ||
@@ -170,3 +171,3 @@ /** | ||
| } | ||
| return `Unknown error: ${JSON.stringify(data)}`; | ||
| return `${UNKNOWN_ERROR_PREFIX} ${JSON.stringify(data)}`; | ||
| } | ||
@@ -186,3 +187,3 @@ | ||
| const VERSION = "0.12.1"; | ||
| const VERSION = "0.12.2"; | ||
@@ -389,3 +390,3 @@ class Drupalkit { | ||
| export { Drupalkit, DrupalkitError }; | ||
| export { Drupalkit, DrupalkitError, UNKNOWN_ERROR_PREFIX }; | ||
| //# sourceMappingURL=index.mjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.mjs","sources":["../src/DrupalkitError.ts","../src/fetch-wrapper.ts","../src/utils.ts","../src/version.ts","../src/Drupalkit.ts"],"sourcesContent":["import * as DrupalkitTypes from \"@drupal-kit/types\";\nimport { JsonApiError } from \"@drupal-kit/types\";\n\nimport { RequestErrorOptions } from \"./types.js\";\n\n/* eslint-disable @typescript-eslint/ban-ts-comment */\n\nexport type DrupalkitErrorOptions = RequestErrorOptions;\n\ntype GenericJsonApiError = {\n code: \"drupalkit_error\";\n detail: string;\n status: string;\n};\n\n/**\n * Custom error class to help with error handling.\n */\nexport class DrupalkitError<T = unknown> extends Error {\n /**\n * Error name.\n */\n readonly name: \"HttpError\";\n\n /**\n * HTTP status code.\n */\n readonly statusCode: number;\n\n /**\n * Request options that lead to the error.\n */\n readonly request: DrupalkitTypes.RequestRequestOptions;\n\n /**\n * Response object if a response was received.\n */\n readonly response?: DrupalkitTypes.DrupalkitResponse<unknown>;\n\n /**\n * Array of JSON:API errors if the response contains them.\n */\n readonly errors: T[] | undefined;\n\n /**\n * The first JSON:API error if the response contains multiple errors.\n */\n readonly firstError: T | undefined;\n\n /**\n * Construct a new DrupalkitError.\n *\n * @param message - Error message.\n * @param statusCode - HTTP status code.\n * @param options - Request / Response that lead to the error.\n */\n constructor(\n message: string,\n statusCode: number,\n options: DrupalkitErrorOptions,\n ) {\n super(message);\n\n // Maintains proper stack trace (only available on V8)\n // @ts-ignore\n if (Error.captureStackTrace) {\n // @ts-ignore\n Error.captureStackTrace(this, this.constructor);\n }\n\n this.name = \"HttpError\";\n this.statusCode = statusCode;\n\n if (options.response) {\n this.response = options.response;\n\n // Parse JSON:API errors if the response has the correct content type\n if (this.isJsonApiResponse()) {\n const responseData = options.response.data as { errors?: T[] };\n if (responseData.errors) {\n this.errors = responseData.errors;\n this.firstError = responseData.errors[0];\n }\n }\n // @todo - Add better support for non-JSON:API responses.\n else {\n this.errors = [options.response.data as T];\n this.firstError = options.response.data as T;\n }\n }\n\n // redact request credentials without mutating original request options\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers?.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(\n /(?!\\w).*$/,\n \" [REDACTED]\",\n ),\n });\n }\n\n this.request = requestCopy;\n }\n\n /**\n * Checks if the response contains JSON:API errors.\n */\n public isJsonApiError<\n TM = T extends JsonApiError ? IntersectPick<T, keyof JsonApiError> : never,\n >(): this is DrupalkitError<TM> & {\n firstError: TM;\n errors: TM[];\n } {\n return (\n this.isJsonApiResponse() &&\n Array.isArray(this.errors) &&\n this.errors.length > 0\n );\n }\n\n /**\n * Gets a specific error by its error code.\n *\n * @param code - The error code to search for.\n * @returns The first error matching the provided code, or undefined if not found.\n */\n public getErrorByCode<\n C extends T extends { code: string } ? T[\"code\"] : never,\n >(code: C): Extract<T, { code: C }> | undefined {\n return this.errors?.find((error) => {\n if (error && typeof error === \"object\" && \"code\" in error) {\n return error.code === code;\n }\n\n return false;\n }) as Extract<T, { code: C }>;\n }\n\n /**\n * Converts the error to a JSON:API compliant error object.\n *\n * If this is already a JSON:API error (has errors array), returns the first error.\n * Otherwise returns a generic error object with the message and status code.\n *\n * @returns A JSON:API compliant error object.\n */\n public toJsonApiError(): T extends JsonApiError\n ? IntersectPick<T, keyof JsonApiError> | GenericJsonApiError\n : GenericJsonApiError {\n if (this.isJsonApiError()) {\n return this.firstError as T extends JsonApiError\n ? T & GenericJsonApiError\n : GenericJsonApiError;\n }\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {\n code: \"drupalkit_error\",\n detail: this.message,\n status: this.statusCode.toString(),\n } as T extends JsonApiError ? T & GenericJsonApiError : GenericJsonApiError;\n }\n\n /**\n * Checks if the response has the JSON:API content type.\n */\n private isJsonApiResponse(): boolean {\n const contentType = Object.keys(this.response?.headers ?? {}).find(\n (key) => key.toLowerCase() === \"content-type\",\n );\n\n return (\n this.response?.headers?.[contentType ?? \"\"] === \"application/vnd.api+json\"\n );\n }\n}\n\ntype IntersectPick<T, K extends keyof T> = {\n [P in K & keyof T]: T[P];\n};\n","import { isPlainObject } from \"is-plain-object\";\nimport { Fetch, RequestRequestOptions } from \"@drupal-kit/types\";\n\nimport { DrupalkitError } from \"./DrupalkitError.js\";\n\n/**\n * Function that wraps the fetch call.\n *\n * Sets up the request and handles errors and responses.\n *\n * @param requestOptions - Options for the request.\n */\nexport default function fetchWrapper<R>(\n requestOptions: RequestRequestOptions & {\n redirect?: \"error\" | \"follow\" | \"manual\";\n fetch?: Fetch;\n },\n) {\n if (\n isPlainObject(requestOptions.body) ||\n Array.isArray(requestOptions.body)\n ) {\n requestOptions.body = JSON.stringify(requestOptions.body);\n }\n\n const headers: { [header: string]: string } = {};\n let status: number;\n let url: string;\n\n const fetch: typeof globalThis.fetch =\n requestOptions.fetch || globalThis.fetch;\n\n return fetch(\n requestOptions.url,\n Object.assign(\n {\n method: requestOptions.method,\n body: requestOptions.body,\n headers: requestOptions.headers as HeadersInit,\n redirect: requestOptions.redirect,\n },\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n requestOptions as any,\n ),\n )\n .then(async (response) => {\n url = response.url;\n status = response.status;\n\n for (const [key, value] of response.headers) {\n headers[key] = value;\n }\n\n if (status === 204 || status === 205) {\n return;\n }\n\n if (status >= 400) {\n const data = await getResponseData(response);\n\n const error = new DrupalkitError(toErrorMessage(data), status, {\n response: {\n url,\n status,\n headers,\n data,\n },\n request: requestOptions,\n });\n\n throw error;\n }\n\n return getResponseData(response);\n })\n .then((data) => {\n return {\n status,\n url,\n headers,\n data: data as R,\n };\n })\n .catch((error) => {\n if (error instanceof DrupalkitError) throw error;\n // @todo Uncomment if AbortSignal is implemented.\n //else if (error.name === \"AbortError\") throw error;\n\n throw new DrupalkitError(error.message, 500, {\n request: requestOptions,\n });\n });\n}\n\n/**\n * Extract data from response depending on the content type.\n *\n * @param response - Response object.\n */\nasync function getResponseData(response: Response) {\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType && /application\\/(vnd\\.api\\+json|json)/.test(contentType)) {\n return response.json();\n }\n\n return response.text();\n}\n\n/**\n * Convert the error message to a human readable string.\n *\n * @param data - Error data.\n */\nfunction toErrorMessage(data: unknown): string {\n if (typeof data === \"string\") return data;\n\n // istanbul ignore else - just in case\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = data as any;\n\n if (data && typeof data === \"object\") {\n if (\"message\" in data) {\n if (\"errors\" in data && Array.isArray(data.errors)) {\n return `${data.message}: ${data.errors\n .map((err) => JSON.stringify(err))\n .join(\", \")}`;\n }\n\n return String(data.message);\n }\n }\n\n // istanbul ignore next - just in case\n return `Unknown error: ${JSON.stringify(data)}`;\n}\n","/**\n * Trim slashes at start / end from given segment.\n *\n * @param segment - The segment or url.\n */\nexport const trimSlashesFromSegment = (segment: string) => {\n // return segment.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n let start = 0;\n let end = segment.length;\n\n while (start < end && segment[start] === \"/\") {\n start++;\n }\n\n while (end > start && segment[end - 1] === \"/\") {\n end--;\n }\n\n return segment.substring(start, end);\n};\n","export const VERSION = \"0.12.1\";","import { Result } from \"@wunderwerk/ts-functional/results\";\nimport Hook, { HookCollection } from \"before-after-hook\";\nimport qs from \"qs\";\nimport {\n DrupalkitResponse,\n Fetch,\n Log,\n OverrideableRequestOptions,\n RequestOptions,\n RequestRequestOptions,\n Url,\n} from \"@drupal-kit/types\";\n\nimport { DrupalkitError } from \"./DrupalkitError.js\";\nimport fetchWrapper from \"./fetch-wrapper.js\";\nimport {\n Constructor,\n DrupalkitOptions,\n DrupalkitPlugin,\n Hooks,\n Query,\n ReturnTypeOf,\n UnionToIntersection,\n} from \"./types.js\";\nimport { trimSlashesFromSegment } from \"./utils.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Drupalkit base calss.\n */\nexport class Drupalkit {\n /**\n * Array of plugins.\n */\n static plugins: DrupalkitPlugin[] = [];\n\n // assigned during constructor\n readonly fetch?: Fetch;\n readonly baseUrl: string;\n readonly availableLocales: string[] = [];\n readonly defaultLocale?: string;\n readonly agent: string;\n readonly log: Log;\n readonly hook: HookCollection<Hooks>;\n private locale?: string;\n private auth?: string;\n\n /**\n * Attach a plugin (or many) to your Drupalkit instance.\n *\n * @param newPlugins - Array of plugins to attach.\n * @example\n * const API = Drupalkit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin<\n S extends Constructor<object> & { plugins: unknown[] },\n T extends DrupalkitPlugin[],\n >(this: S, ...newPlugins: T) {\n const currentPlugins = this.plugins;\n\n /**\n * New class with attached plugins.\n */\n const NewDrupalkit = class extends this {\n static plugins = currentPlugins.concat(\n newPlugins.filter((plugin) => !currentPlugins.includes(plugin)),\n );\n };\n\n return NewDrupalkit as typeof this &\n Constructor<UnionToIntersection<ReturnTypeOf<T>>>;\n }\n\n /**\n * Construct new drupalkit instance.\n *\n * @param options - The drupakit options.\n */\n constructor(options: DrupalkitOptions) {\n const hook = new Hook.Collection<Hooks>();\n\n /* eslint-disable no-console */\n /* eslint-disable jsdoc/require-jsdoc */\n /* eslint-disable @typescript-eslint/no-empty-function */\n this.log = Object.assign(\n {\n debug: () => {},\n info: () => {},\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n },\n options.log,\n );\n /* eslint-enable no-console */\n /* eslint-enable jsdoc/require-jsdoc */\n /* eslint-disable @typescript-eslint/no-empty-function */\n\n this.hook = hook;\n this.baseUrl = trimSlashesFromSegment(options.baseUrl);\n this.agent = `drupal-kit/${VERSION}`;\n\n if (options.locale) {\n this.locale = options.locale;\n this.availableLocales.push(options.locale);\n }\n\n if (options.defaultLocale) {\n this.defaultLocale = options.defaultLocale;\n\n // Add default locale to available if it's not already there.\n if (!this.availableLocales.includes(options.defaultLocale)) {\n this.availableLocales.push(options.defaultLocale);\n }\n }\n\n if (options.availableLocales) {\n this.availableLocales = options.availableLocales;\n }\n\n // Set default locale to locale if set.\n if (!options.defaultLocale && options.locale) {\n this.defaultLocale = options.locale;\n } else if (!options.locale && options.defaultLocale) {\n this.locale = options.defaultLocale;\n }\n\n if (options.fetch) {\n this.fetch = options.fetch;\n }\n\n this.applyPlugins(options);\n }\n\n /**\n * Dispatch a request to the Drupal API.\n *\n * @param url - Relative or absolute url.\n * @param options - Request options.\n * @param optionOverrides - Optional overridden options. These options are merged correctly with the actual options and allow for user-specific overrides.\n */\n public request<R, E = unknown>(\n url: Url,\n options: RequestOptions,\n optionOverrides?: OverrideableRequestOptions,\n ): Promise<Result<DrupalkitResponse<R, number>, DrupalkitError<E>>> {\n // eslint-disable-next-line jsdoc/require-jsdoc\n const request = (options: RequestRequestOptions) => {\n return fetchWrapper<R>(options);\n };\n\n const headers = {\n ...options.headers,\n \"user-agent\": this.agent,\n };\n\n if (optionOverrides?.headers) {\n Object.assign(headers, optionOverrides.headers);\n }\n\n // Delete auth header if unauthenticated is true.\n if (options.unauthenticated || optionOverrides?.unauthenticated) {\n delete headers.authorization;\n } else if (this.auth) {\n headers.authorization = this.auth;\n }\n\n const requestOptions = {\n ...options,\n ...optionOverrides,\n url: this.buildUrl(url, {\n localeOverride: optionOverrides?.locale ?? options.locale,\n }),\n baseUrl: this.baseUrl,\n log: this.log,\n headers,\n };\n\n const p = this.hook(\"request\", request, requestOptions)\n .then((response) => Result.Ok(response as DrupalkitResponse<R, number>))\n .catch((error) => {\n if (error instanceof DrupalkitError) return Result.Err(error);\n\n return Result.Err(\n new DrupalkitError(error.message, 500, {\n request: requestOptions,\n }),\n );\n });\n\n return p;\n }\n\n /**\n * Set authorization header value.\n *\n * @param auth - The authorization header value.\n */\n public setAuth(auth: string) {\n this.auth = auth;\n }\n\n /**\n * Checks if auth data is set.\n */\n public hasAuth() {\n return !!this.auth;\n }\n\n /**\n * Unsets previously set auth info.\n *\n * Makes sure that subsequent requests are anonymous.\n */\n public unsetAuth() {\n this.auth = undefined;\n }\n\n /**\n * Set the locale.\n *\n * @param locale - The locale.\n */\n public setLocale(locale: string) {\n this.locale = locale;\n }\n\n /**\n * Constructs a Drupal API url.\n *\n * @param url - The url for the request. Can be relative or absolute.\n * @param options - An optional object containing additional options.\n * @param options.localeOverride - An optional override for the locale.\n * @param options.customPrefix - A custom prefix to prepend to the url.\n * @param options.query - An optional object containing query parameters.\n * @returns The constructed URL as a string.\n */\n public buildUrl(\n url: Url,\n options?: {\n localeOverride?: string;\n customPrefix?: string;\n query?: Query;\n },\n ) {\n // Do nothing with absolute urls.\n if (url.startsWith(\"http\")) {\n return url;\n }\n\n const locale = options?.localeOverride ?? this.locale;\n\n let finalUrl = this.baseUrl;\n\n // Prepend locale to url if the locale is not the default one.\n if (locale && locale !== this.defaultLocale) {\n finalUrl += \"/\" + locale;\n }\n\n // Add custom prefix if provided.\n if (options?.customPrefix) {\n finalUrl += \"/\" + trimSlashesFromSegment(options.customPrefix);\n }\n\n // Only append url if not empty.\n if (url) {\n finalUrl += \"/\" + trimSlashesFromSegment(url);\n }\n\n if (options?.query) {\n finalUrl += \"?\" + qs.stringify(options.query);\n }\n\n return finalUrl;\n }\n\n /**\n * Applies all plugins to the drupalkit instance.\n *\n * Plugin data will be merged up to two levels.\n *\n * @param options - The drupalkit options.\n * @see https://stackoverflow.com/a/16345172\n */\n private applyPlugins(options: DrupalkitOptions) {\n const classConstructor = this.constructor as typeof Drupalkit;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mergedPluginData: Record<string, any> = {};\n\n classConstructor.plugins.forEach((plugin) => {\n const pluginData = plugin(this, options);\n if (!pluginData) {\n return;\n }\n\n for (const [key, value] of Object.entries(pluginData)) {\n if (!mergedPluginData[key]) {\n mergedPluginData[key] = {};\n }\n\n if (typeof value === \"object\") {\n Object.assign(mergedPluginData[key], value);\n } else {\n mergedPluginData[key] = value;\n }\n }\n });\n\n Object.assign(this, mergedPluginData);\n }\n}\n"],"names":["options"],"mappings":"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"} | ||
| {"version":3,"file":"index.mjs","sources":["../src/DrupalkitError.ts","../src/fetch-wrapper.ts","../src/utils.ts","../src/version.ts","../src/Drupalkit.ts"],"sourcesContent":["import * as DrupalkitTypes from \"@drupal-kit/types\";\nimport { JsonApiError } from \"@drupal-kit/types\";\n\nimport { RequestErrorOptions } from \"./types.js\";\n\nexport const UNKNOWN_ERROR_PREFIX = \"Unknown error:\";\n\nexport type DrupalkitErrorOptions = RequestErrorOptions;\n\ntype GenericJsonApiError = {\n code: \"drupalkit_error\";\n detail: string;\n status: string;\n};\n\n/**\n * Custom error class to help with error handling.\n */\nexport class DrupalkitError<T = unknown> extends Error {\n /**\n * Error name.\n */\n readonly name: \"HttpError\";\n\n /**\n * HTTP status code.\n */\n readonly statusCode: number;\n\n /**\n * Request options that lead to the error.\n */\n readonly request: DrupalkitTypes.RequestRequestOptions;\n\n /**\n * Response object if a response was received.\n */\n readonly response?: DrupalkitTypes.DrupalkitResponse<unknown>;\n\n /**\n * Array of JSON:API errors if the response contains them.\n */\n readonly errors: T[] | undefined;\n\n /**\n * The first JSON:API error if the response contains multiple errors.\n */\n readonly firstError: T | undefined;\n\n /**\n * Construct a new DrupalkitError.\n *\n * @param message - Error message.\n * @param statusCode - HTTP status code.\n * @param options - Request / Response that lead to the error.\n */\n constructor(\n message: string,\n statusCode: number,\n options: DrupalkitErrorOptions,\n ) {\n super(message);\n\n // Maintains proper stack trace (only available on V8)\n // @ts-expect-error - Error.captureStackTrace is not available in all browsers.\n if (Error.captureStackTrace) {\n // @ts-expect-error - Error.captureStackTrace is not available in all browsers.\n Error.captureStackTrace(this, this.constructor);\n }\n\n this.name = \"HttpError\";\n this.statusCode = statusCode;\n\n if (options.response) {\n this.response = options.response;\n\n // Parse JSON:API errors if the response has the correct content type\n if (this.isJsonApiResponse()) {\n const responseData = options.response.data as { errors?: T[] };\n if (responseData.errors) {\n this.errors = responseData.errors;\n this.firstError = responseData.errors[0];\n }\n }\n // @todo - Add better support for non-JSON:API responses.\n else {\n this.errors = [options.response.data as T];\n this.firstError = options.response.data as T;\n }\n }\n\n // redact request credentials without mutating original request options\n const requestCopy = Object.assign({}, options.request);\n if (options.request.headers?.authorization) {\n requestCopy.headers = Object.assign({}, options.request.headers, {\n authorization: options.request.headers.authorization.replace(\n /(?!\\w).*$/,\n \" [REDACTED]\",\n ),\n });\n }\n\n this.request = requestCopy;\n }\n\n /**\n * Checks if the response contains JSON:API errors.\n */\n public isJsonApiError<\n TM = T extends JsonApiError ? IntersectPick<T, keyof JsonApiError> : never,\n >(): this is DrupalkitError<TM> & {\n firstError: TM;\n errors: TM[];\n } {\n return (\n this.isJsonApiResponse() &&\n Array.isArray(this.errors) &&\n this.errors.length > 0\n );\n }\n\n /**\n * Gets a specific error by its error code.\n *\n * @param code - The error code to search for.\n * @returns The first error matching the provided code, or undefined if not found.\n */\n public getErrorByCode<\n C extends T extends { code: string } ? T[\"code\"] : never,\n >(code: C): Extract<T, { code: C }> | undefined {\n return this.errors?.find((error) => {\n if (error && typeof error === \"object\" && \"code\" in error) {\n return error.code === code;\n }\n\n return false;\n }) as Extract<T, { code: C }>;\n }\n\n /**\n * Converts the error to a JSON:API compliant error object.\n *\n * If this is already a JSON:API error (has errors array), returns the first error.\n * Otherwise returns a generic error object with the message and status code.\n *\n * @returns A JSON:API compliant error object.\n */\n public toJsonApiError(): T extends JsonApiError\n ? IntersectPick<T, keyof JsonApiError> | GenericJsonApiError\n : GenericJsonApiError {\n if (this.isJsonApiError()) {\n return this.firstError as T extends JsonApiError\n ? T & GenericJsonApiError\n : GenericJsonApiError;\n }\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return {\n code: \"drupalkit_error\",\n detail: this.message,\n status: this.statusCode.toString(),\n } as T extends JsonApiError ? T & GenericJsonApiError : GenericJsonApiError;\n }\n\n /**\n * Checks if the response has the JSON:API content type.\n */\n private isJsonApiResponse(): boolean {\n const contentType = Object.keys(this.response?.headers ?? {}).find(\n (key) => key.toLowerCase() === \"content-type\",\n );\n\n return (\n this.response?.headers?.[contentType ?? \"\"] === \"application/vnd.api+json\"\n );\n }\n}\n\ntype IntersectPick<T, K extends keyof T> = {\n [P in K & keyof T]: T[P];\n};\n","import { isPlainObject } from \"is-plain-object\";\nimport { Fetch, RequestRequestOptions } from \"@drupal-kit/types\";\n\nimport { DrupalkitError, UNKNOWN_ERROR_PREFIX } from \"./DrupalkitError.js\";\n\n/**\n * Function that wraps the fetch call.\n *\n * Sets up the request and handles errors and responses.\n *\n * @param requestOptions - Options for the request.\n */\nexport default function fetchWrapper<R>(\n requestOptions: RequestRequestOptions & {\n redirect?: \"error\" | \"follow\" | \"manual\";\n fetch?: Fetch;\n },\n) {\n if (\n isPlainObject(requestOptions.body) ||\n Array.isArray(requestOptions.body)\n ) {\n requestOptions.body = JSON.stringify(requestOptions.body);\n }\n\n const headers: { [header: string]: string } = {};\n let status: number;\n let url: string;\n\n const fetch: typeof globalThis.fetch =\n requestOptions.fetch || globalThis.fetch;\n\n return fetch(\n requestOptions.url,\n Object.assign(\n {\n method: requestOptions.method,\n body: requestOptions.body,\n headers: requestOptions.headers as HeadersInit,\n redirect: requestOptions.redirect,\n },\n /* eslint-disable-next-line @typescript-eslint/no-explicit-any */\n requestOptions as any,\n ),\n )\n .then(async (response) => {\n url = response.url;\n status = response.status;\n\n for (const [key, value] of response.headers) {\n headers[key] = value;\n }\n\n if (status === 204 || status === 205) {\n return;\n }\n\n if (status >= 400) {\n const data = await getResponseData(response);\n\n const error = new DrupalkitError(toErrorMessage(data), status, {\n response: {\n url,\n status,\n headers,\n data,\n },\n request: requestOptions,\n });\n\n throw error;\n }\n\n return getResponseData(response);\n })\n .then((data) => {\n return {\n status,\n url,\n headers,\n data: data as R,\n };\n })\n .catch((error) => {\n if (error instanceof DrupalkitError) throw error;\n // @todo Uncomment if AbortSignal is implemented.\n //else if (error.name === \"AbortError\") throw error;\n\n throw new DrupalkitError(error.message, 500, {\n request: requestOptions,\n });\n });\n}\n\n/**\n * Extract data from response depending on the content type.\n *\n * @param response - Response object.\n */\nasync function getResponseData(response: Response) {\n const contentType = response.headers.get(\"content-type\");\n\n if (contentType && /application\\/(vnd\\.api\\+json|json)/.test(contentType)) {\n return response.json();\n }\n\n return response.text();\n}\n\n/**\n * Convert the error message to a human readable string.\n *\n * @param data - Error data.\n */\nfunction toErrorMessage(data: unknown): string {\n if (typeof data === \"string\") return data;\n\n // istanbul ignore else - just in case\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data = data as any;\n\n if (data && typeof data === \"object\") {\n if (\"message\" in data) {\n if (\"errors\" in data && Array.isArray(data.errors)) {\n return `${data.message}: ${data.errors\n .map((err) => JSON.stringify(err))\n .join(\", \")}`;\n }\n\n return String(data.message);\n }\n }\n\n // istanbul ignore next - just in case\n return `${UNKNOWN_ERROR_PREFIX} ${JSON.stringify(data)}`;\n}\n","/**\n * Trim slashes at start / end from given segment.\n *\n * @param segment - The segment or url.\n */\nexport const trimSlashesFromSegment = (segment: string) => {\n // return segment.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\");\n let start = 0;\n let end = segment.length;\n\n while (start < end && segment[start] === \"/\") {\n start++;\n }\n\n while (end > start && segment[end - 1] === \"/\") {\n end--;\n }\n\n return segment.substring(start, end);\n};\n","export const VERSION = \"0.12.2\";","import { Result } from \"@wunderwerk/ts-functional/results\";\nimport Hook, { HookCollection } from \"before-after-hook\";\nimport qs from \"qs\";\nimport {\n DrupalkitResponse,\n Fetch,\n Log,\n OverrideableRequestOptions,\n RequestOptions,\n RequestRequestOptions,\n Url,\n} from \"@drupal-kit/types\";\n\nimport { DrupalkitError } from \"./DrupalkitError.js\";\nimport fetchWrapper from \"./fetch-wrapper.js\";\nimport {\n Constructor,\n DrupalkitOptions,\n DrupalkitPlugin,\n Hooks,\n Query,\n ReturnTypeOf,\n UnionToIntersection,\n} from \"./types.js\";\nimport { trimSlashesFromSegment } from \"./utils.js\";\nimport { VERSION } from \"./version.js\";\n\n/**\n * Drupalkit base calss.\n */\nexport class Drupalkit {\n /**\n * Array of plugins.\n */\n static plugins: DrupalkitPlugin[] = [];\n\n // assigned during constructor\n readonly fetch?: Fetch;\n readonly baseUrl: string;\n readonly availableLocales: string[] = [];\n readonly defaultLocale?: string;\n readonly agent: string;\n readonly log: Log;\n readonly hook: HookCollection<Hooks>;\n private locale?: string;\n private auth?: string;\n\n /**\n * Attach a plugin (or many) to your Drupalkit instance.\n *\n * @param newPlugins - Array of plugins to attach.\n * @example\n * const API = Drupalkit.plugin(plugin1, plugin2, plugin3, ...)\n */\n static plugin<\n S extends Constructor<object> & { plugins: unknown[] },\n T extends DrupalkitPlugin[],\n >(this: S, ...newPlugins: T) {\n const currentPlugins = this.plugins;\n\n /**\n * New class with attached plugins.\n */\n const NewDrupalkit = class extends this {\n static plugins = currentPlugins.concat(\n newPlugins.filter((plugin) => !currentPlugins.includes(plugin)),\n );\n };\n\n return NewDrupalkit as typeof this &\n Constructor<UnionToIntersection<ReturnTypeOf<T>>>;\n }\n\n /**\n * Construct new drupalkit instance.\n *\n * @param options - The drupakit options.\n */\n constructor(options: DrupalkitOptions) {\n const hook = new Hook.Collection<Hooks>();\n\n /* eslint-disable no-console */\n /* eslint-disable jsdoc/require-jsdoc */\n /* eslint-disable @typescript-eslint/no-empty-function */\n this.log = Object.assign(\n {\n debug: () => {},\n info: () => {},\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n },\n options.log,\n );\n /* eslint-enable no-console */\n /* eslint-enable jsdoc/require-jsdoc */\n /* eslint-disable @typescript-eslint/no-empty-function */\n\n this.hook = hook;\n this.baseUrl = trimSlashesFromSegment(options.baseUrl);\n this.agent = `drupal-kit/${VERSION}`;\n\n if (options.locale) {\n this.locale = options.locale;\n this.availableLocales.push(options.locale);\n }\n\n if (options.defaultLocale) {\n this.defaultLocale = options.defaultLocale;\n\n // Add default locale to available if it's not already there.\n if (!this.availableLocales.includes(options.defaultLocale)) {\n this.availableLocales.push(options.defaultLocale);\n }\n }\n\n if (options.availableLocales) {\n this.availableLocales = options.availableLocales;\n }\n\n // Set default locale to locale if set.\n if (!options.defaultLocale && options.locale) {\n this.defaultLocale = options.locale;\n } else if (!options.locale && options.defaultLocale) {\n this.locale = options.defaultLocale;\n }\n\n if (options.fetch) {\n this.fetch = options.fetch;\n }\n\n this.applyPlugins(options);\n }\n\n /**\n * Dispatch a request to the Drupal API.\n *\n * @param url - Relative or absolute url.\n * @param options - Request options.\n * @param optionOverrides - Optional overridden options. These options are merged correctly with the actual options and allow for user-specific overrides.\n */\n public request<R, E = unknown>(\n url: Url,\n options: RequestOptions,\n optionOverrides?: OverrideableRequestOptions,\n ): Promise<Result<DrupalkitResponse<R, number>, DrupalkitError<E>>> {\n // eslint-disable-next-line jsdoc/require-jsdoc\n const request = (options: RequestRequestOptions) => {\n return fetchWrapper<R>(options);\n };\n\n const headers = {\n ...options.headers,\n \"user-agent\": this.agent,\n };\n\n if (optionOverrides?.headers) {\n Object.assign(headers, optionOverrides.headers);\n }\n\n // Delete auth header if unauthenticated is true.\n if (options.unauthenticated || optionOverrides?.unauthenticated) {\n delete headers.authorization;\n } else if (this.auth) {\n headers.authorization = this.auth;\n }\n\n const requestOptions = {\n ...options,\n ...optionOverrides,\n url: this.buildUrl(url, {\n localeOverride: optionOverrides?.locale ?? options.locale,\n }),\n baseUrl: this.baseUrl,\n log: this.log,\n headers,\n };\n\n const p = this.hook(\"request\", request, requestOptions)\n .then((response) => Result.Ok(response as DrupalkitResponse<R, number>))\n .catch((error) => {\n if (error instanceof DrupalkitError) return Result.Err(error);\n\n return Result.Err(\n new DrupalkitError(error.message, 500, {\n request: requestOptions,\n }),\n );\n });\n\n return p;\n }\n\n /**\n * Set authorization header value.\n *\n * @param auth - The authorization header value.\n */\n public setAuth(auth: string) {\n this.auth = auth;\n }\n\n /**\n * Checks if auth data is set.\n */\n public hasAuth() {\n return !!this.auth;\n }\n\n /**\n * Unsets previously set auth info.\n *\n * Makes sure that subsequent requests are anonymous.\n */\n public unsetAuth() {\n this.auth = undefined;\n }\n\n /**\n * Set the locale.\n *\n * @param locale - The locale.\n */\n public setLocale(locale: string) {\n this.locale = locale;\n }\n\n /**\n * Constructs a Drupal API url.\n *\n * @param url - The url for the request. Can be relative or absolute.\n * @param options - An optional object containing additional options.\n * @param options.localeOverride - An optional override for the locale.\n * @param options.customPrefix - A custom prefix to prepend to the url.\n * @param options.query - An optional object containing query parameters.\n * @returns The constructed URL as a string.\n */\n public buildUrl(\n url: Url,\n options?: {\n localeOverride?: string;\n customPrefix?: string;\n query?: Query;\n },\n ) {\n // Do nothing with absolute urls.\n if (url.startsWith(\"http\")) {\n return url;\n }\n\n const locale = options?.localeOverride ?? this.locale;\n\n let finalUrl = this.baseUrl;\n\n // Prepend locale to url if the locale is not the default one.\n if (locale && locale !== this.defaultLocale) {\n finalUrl += \"/\" + locale;\n }\n\n // Add custom prefix if provided.\n if (options?.customPrefix) {\n finalUrl += \"/\" + trimSlashesFromSegment(options.customPrefix);\n }\n\n // Only append url if not empty.\n if (url) {\n finalUrl += \"/\" + trimSlashesFromSegment(url);\n }\n\n if (options?.query) {\n finalUrl += \"?\" + qs.stringify(options.query);\n }\n\n return finalUrl;\n }\n\n /**\n * Applies all plugins to the drupalkit instance.\n *\n * Plugin data will be merged up to two levels.\n *\n * @param options - The drupalkit options.\n * @see https://stackoverflow.com/a/16345172\n */\n private applyPlugins(options: DrupalkitOptions) {\n const classConstructor = this.constructor as typeof Drupalkit;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const mergedPluginData: Record<string, any> = {};\n\n classConstructor.plugins.forEach((plugin) => {\n const pluginData = plugin(this, options);\n if (!pluginData) {\n return;\n }\n\n for (const [key, value] of Object.entries(pluginData)) {\n if (!mergedPluginData[key]) {\n mergedPluginData[key] = {};\n }\n\n if (typeof value === \"object\") {\n Object.assign(mergedPluginData[key], value);\n } else {\n mergedPluginData[key] = value;\n }\n }\n });\n\n Object.assign(this, mergedPluginData);\n }\n}\n"],"names":["options"],"mappings":"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"} |
+4
-4
| { | ||
| "name": "@drupal-kit/core", | ||
| "version": "0.12.1", | ||
| "version": "0.12.2", | ||
| "type": "module", | ||
@@ -13,5 +13,5 @@ "types": "./dist/index.d.ts", | ||
| "devDependencies": { | ||
| "@drupal-kit/config-typescript": "0.12.1", | ||
| "@drupal-kit/eslint-config": "0.12.1", | ||
| "@drupal-kit/types": "0.12.1", | ||
| "@drupal-kit/config-typescript": "0.12.2", | ||
| "@drupal-kit/eslint-config": "0.12.2", | ||
| "@drupal-kit/types": "0.12.2", | ||
| "@rollup/plugin-typescript": "^11.1.1", | ||
@@ -18,0 +18,0 @@ "@swc/core": "^1.6.5", |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
52963
1.27%598
0.34%