@kontent-ai/core-sdk 12.0.0-preview.2 → 12.0.0-preview.21

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.
Files changed (127) hide show
  1. package/.npmignore +1 -5
  2. package/LICENSE.md +1 -1
  3. package/README.md +177 -12
  4. package/dist/core-sdk-info.d.ts +2 -0
  5. package/dist/core-sdk-info.js +6 -0
  6. package/dist/core-sdk-info.js.map +1 -0
  7. package/dist/devkit/console.utils.d.ts +2 -0
  8. package/dist/devkit/console.utils.js +5 -0
  9. package/dist/devkit/console.utils.js.map +1 -0
  10. package/dist/devkit/environment.utils.d.ts +2 -0
  11. package/dist/devkit/environment.utils.js +12 -0
  12. package/dist/devkit/environment.utils.js.map +1 -0
  13. package/dist/devkit/script.utils.js +3 -3
  14. package/dist/devkit/script.utils.js.map +1 -1
  15. package/dist/devkit_api.d.ts +3 -0
  16. package/dist/devkit_api.js +3 -1
  17. package/dist/devkit_api.js.map +1 -1
  18. package/dist/http/http.adapter.d.ts +1 -1
  19. package/dist/http/http.adapter.js +78 -24
  20. package/dist/http/http.adapter.js.map +1 -1
  21. package/dist/http/http.models.d.ts +42 -32
  22. package/dist/http/http.service.js +294 -220
  23. package/dist/http/http.service.js.map +1 -1
  24. package/dist/models/core.models.d.ts +34 -29
  25. package/dist/models/error.models.d.ts +48 -27
  26. package/dist/models/error.models.js +40 -1
  27. package/dist/models/error.models.js.map +1 -1
  28. package/dist/models/json.models.d.ts +13 -4
  29. package/dist/models/json.models.js +10 -1
  30. package/dist/models/json.models.js.map +1 -1
  31. package/dist/models/utility.types.d.ts +16 -0
  32. package/dist/models/utility.types.js +2 -0
  33. package/dist/models/utility.types.js.map +1 -0
  34. package/dist/public_api.d.ts +19 -11
  35. package/dist/public_api.js +15 -6
  36. package/dist/public_api.js.map +1 -1
  37. package/dist/sdk/queries/fetch-sdk-query.d.ts +7 -0
  38. package/dist/sdk/queries/fetch-sdk-query.js +24 -0
  39. package/dist/sdk/queries/fetch-sdk-query.js.map +1 -0
  40. package/dist/sdk/queries/mutation-sdk-query.d.ts +4 -0
  41. package/dist/sdk/queries/mutation-sdk-query.js +17 -0
  42. package/dist/sdk/queries/mutation-sdk-query.js.map +1 -0
  43. package/dist/sdk/queries/paged-fetch-sdk-query.d.ts +6 -0
  44. package/dist/sdk/queries/paged-fetch-sdk-query.js +145 -0
  45. package/dist/sdk/queries/paged-fetch-sdk-query.js.map +1 -0
  46. package/dist/sdk/resolve-query.d.ts +8 -0
  47. package/dist/sdk/resolve-query.js +108 -0
  48. package/dist/sdk/resolve-query.js.map +1 -0
  49. package/dist/sdk/sdk-config.d.ts +3 -0
  50. package/dist/sdk/sdk-config.js +4 -0
  51. package/dist/sdk/sdk-config.js.map +1 -0
  52. package/dist/sdk/sdk-models.d.ts +101 -36
  53. package/dist/sdk/sdk-utils.d.ts +2 -0
  54. package/dist/sdk/sdk-utils.js +9 -0
  55. package/dist/sdk/sdk-utils.js.map +1 -0
  56. package/dist/testkit/poll.utils.d.ts +5 -0
  57. package/dist/testkit/poll.utils.js +24 -0
  58. package/dist/testkit/poll.utils.js.map +1 -0
  59. package/dist/testkit/testkit.utils.d.ts +20 -0
  60. package/dist/testkit/testkit.utils.js +100 -0
  61. package/dist/testkit/testkit.utils.js.map +1 -0
  62. package/dist/testkit_api.d.ts +3 -1
  63. package/dist/testkit_api.js +3 -2
  64. package/dist/testkit_api.js.map +1 -1
  65. package/dist/utils/abort.utils.d.ts +12 -0
  66. package/dist/utils/abort.utils.js +29 -0
  67. package/dist/utils/abort.utils.js.map +1 -0
  68. package/dist/utils/core.utils.d.ts +3 -1
  69. package/dist/utils/core.utils.js +22 -2
  70. package/dist/utils/core.utils.js.map +1 -1
  71. package/dist/utils/error.utils.d.ts +18 -7
  72. package/dist/utils/error.utils.js +35 -7
  73. package/dist/utils/error.utils.js.map +1 -1
  74. package/dist/utils/header.utils.d.ts +6 -1
  75. package/dist/utils/header.utils.js +37 -6
  76. package/dist/utils/header.utils.js.map +1 -1
  77. package/dist/utils/retry.utils.d.ts +16 -11
  78. package/dist/utils/retry.utils.js +131 -63
  79. package/dist/utils/retry.utils.js.map +1 -1
  80. package/dist/utils/sdk-version.utils.js +2 -2
  81. package/dist/utils/sdk-version.utils.js.map +1 -1
  82. package/dist/utils/try-catch.utils.d.ts +15 -0
  83. package/dist/utils/{try.utils.js → try-catch.utils.js} +1 -1
  84. package/dist/utils/try-catch.utils.js.map +1 -0
  85. package/dist/utils/type.utils.d.ts +2 -0
  86. package/dist/utils/type.utils.js +5 -0
  87. package/dist/utils/type.utils.js.map +1 -0
  88. package/dist/utils/url.utils.d.ts +5 -0
  89. package/dist/utils/url.utils.js +10 -0
  90. package/dist/utils/url.utils.js.map +1 -0
  91. package/package.json +61 -64
  92. package/dist/models/utility.models.d.ts +0 -20
  93. package/dist/models/utility.models.js +0 -2
  94. package/dist/models/utility.models.js.map +0 -1
  95. package/dist/sdk/sdk-queries.d.ts +0 -30
  96. package/dist/sdk/sdk-queries.js +0 -152
  97. package/dist/sdk/sdk-queries.js.map +0 -1
  98. package/dist/sdk-info.d.ts +0 -5
  99. package/dist/sdk-info.js +0 -6
  100. package/dist/sdk-info.js.map +0 -1
  101. package/dist/testkit/test.utils.d.ts +0 -15
  102. package/dist/testkit/test.utils.js +0 -42
  103. package/dist/testkit/test.utils.js.map +0 -1
  104. package/dist/utils/try.utils.d.ts +0 -14
  105. package/dist/utils/try.utils.js.map +0 -1
  106. package/lib/devkit/script.utils.ts +0 -12
  107. package/lib/devkit_api.ts +0 -3
  108. package/lib/http/http.adapter.ts +0 -38
  109. package/lib/http/http.models.ts +0 -122
  110. package/lib/http/http.service.ts +0 -320
  111. package/lib/models/core.models.ts +0 -89
  112. package/lib/models/error.models.ts +0 -83
  113. package/lib/models/json.models.ts +0 -9
  114. package/lib/models/utility.models.ts +0 -21
  115. package/lib/public_api.ts +0 -45
  116. package/lib/sdk/sdk-models.ts +0 -85
  117. package/lib/sdk/sdk-queries.ts +0 -232
  118. package/lib/sdk-info.ts +0 -5
  119. package/lib/testkit/test.utils.ts +0 -79
  120. package/lib/testkit/testkit.models.ts +0 -7
  121. package/lib/testkit_api.ts +0 -3
  122. package/lib/utils/core.utils.ts +0 -3
  123. package/lib/utils/error.utils.ts +0 -48
  124. package/lib/utils/header.utils.ts +0 -40
  125. package/lib/utils/retry.utils.ts +0 -156
  126. package/lib/utils/sdk-version.utils.ts +0 -16
  127. package/lib/utils/try.utils.ts +0 -30
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Shared query models/types intended to be reused across SDKs (e.g. Sync, Delivery, Management)
3
+ * to keep common code and behavior consistent.
4
+ */
5
+ import { getDefaultHttpService } from "../http/http.service.js";
6
+ import { createSdkError } from "../utils/error.utils.js";
7
+ import { createAuthorizationHeader, createContinuationHeader, extractContinuationToken, getSdkIdHeader } from "../utils/header.utils.js";
8
+ import { tryCatch } from "../utils/try-catch.utils.js";
9
+ export async function resolveQuery({ config, request, mapMetadata, zodSchema, sdkInfo, method, abortSignal, mapError, }) {
10
+ const urlToUse = config.baseUrl ? setBaseUrl(request.url, config.baseUrl) : request.url;
11
+ const { success, response, error } = await getHttpService(config).request({
12
+ body: request.body,
13
+ url: urlToUse,
14
+ method,
15
+ abortSignal,
16
+ requestHeaders: getCombinedRequestHeaders({
17
+ requestHeaders: request.requestHeaders ?? [],
18
+ continuationToken: request.continuationToken,
19
+ authorizationApiKey: request.authorizationApiKey,
20
+ sdkInfo,
21
+ }),
22
+ });
23
+ if (!success) {
24
+ return {
25
+ success: false,
26
+ error: mapError(error),
27
+ };
28
+ }
29
+ if (config.responseValidation?.enable) {
30
+ const validationError = await validateResponse({ url: response.adapterResponse.url, response, zodSchema });
31
+ if (validationError) {
32
+ return {
33
+ success: false,
34
+ error: mapError(validationError.error),
35
+ };
36
+ }
37
+ }
38
+ const continuationTokenFromResponse = extractContinuationToken(response.adapterResponse.responseHeaders);
39
+ const result = {
40
+ success: true,
41
+ response: {
42
+ payload: response.payload,
43
+ meta: {
44
+ ...mapMetadata(response, { continuationToken: continuationTokenFromResponse }),
45
+ url: response.adapterResponse.url,
46
+ responseHeaders: response.adapterResponse.responseHeaders,
47
+ status: response.adapterResponse.status,
48
+ continuationToken: continuationTokenFromResponse,
49
+ },
50
+ },
51
+ };
52
+ return result;
53
+ }
54
+ /**
55
+ * We are intentionally not throwing errors here as parsing errors are handled by the HttpService.
56
+ */
57
+ function setBaseUrl(url, baseUrl) {
58
+ const { success, data: parsedUrl } = tryCatch(() => new URL(url));
59
+ if (!success) {
60
+ return url;
61
+ }
62
+ if (baseUrl.startsWith("http")) {
63
+ const { success, data: parsedBaseUrl } = tryCatch(() => new URL(baseUrl));
64
+ if (!success) {
65
+ return url;
66
+ }
67
+ parsedUrl.host = parsedBaseUrl.host;
68
+ parsedUrl.protocol = parsedBaseUrl.protocol;
69
+ return parsedUrl.toString();
70
+ }
71
+ parsedUrl.host = baseUrl;
72
+ return parsedUrl.toString();
73
+ }
74
+ async function validateResponse({ url, response, zodSchema, }) {
75
+ const { success, error } = await zodSchema.safeParseAsync(response.payload);
76
+ if (!success) {
77
+ return {
78
+ success: false,
79
+ error: createSdkError({
80
+ baseErrorData: {
81
+ message: `Failed to validate response schema for url '${url}'`,
82
+ url,
83
+ retryStrategyOptions: undefined,
84
+ retryAttempt: undefined,
85
+ },
86
+ details: {
87
+ reason: "validationFailed",
88
+ zodError: error,
89
+ response,
90
+ url,
91
+ },
92
+ }),
93
+ };
94
+ }
95
+ return undefined;
96
+ }
97
+ function getHttpService(config) {
98
+ return config.httpService ?? getDefaultHttpService();
99
+ }
100
+ function getCombinedRequestHeaders({ requestHeaders, continuationToken, authorizationApiKey, sdkInfo, }) {
101
+ return [
102
+ getSdkIdHeader(sdkInfo),
103
+ ...requestHeaders.filter((header) => header.name !== "X-KC-SDKID"),
104
+ ...(continuationToken ? [createContinuationHeader(continuationToken)] : []),
105
+ ...(authorizationApiKey ? [createAuthorizationHeader(authorizationApiKey)] : []),
106
+ ];
107
+ }
108
+ //# sourceMappingURL=resolve-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-query.js","sourceRoot":"","sources":["../../lib/sdk/resolve-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import z from "zod";
2
+ export declare const nilUuid = "00000000-0000-0000-0000-000000000000";
3
+ export declare const kontentUuidSchema: z.ZodUnion<readonly [z.ZodUUID, z.ZodLiteral<"00000000-0000-0000-0000-000000000000">]>;
@@ -0,0 +1,4 @@
1
+ import z from "zod";
2
+ export const nilUuid = "00000000-0000-0000-0000-000000000000";
3
+ export const kontentUuidSchema = z.union([z.uuid({ version: "v4" }), z.literal(nilUuid)]);
4
+ //# sourceMappingURL=sdk-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-config.js","sourceRoot":"","sources":["../../lib/sdk/sdk-config.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,CAAC,MAAM,OAAO,GAAG,sCAAsC,CAAC;AAE9D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC"}
@@ -2,18 +2,22 @@
2
2
  * Shared query models/types intended to be reused across SDKs (e.g. Sync, Delivery, Management)
