@kontent-ai/core-sdk 12.0.0-preview.4 → 12.0.0-preview.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmignore +1 -5
- package/LICENSE.md +1 -1
- package/README.md +117 -12
- package/dist/core-sdk-info.d.ts +2 -0
- package/dist/core-sdk-info.js +6 -0
- package/dist/core-sdk-info.js.map +1 -0
- package/dist/devkit/console.utils.d.ts +2 -0
- package/dist/devkit/console.utils.js +5 -0
- package/dist/devkit/console.utils.js.map +1 -0
- package/dist/devkit/environment.utils.d.ts +2 -0
- package/dist/devkit/environment.utils.js +12 -0
- package/dist/devkit/environment.utils.js.map +1 -0
- package/dist/devkit/script.utils.js +3 -3
- package/dist/devkit/script.utils.js.map +1 -1
- package/dist/{utils → devkit}/sdk-version.utils.js +2 -2
- package/dist/devkit/sdk-version.utils.js.map +1 -0
- package/dist/devkit_api.d.ts +4 -1
- package/dist/devkit_api.js +4 -2
- package/dist/devkit_api.js.map +1 -1
- package/dist/http/http.adapter.d.ts +1 -1
- package/dist/http/http.adapter.js +74 -24
- package/dist/http/http.adapter.js.map +1 -1
- package/dist/http/http.models.d.ts +49 -37
- package/dist/http/http.service.d.ts +2 -2
- package/dist/http/http.service.js +305 -220
- package/dist/http/http.service.js.map +1 -1
- package/dist/models/core.models.d.ts +33 -40
- package/dist/models/error.models.d.ts +78 -32
- package/dist/models/error.models.js +51 -1
- package/dist/models/error.models.js.map +1 -1
- package/dist/models/json.models.d.ts +13 -4
- package/dist/models/json.models.js +10 -1
- package/dist/models/json.models.js.map +1 -1
- package/dist/models/utility.types.d.ts +16 -0
- package/dist/models/utility.types.js +2 -0
- package/dist/models/utility.types.js.map +1 -0
- package/dist/public_api.d.ts +22 -11
- package/dist/public_api.js +18 -6
- package/dist/public_api.js.map +1 -1
- package/dist/sdk/queries/fetch-sdk-query.d.ts +4 -0
- package/dist/sdk/queries/fetch-sdk-query.js +17 -0
- package/dist/sdk/queries/fetch-sdk-query.js.map +1 -0
- package/dist/sdk/queries/mutation-sdk-query.d.ts +5 -0
- package/dist/sdk/queries/mutation-sdk-query.js +16 -0
- package/dist/sdk/queries/mutation-sdk-query.js.map +1 -0
- package/dist/sdk/queries/paged-fetch-sdk-query.d.ts +8 -0
- package/dist/sdk/queries/paged-fetch-sdk-query.js +101 -0
- package/dist/sdk/queries/paged-fetch-sdk-query.js.map +1 -0
- package/dist/sdk/resolve-query.d.ts +12 -0
- package/dist/sdk/resolve-query.js +172 -0
- package/dist/sdk/resolve-query.js.map +1 -0
- package/dist/sdk/sdk-config.d.ts +24 -0
- package/dist/sdk/sdk-config.js +31 -0
- package/dist/sdk/sdk-config.js.map +1 -0
- package/dist/sdk/sdk-models.d.ts +118 -40
- package/dist/sdk/sdk-utils.d.ts +16 -0
- package/dist/sdk/sdk-utils.js +36 -0
- package/dist/sdk/sdk-utils.js.map +1 -0
- package/dist/sdk/transform/transform-fetch-query.d.ts +11 -0
- package/dist/sdk/transform/transform-fetch-query.js +15 -0
- package/dist/sdk/transform/transform-fetch-query.js.map +1 -0
- package/dist/sdk/transform/transform-mutation-query.d.ts +11 -0
- package/dist/sdk/transform/transform-mutation-query.js +15 -0
- package/dist/sdk/transform/transform-mutation-query.js.map +1 -0
- package/dist/sdk/transform/transform-paged-fetch-query.d.ts +11 -0
- package/dist/sdk/transform/transform-paged-fetch-query.js +75 -0
- package/dist/sdk/transform/transform-paged-fetch-query.js.map +1 -0
- package/dist/sdk/transform/transform-utils.d.ts +23 -0
- package/dist/sdk/transform/transform-utils.js +86 -0
- package/dist/sdk/transform/transform-utils.js.map +1 -0
- package/dist/testkit/poll.utils.d.ts +5 -0
- package/dist/testkit/poll.utils.js +15 -0
- package/dist/testkit/poll.utils.js.map +1 -0
- package/dist/testkit/testkit.models.d.ts +2 -2
- package/dist/testkit/testkit.utils.d.ts +27 -0
- package/dist/testkit/testkit.utils.js +113 -0
- package/dist/testkit/testkit.utils.js.map +1 -0
- package/dist/testkit_api.d.ts +3 -1
- package/dist/testkit_api.js +3 -2
- package/dist/testkit_api.js.map +1 -1
- package/dist/utils/abort.utils.d.ts +12 -0
- package/dist/utils/abort.utils.js +30 -0
- package/dist/utils/abort.utils.js.map +1 -0
- package/dist/utils/array.utils.d.ts +1 -0
- package/dist/utils/array.utils.js +4 -0
- package/dist/utils/array.utils.js.map +1 -0
- package/dist/utils/core.utils.d.ts +3 -1
- package/dist/utils/core.utils.js +18 -2
- package/dist/utils/core.utils.js.map +1 -1
- package/dist/utils/error.utils.d.ts +24 -8
- package/dist/utils/error.utils.js +47 -9
- package/dist/utils/error.utils.js.map +1 -1
- package/dist/utils/header.utils.d.ts +7 -2
- package/dist/utils/header.utils.js +43 -11
- package/dist/utils/header.utils.js.map +1 -1
- package/dist/utils/retry.utils.d.ts +17 -12
- package/dist/utils/retry.utils.js +125 -80
- package/dist/utils/retry.utils.js.map +1 -1
- package/dist/utils/schema.utils.d.ts +3 -0
- package/dist/utils/schema.utils.js +10 -0
- package/dist/utils/schema.utils.js.map +1 -0
- package/dist/utils/try-catch.utils.d.ts +15 -0
- package/dist/utils/{try.utils.js → try-catch.utils.js} +1 -1
- package/dist/utils/try-catch.utils.js.map +1 -0
- package/dist/utils/url.utils.d.ts +6 -0
- package/dist/utils/url.utils.js +10 -0
- package/dist/utils/url.utils.js.map +1 -0
- package/package.json +64 -64
- package/dist/models/utility.models.d.ts +0 -20
- package/dist/models/utility.models.js +0 -2
- package/dist/models/utility.models.js.map +0 -1
- package/dist/sdk/sdk-queries.d.ts +0 -30
- package/dist/sdk/sdk-queries.js +0 -152
- package/dist/sdk/sdk-queries.js.map +0 -1
- package/dist/sdk-info.d.ts +0 -5
- package/dist/sdk-info.js +0 -6
- package/dist/sdk-info.js.map +0 -1
- package/dist/testkit/test.utils.d.ts +0 -15
- package/dist/testkit/test.utils.js +0 -42
- package/dist/testkit/test.utils.js.map +0 -1
- package/dist/utils/sdk-version.utils.js.map +0 -1
- package/dist/utils/try.utils.d.ts +0 -14
- package/dist/utils/try.utils.js.map +0 -1
- package/lib/devkit/script.utils.ts +0 -12
- package/lib/devkit_api.ts +0 -3
- package/lib/http/http.adapter.ts +0 -38
- package/lib/http/http.models.ts +0 -122
- package/lib/http/http.service.ts +0 -320
- package/lib/models/core.models.ts +0 -89
- package/lib/models/error.models.ts +0 -83
- package/lib/models/json.models.ts +0 -9
- package/lib/models/utility.models.ts +0 -21
- package/lib/public_api.ts +0 -46
- package/lib/sdk/sdk-models.ts +0 -86
- package/lib/sdk/sdk-queries.ts +0 -232
- package/lib/sdk-info.ts +0 -5
- package/lib/testkit/test.utils.ts +0 -79
- package/lib/testkit/testkit.models.ts +0 -7
- package/lib/testkit_api.ts +0 -3
- package/lib/utils/core.utils.ts +0 -3
- package/lib/utils/error.utils.ts +0 -48
- package/lib/utils/header.utils.ts +0 -40
- package/lib/utils/retry.utils.ts +0 -156
- package/lib/utils/sdk-version.utils.ts +0 -16
- package/lib/utils/try.utils.ts +0 -30
- /package/dist/{utils → devkit}/sdk-version.utils.d.ts +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { isNonEmptyArray } from "../../utils/array.utils.js";
|
|
2
|
+
import { createBatchTransformResponses, createTransformError } from "./transform-utils.js";
|
|
3
|
+
export function transformPagedFetchQuery({ query, transform, transformSchema, mapError, config, }) {
|
|
4
|
+
const batchTransformResponses = createBatchTransformResponses({
|
|
5
|
+
config,
|
|
6
|
+
transform,
|
|
7
|
+
transformSchema,
|
|
8
|
+
mapError,
|
|
9
|
+
});
|
|
10
|
+
const transformSingleOrThrow = async (response) => {
|
|
11
|
+
const { success, data, error } = await batchTransformResponses([response]);
|
|
12
|
+
if (!success) {
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
if (isNonEmptyArray(data)) {
|
|
16
|
+
return data[0];
|
|
17
|
+
}
|
|
18
|
+
throw mapError(createTransformError(new Error("Transform returned no response for input"), response.meta.url));
|
|
19
|
+
};
|
|
20
|
+
const transformSingleSafely = async (safeResult) => {
|
|
21
|
+
if (!safeResult.success) {
|
|
22
|
+
return { success: false, error: safeResult.error };
|
|
23
|
+
}
|
|
24
|
+
const { success, data, error } = await batchTransformResponses([safeResult.response]);
|
|
25
|
+
if (!success) {
|
|
26
|
+
return { success: false, error };
|
|
27
|
+
}
|
|
28
|
+
if (isNonEmptyArray(data)) {
|
|
29
|
+
return { success: true, response: data[0] };
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
success: false,
|
|
33
|
+
error: mapError(createTransformError(new Error("Transform returned no response for input"), safeResult.response.meta.url)),
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
fetchPage: async () => transformSingleOrThrow(await query.fetchPage()),
|
|
38
|
+
fetchPageSafe: async () => transformSingleSafely(await query.fetchPageSafe()),
|
|
39
|
+
fetchAllPages: async (config) => {
|
|
40
|
+
const result = await query.fetchAllPages(config);
|
|
41
|
+
const { success, data, error } = await batchTransformResponses(result.responses);
|
|
42
|
+
if (!success) {
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
return { ...result, responses: data };
|
|
46
|
+
},
|
|
47
|
+
fetchAllPagesSafe: async (config) => {
|
|
48
|
+
const result = await query.fetchAllPagesSafe(config);
|
|
49
|
+
if (!result.success) {
|
|
50
|
+
return { success: false, error: result.error };
|
|
51
|
+
}
|
|
52
|
+
const { success, data, error } = await batchTransformResponses(result.responses);
|
|
53
|
+
if (!success) {
|
|
54
|
+
return { success: false, error };
|
|
55
|
+
}
|
|
56
|
+
return { ...result, success: true, responses: data };
|
|
57
|
+
},
|
|
58
|
+
pages: async function* (config) {
|
|
59
|
+
for await (const response of query.pages(config)) {
|
|
60
|
+
yield await transformSingleOrThrow(response);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
pagesSafe: async function* (config) {
|
|
64
|
+
for await (const safeResult of query.pagesSafe(config)) {
|
|
65
|
+
const result = await transformSingleSafely(safeResult);
|
|
66
|
+
yield result;
|
|
67
|
+
if (!result.success) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
inspect: query.inspect,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=transform-paged-fetch-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform-paged-fetch-query.js","sourceRoot":"","sources":["../../../lib/sdk/transform/transform-paged-fetch-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { KontentSdkError } from "../../models/error.models.js";
|
|
2
|
+
import type { JsonValue } from "../../models/json.models.js";
|
|
3
|
+
import { type SchemaInput } from "../../utils/schema.utils.js";
|
|
4
|
+
import { type TryCatchResult } from "../../utils/try-catch.utils.js";
|
|
5
|
+
import type { QueryResponse, SafeQueryResult, SdkConfig } from "../sdk-models.js";
|
|
6
|
+
type TransformResponseFn<TPayload extends JsonValue, TTransformedPayload extends TPayload, TError, TMeta, TExtra> = (response: QueryResponse<TPayload, TMeta, TExtra>) => Promise<TryCatchResult<QueryResponse<TTransformedPayload, TMeta, TExtra>, TError>>;
|
|
7
|
+
type BatchTransformResponsesFn<TPayload extends JsonValue, TTransformedPayload extends TPayload, TError, TMeta, TExtra> = (responses: readonly QueryResponse<TPayload, TMeta, TExtra>[]) => Promise<TryCatchResult<readonly QueryResponse<TTransformedPayload, TMeta, TExtra>[], TError>>;
|
|
8
|
+
export declare function createTransformError(error: unknown, url: URL): KontentSdkError;
|
|
9
|
+
export declare function createTransformResponse<TPayload extends JsonValue, TTransformedPayload extends TPayload, TError, TMeta, TExtra>({ config, transform, transformSchema, mapError }: {
|
|
10
|
+
readonly config: Pick<SdkConfig, "runtimeValidation">;
|
|
11
|
+
readonly transform: (response: QueryResponse<TPayload, TMeta, TExtra>) => QueryResponse<TTransformedPayload, TMeta, TExtra>;
|
|
12
|
+
readonly transformSchema: SchemaInput<TTransformedPayload>;
|
|
13
|
+
readonly mapError: (error: KontentSdkError) => TError;
|
|
14
|
+
}): TransformResponseFn<TPayload, TTransformedPayload, TError, TMeta, TExtra>;
|
|
15
|
+
export declare function createBatchTransformResponses<TPayload extends JsonValue, TTransformedPayload extends TPayload, TError, TMeta, TExtra>({ config, transform, transformSchema, mapError }: {
|
|
16
|
+
readonly config: Pick<SdkConfig, "runtimeValidation">;
|
|
17
|
+
readonly transform: (responses: readonly QueryResponse<TPayload, TMeta, TExtra>[]) => readonly QueryResponse<TTransformedPayload, TMeta, TExtra>[];
|
|
18
|
+
readonly transformSchema: SchemaInput<TTransformedPayload>;
|
|
19
|
+
readonly mapError: (error: KontentSdkError) => TError;
|
|
20
|
+
}): BatchTransformResponsesFn<TPayload, TTransformedPayload, TError, TMeta, TExtra>;
|
|
21
|
+
export declare function applyTransformOrThrow<TPayload extends JsonValue, TTransformedPayload extends TPayload, TError, TMeta, TExtra>(response: QueryResponse<TPayload, TMeta, TExtra>, transformResponse: TransformResponseFn<TPayload, TTransformedPayload, TError, TMeta, TExtra>): Promise<QueryResponse<TTransformedPayload, TMeta, TExtra>>;
|
|
22
|
+
export declare function applyTransformSafely<TPayload extends JsonValue, TTransformedPayload extends TPayload, TError, TMeta, TExtra>(safeResult: SafeQueryResult<QueryResponse<TPayload, TMeta, TExtra>, TError>, transformResponse: TransformResponseFn<TPayload, TTransformedPayload, TError, TMeta, TExtra>): Promise<SafeQueryResult<QueryResponse<TTransformedPayload, TMeta, TExtra>, TError>>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createSdkError } from "../../utils/error.utils.js";
|
|
2
|
+
import { resolveSchema } from "../../utils/schema.utils.js";
|
|
3
|
+
import { tryCatch } from "../../utils/try-catch.utils.js";
|
|
4
|
+
import { parseResponse } from "../sdk-utils.js";
|
|
5
|
+
export function createTransformError(error, url) {
|
|
6
|
+
return createSdkError({
|
|
7
|
+
baseErrorData: {
|
|
8
|
+
message: `Failed to transform payload for url ${url.toString()}`,
|
|
9
|
+
url: url.toString(),
|
|
10
|
+
retryAttempt: undefined,
|
|
11
|
+
retryStrategyOptions: undefined,
|
|
12
|
+
},
|
|
13
|
+
details: {
|
|
14
|
+
originalError: error,
|
|
15
|
+
reason: "transformError",
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function createTransformResponse({ config, transform, transformSchema, mapError, }) {
|
|
20
|
+
return async (response) => {
|
|
21
|
+
const { success, data: transformedResponse, error } = tryCatch(() => transform(response));
|
|
22
|
+
if (!success) {
|
|
23
|
+
return { success: false, error: mapError(createTransformError(error, response.meta.url)) };
|
|
24
|
+
}
|
|
25
|
+
if (config.runtimeValidation?.validateResponses) {
|
|
26
|
+
const schema = await resolveSchema(transformSchema);
|
|
27
|
+
if (schema) {
|
|
28
|
+
const validationError = await parseResponse({
|
|
29
|
+
url: transformedResponse.meta.url,
|
|
30
|
+
payload: transformedResponse.payload,
|
|
31
|
+
schema,
|
|
32
|
+
});
|
|
33
|
+
if (validationError) {
|
|
34
|
+
return { success: false, error: mapError(validationError.error) };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { success: true, data: transformedResponse };
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function createBatchTransformResponses({ config, transform, transformSchema, mapError, }) {
|
|
42
|
+
return async (responses) => {
|
|
43
|
+
const firstResponse = responses?.[0];
|
|
44
|
+
if (!firstResponse) {
|
|
45
|
+
return { success: true, data: [] };
|
|
46
|
+
}
|
|
47
|
+
const { success, data: transformedResponses, error } = tryCatch(() => transform(responses));
|
|
48
|
+
if (!success) {
|
|
49
|
+
return { success: false, error: mapError(createTransformError(error, firstResponse.meta.url)) };
|
|
50
|
+
}
|
|
51
|
+
if (config.runtimeValidation?.validateResponses) {
|
|
52
|
+
const schema = await resolveSchema(transformSchema);
|
|
53
|
+
if (schema) {
|
|
54
|
+
for (const transformedResponse of transformedResponses) {
|
|
55
|
+
const validationError = await parseResponse({
|
|
56
|
+
url: transformedResponse.meta.url,
|
|
57
|
+
payload: transformedResponse.payload,
|
|
58
|
+
schema,
|
|
59
|
+
});
|
|
60
|
+
if (validationError) {
|
|
61
|
+
return { success: false, error: mapError(validationError.error) };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return { success: true, data: transformedResponses };
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export async function applyTransformOrThrow(response, transformResponse) {
|
|
70
|
+
const { success, data, error } = await transformResponse(response);
|
|
71
|
+
if (!success) {
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
return data;
|
|
75
|
+
}
|
|
76
|
+
export async function applyTransformSafely(safeResult, transformResponse) {
|
|
77
|
+
if (!safeResult.success) {
|
|
78
|
+
return { success: false, error: safeResult.error };
|
|
79
|
+
}
|
|
80
|
+
const { success, data, error } = await transformResponse(safeResult.response);
|
|
81
|
+
if (!success) {
|
|
82
|
+
return { success: false, error };
|
|
83
|
+
}
|
|
84
|
+
return { success: true, response: data };
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=transform-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform-utils.js","sourceRoot":"","sources":["../../../lib/sdk/transform/transform-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Failure, Success } from "../utils/try-catch.utils.js";
|
|
2
|
+
export declare function poll<TResult, TError = unknown>(func: () => Promise<Success<TResult> | Failure<TResult, TError>>, config?: {
|
|
3
|
+
readonly intervalMs?: number;
|
|
4
|
+
readonly timeoutMs?: number;
|
|
5
|
+
}): Promise<Success<TResult> | Failure<TResult, TError>>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { sleep } from "../utils/core.utils.js";
|
|
2
|
+
const defaultIntervalMs = 1000;
|
|
3
|
+
const defaultTimeoutMs = 30000;
|
|
4
|
+
export async function poll(func, config) {
|
|
5
|
+
const intervalMs = config?.intervalMs ?? defaultIntervalMs;
|
|
6
|
+
const timeoutMs = config?.timeoutMs ?? defaultTimeoutMs;
|
|
7
|
+
const startTime = Date.now();
|
|
8
|
+
let result = await func();
|
|
9
|
+
while (!result.success && Date.now() - startTime <= timeoutMs) {
|
|
10
|
+
await sleep(intervalMs);
|
|
11
|
+
result = await func();
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=poll.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll.utils.js","sourceRoot":"","sources":["../../lib/testkit/poll.utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAG/C,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,IAAI,CACzB,IAAgE,EAChE,MAGC;IAED,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,IAAI,iBAAiB,CAAC;IAC3D,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,IAAI,gBAAgB,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IAE1B,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,SAAS,EAAE,CAAC;QAC/D,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;QACxB,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { HttpStatusCode } from "../http/http.models.js";
|
|
2
2
|
import type { JsonValue } from "../models/json.models.js";
|
|
3
3
|
export type FetchResponse = {
|
|
4
|
-
readonly statusCode:
|
|
4
|
+
readonly statusCode: HttpStatusCode;
|
|
5
5
|
readonly json: JsonValue;
|
|
6
6
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { GetNextPageData, HttpService, HttpStatusCode } from "../http/http.models.js";
|
|
2
|
+
import type { RetryStrategyOptions, SdkInfo } from "../models/core.models.js";
|
|
3
|
+
import type { JsonValue } from "../models/json.models.js";
|
|
4
|
+
export declare function mockGlobalFetchJsonResponse({ jsonResponse, statusCode, continuationToken }: {
|
|
5
|
+
readonly jsonResponse: JsonValue;
|
|
6
|
+
readonly statusCode: HttpStatusCode;
|
|
7
|
+
readonly continuationToken?: string;
|
|
8
|
+
}): void;
|
|
9
|
+
export declare function mockGlobalFetchBlobResponse({ blobResponse, statusCode }: {
|
|
10
|
+
readonly blobResponse: Blob;
|
|
11
|
+
readonly statusCode: HttpStatusCode;
|
|
12
|
+
}): void;
|
|
13
|
+
export declare function getFakeBlob(): Blob;
|
|
14
|
+
export declare function getTestSdkInfo(): SdkInfo;
|
|
15
|
+
export declare function getTestHttpServiceWithJsonResponse({ jsonResponse, statusCode, continuationToken, retryStrategy }: {
|
|
16
|
+
readonly jsonResponse: JsonValue | (() => Promise<JsonValue>);
|
|
17
|
+
readonly statusCode: HttpStatusCode;
|
|
18
|
+
readonly continuationToken?: string;
|
|
19
|
+
readonly retryStrategy?: RetryStrategyOptions;
|
|
20
|
+
}): HttpService;
|
|
21
|
+
export declare function preventInfinitePaging({ responseIndex, maxPagesCount, continuationToken, nextPageUrl }: {
|
|
22
|
+
readonly responseIndex: number;
|
|
23
|
+
readonly maxPagesCount: number;
|
|
24
|
+
readonly continuationToken?: string;
|
|
25
|
+
readonly nextPageUrl?: string | undefined;
|
|
26
|
+
}): ReturnType<GetNextPageData<null, null, unknown>>;
|
|
27
|
+
export declare function getNextPageUrl(index: number): string;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { vi } from "vitest";
|
|
2
|
+
import { getDefaultHttpService } from "../http/http.service.js";
|
|
3
|
+
import { isDefined } from "../utils/core.utils.js";
|
|
4
|
+
import { createContinuationHeader, findHeaderByName, toFetchHeaders } from "../utils/header.utils.js";
|
|
5
|
+
const upperBoundLimitForInfinitePaging = 50;
|
|
6
|
+
export function mockGlobalFetchJsonResponse({ jsonResponse, statusCode, continuationToken, }) {
|
|
7
|
+
global.fetch = getFetchJsonMock({
|
|
8
|
+
json: jsonResponse,
|
|
9
|
+
status: statusCode,
|
|
10
|
+
responseHeaders: continuationToken ? [createContinuationHeader(continuationToken)] : [],
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export function mockGlobalFetchBlobResponse({ blobResponse, statusCode, }) {
|
|
14
|
+
global.fetch = getFetchBlobMock({
|
|
15
|
+
blob: blobResponse,
|
|
16
|
+
status: statusCode,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function getFakeBlob() {
|
|
20
|
+
return new Blob(["x"], { type: "text/plain" });
|
|
21
|
+
}
|
|
22
|
+
export function getTestSdkInfo() {
|
|
23
|
+
return {
|
|
24
|
+
name: "test",
|
|
25
|
+
version: "0.0.0",
|
|
26
|
+
host: "sdk",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function getTestHttpServiceWithJsonResponse({ jsonResponse, statusCode, continuationToken, retryStrategy, }) {
|
|
30
|
+
return getDefaultHttpService({
|
|
31
|
+
retryStrategy: retryStrategy ?? {},
|
|
32
|
+
adapter: {
|
|
33
|
+
executeRequest: async ({ url }) => {
|
|
34
|
+
return {
|
|
35
|
+
responseHeaders: [...(continuationToken ? [createContinuationHeader(continuationToken)] : [])],
|
|
36
|
+
status: statusCode,
|
|
37
|
+
statusText: "",
|
|
38
|
+
url,
|
|
39
|
+
payload: typeof jsonResponse === "function" ? await jsonResponse() : jsonResponse,
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
downloadFile: async ({ url }) => {
|
|
43
|
+
return {
|
|
44
|
+
responseHeaders: [],
|
|
45
|
+
status: 200,
|
|
46
|
+
statusText: "",
|
|
47
|
+
url,
|
|
48
|
+
payload: await Promise.resolve(getFakeBlob()),
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export function preventInfinitePaging({ responseIndex, maxPagesCount, continuationToken, nextPageUrl, }) {
|
|
55
|
+
if (responseIndex >= maxPagesCount + upperBoundLimitForInfinitePaging) {
|
|
56
|
+
throw new Error("Infinite paging detected");
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
continuationToken,
|
|
60
|
+
nextPageUrl,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function getNextPageUrl(index) {
|
|
64
|
+
return `https://page-url.com/${index}`;
|
|
65
|
+
}
|
|
66
|
+
function getFetchBlobMock({ blob, status, responseHeaders, }) {
|
|
67
|
+
return getFetchMock({
|
|
68
|
+
blob,
|
|
69
|
+
status,
|
|
70
|
+
responseHeaders: responseHeaders ?? [],
|
|
71
|
+
json: undefined,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function getFetchJsonMock({ json, status, responseHeaders, }) {
|
|
75
|
+
return getFetchMock({
|
|
76
|
+
status,
|
|
77
|
+
responseHeaders: responseHeaders ?? [],
|
|
78
|
+
blob: undefined,
|
|
79
|
+
json,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function getFetchMock({ json, blob, status, responseHeaders, }) {
|
|
83
|
+
return vi.fn(async () => {
|
|
84
|
+
const baseResponse = {
|
|
85
|
+
ok: status >= 200 && status < 300,
|
|
86
|
+
headers: buildHeadersWithDefaultContentType(responseHeaders),
|
|
87
|
+
status,
|
|
88
|
+
json: async () => await Promise.resolve(json),
|
|
89
|
+
...(blob ? { blob: async () => await Promise.resolve(blob) } : {}),
|
|
90
|
+
};
|
|
91
|
+
return await Promise.resolve({
|
|
92
|
+
// only implement the methods we need, ignore the rest
|
|
93
|
+
...{},
|
|
94
|
+
...baseResponse,
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function buildHeadersWithDefaultContentType(headers) {
|
|
99
|
+
const defaultContentTypeHeader = getDefaultContentTypeHeaderIfMissing(headers);
|
|
100
|
+
const headersWithDefaults = [...headers, defaultContentTypeHeader].filter(isDefined);
|
|
101
|
+
return toFetchHeaders(headersWithDefaults);
|
|
102
|
+
}
|
|
103
|
+
function getDefaultContentTypeHeaderIfMissing(headers) {
|
|
104
|
+
const hasContentTypeHeader = findHeaderByName(headers, "Content-Type");
|
|
105
|
+
if (hasContentTypeHeader) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
name: "Content-Type",
|
|
110
|
+
value: "application/json",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=testkit.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testkit.utils.js","sourceRoot":"","sources":["../../lib/testkit/testkit.utils.ts"],"names":[],"mappings":"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"}
|
package/dist/testkit_api.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
/** biome-ignore-all lint/performance/noBarrelFile: One barrel for exported API is fine */
|
|
2
|
+
export { poll } from "./testkit/poll.utils.js";
|
|
2
3
|
export type { FetchResponse } from "./testkit/testkit.models.js";
|
|
4
|
+
export { getFakeBlob, getNextPageUrl, getTestHttpServiceWithJsonResponse, getTestSdkInfo, mockGlobalFetchBlobResponse, mockGlobalFetchJsonResponse, preventInfinitePaging, } from "./testkit/testkit.utils.js";
|
package/dist/testkit_api.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export {
|
|
1
|
+
/** biome-ignore-all lint/performance/noBarrelFile: One barrel for exported API is fine */
|
|
2
|
+
export { poll } from "./testkit/poll.utils.js";
|
|
3
|
+
export { getFakeBlob, getNextPageUrl, getTestHttpServiceWithJsonResponse, getTestSdkInfo, mockGlobalFetchBlobResponse, mockGlobalFetchJsonResponse, preventInfinitePaging, } from "./testkit/testkit.utils.js";
|
|
3
4
|
//# sourceMappingURL=testkit_api.js.map
|
package/dist/testkit_api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testkit_api.js","sourceRoot":"","sources":["../lib/testkit_api.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"testkit_api.js","sourceRoot":"","sources":["../lib/testkit_api.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE/C,OAAO,EACN,WAAW,EACX,cAAc,EACd,kCAAkC,EAClC,cAAc,EACd,2BAA2B,EAC3B,2BAA2B,EAC3B,qBAAqB,GACrB,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type AbortResult<TData> = {
|
|
2
|
+
readonly isAborted: false;
|
|
3
|
+
readonly data: TData;
|
|
4
|
+
} | {
|
|
5
|
+
readonly isAborted: true;
|
|
6
|
+
readonly data?: never;
|
|
7
|
+
};
|
|
8
|
+
export declare function runWithAbortSignal<T>({ func, abortSignal }: {
|
|
9
|
+
readonly func: () => Promise<T>;
|
|
10
|
+
readonly abortSignal: AbortSignal;
|
|
11
|
+
}): Promise<AbortResult<T>>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export async function runWithAbortSignal({ func, abortSignal, }) {
|
|
2
|
+
if (abortSignal.aborted) {
|
|
3
|
+
return {
|
|
4
|
+
isAborted: true,
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
const listenerName = "abort";
|
|
8
|
+
return await new Promise((resolve, reject) => {
|
|
9
|
+
const onAbort = () => {
|
|
10
|
+
cleanup();
|
|
11
|
+
resolve({ isAborted: true });
|
|
12
|
+
};
|
|
13
|
+
const cleanup = () => {
|
|
14
|
+
abortSignal.removeEventListener(listenerName, onAbort);
|
|
15
|
+
};
|
|
16
|
+
abortSignal.addEventListener(listenerName, onAbort);
|
|
17
|
+
func()
|
|
18
|
+
.then((result) => {
|
|
19
|
+
resolve({ isAborted: false, data: result });
|
|
20
|
+
})
|
|
21
|
+
.catch((error) => {
|
|
22
|
+
// forward any error that occurs during the execution of the function
|
|
23
|
+
reject(error);
|
|
24
|
+
})
|
|
25
|
+
.finally(() => {
|
|
26
|
+
cleanup();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=abort.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abort.utils.js","sourceRoot":"","sources":["../../lib/utils/abort.utils.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAI,EAC3C,IAAI,EACJ,WAAW,GAIX;IACA,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO;YACN,SAAS,EAAE,IAAI;SACf,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC;IAE7B,OAAO,MAAM,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,GAAG,EAAE;YACpB,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,EAAE;YACpB,WAAW,CAAC,mBAAmB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACxD,CAAC,CAAC;QACF,WAAW,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEpD,IAAI,EAAE;aACJ,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;YAChB,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAChB,qEAAqE;YACrE,MAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACb,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isNonEmptyArray<T>(array: readonly T[]): array is [T, ...T[]];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array.utils.js","sourceRoot":"","sources":["../../lib/utils/array.utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,eAAe,CAAI,KAAmB;IACrD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -1 +1,3 @@
|
|
|
1
|
-
export declare function
|
|
1
|
+
export declare function isDefined<T>(value: T): value is NonNullable<T>;
|
|
2
|
+
export declare function sleep(ms: number): Promise<void>;
|
|
3
|
+
export declare function isBlob(value: unknown): value is Blob;
|
package/dist/utils/core.utils.js
CHANGED
|
@@ -1,4 +1,20 @@
|
|
|
1
|
-
export function
|
|
2
|
-
return value !== undefined;
|
|
1
|
+
export function isDefined(value) {
|
|
2
|
+
return value !== undefined && value !== null;
|
|
3
|
+
}
|
|
4
|
+
export async function sleep(ms) {
|
|
5
|
+
return await new Promise((resolve) => {
|
|
6
|
+
setTimeout(resolve, ms);
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
export function isBlob(value) {
|
|
10
|
+
if (!value) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
if (value instanceof Blob) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
const record = value;
|
|
17
|
+
return (Object.prototype.toString.call(value) === "[object Blob]" ||
|
|
18
|
+
(typeof record.arrayBuffer === "function" && typeof record.size === "number"));
|
|
3
19
|
}
|
|
4
20
|
//# sourceMappingURL=core.utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.utils.js","sourceRoot":"","sources":["../../lib/utils/core.utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"core.utils.js","sourceRoot":"","sources":["../../lib/utils/core.utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAI,KAAQ;IACpC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,EAAU;IACrC,OAAO,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC1C,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAc;IACpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,KAAgC,CAAC;IAEhD,OAAO,CACN,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,eAAe;QACzD,CAAC,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAC7E,CAAC;AACH,CAAC"}
|
|
@@ -1,10 +1,26 @@
|
|
|
1
|
-
import type { AdapterResponse } from "../http/http.models.js";
|
|
2
|
-
import type { HttpMethod
|
|
3
|
-
import type
|
|
4
|
-
export declare function
|
|
5
|
-
|
|
6
|
-
readonly
|
|
1
|
+
import type { AdapterPayload, AdapterResponse } from "../http/http.models.js";
|
|
2
|
+
import type { HttpMethod } from "../models/core.models.js";
|
|
3
|
+
import { AdapterAbortError, AdapterParseError, type BaseErrorData, type ErrorDetails, type ErrorResponseData, KontentSdkError } from "../models/error.models.js";
|
|
4
|
+
export declare function createSdkError<TDetails extends ErrorDetails>({ baseErrorData, details }: {
|
|
5
|
+
readonly baseErrorData: BaseErrorData;
|
|
6
|
+
readonly details: TDetails;
|
|
7
|
+
}): KontentSdkError<TDetails>;
|
|
8
|
+
export declare function isKontent404Error(error: unknown): boolean;
|
|
9
|
+
export declare function isKontentSdkError(error: unknown): error is KontentSdkError;
|
|
10
|
+
export declare function isAdapterParseError(error: unknown): error is AdapterParseError;
|
|
11
|
+
export declare function isAdapterAbortError(error: unknown): error is AdapterAbortError;
|
|
12
|
+
export declare function toInvalidResponseMessage({ method, url, adapterResponse, kontentErrorData: kontentErrorResponse }: {
|
|
13
|
+
readonly url: URL;
|
|
7
14
|
readonly method: HttpMethod;
|
|
8
|
-
readonly adapterResponse: AdapterResponse
|
|
9
|
-
readonly
|
|
15
|
+
readonly adapterResponse: AdapterResponse<AdapterPayload>;
|
|
16
|
+
readonly kontentErrorData: ErrorResponseData | undefined;
|
|
10
17
|
}): string;
|
|
18
|
+
/**
|
|
19
|
+
* Checks if the given JSON value is a Kontent API error response data.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isKontentErrorResponseData(json: unknown): json is ErrorResponseData;
|
|
22
|
+
/**
|
|
23
|
+
* Checks if the given error is a fetch abort error.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isFetchAbortError(error: unknown): boolean;
|
|
26
|
+
export declare function toFriendlyKontentSdkErrorMessage(message: string, error: ErrorDetails): string;
|
|
@@ -1,13 +1,51 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { match, P } from "ts-pattern";
|
|
2
|
+
import { AdapterAbortError, AdapterParseError, errorResponseDataSchema, KontentSdkError, } from "../models/error.models.js";
|
|
3
|
+
import { isDefined } from "./core.utils.js";
|
|
4
|
+
export function createSdkError({ baseErrorData, details, }) {
|
|
5
|
+
return new KontentSdkError({
|
|
6
|
+
baseErrorData,
|
|
7
|
+
details,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
2
10
|
export function isKontent404Error(error) {
|
|
3
|
-
return
|
|
11
|
+
return isKontentSdkError(error) && error.details.reason === "notFound";
|
|
12
|
+
}
|
|
13
|
+
export function isKontentSdkError(error) {
|
|
14
|
+
return error instanceof KontentSdkError;
|
|
15
|
+
}
|
|
16
|
+
export function isAdapterParseError(error) {
|
|
17
|
+
return error instanceof AdapterParseError;
|
|
18
|
+
}
|
|
19
|
+
export function isAdapterAbortError(error) {
|
|
20
|
+
return error instanceof AdapterAbortError;
|
|
4
21
|
}
|
|
5
|
-
export function
|
|
6
|
-
const details = kontentErrorResponse ? getKontentErrorResponseMessage(adapterResponse, kontentErrorResponse) :
|
|
7
|
-
return `Failed to execute '${method}' request '${url}'.${details
|
|
22
|
+
export function toInvalidResponseMessage({ method, url, adapterResponse, kontentErrorData: kontentErrorResponse, }) {
|
|
23
|
+
const details = kontentErrorResponse ? ` ${getKontentErrorResponseMessage(adapterResponse, kontentErrorResponse)}` : "";
|
|
24
|
+
return `Failed to execute '${method}' request '${url.toString()}'.${details}`;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Checks if the given JSON value is a Kontent API error response data.
|
|
28
|
+
*/
|
|
29
|
+
export function isKontentErrorResponseData(json) {
|
|
30
|
+
if (!json || typeof json !== "object" || Array.isArray(json)) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return errorResponseDataSchema.safeParse(json).success;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Checks if the given error is a fetch abort error.
|
|
37
|
+
*/
|
|
38
|
+
export function isFetchAbortError(error) {
|
|
39
|
+
if (!error || typeof error !== "object") {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return "name" in error && error.name === "AbortError";
|
|
8
43
|
}
|
|
9
|
-
function
|
|
10
|
-
return error
|
|
44
|
+
export function toFriendlyKontentSdkErrorMessage(message, error) {
|
|
45
|
+
return match(error)
|
|
46
|
+
.returnType()
|
|
47
|
+
.with({ reason: P.union("invalidResponse", "notFound"), kontentErrorResponse: P.nonNullable }, (m) => `${message} ${m.kontentErrorResponse.message}`)
|
|
48
|
+
.otherwise(() => message);
|
|
11
49
|
}
|
|
12
50
|
function getValidationErrorMessage(validationErrors) {
|
|
13
51
|
if (!validationErrors?.length) {
|
|
@@ -19,13 +57,13 @@ function getValidationErrorMessage(validationErrors) {
|
|
|
19
57
|
m.path ? `path: ${m.path}` : undefined,
|
|
20
58
|
m.line ? `line: ${m.line}` : undefined,
|
|
21
59
|
m.position ? `position: ${m.position}` : undefined,
|
|
22
|
-
].filter(
|
|
60
|
+
].filter(isDefined);
|
|
23
61
|
return `${m.message}${details.length ? ` (${details.join(", ")})` : ""}`;
|
|
24
62
|
})
|
|
25
63
|
.join(", ");
|
|
26
64
|
}
|
|
27
65
|
function getKontentErrorResponseMessage(adapterResponse, kontentErrorResponse) {
|
|
28
66
|
const validationErrorMessage = getValidationErrorMessage(kontentErrorResponse.validation_errors);
|
|
29
|
-
return `
|
|
67
|
+
return `Request failed with status '${adapterResponse.status}' and status text '${adapterResponse.statusText}'. ${kontentErrorResponse.message}${validationErrorMessage ? ` ${validationErrorMessage}` : ""}`;
|
|
30
68
|
}
|
|
31
69
|
//# sourceMappingURL=error.utils.js.map
|