@storyblok/api-client 0.1.1 → 0.2.0
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/dist/index.cjs +5 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -2
- package/dist/index.d.mts +16 -2
- package/dist/index.mjs +5 -3
- package/dist/index.mjs.map +1 -1
- package/dist/resources/datasource-entries.cjs +6 -2
- package/dist/resources/datasource-entries.cjs.map +1 -1
- package/dist/resources/datasource-entries.mjs +6 -2
- package/dist/resources/datasource-entries.mjs.map +1 -1
- package/dist/resources/datasources.cjs +12 -4
- package/dist/resources/datasources.cjs.map +1 -1
- package/dist/resources/datasources.mjs +12 -4
- package/dist/resources/datasources.mjs.map +1 -1
- package/dist/resources/links.cjs +6 -2
- package/dist/resources/links.cjs.map +1 -1
- package/dist/resources/links.mjs +6 -2
- package/dist/resources/links.mjs.map +1 -1
- package/dist/resources/spaces.cjs +6 -2
- package/dist/resources/spaces.cjs.map +1 -1
- package/dist/resources/spaces.mjs +6 -2
- package/dist/resources/spaces.mjs.map +1 -1
- package/dist/resources/stories.cjs +14 -6
- package/dist/resources/stories.cjs.map +1 -1
- package/dist/resources/stories.mjs +14 -6
- package/dist/resources/stories.mjs.map +1 -1
- package/dist/resources/tags.cjs +6 -2
- package/dist/resources/tags.cjs.map +1 -1
- package/dist/resources/tags.mjs +6 -2
- package/dist/resources/tags.mjs.map +1 -1
- package/dist/types.d.cts +19 -1
- package/dist/types.d.mts +19 -1
- package/dist/utils/cache.cjs +10 -4
- package/dist/utils/cache.cjs.map +1 -1
- package/dist/utils/cache.mjs +10 -4
- package/dist/utils/cache.mjs.map +1 -1
- package/dist/utils/inline-relations.cjs +10 -7
- package/dist/utils/inline-relations.cjs.map +1 -1
- package/dist/utils/inline-relations.mjs +10 -7
- package/dist/utils/inline-relations.mjs.map +1 -1
- package/package.json +3 -3
package/dist/resources/links.mjs
CHANGED
|
@@ -4,14 +4,18 @@ import { getAll } from "../generated/links/sdk.gen.mjs";
|
|
|
4
4
|
function createLinksResource(deps) {
|
|
5
5
|
const { client, requestWithCache, asApiResponse, throttleManager } = deps;
|
|
6
6
|
return { getAll: async (options = {}) => {
|
|
7
|
-
const { query = {}, signal, throwOnError } = options;
|
|
7
|
+
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
8
8
|
const requestPath = "/v2/cdn/links";
|
|
9
9
|
return requestWithCache("GET", requestPath, query, (requestQuery) => {
|
|
10
10
|
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(getAll({
|
|
11
11
|
client,
|
|
12
12
|
query: requestQuery,
|
|
13
13
|
signal,
|
|
14
|
-
...throwOnError === void 0 ? {} : { throwOnError }
|
|
14
|
+
...throwOnError === void 0 ? {} : { throwOnError },
|
|
15
|
+
...fetchOptions ? { kyOptions: {
|
|
16
|
+
...client.getConfig().kyOptions,
|
|
17
|
+
...fetchOptions
|
|
18
|
+
} } : {}
|
|
15
19
|
})));
|
|
16
20
|
});
|
|
17
21
|
} };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.mjs","names":["getAllLinks"],"sources":["../../src/resources/links.ts"],"sourcesContent":["import { getAll as getAllLinks } from '../generated/links/sdk.gen';\nimport type { GetAllData as LinksGetAllData, GetAllResponses as LinksGetAllResponses } from '../generated/links/types.gen';\nimport type { ApiResponse, ResourceDeps } from '../types';\n\nexport function createLinksResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: LinksGetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError } = {},\n ): Promise<ApiResponse<LinksGetAllResponses[200], ThrowOnError>> => {\n const { query = {}, signal, throwOnError } = options;\n const requestPath = '/v2/cdn/links';\n return requestWithCache<LinksGetAllResponses[200], ThrowOnError>('GET', requestPath, query, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<LinksGetAllResponses[200], ThrowOnError>(getAllLinks({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,oBAAoB,MAAoB;CACtD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,QAAQ,OACN,
|
|
1
|
+
{"version":3,"file":"links.mjs","names":["getAllLinks"],"sources":["../../src/resources/links.ts"],"sourcesContent":["import { getAll as getAllLinks } from '../generated/links/sdk.gen';\nimport type { GetAllData as LinksGetAllData, GetAllResponses as LinksGetAllResponses } from '../generated/links/types.gen';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../types';\n\nexport function createLinksResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: LinksGetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<LinksGetAllResponses[200], ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/links';\n return requestWithCache<LinksGetAllResponses[200], ThrowOnError>('GET', requestPath, query, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<LinksGetAllResponses[200], ThrowOnError>(getAllLinks({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,oBAAoB,MAAoB;CACtD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,QAAQ,OACN,UAAgI,EAAE,KAChE;EAClE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;EAC3D,MAAM,cAAc;AACpB,SAAO,iBAA0D,OAAO,aAAa,QAAQ,iBAA0C;AACrI,UAAO,gBAAgB,QAAQ,aAAa,oBAC1C,cAAuDA,OAAY;IACjE;IACA,OAAO;IACP;IACA,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IACtD,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAC5F,CAAC,CAAC,CAAC;IACN;IAEL"}
|
|
@@ -4,14 +4,18 @@ const require_sdk_gen = require('../generated/spaces/sdk.gen.cjs');
|
|
|
4
4
|
function createSpacesResource(deps) {
|
|
5
5
|
const { client, requestWithCache, asApiResponse, throttleManager } = deps;
|
|
6
6
|
return { get: async (options = {}) => {
|
|
7
|
-
const { signal, throwOnError } = options;
|
|
7
|
+
const { signal, throwOnError, fetchOptions } = options;
|
|
8
8
|
const requestPath = "/v2/cdn/spaces/me";
|
|
9
9
|
return requestWithCache("GET", requestPath, {}, (requestQuery) => {
|
|
10
10
|
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(require_sdk_gen.get({
|
|
11
11
|
client,
|
|
12
12
|
query: requestQuery,
|
|
13
13
|
signal,
|
|
14
|
-
...throwOnError === void 0 ? {} : { throwOnError }
|
|
14
|
+
...throwOnError === void 0 ? {} : { throwOnError },
|
|
15
|
+
...fetchOptions ? { kyOptions: {
|
|
16
|
+
...client.getConfig().kyOptions,
|
|
17
|
+
...fetchOptions
|
|
18
|
+
} } : {}
|
|
15
19
|
})));
|
|
16
20
|
});
|
|
17
21
|
} };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spaces.cjs","names":["getSpaceApi"],"sources":["../../src/resources/spaces.ts"],"sourcesContent":["import { get as getSpaceApi } from '../generated/spaces/sdk.gen';\nimport type { GetResponses as SpacesGetResponses } from '../generated/spaces/types.gen';\nimport type { ApiResponse, ResourceDeps } from '../types';\n\nexport function createSpacesResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n get: async <ThrowOnError extends boolean = false>(\n options: { signal?: AbortSignal; throwOnError?: ThrowOnError } = {},\n ): Promise<ApiResponse<SpacesGetResponses[200], ThrowOnError>> => {\n const { signal, throwOnError } = options;\n const requestPath = '/v2/cdn/spaces/me';\n return requestWithCache<SpacesGetResponses[200], ThrowOnError>('GET', requestPath, {}, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<SpacesGetResponses[200], ThrowOnError>(getSpaceApi({\n client,\n // The OpenAPI spec declares no query params so the generated type\n // is `query?: never`. At runtime we still need to pass a query object\n // because `setAuthParams` mutates it in-place to inject the `token`.\n query: requestQuery as never,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,qBAAqB,MAAoB;CACvD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,KAAK,OACH,
|
|
1
|
+
{"version":3,"file":"spaces.cjs","names":["getSpaceApi"],"sources":["../../src/resources/spaces.ts"],"sourcesContent":["import { get as getSpaceApi } from '../generated/spaces/sdk.gen';\nimport type { GetResponses as SpacesGetResponses } from '../generated/spaces/types.gen';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../types';\n\nexport function createSpacesResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n get: async <ThrowOnError extends boolean = false>(\n options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<SpacesGetResponses[200], ThrowOnError>> => {\n const { signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/spaces/me';\n return requestWithCache<SpacesGetResponses[200], ThrowOnError>('GET', requestPath, {}, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<SpacesGetResponses[200], ThrowOnError>(getSpaceApi({\n client,\n // The OpenAPI spec declares no query params so the generated type\n // is `query?: never`. At runtime we still need to pass a query object\n // because `setAuthParams` mutates it in-place to inject the `token`.\n query: requestQuery as never,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,qBAAqB,MAAoB;CACvD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,KAAK,OACH,UAA8F,EAAE,KAChC;EAChE,MAAM,EAAE,QAAQ,cAAc,iBAAiB;EAC/C,MAAM,cAAc;AACpB,SAAO,iBAAwD,OAAO,aAAa,EAAE,GAAG,iBAA0C;AAChI,UAAO,gBAAgB,QAAQ,aAAa,oBAC1C,cAAqDA,oBAAY;IAC/D;IAIA,OAAO;IACP;IACA,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IACtD,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAC5F,CAAC,CAAC,CAAC;IACN;IAEL"}
|
|
@@ -4,14 +4,18 @@ import { get } from "../generated/spaces/sdk.gen.mjs";
|
|
|
4
4
|
function createSpacesResource(deps) {
|
|
5
5
|
const { client, requestWithCache, asApiResponse, throttleManager } = deps;
|
|
6
6
|
return { get: async (options = {}) => {
|
|
7
|
-
const { signal, throwOnError } = options;
|
|
7
|
+
const { signal, throwOnError, fetchOptions } = options;
|
|
8
8
|
const requestPath = "/v2/cdn/spaces/me";
|
|
9
9
|
return requestWithCache("GET", requestPath, {}, (requestQuery) => {
|
|
10
10
|
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(get({
|
|
11
11
|
client,
|
|
12
12
|
query: requestQuery,
|
|
13
13
|
signal,
|
|
14
|
-
...throwOnError === void 0 ? {} : { throwOnError }
|
|
14
|
+
...throwOnError === void 0 ? {} : { throwOnError },
|
|
15
|
+
...fetchOptions ? { kyOptions: {
|
|
16
|
+
...client.getConfig().kyOptions,
|
|
17
|
+
...fetchOptions
|
|
18
|
+
} } : {}
|
|
15
19
|
})));
|
|
16
20
|
});
|
|
17
21
|
} };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spaces.mjs","names":["getSpaceApi"],"sources":["../../src/resources/spaces.ts"],"sourcesContent":["import { get as getSpaceApi } from '../generated/spaces/sdk.gen';\nimport type { GetResponses as SpacesGetResponses } from '../generated/spaces/types.gen';\nimport type { ApiResponse, ResourceDeps } from '../types';\n\nexport function createSpacesResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n get: async <ThrowOnError extends boolean = false>(\n options: { signal?: AbortSignal; throwOnError?: ThrowOnError } = {},\n ): Promise<ApiResponse<SpacesGetResponses[200], ThrowOnError>> => {\n const { signal, throwOnError } = options;\n const requestPath = '/v2/cdn/spaces/me';\n return requestWithCache<SpacesGetResponses[200], ThrowOnError>('GET', requestPath, {}, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<SpacesGetResponses[200], ThrowOnError>(getSpaceApi({\n client,\n // The OpenAPI spec declares no query params so the generated type\n // is `query?: never`. At runtime we still need to pass a query object\n // because `setAuthParams` mutates it in-place to inject the `token`.\n query: requestQuery as never,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,qBAAqB,MAAoB;CACvD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,KAAK,OACH,
|
|
1
|
+
{"version":3,"file":"spaces.mjs","names":["getSpaceApi"],"sources":["../../src/resources/spaces.ts"],"sourcesContent":["import { get as getSpaceApi } from '../generated/spaces/sdk.gen';\nimport type { GetResponses as SpacesGetResponses } from '../generated/spaces/types.gen';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../types';\n\nexport function createSpacesResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n get: async <ThrowOnError extends boolean = false>(\n options: { signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<SpacesGetResponses[200], ThrowOnError>> => {\n const { signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/spaces/me';\n return requestWithCache<SpacesGetResponses[200], ThrowOnError>('GET', requestPath, {}, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<SpacesGetResponses[200], ThrowOnError>(getSpaceApi({\n client,\n // The OpenAPI spec declares no query params so the generated type\n // is `query?: never`. At runtime we still need to pass a query object\n // because `setAuthParams` mutates it in-place to inject the `token`.\n query: requestQuery as never,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,qBAAqB,MAAoB;CACvD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,KAAK,OACH,UAA8F,EAAE,KAChC;EAChE,MAAM,EAAE,QAAQ,cAAc,iBAAiB;EAC/C,MAAM,cAAc;AACpB,SAAO,iBAAwD,OAAO,aAAa,EAAE,GAAG,iBAA0C;AAChI,UAAO,gBAAgB,QAAQ,aAAa,oBAC1C,cAAqDA,IAAY;IAC/D;IAIA,OAAO;IACP;IACA,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IACtD,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAC5F,CAAC,CAAC,CAAC;IACN;IAEL"}
|
|
@@ -7,7 +7,7 @@ function createStoriesResource(deps) {
|
|
|
7
7
|
const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;
|
|
8
8
|
return {
|
|
9
9
|
get: async (identifier, options = {}) => {
|
|
10
|
-
const { query = {}, signal, throwOnError } = options;
|
|
10
|
+
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
11
11
|
const resolvedQuery = typeof identifier === "string" && UUID_RE.test(identifier) && !query.find_by ? {
|
|
12
12
|
...query,
|
|
13
13
|
find_by: "uuid"
|
|
@@ -19,7 +19,11 @@ function createStoriesResource(deps) {
|
|
|
19
19
|
path: { identifier },
|
|
20
20
|
query: requestQuery,
|
|
21
21
|
signal,
|
|
22
|
-
...throwOnError === void 0 ? {} : { throwOnError }
|
|
22
|
+
...throwOnError === void 0 ? {} : { throwOnError },
|
|
23
|
+
...fetchOptions ? { kyOptions: {
|
|
24
|
+
...client.getConfig().kyOptions,
|
|
25
|
+
...fetchOptions
|
|
26
|
+
} } : {}
|
|
23
27
|
})));
|
|
24
28
|
if (!inlineRelations || response.data === void 0) return response;
|
|
25
29
|
const resolved = await require_inline_relations.resolveRelationMap(response.data, requestQuery, {
|
|
@@ -34,17 +38,21 @@ function createStoriesResource(deps) {
|
|
|
34
38
|
story: require_inline_relations.inlineStoryContent(response.data.story, resolved.relationPaths, resolved.relationMap)
|
|
35
39
|
}
|
|
36
40
|
};
|
|
37
|
-
});
|
|
41
|
+
}, inlineRelations ? { cacheKeyPrefix: "inline" } : void 0);
|
|
38
42
|
},
|
|
39
43
|
getAll: async (options = {}) => {
|
|
40
|
-
const { query = {}, signal, throwOnError } = options;
|
|
44
|
+
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
41
45
|
const requestPath = "/v2/cdn/stories";
|
|
42
46
|
return requestWithCache("GET", requestPath, query, async (requestQuery) => {
|
|
43
47
|
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(require_sdk_gen.getAll({
|
|
44
48
|
client,
|
|
45
49
|
query: requestQuery,
|
|
46
50
|
signal,
|
|
47
|
-
...throwOnError === void 0 ? {} : { throwOnError }
|
|
51
|
+
...throwOnError === void 0 ? {} : { throwOnError },
|
|
52
|
+
...fetchOptions ? { kyOptions: {
|
|
53
|
+
...client.getConfig().kyOptions,
|
|
54
|
+
...fetchOptions
|
|
55
|
+
} } : {}
|
|
48
56
|
})));
|
|
49
57
|
if (!inlineRelations || response.data === void 0) return response;
|
|
50
58
|
const resolved = await require_inline_relations.resolveRelationMap(response.data, requestQuery, {
|
|
@@ -59,7 +67,7 @@ function createStoriesResource(deps) {
|
|
|
59
67
|
stories: require_inline_relations.inlineStoriesContent(response.data.stories, resolved.relationPaths, resolved.relationMap)
|
|
60
68
|
}
|
|
61
69
|
};
|
|
62
|
-
});
|
|
70
|
+
}, inlineRelations ? { cacheKeyPrefix: "inline" } : void 0);
|
|
63
71
|
}
|
|
64
72
|
};
|
|
65
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stories.cjs","names":["get","resolveRelationMap","inlineStoryContent","getAll","inlineStoriesContent"],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import { get, getAll } from '../generated/stories/sdk.gen';\nimport type { GetAllData, GetAllResponses, GetData, GetResponses } from '../generated/stories/types.gen';\nimport type {\n AssetField,\n MultilinkField,\n PluginField,\n RichtextField,\n StoryCapi,\n StoryContent,\n TableField,\n} from '../generated/stories';\nimport { inlineStoriesContent, inlineStoryContent, resolveRelationMap } from '../utils/inline-relations';\nimport type { ApiResponse, ResourceDeps } from '../types';\n\ntype InlinedStoryContentField =\n | string\n | number\n | boolean\n | Array<string | AssetField | StoryContent | StoryWithInlinedRelations>\n | AssetField\n | MultilinkField\n | TableField\n | RichtextField\n | PluginField\n | StoryWithInlinedRelations\n | undefined;\n\ninterface InlinedStoryContent {\n _uid: string;\n component: string;\n _editable?: string;\n [key: string]: InlinedStoryContentField;\n}\n\nexport type StoryWithInlinedRelations = Omit<StoryCapi, 'content'> & {\n content: InlinedStoryContent;\n};\n\ntype StoryResult<InlineRelations extends boolean> = InlineRelations extends true\n ? StoryWithInlinedRelations\n : StoryCapi;\n\ntype GetResponse<InlineRelations extends boolean> = Omit<GetResponses[200], 'story'> & {\n story: StoryResult<InlineRelations>;\n};\ntype GetAllResponse<InlineRelations extends boolean> = Omit<GetAllResponses[200], 'stories'> & {\n stories: Array<StoryResult<InlineRelations>>;\n};\n\n/** Pre-resolved to avoid TypeScript emitting deep indexed-access chains that trip up DTS bundlers. */\ntype StoryIdentifier = GetData['path']['identifier'];\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport interface StoriesResourceDeps extends ResourceDeps {\n inlineRelations: boolean;\n}\n\nexport function createStoriesResource<InlineRelations extends boolean>(\n deps: StoriesResourceDeps,\n) {\n const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;\n\n return {\n get: async <ThrowOnError extends boolean = false>(\n identifier: StoryIdentifier,\n options: { query?: GetData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError } = {},\n ): Promise<ApiResponse<GetResponse<InlineRelations>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError } = options;\n const resolvedQuery = typeof identifier === 'string' && UUID_RE.test(identifier) && !query.find_by\n ? { ...query, find_by: 'uuid' as const }\n : query;\n const requestPath = `/v2/cdn/stories/${identifier}`;\n type Res = ApiResponse<GetResponse<InlineRelations>, ThrowOnError>;\n return requestWithCache<GetResponse<InlineRelations>, ThrowOnError>('GET', requestPath, resolvedQuery, async (requestQuery: Record<string, unknown>): Promise<Res> => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<GetResponse<InlineRelations>, ThrowOnError>(get({\n client,\n path: { identifier },\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n })));\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n const resolved = await resolveRelationMap(response.data, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n story: inlineStoryContent(response.data.story, resolved.relationPaths, resolved.relationMap),\n },\n };\n });\n },\n\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: GetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError } = {},\n ): Promise<ApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError } = options;\n const requestPath = '/v2/cdn/stories';\n type ResAll = ApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>;\n return requestWithCache<GetAllResponse<InlineRelations>, ThrowOnError>('GET', requestPath, query, async (requestQuery: Record<string, unknown>): Promise<ResAll> => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>(getAll({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n })));\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n const resolved = await resolveRelationMap(response.data, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n stories: inlineStoriesContent(response.data.stories, resolved.relationPaths, resolved.relationMap),\n },\n };\n });\n },\n };\n}\n"],"mappings":";;;;AAoDA,MAAM,UAAU;AAMhB,SAAgB,sBACd,MACA;CACA,MAAM,EAAE,QAAQ,kBAAkB,eAAe,iBAAiB,oBAAoB;AAEtF,QAAO;EACL,KAAK,OACH,YACA,
|
|
1
|
+
{"version":3,"file":"stories.cjs","names":["get","resolveRelationMap","inlineStoryContent","getAll","inlineStoriesContent"],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import { get, getAll } from '../generated/stories/sdk.gen';\nimport type { GetAllData, GetAllResponses, GetData, GetResponses } from '../generated/stories/types.gen';\nimport type {\n AssetField,\n MultilinkField,\n PluginField,\n RichtextField,\n StoryCapi,\n StoryContent,\n TableField,\n} from '../generated/stories';\nimport { inlineStoriesContent, inlineStoryContent, resolveRelationMap } from '../utils/inline-relations';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../types';\n\ntype InlinedStoryContentField =\n | string\n | number\n | boolean\n | Array<string | AssetField | StoryContent | StoryWithInlinedRelations>\n | AssetField\n | MultilinkField\n | TableField\n | RichtextField\n | PluginField\n | StoryWithInlinedRelations\n | undefined;\n\ninterface InlinedStoryContent {\n _uid: string;\n component: string;\n _editable?: string;\n [key: string]: InlinedStoryContentField;\n}\n\nexport type StoryWithInlinedRelations = Omit<StoryCapi, 'content'> & {\n content: InlinedStoryContent;\n};\n\ntype StoryResult<InlineRelations extends boolean> = InlineRelations extends true\n ? StoryWithInlinedRelations\n : StoryCapi;\n\ntype GetResponse<InlineRelations extends boolean> = Omit<GetResponses[200], 'story'> & {\n story: StoryResult<InlineRelations>;\n};\ntype GetAllResponse<InlineRelations extends boolean> = Omit<GetAllResponses[200], 'stories'> & {\n stories: Array<StoryResult<InlineRelations>>;\n};\n\n/** Pre-resolved to avoid TypeScript emitting deep indexed-access chains that trip up DTS bundlers. */\ntype StoryIdentifier = GetData['path']['identifier'];\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport interface StoriesResourceDeps extends ResourceDeps {\n inlineRelations: boolean;\n}\n\nexport function createStoriesResource<InlineRelations extends boolean>(\n deps: StoriesResourceDeps,\n) {\n const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;\n\n return {\n get: async <ThrowOnError extends boolean = false>(\n identifier: StoryIdentifier,\n options: { query?: GetData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<GetResponse<InlineRelations>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const resolvedQuery = typeof identifier === 'string' && UUID_RE.test(identifier) && !query.find_by\n ? { ...query, find_by: 'uuid' as const }\n : query;\n const requestPath = `/v2/cdn/stories/${identifier}`;\n type Res = ApiResponse<GetResponse<InlineRelations>, ThrowOnError>;\n return requestWithCache<GetResponse<InlineRelations>, ThrowOnError>('GET', requestPath, resolvedQuery, async (requestQuery: Record<string, unknown>): Promise<Res> => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<GetResponse<InlineRelations>, ThrowOnError>(get({\n client,\n path: { identifier },\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n })));\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n const resolved = await resolveRelationMap(response.data, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n story: inlineStoryContent(response.data.story, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: GetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/stories';\n type ResAll = ApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>;\n return requestWithCache<GetAllResponse<InlineRelations>, ThrowOnError>('GET', requestPath, query, async (requestQuery: Record<string, unknown>): Promise<ResAll> => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>(getAll({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n })));\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n const resolved = await resolveRelationMap(response.data, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n stories: inlineStoriesContent(response.data.stories, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n };\n}\n"],"mappings":";;;;AAoDA,MAAM,UAAU;AAMhB,SAAgB,sBACd,MACA;CACA,MAAM,EAAE,QAAQ,kBAAkB,eAAe,iBAAiB,oBAAoB;AAEtF,QAAO;EACL,KAAK,OACH,YACA,UAAwH,EAAE,KACrD;GACrE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,gBAAgB,OAAO,eAAe,YAAY,QAAQ,KAAK,WAAW,IAAI,CAAC,MAAM,UACvF;IAAE,GAAG;IAAO,SAAS;IAAiB,GACtC;GACJ,MAAM,cAAc,mBAAmB;AAEvC,UAAO,iBAA6D,OAAO,aAAa,eAAe,OAAO,iBAAwD;IACpK,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAA0DA,oBAAI;KAC5D;KACA,MAAM,EAAE,YAAY;KACpB,OAAO;KACP;KACA,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;KACtD,GAAI,eAAe,EAAE,WAAW;MAAE,GAAG,OAAO,WAAW,CAAC;MAAW,GAAG;MAAc,EAAE,GAAG,EAAE;KAC5F,CAAC,CAAC,CAAC;AAEN,QAAI,CAAC,mBAAmB,SAAS,SAAS,OACxC,QAAO;IAGT,MAAM,WAAW,MAAMC,4CAAmB,SAAS,MAAM,cAAc;KAAE;KAAQ;KAAiB,CAAC;AACnG,QAAI,CAAC,SACH,QAAO;AAGT,WAAO;KACL,GAAG;KACH,MAAM;MACJ,GAAG,SAAS;MACZ,OAAOC,4CAAmB,SAAS,KAAK,OAAO,SAAS,eAAe,SAAS,YAAY;MAC7F;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAGhE,QAAQ,OACN,UAA2H,EAAE,KACrD;GACxE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,cAAc;AAEpB,UAAO,iBAAgE,OAAO,aAAa,OAAO,OAAO,iBAA2D;IAClK,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAA6DC,uBAAO;KAClE;KACA,OAAO;KACP;KACA,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;KACtD,GAAI,eAAe,EAAE,WAAW;MAAE,GAAG,OAAO,WAAW,CAAC;MAAW,GAAG;MAAc,EAAE,GAAG,EAAE;KAC5F,CAAC,CAAC,CAAC;AAEN,QAAI,CAAC,mBAAmB,SAAS,SAAS,OACxC,QAAO;IAGT,MAAM,WAAW,MAAMF,4CAAmB,SAAS,MAAM,cAAc;KAAE;KAAQ;KAAiB,CAAC;AACnG,QAAI,CAAC,SACH,QAAO;AAGT,WAAO;KACL,GAAG;KACH,MAAM;MACJ,GAAG,SAAS;MACZ,SAASG,8CAAqB,SAAS,KAAK,SAAS,SAAS,eAAe,SAAS,YAAY;MACnG;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAEjE"}
|
|
@@ -7,7 +7,7 @@ function createStoriesResource(deps) {
|
|
|
7
7
|
const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;
|
|
8
8
|
return {
|
|
9
9
|
get: async (identifier, options = {}) => {
|
|
10
|
-
const { query = {}, signal, throwOnError } = options;
|
|
10
|
+
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
11
11
|
const resolvedQuery = typeof identifier === "string" && UUID_RE.test(identifier) && !query.find_by ? {
|
|
12
12
|
...query,
|
|
13
13
|
find_by: "uuid"
|
|
@@ -19,7 +19,11 @@ function createStoriesResource(deps) {
|
|
|
19
19
|
path: { identifier },
|
|
20
20
|
query: requestQuery,
|
|
21
21
|
signal,
|
|
22
|
-
...throwOnError === void 0 ? {} : { throwOnError }
|
|
22
|
+
...throwOnError === void 0 ? {} : { throwOnError },
|
|
23
|
+
...fetchOptions ? { kyOptions: {
|
|
24
|
+
...client.getConfig().kyOptions,
|
|
25
|
+
...fetchOptions
|
|
26
|
+
} } : {}
|
|
23
27
|
})));
|
|
24
28
|
if (!inlineRelations || response.data === void 0) return response;
|
|
25
29
|
const resolved = await resolveRelationMap(response.data, requestQuery, {
|
|
@@ -34,17 +38,21 @@ function createStoriesResource(deps) {
|
|
|
34
38
|
story: inlineStoryContent(response.data.story, resolved.relationPaths, resolved.relationMap)
|
|
35
39
|
}
|
|
36
40
|
};
|
|
37
|
-
});
|
|
41
|
+
}, inlineRelations ? { cacheKeyPrefix: "inline" } : void 0);
|
|
38
42
|
},
|
|
39
43
|
getAll: async (options = {}) => {
|
|
40
|
-
const { query = {}, signal, throwOnError } = options;
|
|
44
|
+
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
41
45
|
const requestPath = "/v2/cdn/stories";
|
|
42
46
|
return requestWithCache("GET", requestPath, query, async (requestQuery) => {
|
|
43
47
|
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(getAll({
|
|
44
48
|
client,
|
|
45
49
|
query: requestQuery,
|
|
46
50
|
signal,
|
|
47
|
-
...throwOnError === void 0 ? {} : { throwOnError }
|
|
51
|
+
...throwOnError === void 0 ? {} : { throwOnError },
|
|
52
|
+
...fetchOptions ? { kyOptions: {
|
|
53
|
+
...client.getConfig().kyOptions,
|
|
54
|
+
...fetchOptions
|
|
55
|
+
} } : {}
|
|
48
56
|
})));
|
|
49
57
|
if (!inlineRelations || response.data === void 0) return response;
|
|
50
58
|
const resolved = await resolveRelationMap(response.data, requestQuery, {
|
|
@@ -59,7 +67,7 @@ function createStoriesResource(deps) {
|
|
|
59
67
|
stories: inlineStoriesContent(response.data.stories, resolved.relationPaths, resolved.relationMap)
|
|
60
68
|
}
|
|
61
69
|
};
|
|
62
|
-
});
|
|
70
|
+
}, inlineRelations ? { cacheKeyPrefix: "inline" } : void 0);
|
|
63
71
|
}
|
|
64
72
|
};
|
|
65
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stories.mjs","names":[],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import { get, getAll } from '../generated/stories/sdk.gen';\nimport type { GetAllData, GetAllResponses, GetData, GetResponses } from '../generated/stories/types.gen';\nimport type {\n AssetField,\n MultilinkField,\n PluginField,\n RichtextField,\n StoryCapi,\n StoryContent,\n TableField,\n} from '../generated/stories';\nimport { inlineStoriesContent, inlineStoryContent, resolveRelationMap } from '../utils/inline-relations';\nimport type { ApiResponse, ResourceDeps } from '../types';\n\ntype InlinedStoryContentField =\n | string\n | number\n | boolean\n | Array<string | AssetField | StoryContent | StoryWithInlinedRelations>\n | AssetField\n | MultilinkField\n | TableField\n | RichtextField\n | PluginField\n | StoryWithInlinedRelations\n | undefined;\n\ninterface InlinedStoryContent {\n _uid: string;\n component: string;\n _editable?: string;\n [key: string]: InlinedStoryContentField;\n}\n\nexport type StoryWithInlinedRelations = Omit<StoryCapi, 'content'> & {\n content: InlinedStoryContent;\n};\n\ntype StoryResult<InlineRelations extends boolean> = InlineRelations extends true\n ? StoryWithInlinedRelations\n : StoryCapi;\n\ntype GetResponse<InlineRelations extends boolean> = Omit<GetResponses[200], 'story'> & {\n story: StoryResult<InlineRelations>;\n};\ntype GetAllResponse<InlineRelations extends boolean> = Omit<GetAllResponses[200], 'stories'> & {\n stories: Array<StoryResult<InlineRelations>>;\n};\n\n/** Pre-resolved to avoid TypeScript emitting deep indexed-access chains that trip up DTS bundlers. */\ntype StoryIdentifier = GetData['path']['identifier'];\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport interface StoriesResourceDeps extends ResourceDeps {\n inlineRelations: boolean;\n}\n\nexport function createStoriesResource<InlineRelations extends boolean>(\n deps: StoriesResourceDeps,\n) {\n const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;\n\n return {\n get: async <ThrowOnError extends boolean = false>(\n identifier: StoryIdentifier,\n options: { query?: GetData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError } = {},\n ): Promise<ApiResponse<GetResponse<InlineRelations>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError } = options;\n const resolvedQuery = typeof identifier === 'string' && UUID_RE.test(identifier) && !query.find_by\n ? { ...query, find_by: 'uuid' as const }\n : query;\n const requestPath = `/v2/cdn/stories/${identifier}`;\n type Res = ApiResponse<GetResponse<InlineRelations>, ThrowOnError>;\n return requestWithCache<GetResponse<InlineRelations>, ThrowOnError>('GET', requestPath, resolvedQuery, async (requestQuery: Record<string, unknown>): Promise<Res> => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<GetResponse<InlineRelations>, ThrowOnError>(get({\n client,\n path: { identifier },\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n })));\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n const resolved = await resolveRelationMap(response.data, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n story: inlineStoryContent(response.data.story, resolved.relationPaths, resolved.relationMap),\n },\n };\n });\n },\n\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: GetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError } = {},\n ): Promise<ApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError } = options;\n const requestPath = '/v2/cdn/stories';\n type ResAll = ApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>;\n return requestWithCache<GetAllResponse<InlineRelations>, ThrowOnError>('GET', requestPath, query, async (requestQuery: Record<string, unknown>): Promise<ResAll> => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>(getAll({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n })));\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n const resolved = await resolveRelationMap(response.data, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n stories: inlineStoriesContent(response.data.stories, resolved.relationPaths, resolved.relationMap),\n },\n };\n });\n },\n };\n}\n"],"mappings":";;;;AAoDA,MAAM,UAAU;AAMhB,SAAgB,sBACd,MACA;CACA,MAAM,EAAE,QAAQ,kBAAkB,eAAe,iBAAiB,oBAAoB;AAEtF,QAAO;EACL,KAAK,OACH,YACA,
|
|
1
|
+
{"version":3,"file":"stories.mjs","names":[],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import { get, getAll } from '../generated/stories/sdk.gen';\nimport type { GetAllData, GetAllResponses, GetData, GetResponses } from '../generated/stories/types.gen';\nimport type {\n AssetField,\n MultilinkField,\n PluginField,\n RichtextField,\n StoryCapi,\n StoryContent,\n TableField,\n} from '../generated/stories';\nimport { inlineStoriesContent, inlineStoryContent, resolveRelationMap } from '../utils/inline-relations';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../types';\n\ntype InlinedStoryContentField =\n | string\n | number\n | boolean\n | Array<string | AssetField | StoryContent | StoryWithInlinedRelations>\n | AssetField\n | MultilinkField\n | TableField\n | RichtextField\n | PluginField\n | StoryWithInlinedRelations\n | undefined;\n\ninterface InlinedStoryContent {\n _uid: string;\n component: string;\n _editable?: string;\n [key: string]: InlinedStoryContentField;\n}\n\nexport type StoryWithInlinedRelations = Omit<StoryCapi, 'content'> & {\n content: InlinedStoryContent;\n};\n\ntype StoryResult<InlineRelations extends boolean> = InlineRelations extends true\n ? StoryWithInlinedRelations\n : StoryCapi;\n\ntype GetResponse<InlineRelations extends boolean> = Omit<GetResponses[200], 'story'> & {\n story: StoryResult<InlineRelations>;\n};\ntype GetAllResponse<InlineRelations extends boolean> = Omit<GetAllResponses[200], 'stories'> & {\n stories: Array<StoryResult<InlineRelations>>;\n};\n\n/** Pre-resolved to avoid TypeScript emitting deep indexed-access chains that trip up DTS bundlers. */\ntype StoryIdentifier = GetData['path']['identifier'];\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\nexport interface StoriesResourceDeps extends ResourceDeps {\n inlineRelations: boolean;\n}\n\nexport function createStoriesResource<InlineRelations extends boolean>(\n deps: StoriesResourceDeps,\n) {\n const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;\n\n return {\n get: async <ThrowOnError extends boolean = false>(\n identifier: StoryIdentifier,\n options: { query?: GetData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<GetResponse<InlineRelations>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const resolvedQuery = typeof identifier === 'string' && UUID_RE.test(identifier) && !query.find_by\n ? { ...query, find_by: 'uuid' as const }\n : query;\n const requestPath = `/v2/cdn/stories/${identifier}`;\n type Res = ApiResponse<GetResponse<InlineRelations>, ThrowOnError>;\n return requestWithCache<GetResponse<InlineRelations>, ThrowOnError>('GET', requestPath, resolvedQuery, async (requestQuery: Record<string, unknown>): Promise<Res> => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<GetResponse<InlineRelations>, ThrowOnError>(get({\n client,\n path: { identifier },\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n })));\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n const resolved = await resolveRelationMap(response.data, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n story: inlineStoryContent(response.data.story, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: GetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/stories';\n type ResAll = ApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>;\n return requestWithCache<GetAllResponse<InlineRelations>, ThrowOnError>('GET', requestPath, query, async (requestQuery: Record<string, unknown>): Promise<ResAll> => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<GetAllResponse<InlineRelations>, ThrowOnError>(getAll({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n })));\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n const resolved = await resolveRelationMap(response.data, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n stories: inlineStoriesContent(response.data.stories, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n };\n}\n"],"mappings":";;;;AAoDA,MAAM,UAAU;AAMhB,SAAgB,sBACd,MACA;CACA,MAAM,EAAE,QAAQ,kBAAkB,eAAe,iBAAiB,oBAAoB;AAEtF,QAAO;EACL,KAAK,OACH,YACA,UAAwH,EAAE,KACrD;GACrE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,gBAAgB,OAAO,eAAe,YAAY,QAAQ,KAAK,WAAW,IAAI,CAAC,MAAM,UACvF;IAAE,GAAG;IAAO,SAAS;IAAiB,GACtC;GACJ,MAAM,cAAc,mBAAmB;AAEvC,UAAO,iBAA6D,OAAO,aAAa,eAAe,OAAO,iBAAwD;IACpK,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAA0D,IAAI;KAC5D;KACA,MAAM,EAAE,YAAY;KACpB,OAAO;KACP;KACA,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;KACtD,GAAI,eAAe,EAAE,WAAW;MAAE,GAAG,OAAO,WAAW,CAAC;MAAW,GAAG;MAAc,EAAE,GAAG,EAAE;KAC5F,CAAC,CAAC,CAAC;AAEN,QAAI,CAAC,mBAAmB,SAAS,SAAS,OACxC,QAAO;IAGT,MAAM,WAAW,MAAM,mBAAmB,SAAS,MAAM,cAAc;KAAE;KAAQ;KAAiB,CAAC;AACnG,QAAI,CAAC,SACH,QAAO;AAGT,WAAO;KACL,GAAG;KACH,MAAM;MACJ,GAAG,SAAS;MACZ,OAAO,mBAAmB,SAAS,KAAK,OAAO,SAAS,eAAe,SAAS,YAAY;MAC7F;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAGhE,QAAQ,OACN,UAA2H,EAAE,KACrD;GACxE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,cAAc;AAEpB,UAAO,iBAAgE,OAAO,aAAa,OAAO,OAAO,iBAA2D;IAClK,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAA6D,OAAO;KAClE;KACA,OAAO;KACP;KACA,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;KACtD,GAAI,eAAe,EAAE,WAAW;MAAE,GAAG,OAAO,WAAW,CAAC;MAAW,GAAG;MAAc,EAAE,GAAG,EAAE;KAC5F,CAAC,CAAC,CAAC;AAEN,QAAI,CAAC,mBAAmB,SAAS,SAAS,OACxC,QAAO;IAGT,MAAM,WAAW,MAAM,mBAAmB,SAAS,MAAM,cAAc;KAAE;KAAQ;KAAiB,CAAC;AACnG,QAAI,CAAC,SACH,QAAO;AAGT,WAAO;KACL,GAAG;KACH,MAAM;MACJ,GAAG,SAAS;MACZ,SAAS,qBAAqB,SAAS,KAAK,SAAS,SAAS,eAAe,SAAS,YAAY;MACnG;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAEjE"}
|
package/dist/resources/tags.cjs
CHANGED
|
@@ -4,14 +4,18 @@ const require_sdk_gen = require('../generated/tags/sdk.gen.cjs');
|
|
|
4
4
|
function createTagsResource(deps) {
|
|
5
5
|
const { client, requestWithCache, asApiResponse, throttleManager } = deps;
|
|
6
6
|
return { getAll: async (options = {}) => {
|
|
7
|
-
const { query = {}, signal, throwOnError } = options;
|
|
7
|
+
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
8
8
|
const requestPath = "/v2/cdn/tags";
|
|
9
9
|
return requestWithCache("GET", requestPath, query, (requestQuery) => {
|
|
10
10
|
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(require_sdk_gen.getAll({
|
|
11
11
|
client,
|
|
12
12
|
query: requestQuery,
|
|
13
13
|
signal,
|
|
14
|
-
...throwOnError === void 0 ? {} : { throwOnError }
|
|
14
|
+
...throwOnError === void 0 ? {} : { throwOnError },
|
|
15
|
+
...fetchOptions ? { kyOptions: {
|
|
16
|
+
...client.getConfig().kyOptions,
|
|
17
|
+
...fetchOptions
|
|
18
|
+
} } : {}
|
|
15
19
|
})));
|
|
16
20
|
});
|
|
17
21
|
} };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.cjs","names":["getAllTagsApi"],"sources":["../../src/resources/tags.ts"],"sourcesContent":["import { getAll as getAllTagsApi } from '../generated/tags/sdk.gen';\nimport type { GetAllData as TagsGetAllData, GetAllResponses as TagsGetAllResponses } from '../generated/tags/types.gen';\nimport type { ApiResponse, ResourceDeps } from '../types';\n\nexport function createTagsResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: TagsGetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError } = {},\n ): Promise<ApiResponse<TagsGetAllResponses[200], ThrowOnError>> => {\n const { query = {}, signal, throwOnError } = options;\n const requestPath = '/v2/cdn/tags';\n return requestWithCache<TagsGetAllResponses[200], ThrowOnError>('GET', requestPath, query, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<TagsGetAllResponses[200], ThrowOnError>(getAllTagsApi({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,mBAAmB,MAAoB;CACrD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,QAAQ,OACN,
|
|
1
|
+
{"version":3,"file":"tags.cjs","names":["getAllTagsApi"],"sources":["../../src/resources/tags.ts"],"sourcesContent":["import { getAll as getAllTagsApi } from '../generated/tags/sdk.gen';\nimport type { GetAllData as TagsGetAllData, GetAllResponses as TagsGetAllResponses } from '../generated/tags/types.gen';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../types';\n\nexport function createTagsResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: TagsGetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<TagsGetAllResponses[200], ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/tags';\n return requestWithCache<TagsGetAllResponses[200], ThrowOnError>('GET', requestPath, query, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<TagsGetAllResponses[200], ThrowOnError>(getAllTagsApi({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,mBAAmB,MAAoB;CACrD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,QAAQ,OACN,UAA+H,EAAE,KAChE;EACjE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;EAC3D,MAAM,cAAc;AACpB,SAAO,iBAAyD,OAAO,aAAa,QAAQ,iBAA0C;AACpI,UAAO,gBAAgB,QAAQ,aAAa,oBAC1C,cAAsDA,uBAAc;IAClE;IACA,OAAO;IACP;IACA,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IACtD,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAC5F,CAAC,CAAC,CAAC;IACN;IAEL"}
|
package/dist/resources/tags.mjs
CHANGED
|
@@ -4,14 +4,18 @@ import { getAll } from "../generated/tags/sdk.gen.mjs";
|
|
|
4
4
|
function createTagsResource(deps) {
|
|
5
5
|
const { client, requestWithCache, asApiResponse, throttleManager } = deps;
|
|
6
6
|
return { getAll: async (options = {}) => {
|
|
7
|
-
const { query = {}, signal, throwOnError } = options;
|
|
7
|
+
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
8
8
|
const requestPath = "/v2/cdn/tags";
|
|
9
9
|
return requestWithCache("GET", requestPath, query, (requestQuery) => {
|
|
10
10
|
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(getAll({
|
|
11
11
|
client,
|
|
12
12
|
query: requestQuery,
|
|
13
13
|
signal,
|
|
14
|
-
...throwOnError === void 0 ? {} : { throwOnError }
|
|
14
|
+
...throwOnError === void 0 ? {} : { throwOnError },
|
|
15
|
+
...fetchOptions ? { kyOptions: {
|
|
16
|
+
...client.getConfig().kyOptions,
|
|
17
|
+
...fetchOptions
|
|
18
|
+
} } : {}
|
|
15
19
|
})));
|
|
16
20
|
});
|
|
17
21
|
} };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.mjs","names":["getAllTagsApi"],"sources":["../../src/resources/tags.ts"],"sourcesContent":["import { getAll as getAllTagsApi } from '../generated/tags/sdk.gen';\nimport type { GetAllData as TagsGetAllData, GetAllResponses as TagsGetAllResponses } from '../generated/tags/types.gen';\nimport type { ApiResponse, ResourceDeps } from '../types';\n\nexport function createTagsResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: TagsGetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError } = {},\n ): Promise<ApiResponse<TagsGetAllResponses[200], ThrowOnError>> => {\n const { query = {}, signal, throwOnError } = options;\n const requestPath = '/v2/cdn/tags';\n return requestWithCache<TagsGetAllResponses[200], ThrowOnError>('GET', requestPath, query, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<TagsGetAllResponses[200], ThrowOnError>(getAllTagsApi({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,mBAAmB,MAAoB;CACrD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,QAAQ,OACN,
|
|
1
|
+
{"version":3,"file":"tags.mjs","names":["getAllTagsApi"],"sources":["../../src/resources/tags.ts"],"sourcesContent":["import { getAll as getAllTagsApi } from '../generated/tags/sdk.gen';\nimport type { GetAllData as TagsGetAllData, GetAllResponses as TagsGetAllResponses } from '../generated/tags/types.gen';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../types';\n\nexport function createTagsResource(deps: ResourceDeps) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n getAll: async <ThrowOnError extends boolean = false>(\n options: { query?: TagsGetAllData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<TagsGetAllResponses[200], ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/tags';\n return requestWithCache<TagsGetAllResponses[200], ThrowOnError>('GET', requestPath, query, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<TagsGetAllResponses[200], ThrowOnError>(getAllTagsApi({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n })));\n });\n },\n };\n}\n"],"mappings":";;;AAIA,SAAgB,mBAAmB,MAAoB;CACrD,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,QAAQ,OACN,UAA+H,EAAE,KAChE;EACjE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;EAC3D,MAAM,cAAc;AACpB,SAAO,iBAAyD,OAAO,aAAa,QAAQ,iBAA0C;AACpI,UAAO,gBAAgB,QAAQ,aAAa,oBAC1C,cAAsDA,OAAc;IAClE;IACA,OAAO;IACP;IACA,GAAI,iBAAiB,SAAY,EAAE,GAAG,EAAE,cAAc;IACtD,GAAI,eAAe,EAAE,WAAW;KAAE,GAAG,OAAO,WAAW,CAAC;KAAW,GAAG;KAAc,EAAE,GAAG,EAAE;IAC5F,CAAC,CAAC,CAAC;IACN;IAEL"}
|
package/dist/types.d.cts
CHANGED
|
@@ -14,6 +14,24 @@ type ApiResponse<Data = unknown, ThrowOnError extends boolean = false> = ThrowOn
|
|
|
14
14
|
};
|
|
15
15
|
type HttpRequestOptions = Omit<RequestOptions, 'method' | 'security' | 'url'>;
|
|
16
16
|
type HttpRequestMethod = <TData = unknown>(path: string, options?: HttpRequestOptions) => Promise<ApiResponse<TData>>;
|
|
17
|
+
/**
|
|
18
|
+
* Arbitrary options forwarded to the underlying `fetch()` call.
|
|
19
|
+
*
|
|
20
|
+
* Standard `RequestInit` properties (`cache`, `credentials`, `mode`, …) and
|
|
21
|
+
* non-standard, vendor-specific properties (Next.js `next`, Cloudflare `cf`, …)
|
|
22
|
+
* are both supported.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* client.stories.get('home', {
|
|
27
|
+
* fetchOptions: {
|
|
28
|
+
* cache: 'no-store',
|
|
29
|
+
* next: { revalidate: 60, tags: ['home'] },
|
|
30
|
+
* },
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
type FetchOptions = Record<string, unknown>;
|
|
17
35
|
//#endregion
|
|
18
|
-
export { ApiResponse, HttpRequestMethod, HttpRequestOptions };
|
|
36
|
+
export { ApiResponse, FetchOptions, HttpRequestMethod, HttpRequestOptions };
|
|
19
37
|
//# sourceMappingURL=types.d.cts.map
|
package/dist/types.d.mts
CHANGED
|
@@ -14,6 +14,24 @@ type ApiResponse<Data = unknown, ThrowOnError extends boolean = false> = ThrowOn
|
|
|
14
14
|
};
|
|
15
15
|
type HttpRequestOptions = Omit<RequestOptions, 'method' | 'security' | 'url'>;
|
|
16
16
|
type HttpRequestMethod = <TData = unknown>(path: string, options?: HttpRequestOptions) => Promise<ApiResponse<TData>>;
|
|
17
|
+
/**
|
|
18
|
+
* Arbitrary options forwarded to the underlying `fetch()` call.
|
|
19
|
+
*
|
|
20
|
+
* Standard `RequestInit` properties (`cache`, `credentials`, `mode`, …) and
|
|
21
|
+
* non-standard, vendor-specific properties (Next.js `next`, Cloudflare `cf`, …)
|
|
22
|
+
* are both supported.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* client.stories.get('home', {
|
|
27
|
+
* fetchOptions: {
|
|
28
|
+
* cache: 'no-store',
|
|
29
|
+
* next: { revalidate: 60, tags: ['home'] },
|
|
30
|
+
* },
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
type FetchOptions = Record<string, unknown>;
|
|
17
35
|
//#endregion
|
|
18
|
-
export { ApiResponse, HttpRequestMethod, HttpRequestOptions };
|
|
36
|
+
export { ApiResponse, FetchOptions, HttpRequestMethod, HttpRequestOptions };
|
|
19
37
|
//# sourceMappingURL=types.d.mts.map
|
package/dist/utils/cache.cjs
CHANGED
|
@@ -46,12 +46,18 @@ const createNetworkFirstStrategy = () => {
|
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
};
|
|
49
|
-
const
|
|
49
|
+
const defaultOnRevalidationError = (error) => {
|
|
50
|
+
console.warn("[storyblok/api-client] SWR background revalidation failed:", error);
|
|
51
|
+
};
|
|
52
|
+
const createSwrStrategy = (options = {}) => {
|
|
53
|
+
const { onRevalidationError = defaultOnRevalidationError } = options;
|
|
50
54
|
const revalidations = /* @__PURE__ */ new Map();
|
|
51
55
|
return async ({ key, cachedResult, loadNetwork }) => {
|
|
52
56
|
if (cachedResult !== void 0) {
|
|
53
57
|
if (!revalidations.has(key)) {
|
|
54
|
-
const revalidation = loadNetwork().catch(() =>
|
|
58
|
+
const revalidation = loadNetwork().catch((error) => {
|
|
59
|
+
onRevalidationError(error);
|
|
60
|
+
}).finally(() => {
|
|
55
61
|
revalidations.delete(key);
|
|
56
62
|
});
|
|
57
63
|
revalidations.set(key, revalidation);
|
|
@@ -61,9 +67,9 @@ const createSwrStrategy = () => {
|
|
|
61
67
|
return loadNetwork();
|
|
62
68
|
};
|
|
63
69
|
};
|
|
64
|
-
const createStrategy = (strategy) => {
|
|
70
|
+
const createStrategy = (strategy, options) => {
|
|
65
71
|
if (strategy === "network-first") return createNetworkFirstStrategy();
|
|
66
|
-
if (strategy === "swr") return createSwrStrategy();
|
|
72
|
+
if (strategy === "swr") return createSwrStrategy(options);
|
|
67
73
|
return createCacheFirstStrategy();
|
|
68
74
|
};
|
|
69
75
|
|
package/dist/utils/cache.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.cjs","names":[],"sources":["../../src/utils/cache.ts"],"sourcesContent":["export type CacheStrategy = 'cache-first' | 'network-first' | 'swr';\n\ninterface StrategyContext<TData> {\n key: string;\n cachedResult: TData | undefined;\n loadNetwork: () => Promise<TData>;\n}\n\nexport type CacheStrategyHandler = <TData>(context: StrategyContext<TData>) => Promise<TData>;\n\nexport interface CacheEntry<TValue = unknown> {\n value: TValue;\n storedAt: number;\n ttlMs: number;\n}\n\nexport interface CacheEntryInput<TValue = unknown> {\n value: TValue;\n storedAt?: number;\n ttlMs: number;\n}\n\nexport interface CacheProvider {\n get: <TValue = unknown>(key: string) => Promise<CacheEntry<TValue> | undefined>;\n set: <TValue = unknown>(key: string, entry: CacheEntryInput<TValue>) => Promise<void>;\n flush: () => Promise<void>;\n}\n\ninterface MemoryCacheProviderOptions {\n maxEntries?: number;\n}\n\nexport const createMemoryCacheProvider = (\n options: MemoryCacheProviderOptions = {},\n): CacheProvider => {\n const maxEntries = options.maxEntries ?? 1_000;\n const cache = new Map<string, CacheEntry<unknown>>();\n\n return {\n async get<TValue = unknown>(key: string) {\n // Map stores heterogeneous CacheEntry<unknown>; caller provides the expected type via the generic.\n const entry = cache.get(key) as CacheEntry<TValue>;\n if (!entry) {\n return undefined;\n }\n\n if (Date.now() - entry.storedAt > entry.ttlMs) {\n cache.delete(key);\n return undefined;\n }\n\n return entry;\n },\n async set<TValue = unknown>(key: string, entry: CacheEntryInput<TValue>) {\n const cacheEntry: CacheEntry<TValue> = {\n ...entry,\n storedAt: entry.storedAt ?? Date.now(),\n };\n\n // Move existing keys to the end so eviction stays LRU-like.\n // Map#set updates values in place and does not change insertion order.\n if (cache.has(key)) {\n cache.delete(key);\n }\n\n cache.set(key, cacheEntry);\n\n if (cache.size > maxEntries) {\n const oldestKey = cache.keys().next().value;\n if (oldestKey !== undefined) {\n cache.delete(oldestKey);\n }\n }\n },\n async flush(): Promise<void> {\n cache.clear();\n },\n };\n};\n\nexport const createCacheFirstStrategy = (): CacheStrategyHandler => {\n return async <TData>({ cachedResult, loadNetwork }: StrategyContext<TData>) => {\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n return loadNetwork();\n };\n};\n\nexport const createNetworkFirstStrategy = (): CacheStrategyHandler => {\n return async <TData>({ cachedResult, loadNetwork }: StrategyContext<TData>) => {\n try {\n return await loadNetwork();\n }\n catch (error) {\n // network-first: try network, fall back to cached data if available.\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n throw error;\n }\n };\n};\n\nexport const createSwrStrategy = (): CacheStrategyHandler => {\n const revalidations = new Map<string, Promise<unknown>>();\n\n return async <TData>({ key, cachedResult, loadNetwork }: StrategyContext<TData>) => {\n if (cachedResult !== undefined) {\n if (!revalidations.has(key)) {\n const revalidation = loadNetwork()\n .catch(() => undefined)\n .finally(() => {\n revalidations.delete(key);\n });\n revalidations.set(key, revalidation);\n }\n\n return cachedResult;\n }\n\n return loadNetwork();\n };\n};\n\nexport const createStrategy = (strategy: CacheStrategy): CacheStrategyHandler => {\n if (strategy === 'network-first') {\n return createNetworkFirstStrategy();\n }\n\n if (strategy === 'swr') {\n return createSwrStrategy();\n }\n\n return createCacheFirstStrategy();\n};\n"],"mappings":";;AAgCA,MAAa,6BACX,UAAsC,EAAE,KACtB;CAClB,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,wBAAQ,IAAI,KAAkC;AAEpD,QAAO;EACL,MAAM,IAAsB,KAAa;GAEvC,MAAM,QAAQ,MAAM,IAAI,IAAI;AAC5B,OAAI,CAAC,MACH;AAGF,OAAI,KAAK,KAAK,GAAG,MAAM,WAAW,MAAM,OAAO;AAC7C,UAAM,OAAO,IAAI;AACjB;;AAGF,UAAO;;EAET,MAAM,IAAsB,KAAa,OAAgC;GACvE,MAAM,aAAiC;IACrC,GAAG;IACH,UAAU,MAAM,YAAY,KAAK,KAAK;IACvC;AAID,OAAI,MAAM,IAAI,IAAI,CAChB,OAAM,OAAO,IAAI;AAGnB,SAAM,IAAI,KAAK,WAAW;AAE1B,OAAI,MAAM,OAAO,YAAY;IAC3B,MAAM,YAAY,MAAM,MAAM,CAAC,MAAM,CAAC;AACtC,QAAI,cAAc,OAChB,OAAM,OAAO,UAAU;;;EAI7B,MAAM,QAAuB;AAC3B,SAAM,OAAO;;EAEhB;;AAGH,MAAa,iCAAuD;AAClE,QAAO,OAAc,EAAE,cAAc,kBAA0C;AAC7E,MAAI,iBAAiB,OACnB,QAAO;AAGT,SAAO,aAAa;;;AAIxB,MAAa,mCAAyD;AACpE,QAAO,OAAc,EAAE,cAAc,kBAA0C;AAC7E,MAAI;AACF,UAAO,MAAM,aAAa;WAErB,OAAO;AAEZ,OAAI,iBAAiB,OACnB,QAAO;AAGT,SAAM;;;;
|
|
1
|
+
{"version":3,"file":"cache.cjs","names":[],"sources":["../../src/utils/cache.ts"],"sourcesContent":["export type CacheStrategy = 'cache-first' | 'network-first' | 'swr';\n\ninterface StrategyContext<TData> {\n key: string;\n cachedResult: TData | undefined;\n loadNetwork: () => Promise<TData>;\n}\n\nexport type CacheStrategyHandler = <TData>(context: StrategyContext<TData>) => Promise<TData>;\n\nexport interface CacheEntry<TValue = unknown> {\n value: TValue;\n storedAt: number;\n ttlMs: number;\n}\n\nexport interface CacheEntryInput<TValue = unknown> {\n value: TValue;\n storedAt?: number;\n ttlMs: number;\n}\n\nexport interface CacheProvider {\n get: <TValue = unknown>(key: string) => Promise<CacheEntry<TValue> | undefined>;\n set: <TValue = unknown>(key: string, entry: CacheEntryInput<TValue>) => Promise<void>;\n flush: () => Promise<void>;\n}\n\ninterface MemoryCacheProviderOptions {\n maxEntries?: number;\n}\n\nexport const createMemoryCacheProvider = (\n options: MemoryCacheProviderOptions = {},\n): CacheProvider => {\n const maxEntries = options.maxEntries ?? 1_000;\n const cache = new Map<string, CacheEntry<unknown>>();\n\n return {\n async get<TValue = unknown>(key: string) {\n // Map stores heterogeneous CacheEntry<unknown>; caller provides the expected type via the generic.\n const entry = cache.get(key) as CacheEntry<TValue>;\n if (!entry) {\n return undefined;\n }\n\n if (Date.now() - entry.storedAt > entry.ttlMs) {\n cache.delete(key);\n return undefined;\n }\n\n return entry;\n },\n async set<TValue = unknown>(key: string, entry: CacheEntryInput<TValue>) {\n const cacheEntry: CacheEntry<TValue> = {\n ...entry,\n storedAt: entry.storedAt ?? Date.now(),\n };\n\n // Move existing keys to the end so eviction stays LRU-like.\n // Map#set updates values in place and does not change insertion order.\n if (cache.has(key)) {\n cache.delete(key);\n }\n\n cache.set(key, cacheEntry);\n\n if (cache.size > maxEntries) {\n const oldestKey = cache.keys().next().value;\n if (oldestKey !== undefined) {\n cache.delete(oldestKey);\n }\n }\n },\n async flush(): Promise<void> {\n cache.clear();\n },\n };\n};\n\nexport const createCacheFirstStrategy = (): CacheStrategyHandler => {\n return async <TData>({ cachedResult, loadNetwork }: StrategyContext<TData>) => {\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n return loadNetwork();\n };\n};\n\nexport const createNetworkFirstStrategy = (): CacheStrategyHandler => {\n return async <TData>({ cachedResult, loadNetwork }: StrategyContext<TData>) => {\n try {\n return await loadNetwork();\n }\n catch (error) {\n // network-first: try network, fall back to cached data if available.\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n throw error;\n }\n };\n};\n\nexport interface SwrStrategyOptions {\n /** Called when a background revalidation fails. Defaults to `console.warn`. */\n onRevalidationError?: (error: unknown) => void;\n}\n\nconst defaultOnRevalidationError = (error: unknown): void => {\n console.warn('[storyblok/api-client] SWR background revalidation failed:', error);\n};\n\nexport const createSwrStrategy = (options: SwrStrategyOptions = {}): CacheStrategyHandler => {\n const { onRevalidationError = defaultOnRevalidationError } = options;\n const revalidations = new Map<string, Promise<unknown>>();\n\n return async <TData>({ key, cachedResult, loadNetwork }: StrategyContext<TData>) => {\n if (cachedResult !== undefined) {\n if (!revalidations.has(key)) {\n const revalidation = loadNetwork()\n .catch((error: unknown) => {\n onRevalidationError(error);\n return undefined;\n })\n .finally(() => {\n revalidations.delete(key);\n });\n revalidations.set(key, revalidation);\n }\n\n return cachedResult;\n }\n\n return loadNetwork();\n };\n};\n\nexport const createStrategy = (strategy: CacheStrategy, options?: SwrStrategyOptions): CacheStrategyHandler => {\n if (strategy === 'network-first') {\n return createNetworkFirstStrategy();\n }\n\n if (strategy === 'swr') {\n return createSwrStrategy(options);\n }\n\n return createCacheFirstStrategy();\n};\n"],"mappings":";;AAgCA,MAAa,6BACX,UAAsC,EAAE,KACtB;CAClB,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,wBAAQ,IAAI,KAAkC;AAEpD,QAAO;EACL,MAAM,IAAsB,KAAa;GAEvC,MAAM,QAAQ,MAAM,IAAI,IAAI;AAC5B,OAAI,CAAC,MACH;AAGF,OAAI,KAAK,KAAK,GAAG,MAAM,WAAW,MAAM,OAAO;AAC7C,UAAM,OAAO,IAAI;AACjB;;AAGF,UAAO;;EAET,MAAM,IAAsB,KAAa,OAAgC;GACvE,MAAM,aAAiC;IACrC,GAAG;IACH,UAAU,MAAM,YAAY,KAAK,KAAK;IACvC;AAID,OAAI,MAAM,IAAI,IAAI,CAChB,OAAM,OAAO,IAAI;AAGnB,SAAM,IAAI,KAAK,WAAW;AAE1B,OAAI,MAAM,OAAO,YAAY;IAC3B,MAAM,YAAY,MAAM,MAAM,CAAC,MAAM,CAAC;AACtC,QAAI,cAAc,OAChB,OAAM,OAAO,UAAU;;;EAI7B,MAAM,QAAuB;AAC3B,SAAM,OAAO;;EAEhB;;AAGH,MAAa,iCAAuD;AAClE,QAAO,OAAc,EAAE,cAAc,kBAA0C;AAC7E,MAAI,iBAAiB,OACnB,QAAO;AAGT,SAAO,aAAa;;;AAIxB,MAAa,mCAAyD;AACpE,QAAO,OAAc,EAAE,cAAc,kBAA0C;AAC7E,MAAI;AACF,UAAO,MAAM,aAAa;WAErB,OAAO;AAEZ,OAAI,iBAAiB,OACnB,QAAO;AAGT,SAAM;;;;AAUZ,MAAM,8BAA8B,UAAyB;AAC3D,SAAQ,KAAK,8DAA8D,MAAM;;AAGnF,MAAa,qBAAqB,UAA8B,EAAE,KAA2B;CAC3F,MAAM,EAAE,sBAAsB,+BAA+B;CAC7D,MAAM,gCAAgB,IAAI,KAA+B;AAEzD,QAAO,OAAc,EAAE,KAAK,cAAc,kBAA0C;AAClF,MAAI,iBAAiB,QAAW;AAC9B,OAAI,CAAC,cAAc,IAAI,IAAI,EAAE;IAC3B,MAAM,eAAe,aAAa,CAC/B,OAAO,UAAmB;AACzB,yBAAoB,MAAM;MAE1B,CACD,cAAc;AACb,mBAAc,OAAO,IAAI;MACzB;AACJ,kBAAc,IAAI,KAAK,aAAa;;AAGtC,UAAO;;AAGT,SAAO,aAAa;;;AAIxB,MAAa,kBAAkB,UAAyB,YAAuD;AAC7G,KAAI,aAAa,gBACf,QAAO,4BAA4B;AAGrC,KAAI,aAAa,MACf,QAAO,kBAAkB,QAAQ;AAGnC,QAAO,0BAA0B"}
|
package/dist/utils/cache.mjs
CHANGED
|
@@ -45,12 +45,18 @@ const createNetworkFirstStrategy = () => {
|
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
47
|
};
|
|
48
|
-
const
|
|
48
|
+
const defaultOnRevalidationError = (error) => {
|
|
49
|
+
console.warn("[storyblok/api-client] SWR background revalidation failed:", error);
|
|
50
|
+
};
|
|
51
|
+
const createSwrStrategy = (options = {}) => {
|
|
52
|
+
const { onRevalidationError = defaultOnRevalidationError } = options;
|
|
49
53
|
const revalidations = /* @__PURE__ */ new Map();
|
|
50
54
|
return async ({ key, cachedResult, loadNetwork }) => {
|
|
51
55
|
if (cachedResult !== void 0) {
|
|
52
56
|
if (!revalidations.has(key)) {
|
|
53
|
-
const revalidation = loadNetwork().catch(() =>
|
|
57
|
+
const revalidation = loadNetwork().catch((error) => {
|
|
58
|
+
onRevalidationError(error);
|
|
59
|
+
}).finally(() => {
|
|
54
60
|
revalidations.delete(key);
|
|
55
61
|
});
|
|
56
62
|
revalidations.set(key, revalidation);
|
|
@@ -60,9 +66,9 @@ const createSwrStrategy = () => {
|
|
|
60
66
|
return loadNetwork();
|
|
61
67
|
};
|
|
62
68
|
};
|
|
63
|
-
const createStrategy = (strategy) => {
|
|
69
|
+
const createStrategy = (strategy, options) => {
|
|
64
70
|
if (strategy === "network-first") return createNetworkFirstStrategy();
|
|
65
|
-
if (strategy === "swr") return createSwrStrategy();
|
|
71
|
+
if (strategy === "swr") return createSwrStrategy(options);
|
|
66
72
|
return createCacheFirstStrategy();
|
|
67
73
|
};
|
|
68
74
|
|
package/dist/utils/cache.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.mjs","names":[],"sources":["../../src/utils/cache.ts"],"sourcesContent":["export type CacheStrategy = 'cache-first' | 'network-first' | 'swr';\n\ninterface StrategyContext<TData> {\n key: string;\n cachedResult: TData | undefined;\n loadNetwork: () => Promise<TData>;\n}\n\nexport type CacheStrategyHandler = <TData>(context: StrategyContext<TData>) => Promise<TData>;\n\nexport interface CacheEntry<TValue = unknown> {\n value: TValue;\n storedAt: number;\n ttlMs: number;\n}\n\nexport interface CacheEntryInput<TValue = unknown> {\n value: TValue;\n storedAt?: number;\n ttlMs: number;\n}\n\nexport interface CacheProvider {\n get: <TValue = unknown>(key: string) => Promise<CacheEntry<TValue> | undefined>;\n set: <TValue = unknown>(key: string, entry: CacheEntryInput<TValue>) => Promise<void>;\n flush: () => Promise<void>;\n}\n\ninterface MemoryCacheProviderOptions {\n maxEntries?: number;\n}\n\nexport const createMemoryCacheProvider = (\n options: MemoryCacheProviderOptions = {},\n): CacheProvider => {\n const maxEntries = options.maxEntries ?? 1_000;\n const cache = new Map<string, CacheEntry<unknown>>();\n\n return {\n async get<TValue = unknown>(key: string) {\n // Map stores heterogeneous CacheEntry<unknown>; caller provides the expected type via the generic.\n const entry = cache.get(key) as CacheEntry<TValue>;\n if (!entry) {\n return undefined;\n }\n\n if (Date.now() - entry.storedAt > entry.ttlMs) {\n cache.delete(key);\n return undefined;\n }\n\n return entry;\n },\n async set<TValue = unknown>(key: string, entry: CacheEntryInput<TValue>) {\n const cacheEntry: CacheEntry<TValue> = {\n ...entry,\n storedAt: entry.storedAt ?? Date.now(),\n };\n\n // Move existing keys to the end so eviction stays LRU-like.\n // Map#set updates values in place and does not change insertion order.\n if (cache.has(key)) {\n cache.delete(key);\n }\n\n cache.set(key, cacheEntry);\n\n if (cache.size > maxEntries) {\n const oldestKey = cache.keys().next().value;\n if (oldestKey !== undefined) {\n cache.delete(oldestKey);\n }\n }\n },\n async flush(): Promise<void> {\n cache.clear();\n },\n };\n};\n\nexport const createCacheFirstStrategy = (): CacheStrategyHandler => {\n return async <TData>({ cachedResult, loadNetwork }: StrategyContext<TData>) => {\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n return loadNetwork();\n };\n};\n\nexport const createNetworkFirstStrategy = (): CacheStrategyHandler => {\n return async <TData>({ cachedResult, loadNetwork }: StrategyContext<TData>) => {\n try {\n return await loadNetwork();\n }\n catch (error) {\n // network-first: try network, fall back to cached data if available.\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n throw error;\n }\n };\n};\n\nexport const createSwrStrategy = (): CacheStrategyHandler => {\n const revalidations = new Map<string, Promise<unknown>>();\n\n return async <TData>({ key, cachedResult, loadNetwork }: StrategyContext<TData>) => {\n if (cachedResult !== undefined) {\n if (!revalidations.has(key)) {\n const revalidation = loadNetwork()\n .catch(() => undefined)\n .finally(() => {\n revalidations.delete(key);\n });\n revalidations.set(key, revalidation);\n }\n\n return cachedResult;\n }\n\n return loadNetwork();\n };\n};\n\nexport const createStrategy = (strategy: CacheStrategy): CacheStrategyHandler => {\n if (strategy === 'network-first') {\n return createNetworkFirstStrategy();\n }\n\n if (strategy === 'swr') {\n return createSwrStrategy();\n }\n\n return createCacheFirstStrategy();\n};\n"],"mappings":";AAgCA,MAAa,6BACX,UAAsC,EAAE,KACtB;CAClB,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,wBAAQ,IAAI,KAAkC;AAEpD,QAAO;EACL,MAAM,IAAsB,KAAa;GAEvC,MAAM,QAAQ,MAAM,IAAI,IAAI;AAC5B,OAAI,CAAC,MACH;AAGF,OAAI,KAAK,KAAK,GAAG,MAAM,WAAW,MAAM,OAAO;AAC7C,UAAM,OAAO,IAAI;AACjB;;AAGF,UAAO;;EAET,MAAM,IAAsB,KAAa,OAAgC;GACvE,MAAM,aAAiC;IACrC,GAAG;IACH,UAAU,MAAM,YAAY,KAAK,KAAK;IACvC;AAID,OAAI,MAAM,IAAI,IAAI,CAChB,OAAM,OAAO,IAAI;AAGnB,SAAM,IAAI,KAAK,WAAW;AAE1B,OAAI,MAAM,OAAO,YAAY;IAC3B,MAAM,YAAY,MAAM,MAAM,CAAC,MAAM,CAAC;AACtC,QAAI,cAAc,OAChB,OAAM,OAAO,UAAU;;;EAI7B,MAAM,QAAuB;AAC3B,SAAM,OAAO;;EAEhB;;AAGH,MAAa,iCAAuD;AAClE,QAAO,OAAc,EAAE,cAAc,kBAA0C;AAC7E,MAAI,iBAAiB,OACnB,QAAO;AAGT,SAAO,aAAa;;;AAIxB,MAAa,mCAAyD;AACpE,QAAO,OAAc,EAAE,cAAc,kBAA0C;AAC7E,MAAI;AACF,UAAO,MAAM,aAAa;WAErB,OAAO;AAEZ,OAAI,iBAAiB,OACnB,QAAO;AAGT,SAAM;;;;
|
|
1
|
+
{"version":3,"file":"cache.mjs","names":[],"sources":["../../src/utils/cache.ts"],"sourcesContent":["export type CacheStrategy = 'cache-first' | 'network-first' | 'swr';\n\ninterface StrategyContext<TData> {\n key: string;\n cachedResult: TData | undefined;\n loadNetwork: () => Promise<TData>;\n}\n\nexport type CacheStrategyHandler = <TData>(context: StrategyContext<TData>) => Promise<TData>;\n\nexport interface CacheEntry<TValue = unknown> {\n value: TValue;\n storedAt: number;\n ttlMs: number;\n}\n\nexport interface CacheEntryInput<TValue = unknown> {\n value: TValue;\n storedAt?: number;\n ttlMs: number;\n}\n\nexport interface CacheProvider {\n get: <TValue = unknown>(key: string) => Promise<CacheEntry<TValue> | undefined>;\n set: <TValue = unknown>(key: string, entry: CacheEntryInput<TValue>) => Promise<void>;\n flush: () => Promise<void>;\n}\n\ninterface MemoryCacheProviderOptions {\n maxEntries?: number;\n}\n\nexport const createMemoryCacheProvider = (\n options: MemoryCacheProviderOptions = {},\n): CacheProvider => {\n const maxEntries = options.maxEntries ?? 1_000;\n const cache = new Map<string, CacheEntry<unknown>>();\n\n return {\n async get<TValue = unknown>(key: string) {\n // Map stores heterogeneous CacheEntry<unknown>; caller provides the expected type via the generic.\n const entry = cache.get(key) as CacheEntry<TValue>;\n if (!entry) {\n return undefined;\n }\n\n if (Date.now() - entry.storedAt > entry.ttlMs) {\n cache.delete(key);\n return undefined;\n }\n\n return entry;\n },\n async set<TValue = unknown>(key: string, entry: CacheEntryInput<TValue>) {\n const cacheEntry: CacheEntry<TValue> = {\n ...entry,\n storedAt: entry.storedAt ?? Date.now(),\n };\n\n // Move existing keys to the end so eviction stays LRU-like.\n // Map#set updates values in place and does not change insertion order.\n if (cache.has(key)) {\n cache.delete(key);\n }\n\n cache.set(key, cacheEntry);\n\n if (cache.size > maxEntries) {\n const oldestKey = cache.keys().next().value;\n if (oldestKey !== undefined) {\n cache.delete(oldestKey);\n }\n }\n },\n async flush(): Promise<void> {\n cache.clear();\n },\n };\n};\n\nexport const createCacheFirstStrategy = (): CacheStrategyHandler => {\n return async <TData>({ cachedResult, loadNetwork }: StrategyContext<TData>) => {\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n return loadNetwork();\n };\n};\n\nexport const createNetworkFirstStrategy = (): CacheStrategyHandler => {\n return async <TData>({ cachedResult, loadNetwork }: StrategyContext<TData>) => {\n try {\n return await loadNetwork();\n }\n catch (error) {\n // network-first: try network, fall back to cached data if available.\n if (cachedResult !== undefined) {\n return cachedResult;\n }\n\n throw error;\n }\n };\n};\n\nexport interface SwrStrategyOptions {\n /** Called when a background revalidation fails. Defaults to `console.warn`. */\n onRevalidationError?: (error: unknown) => void;\n}\n\nconst defaultOnRevalidationError = (error: unknown): void => {\n console.warn('[storyblok/api-client] SWR background revalidation failed:', error);\n};\n\nexport const createSwrStrategy = (options: SwrStrategyOptions = {}): CacheStrategyHandler => {\n const { onRevalidationError = defaultOnRevalidationError } = options;\n const revalidations = new Map<string, Promise<unknown>>();\n\n return async <TData>({ key, cachedResult, loadNetwork }: StrategyContext<TData>) => {\n if (cachedResult !== undefined) {\n if (!revalidations.has(key)) {\n const revalidation = loadNetwork()\n .catch((error: unknown) => {\n onRevalidationError(error);\n return undefined;\n })\n .finally(() => {\n revalidations.delete(key);\n });\n revalidations.set(key, revalidation);\n }\n\n return cachedResult;\n }\n\n return loadNetwork();\n };\n};\n\nexport const createStrategy = (strategy: CacheStrategy, options?: SwrStrategyOptions): CacheStrategyHandler => {\n if (strategy === 'network-first') {\n return createNetworkFirstStrategy();\n }\n\n if (strategy === 'swr') {\n return createSwrStrategy(options);\n }\n\n return createCacheFirstStrategy();\n};\n"],"mappings":";AAgCA,MAAa,6BACX,UAAsC,EAAE,KACtB;CAClB,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,wBAAQ,IAAI,KAAkC;AAEpD,QAAO;EACL,MAAM,IAAsB,KAAa;GAEvC,MAAM,QAAQ,MAAM,IAAI,IAAI;AAC5B,OAAI,CAAC,MACH;AAGF,OAAI,KAAK,KAAK,GAAG,MAAM,WAAW,MAAM,OAAO;AAC7C,UAAM,OAAO,IAAI;AACjB;;AAGF,UAAO;;EAET,MAAM,IAAsB,KAAa,OAAgC;GACvE,MAAM,aAAiC;IACrC,GAAG;IACH,UAAU,MAAM,YAAY,KAAK,KAAK;IACvC;AAID,OAAI,MAAM,IAAI,IAAI,CAChB,OAAM,OAAO,IAAI;AAGnB,SAAM,IAAI,KAAK,WAAW;AAE1B,OAAI,MAAM,OAAO,YAAY;IAC3B,MAAM,YAAY,MAAM,MAAM,CAAC,MAAM,CAAC;AACtC,QAAI,cAAc,OAChB,OAAM,OAAO,UAAU;;;EAI7B,MAAM,QAAuB;AAC3B,SAAM,OAAO;;EAEhB;;AAGH,MAAa,iCAAuD;AAClE,QAAO,OAAc,EAAE,cAAc,kBAA0C;AAC7E,MAAI,iBAAiB,OACnB,QAAO;AAGT,SAAO,aAAa;;;AAIxB,MAAa,mCAAyD;AACpE,QAAO,OAAc,EAAE,cAAc,kBAA0C;AAC7E,MAAI;AACF,UAAO,MAAM,aAAa;WAErB,OAAO;AAEZ,OAAI,iBAAiB,OACnB,QAAO;AAGT,SAAM;;;;AAUZ,MAAM,8BAA8B,UAAyB;AAC3D,SAAQ,KAAK,8DAA8D,MAAM;;AAGnF,MAAa,qBAAqB,UAA8B,EAAE,KAA2B;CAC3F,MAAM,EAAE,sBAAsB,+BAA+B;CAC7D,MAAM,gCAAgB,IAAI,KAA+B;AAEzD,QAAO,OAAc,EAAE,KAAK,cAAc,kBAA0C;AAClF,MAAI,iBAAiB,QAAW;AAC9B,OAAI,CAAC,cAAc,IAAI,IAAI,EAAE;IAC3B,MAAM,eAAe,aAAa,CAC/B,OAAO,UAAmB;AACzB,yBAAoB,MAAM;MAE1B,CACD,cAAc;AACb,mBAAc,OAAO,IAAI;MACzB;AACJ,kBAAc,IAAI,KAAK,aAAa;;AAGtC,UAAO;;AAGT,SAAO,aAAa;;;AAIxB,MAAa,kBAAkB,UAAyB,YAAuD;AAC7G,KAAI,aAAa,gBACf,QAAO,4BAA4B;AAGrC,KAAI,aAAa,MACf,QAAO,kBAAkB,QAAQ;AAGnC,QAAO,0BAA0B"}
|
|
@@ -65,13 +65,16 @@ const resolveRelationMap = async (responseData, requestQuery, { client, throttle
|
|
|
65
65
|
if (relationPaths.length === 0) return null;
|
|
66
66
|
const relationMap = buildRelationMap(responseData.rels);
|
|
67
67
|
if (responseData.rel_uuids?.length) {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
68
|
+
const missingUuids = responseData.rel_uuids.filter((uuid) => !relationMap.has(uuid));
|
|
69
|
+
if (missingUuids.length > 0) {
|
|
70
|
+
const fetchedRelations = await require_fetch_rel_uuids.fetchMissingRelations({
|
|
71
|
+
client,
|
|
72
|
+
uuids: missingUuids,
|
|
73
|
+
baseQuery: requestQuery,
|
|
74
|
+
throttleManager
|
|
75
|
+
});
|
|
76
|
+
for (const relationStory of fetchedRelations) relationMap.set(relationStory.uuid, relationStory);
|
|
77
|
+
}
|
|
75
78
|
}
|
|
76
79
|
return {
|
|
77
80
|
relationPaths,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inline-relations.cjs","names":["fetchMissingRelations"],"sources":["../../src/utils/inline-relations.ts"],"sourcesContent":["import type { Client } from '../generated/shared/client';\nimport type { StoryCapi } from '../generated/stories';\nimport type { StoryWithInlinedRelations } from '../resources/stories';\nimport { fetchMissingRelations } from './fetch-rel-uuids';\nimport type { ThrottleManager } from './rate-limit';\n\ntype RelationPath = `${string}.${string}`;\n\ninterface ComponentNode {\n _uid: string;\n component: string;\n [key: string]: unknown;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value);\n\nconst isComponentNode = (value: Record<string, unknown>): value is ComponentNode =>\n typeof value.component === 'string' && typeof value._uid === 'string';\n\nconst inlineStoryContentInternal = <TStory extends StoryCapi | StoryWithInlinedRelations>(\n story: TStory,\n relationPaths: ReadonlySet<RelationPath>,\n relationMap: ReadonlyMap<string, TStory>,\n resolved: Map<string, TStory>,\n): TStory => {\n const existingStory = resolved.get(story.uuid);\n if (existingStory) {\n return existingStory;\n }\n\n const clonedStory = structuredClone(story);\n resolved.set(story.uuid, clonedStory);\n // resolveNode returns `unknown` to handle arbitrary JSON trees; shape is preserved at runtime.\n clonedStory.content = resolveNode(clonedStory.content, relationMap, relationPaths, resolved) as StoryCapi['content'];\n return clonedStory;\n};\n\nfunction resolveNode<TStory extends StoryCapi | StoryWithInlinedRelations>(\n value: unknown,\n relationMap: ReadonlyMap<string, TStory>,\n relationPaths: ReadonlySet<RelationPath>,\n resolved: Map<string, TStory>,\n): unknown {\n if (Array.isArray(value)) {\n return value.map(item => resolveNode(item, relationMap, relationPaths, resolved));\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n if (isComponentNode(value)) {\n for (const [fieldName, fieldValue] of Object.entries(value)) {\n if (fieldName === 'component' || fieldName === '_uid') {\n continue;\n }\n\n const relationPath: RelationPath = `${value.component}.${fieldName}`;\n value[fieldName] = relationPaths.has(relationPath)\n ? resolveFieldValue(fieldValue, relationMap, relationPaths, resolved)\n : resolveNode(fieldValue, relationMap, relationPaths, resolved);\n }\n\n return value;\n }\n\n for (const [fieldName, fieldValue] of Object.entries(value)) {\n value[fieldName] = resolveNode(fieldValue, relationMap, relationPaths, resolved);\n }\n\n return value;\n}\n\nexport const parseResolveRelations = (query: Record<string, unknown>): RelationPath[] => {\n if (typeof query.resolve_relations !== 'string') {\n return [];\n }\n\n return query.resolve_relations\n .split(',')\n .map(path => path.trim())\n .filter((path): path is RelationPath => {\n const [component = '', field = '', ...rest] = path.split('.');\n return component.length > 0 && field.length > 0 && rest.length === 0;\n });\n};\n\nexport const buildRelationMap = (rels: Array<StoryCapi> | undefined): Map<string, StoryCapi> => {\n const relationMap = new Map<string, StoryCapi>();\n\n for (const story of rels ?? []) {\n relationMap.set(story.uuid, story);\n }\n\n return relationMap;\n};\n\nfunction resolveFieldValue<TStory extends StoryCapi | StoryWithInlinedRelations>(\n value: unknown,\n relationMap: ReadonlyMap<string, TStory>,\n relationPaths: ReadonlySet<RelationPath>,\n resolved: Map<string, TStory>,\n): unknown {\n if (typeof value === 'string') {\n const relatedStory = relationMap.get(value);\n if (!relatedStory) {\n return value;\n }\n\n return inlineStoryContentInternal(relatedStory, relationPaths, relationMap, resolved);\n }\n\n if (Array.isArray(value)) {\n return value.map(item => resolveFieldValue(item, relationMap, relationPaths, resolved));\n }\n\n return resolveNode(value, relationMap, relationPaths, resolved);\n}\n\nexport const inlineStoryContent = <TStory extends StoryCapi | StoryWithInlinedRelations>(\n story: TStory,\n relationPaths: RelationPath[],\n relationMap: ReadonlyMap<string, TStory>,\n): TStory => {\n const normalizedPaths = new Set(relationPaths);\n const resolved = new Map<string, TStory>();\n return inlineStoryContentInternal(story, normalizedPaths, relationMap, resolved);\n};\n\nexport const inlineStoriesContent = <TStory extends StoryCapi | StoryWithInlinedRelations>(\n stories: Array<TStory>,\n relationPaths: RelationPath[],\n relationMap: ReadonlyMap<string, TStory>,\n): Array<TStory> => {\n const normalizedPaths = new Set(relationPaths);\n const resolved = new Map<string, TStory>();\n return stories.map(story => inlineStoryContentInternal(story, normalizedPaths, relationMap, resolved));\n};\n\ninterface ResolveRelationMapOptions {\n client: Client;\n throttleManager: ThrottleManager;\n}\n\nexport interface ResolvedRelations {\n relationPaths: RelationPath[];\n relationMap: Map<string, StoryCapi>;\n}\n\n/**\n * Parses relation paths from the request query, builds a relation map from the\n * response's `rels`, and fetches any additional relations referenced by `rel_uuids`.\n *\n * Returns `null` when there is nothing to inline (no `resolve_relations` in the query).\n */\nexport const resolveRelationMap = async (\n responseData: { rels?: StoryCapi[]; rel_uuids?: string[] },\n requestQuery: Record<string, unknown>,\n { client, throttleManager }: ResolveRelationMapOptions,\n): Promise<ResolvedRelations | null> => {\n const relationPaths = parseResolveRelations(requestQuery);\n if (relationPaths.length === 0) {\n return null;\n }\n\n const relationMap = buildRelationMap(responseData.rels);\n if (responseData.rel_uuids?.length) {\n const fetchedRelations = await fetchMissingRelations({\n
|
|
1
|
+
{"version":3,"file":"inline-relations.cjs","names":["fetchMissingRelations"],"sources":["../../src/utils/inline-relations.ts"],"sourcesContent":["import type { Client } from '../generated/shared/client';\nimport type { StoryCapi } from '../generated/stories';\nimport type { StoryWithInlinedRelations } from '../resources/stories';\nimport { fetchMissingRelations } from './fetch-rel-uuids';\nimport type { ThrottleManager } from './rate-limit';\n\ntype RelationPath = `${string}.${string}`;\n\ninterface ComponentNode {\n _uid: string;\n component: string;\n [key: string]: unknown;\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value);\n\nconst isComponentNode = (value: Record<string, unknown>): value is ComponentNode =>\n typeof value.component === 'string' && typeof value._uid === 'string';\n\nconst inlineStoryContentInternal = <TStory extends StoryCapi | StoryWithInlinedRelations>(\n story: TStory,\n relationPaths: ReadonlySet<RelationPath>,\n relationMap: ReadonlyMap<string, TStory>,\n resolved: Map<string, TStory>,\n): TStory => {\n const existingStory = resolved.get(story.uuid);\n if (existingStory) {\n return existingStory;\n }\n\n const clonedStory = structuredClone(story);\n resolved.set(story.uuid, clonedStory);\n // resolveNode returns `unknown` to handle arbitrary JSON trees; shape is preserved at runtime.\n clonedStory.content = resolveNode(clonedStory.content, relationMap, relationPaths, resolved) as StoryCapi['content'];\n return clonedStory;\n};\n\nfunction resolveNode<TStory extends StoryCapi | StoryWithInlinedRelations>(\n value: unknown,\n relationMap: ReadonlyMap<string, TStory>,\n relationPaths: ReadonlySet<RelationPath>,\n resolved: Map<string, TStory>,\n): unknown {\n if (Array.isArray(value)) {\n return value.map(item => resolveNode(item, relationMap, relationPaths, resolved));\n }\n\n if (!isRecord(value)) {\n return value;\n }\n\n if (isComponentNode(value)) {\n for (const [fieldName, fieldValue] of Object.entries(value)) {\n if (fieldName === 'component' || fieldName === '_uid') {\n continue;\n }\n\n const relationPath: RelationPath = `${value.component}.${fieldName}`;\n value[fieldName] = relationPaths.has(relationPath)\n ? resolveFieldValue(fieldValue, relationMap, relationPaths, resolved)\n : resolveNode(fieldValue, relationMap, relationPaths, resolved);\n }\n\n return value;\n }\n\n for (const [fieldName, fieldValue] of Object.entries(value)) {\n value[fieldName] = resolveNode(fieldValue, relationMap, relationPaths, resolved);\n }\n\n return value;\n}\n\nexport const parseResolveRelations = (query: Record<string, unknown>): RelationPath[] => {\n if (typeof query.resolve_relations !== 'string') {\n return [];\n }\n\n return query.resolve_relations\n .split(',')\n .map(path => path.trim())\n .filter((path): path is RelationPath => {\n const [component = '', field = '', ...rest] = path.split('.');\n return component.length > 0 && field.length > 0 && rest.length === 0;\n });\n};\n\nexport const buildRelationMap = (rels: Array<StoryCapi> | undefined): Map<string, StoryCapi> => {\n const relationMap = new Map<string, StoryCapi>();\n\n for (const story of rels ?? []) {\n relationMap.set(story.uuid, story);\n }\n\n return relationMap;\n};\n\nfunction resolveFieldValue<TStory extends StoryCapi | StoryWithInlinedRelations>(\n value: unknown,\n relationMap: ReadonlyMap<string, TStory>,\n relationPaths: ReadonlySet<RelationPath>,\n resolved: Map<string, TStory>,\n): unknown {\n if (typeof value === 'string') {\n const relatedStory = relationMap.get(value);\n if (!relatedStory) {\n return value;\n }\n\n return inlineStoryContentInternal(relatedStory, relationPaths, relationMap, resolved);\n }\n\n if (Array.isArray(value)) {\n return value.map(item => resolveFieldValue(item, relationMap, relationPaths, resolved));\n }\n\n return resolveNode(value, relationMap, relationPaths, resolved);\n}\n\nexport const inlineStoryContent = <TStory extends StoryCapi | StoryWithInlinedRelations>(\n story: TStory,\n relationPaths: RelationPath[],\n relationMap: ReadonlyMap<string, TStory>,\n): TStory => {\n const normalizedPaths = new Set(relationPaths);\n const resolved = new Map<string, TStory>();\n return inlineStoryContentInternal(story, normalizedPaths, relationMap, resolved);\n};\n\nexport const inlineStoriesContent = <TStory extends StoryCapi | StoryWithInlinedRelations>(\n stories: Array<TStory>,\n relationPaths: RelationPath[],\n relationMap: ReadonlyMap<string, TStory>,\n): Array<TStory> => {\n const normalizedPaths = new Set(relationPaths);\n const resolved = new Map<string, TStory>();\n return stories.map(story => inlineStoryContentInternal(story, normalizedPaths, relationMap, resolved));\n};\n\ninterface ResolveRelationMapOptions {\n client: Client;\n throttleManager: ThrottleManager;\n}\n\nexport interface ResolvedRelations {\n relationPaths: RelationPath[];\n relationMap: Map<string, StoryCapi>;\n}\n\n/**\n * Parses relation paths from the request query, builds a relation map from the\n * response's `rels`, and fetches any additional relations referenced by `rel_uuids`.\n *\n * Returns `null` when there is nothing to inline (no `resolve_relations` in the query).\n */\nexport const resolveRelationMap = async (\n responseData: { rels?: StoryCapi[]; rel_uuids?: string[] },\n requestQuery: Record<string, unknown>,\n { client, throttleManager }: ResolveRelationMapOptions,\n): Promise<ResolvedRelations | null> => {\n const relationPaths = parseResolveRelations(requestQuery);\n if (relationPaths.length === 0) {\n return null;\n }\n\n const relationMap = buildRelationMap(responseData.rels);\n if (responseData.rel_uuids?.length) {\n const missingUuids = responseData.rel_uuids.filter(uuid => !relationMap.has(uuid));\n if (missingUuids.length > 0) {\n const fetchedRelations = await fetchMissingRelations({\n client,\n uuids: missingUuids,\n baseQuery: requestQuery,\n throttleManager,\n });\n for (const relationStory of fetchedRelations) {\n relationMap.set(relationStory.uuid, relationStory);\n }\n }\n }\n\n return { relationPaths, relationMap };\n};\n"],"mappings":";;;AAcA,MAAM,YAAY,UAChB,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM;AAEtE,MAAM,mBAAmB,UACvB,OAAO,MAAM,cAAc,YAAY,OAAO,MAAM,SAAS;AAE/D,MAAM,8BACJ,OACA,eACA,aACA,aACW;CACX,MAAM,gBAAgB,SAAS,IAAI,MAAM,KAAK;AAC9C,KAAI,cACF,QAAO;CAGT,MAAM,cAAc,gBAAgB,MAAM;AAC1C,UAAS,IAAI,MAAM,MAAM,YAAY;AAErC,aAAY,UAAU,YAAY,YAAY,SAAS,aAAa,eAAe,SAAS;AAC5F,QAAO;;AAGT,SAAS,YACP,OACA,aACA,eACA,UACS;AACT,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAI,SAAQ,YAAY,MAAM,aAAa,eAAe,SAAS,CAAC;AAGnF,KAAI,CAAC,SAAS,MAAM,CAClB,QAAO;AAGT,KAAI,gBAAgB,MAAM,EAAE;AAC1B,OAAK,MAAM,CAAC,WAAW,eAAe,OAAO,QAAQ,MAAM,EAAE;AAC3D,OAAI,cAAc,eAAe,cAAc,OAC7C;GAGF,MAAM,eAA6B,GAAG,MAAM,UAAU,GAAG;AACzD,SAAM,aAAa,cAAc,IAAI,aAAa,GAC9C,kBAAkB,YAAY,aAAa,eAAe,SAAS,GACnE,YAAY,YAAY,aAAa,eAAe,SAAS;;AAGnE,SAAO;;AAGT,MAAK,MAAM,CAAC,WAAW,eAAe,OAAO,QAAQ,MAAM,CACzD,OAAM,aAAa,YAAY,YAAY,aAAa,eAAe,SAAS;AAGlF,QAAO;;AAGT,MAAa,yBAAyB,UAAmD;AACvF,KAAI,OAAO,MAAM,sBAAsB,SACrC,QAAO,EAAE;AAGX,QAAO,MAAM,kBACV,MAAM,IAAI,CACV,KAAI,SAAQ,KAAK,MAAM,CAAC,CACxB,QAAQ,SAA+B;EACtC,MAAM,CAAC,YAAY,IAAI,QAAQ,IAAI,GAAG,QAAQ,KAAK,MAAM,IAAI;AAC7D,SAAO,UAAU,SAAS,KAAK,MAAM,SAAS,KAAK,KAAK,WAAW;GACnE;;AAGN,MAAa,oBAAoB,SAA+D;CAC9F,MAAM,8BAAc,IAAI,KAAwB;AAEhD,MAAK,MAAM,SAAS,QAAQ,EAAE,CAC5B,aAAY,IAAI,MAAM,MAAM,MAAM;AAGpC,QAAO;;AAGT,SAAS,kBACP,OACA,aACA,eACA,UACS;AACT,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,eAAe,YAAY,IAAI,MAAM;AAC3C,MAAI,CAAC,aACH,QAAO;AAGT,SAAO,2BAA2B,cAAc,eAAe,aAAa,SAAS;;AAGvF,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,MAAM,KAAI,SAAQ,kBAAkB,MAAM,aAAa,eAAe,SAAS,CAAC;AAGzF,QAAO,YAAY,OAAO,aAAa,eAAe,SAAS;;AAGjE,MAAa,sBACX,OACA,eACA,gBACW;AAGX,QAAO,2BAA2B,OAFV,IAAI,IAAI,cAAc,EAEY,6BADzC,IAAI,KAAqB,CACsC;;AAGlF,MAAa,wBACX,SACA,eACA,gBACkB;CAClB,MAAM,kBAAkB,IAAI,IAAI,cAAc;CAC9C,MAAM,2BAAW,IAAI,KAAqB;AAC1C,QAAO,QAAQ,KAAI,UAAS,2BAA2B,OAAO,iBAAiB,aAAa,SAAS,CAAC;;;;;;;;AAmBxG,MAAa,qBAAqB,OAChC,cACA,cACA,EAAE,QAAQ,sBAC4B;CACtC,MAAM,gBAAgB,sBAAsB,aAAa;AACzD,KAAI,cAAc,WAAW,EAC3B,QAAO;CAGT,MAAM,cAAc,iBAAiB,aAAa,KAAK;AACvD,KAAI,aAAa,WAAW,QAAQ;EAClC,MAAM,eAAe,aAAa,UAAU,QAAO,SAAQ,CAAC,YAAY,IAAI,KAAK,CAAC;AAClF,MAAI,aAAa,SAAS,GAAG;GAC3B,MAAM,mBAAmB,MAAMA,8CAAsB;IACnD;IACA,OAAO;IACP,WAAW;IACX;IACD,CAAC;AACF,QAAK,MAAM,iBAAiB,iBAC1B,aAAY,IAAI,cAAc,MAAM,cAAc;;;AAKxD,QAAO;EAAE;EAAe;EAAa"}
|