3
3
  * to keep common code and behavior consistent.
4
4
  */
5
- import type { AdapterResponse, HttpResponse, HttpService } from "../http/http.models.js";
6
- import type { CoreSdkError } from "../models/error.models.js";
5
+ import type z from "zod";
6
+ import type { ZodType } from "zod";
7
+ import type { AdapterPayload, AdapterResponse, HttpPayload, HttpRequestBody, HttpResponse, HttpService, PaginationConfig } from "../http/http.models.js";
8
+ import type { Header, HttpMethod, SDKInfo } from "../models/core.models.js";
9
+ import type { KontentSdkError } from "../models/error.models.js";
7
10
  import type { JsonValue } from "../models/json.models.js";
8
- import type { Prettify } from "../models/utility.models.js";
9
- export type CoreResponseMeta<TExtraMetadata = unknown> = Pick<AdapterResponse, "status" | "responseHeaders"> & {
10
- readonly continuationToken?: string;
11
- } & TExtraMetadata;
12
- export type CoreResponse<TPayload, TExtraMetadata = unknown> = {
13
- readonly payload: TPayload;
14
- readonly meta: CoreResponseMeta<TExtraMetadata>;
11
+ import type { PickStringLiteral } from "../models/utility.types.js";
12
+ import type { Failure, Success } from "../utils/try-catch.utils.js";
13
+ export type QueryResponseMeta<TMeta> = Pick<AdapterResponse<AdapterPayload>, "status" | "responseHeaders" | "url"> & {
14
+ readonly continuationToken: string | undefined;
15
+ } & TMeta;
16
+ export type QueryResponse<TResponsePayload, TMeta> = {
17
+ readonly payload: TResponsePayload;
18
+ readonly meta: QueryResponseMeta<TMeta>;
15
19
  };
16
- export type CoreSdkConfig = {
20
+ export type SdkConfig = {
17
21
  /**
18
22
  * The HTTP service to use for the request. If not provided, the default HTTP service will be used.
19
23
  *
@@ -33,7 +37,7 @@ export type CoreSdkConfig = {
33
37
  */
34
38
  readonly responseValidation?: {
35
39
  /**
36
- * When enabled, the response payload will be validated against the expected Zod schema from which the types
40
+ * When enabled, the response data will be validated against the expected Zod schema from which the types
37
41
  * this library are based on. This ensures that you are working with the correct data types.
38
42
  *
39
43
  * @default false
@@ -41,42 +45,103 @@ export type CoreSdkConfig = {
41
45
  readonly enable: boolean;
42
46
  };
43
47
  };
44
- export type Query<TPayload, TExtraData = unknown> = {
45
- toUrl(): string;
46
- toPromise(): Promise<QueryResult<CoreResponse<TPayload, TExtraData>>>;
48
+ export type Query<TResponsePayload> = {
49
+ readonly schema: z.ZodType<TResponsePayload>;
50
+ readonly url: string;
47
51
  };
48
- export type PagingQuery<TPayload, TExtraData = unknown> = Query<TPayload, TExtraData> & {
49
- toAllPromise(): Promise<PagingQueryResult<CoreResponse<TPayload, TExtraData>>>;
52
+ export type FetchQuery<TResponsePayload, TMeta, TError> = Query<TResponsePayload> & {
53
+ fetchSafe(): Promise<QueryResult<QueryResponse<TResponsePayload, TMeta>, TError>>;
54
+ fetch(): Promise<QueryResponse<TResponsePayload, TMeta>>;
50
55
  };
51
- export type SuccessfulHttpResponse<TPayload extends JsonValue, TBodyData extends JsonValue> = Prettify<Extract<HttpResponse<TPayload, TBodyData>, {
52
- readonly success: true;
53
- }>["response"]>;
54
- export type ResultOfSuccessfulQuery<TQuery extends Query<unknown>> = Extract<Awaited<ReturnType<TQuery["toPromise"]>>, {
56
+ export type PagedFetchQuery<TResponsePayload, TMeta, TError> = Query<TResponsePayload> & {
57
+ fetchPageSafe(): Promise<QueryResult<QueryResponse<TResponsePayload, TMeta>, TError>>;
58
+ fetchPage(): Promise<QueryResponse<TResponsePayload, TMeta>>;
59
+ fetchAllPagesSafe(config?: PaginationConfig): Promise<SafePagingQueryResult<QueryResponse<TResponsePayload, TMeta>, TError>>;
60
+ fetchAllPages(config?: PaginationConfig): Promise<PagingQueryResult<QueryResponse<TResponsePayload, TMeta>>>;
61
+ pagesSafe(config?: PaginationConfig): AsyncGenerator<QueryResult<QueryResponse<TResponsePayload, TMeta>, TError>>;
62
+ pages(config?: PaginationConfig): AsyncGenerator<QueryResponse<TResponsePayload, TMeta>>;
63
+ };
64
+ /**
65
+ * Not yet implemented.
66
+ *
67
+ * @todo Implement mutation query.
68
+ */
69
+ export type MutationQuery<TResponsePayload, TMeta, TError> = Query<TResponsePayload> & {
70
+ executeSafe(): Promise<QueryResult<QueryResponse<TResponsePayload, TMeta>, TError>>;
71
+ execute(): Promise<QueryResponse<TResponsePayload, TMeta>>;
72
+ };
73
+ export type NextPageStateWithRequest = {
74
+ readonly pageSource: "continuationToken";
75
+ readonly hasNextPage: true;
76
+ readonly continuationToken: string;
77
+ readonly nextPageUrl?: never;
78
+ } | {
79
+ readonly pageSource: "nextPageUrl";
80
+ readonly hasNextPage: true;
81
+ readonly continuationToken?: never;
82
+ readonly nextPageUrl: string;
83
+ } | {
84
+ readonly pageSource: "firstRequest";
85
+ readonly hasNextPage: true;
86
+ readonly continuationToken?: never;
87
+ readonly nextPageUrl?: never;
88
+ };
89
+ export type SuccessfulHttpResponse<TResponsePayload extends HttpPayload, TRequestBody extends HttpRequestBody> = Extract<HttpResponse<TResponsePayload, TRequestBody>, {
55
90
  readonly success: true;
56
91
  }>["response"];
57
92
  /**
58
- * A nomadic result type that represents a success or failure of an operation.
93
+ * Result type that represents a success or failure of an operation.
59
94
  *
60
95
  * Ensures that consumers of this library handle both success and failure cases.
61
96
  */
62
- export type QueryResult<TResponse> = (Success & {
63
- readonly response: TResponse;
64
- }) | (Failure & {
97
+ export type QueryResult<TResponsePayload, TError> = Success<{
98
+ readonly response: TResponsePayload;
99
+ }> | Failure<{
65
100
  readonly response?: never;
66
- });
67
- export type PagingQueryResult<TResponse> = (Success & {
68
- readonly responses: TResponse[];
69
- readonly lastContinuationToken: string;
70
- }) | (Failure & {
101
+ }, TError>;
102
+ export type SafePagingQueryResult<TResponsePayload, TError> = Success<{
103
+ readonly responses: readonly TResponsePayload[];
104
+ readonly partialResponses?: never;
105
+ readonly lastContinuationToken: string | undefined;
106
+ }> | Failure<{
71
107
  readonly responses?: never;
72
108
  readonly lastContinuationToken?: never;
73
- });
74
- type Success = {
75
- readonly success: true;
76
- readonly error?: never;
109
+ readonly partialResponses: readonly TResponsePayload[];
110
+ }, TError>;
111
+ export type PagingQueryResult<TResponsePayload> = {
112
+ readonly responses: readonly TResponsePayload[];
113
+ readonly lastContinuationToken: string | undefined;
114
+ };
115
+ export type QueryPromiseResult<TResponsePayload extends JsonValue, TMeta, TError> = ReturnType<Pick<FetchQuery<TResponsePayload, TMeta, TError>, "fetchSafe">["fetchSafe"]>;
116
+ export type FetchQueryRequest<TResponsePayload extends JsonValue, TMeta, TError> = Pick<ResolveQueryData<TResponsePayload, null, TMeta, TError>, "config" | "zodSchema" | "sdkInfo" | "mapMetadata" | "abortSignal" | "mapError"> & {
117
+ readonly request: RequestDataWithoutBody;
118
+ };
119
+ export type MutationQueryRequest<TResponsePayload extends JsonValue, TRequestBody extends HttpRequestBody, TMeta, TError> = Pick<ResolveQueryData<TResponsePayload, TRequestBody, TMeta, TError>, "config" | "zodSchema" | "sdkInfo" | "mapMetadata" | "abortSignal" | "request" | "mapError"> & {
120
+ readonly method: MutationHttpMethod;
121
+ };
122
+ export type ResolveQueryData<TResponsePayload extends JsonValue, TRequestBody extends HttpRequestBody, TMeta, TError> = {
123
+ readonly method: HttpMethod;
124
+ readonly request: RequestData<TRequestBody>;
125
+ readonly config: SdkConfig;
126
+ readonly zodSchema: ZodType<TResponsePayload>;
127
+ readonly sdkInfo: SDKInfo;
128
+ readonly abortSignal?: AbortSignal | undefined;
129
+ readonly mapError: (error: KontentSdkError) => TError;
130
+ } & MetadataMapperConfig<TResponsePayload, TRequestBody, TMeta>;
131
+ type MetadataMapperConfig<TResponsePayload extends JsonValue, TRequestBody extends HttpRequestBody, TMeta> = {
132
+ readonly mapMetadata: MetadataMapper<TResponsePayload, TRequestBody, TMeta>;
133
+ };
134
+ type MetadataMapper<TResponsePayload extends JsonValue, TRequestBody extends HttpRequestBody, TMeta> = (response: SuccessfulHttpResponse<TResponsePayload, TRequestBody>, data: MetadataContextData) => TMeta;
135
+ type MetadataContextData = {
136
+ readonly continuationToken: string | undefined;
77
137
  };
78
- type Failure = {
79
- readonly success: false;
80
- readonly error: CoreSdkError;
138
+ type RequestData<TRequestBody extends HttpRequestBody> = {
139
+ readonly url: string;
140
+ readonly body: TRequestBody;
141
+ readonly requestHeaders?: readonly Header[];
142
+ readonly continuationToken?: string | undefined;
143
+ readonly authorizationApiKey?: string | undefined;
81
144
  };
145
+ type MutationHttpMethod = PickStringLiteral<HttpMethod, "POST" | "PUT" | "PATCH" | "DELETE">;
146
+ type RequestDataWithoutBody = Omit<RequestData<never>, "body">;
82
147
  export {};
@@ -0,0 +1,2 @@
1
+ import type { PagedFetchQuery, Query } from "./sdk-models.js";
2
+ export declare function isPagingQuery<T, TBody = null, TError = unknown>(query: Query<T> | PagedFetchQuery<T, TBody, TError>): query is PagedFetchQuery<T, TBody, TError>;
@@ -0,0 +1,9 @@
1
+ export function isPagingQuery(query) {
2
+ return ("fetchPage" in query &&
3
+ "fetchPageSafe" in query &&
4
+ "fetchAllPages" in query &&
5
+ "fetchAllPagesSafe" in query &&
6
+ "pages" in query &&
7
+ "pagesSafe" in query);
8
+ }
9
+ //# sourceMappingURL=sdk-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdk-utils.js","sourceRoot":"","sources":["../../lib/sdk/sdk-utils.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAC5B,KAAmD;IAEnD,OAAO,CACN,WAAW,IAAI,KAAK;QACpB,eAAe,IAAI,KAAK;QACxB,eAAe,IAAI,KAAK;QACxB,mBAAmB,IAAI,KAAK;QAC5B,OAAO,IAAI,KAAK;QAChB,WAAW,IAAI,KAAK,CACpB,CAAC;AACH,CAAC"}
@@ -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,24 @@
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 elapsedMs = 0;
9
+ let latestAttempt;
10
+ while (elapsedMs <= timeoutMs) {
11
+ const result = await func();
12
+ latestAttempt = result;
13
+ if (result.success) {
14
+ return result;
15
+ }
16
+ elapsedMs = Date.now() - startTime;
17
+ await sleep(intervalMs);
18
+ }
19
+ if (!latestAttempt) {
20
+ throw new Error("Invalid latest attempt in poll result");
21
+ }
22
+ return latestAttempt;
23
+ }
24
+ //# 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,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,aAAsE,CAAC;IAE3E,OAAO,SAAS,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QAC5B,aAAa,GAAG,MAAM,CAAC;QAEvB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC;QACf,CAAC;QAED,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACnC,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,aAAa,CAAC;AACtB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { HttpService, HttpServiceStatus } 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: HttpServiceStatus;
7
+ readonly continuationToken?: string;
8
+ }): void;
9
+ export declare function mockGlobalFetchBlobResponse({ blobResponse, statusCode, }: {
10
+ readonly blobResponse: Blob;
11
+ readonly statusCode: HttpServiceStatus;
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: HttpServiceStatus;
18
+ readonly continuationToken?: string;
19
+ readonly retryStrategy?: RetryStrategyOptions;
20
+ }): HttpService;
@@ -0,0 +1,100 @@
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
+ export function mockGlobalFetchJsonResponse({ jsonResponse, statusCode, continuationToken, }) {
6
+ global.fetch = getFetchJsonMock({
7
+ json: jsonResponse,
8
+ status: statusCode,
9
+ responseHeaders: continuationToken ? [createContinuationHeader(continuationToken)] : [],
10
+ });
11
+ }
12
+ export function mockGlobalFetchBlobResponse({ blobResponse, statusCode, }) {
13
+ global.fetch = getFetchBlobMock({
14
+ blob: blobResponse,
15
+ status: statusCode,
16
+ });
17
+ }
18
+ export function getFakeBlob() {
19
+ return new Blob(["x"], { type: "text/plain" });
20
+ }
21
+ export function getTestSdkInfo() {
22
+ return {
23
+ name: "test",
24
+ version: "0.0.0",
25
+ host: "sdk",
26
+ };
27
+ }
28
+ export function getTestHttpServiceWithJsonResponse({ jsonResponse, statusCode, continuationToken, retryStrategy, }) {
29
+ return getDefaultHttpService({
30
+ retryStrategy: retryStrategy ?? {},
31
+ adapter: {
32
+ executeRequest: async ({ url }) => {
33
+ return {
34
+ responseHeaders: [...(continuationToken ? [createContinuationHeader(continuationToken)] : [])],
35
+ status: statusCode,
36
+ statusText: "",
37
+ url,
38
+ payload: typeof jsonResponse === "function" ? await jsonResponse() : jsonResponse,
39
+ };
40
+ },
41
+ downloadFile: async ({ url }) => {
42
+ return {
43
+ responseHeaders: [],
44
+ status: 200,
45
+ statusText: "",
46
+ url,
47
+ payload: await Promise.resolve(getFakeBlob()),
48
+ };
49
+ },
50
+ },
51
+ });
52
+ }
53
+ function getFetchBlobMock({ blob, status, responseHeaders, }) {
54
+ return getFetchMock({
55
+ blob,
56
+ status,
57
+ responseHeaders: responseHeaders ?? [],
58
+ json: undefined,
59
+ });
60
+ }
61
+ function getFetchJsonMock({ json, status, responseHeaders, }) {
62
+ return getFetchMock({
63
+ status,
64
+ responseHeaders: responseHeaders ?? [],
65
+ blob: undefined,
66
+ json,
67
+ });
68
+ }
69
+ function getFetchMock({ json, blob, status, responseHeaders, }) {
70
+ return vi.fn(async () => {
71
+ const baseResponse = {
72
+ ok: status >= 200 && status < 300,
73
+ headers: buildHeadersWithDefaultContentType(responseHeaders),
74
+ status,
75
+ json: async () => await Promise.resolve(json),
76
+ ...(blob ? { blob: async () => await Promise.resolve(blob) } : {}),
77
+ };
78
+ return await Promise.resolve({
79
+ // only implement the methods we need, ignore the rest
80
+ ...{},
81
+ ...baseResponse,
82
+ });
83
+ });
84
+ }
85
+ function buildHeadersWithDefaultContentType(headers) {
86
+ const defaultContentTypeHeader = getDefaultContentTypeHeaderIfMissing(headers);
87
+ const headersWithDefaults = [...headers, defaultContentTypeHeader].filter(isDefined);
88
+ return toFetchHeaders(headersWithDefaults);
89
+ }
90
+ function getDefaultContentTypeHeaderIfMissing(headers) {
91
+ const hasContentTypeHeader = findHeaderByName(headers, "Content-Type");
92
+ if (hasContentTypeHeader) {
93
+ return undefined;
94
+ }
95
+ return {
96
+ name: "Content-Type",
97
+ value: "application/json",
98
+ };
99
+ }
100
+ //# 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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"}
@@ -1,2 +1,4 @@
1
- export { getFakeBlob, getFetchBlobMock, getFetchJsonMock } from "./testkit/test.utils.js";
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, getTestHttpServiceWithJsonResponse, getTestSdkInfo, mockGlobalFetchBlobResponse, mockGlobalFetchJsonResponse, } from "./testkit/testkit.utils.js";
@@ -1,3 +1,4 @@
1
- // biome-ignore lint/performance/noBarrelFile: One barrel for the Devkit API is fine
2
- export { getFakeBlob, getFetchBlobMock, getFetchJsonMock } from "./testkit/test.utils.js";
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, getTestHttpServiceWithJsonResponse, getTestSdkInfo, mockGlobalFetchBlobResponse, mockGlobalFetchJsonResponse, } from "./testkit/testkit.utils.js";
3
4
  //# sourceMappingURL=testkit_api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testkit_api.js","sourceRoot":"","sources":["../lib/testkit_api.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
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,kCAAkC,EAClC,cAAc,EACd,2BAA2B,EAC3B,2BAA2B,GAC3B,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,29 @@
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) => {
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(() => {
22
+ resolve({ isAborted: true });
23
+ })
24
+ .finally(() => {
25
+ cleanup();
26
+ });
27
+ });
28
+ }
29
+ //# 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,EAAE;QACpD,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,GAAG,EAAE;YACX,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACb,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1,3 @@
1
- export declare function isNotUndefined<T>(value: T): value is NonNullable<T>;
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;
@@ -1,4 +1,24 @@
1
- export function isNotUndefined(value) {
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" &&
19
+ typeof record.text === "function" &&
20
+ typeof record.stream === "function" &&
21
+ typeof record.size === "number" &&
22
+ typeof record.type === "string"));
3
23
  }
4
24
  //# 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,cAAc,CAAI,KAAQ;IACzC,OAAO,KAAK,KAAK,SAAS,CAAC;AAC5B,CAAC"}
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;YACxC,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU;YACjC,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU;YACnC,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC/B,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CACjC,CAAC;AACH,CAAC"}
@@ -1,10 +1,21 @@
1
- import type { AdapterResponse } from "../http/http.models.js";
2
- import type { HttpMethod, KontentErrorResponseData } from "../models/core.models.js";
3
- import type { CoreSdkError } from "../models/error.models.js";
4
- export declare function isKontent404Error(error: CoreSdkError): error is CoreSdkError<"invalidResponse">;
5
- export declare function getErrorMessage({ method, url, adapterResponse, kontentErrorResponse, }: {
1
+ import type { AdapterPayload, AdapterResponse } from "../http/http.models.js";
2
+ import type { ErrorResponseData, HttpMethod } from "../models/core.models.js";
3
+ import { AdapterAbortError, AdapterParseError, type BaseErrorData, type ErrorDetails, 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, kontentErrorResponse, }: {
6
13
  readonly url: string;
7
14
  readonly method: HttpMethod;
8
- readonly adapterResponse: AdapterResponse;
9
- readonly kontentErrorResponse?: KontentErrorResponseData;
15
+ readonly adapterResponse: AdapterResponse<AdapterPayload>;
16
+ readonly kontentErrorResponse?: ErrorResponseData;
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;