@storyblok/api-client 1.0.0-alpha.1 → 1.0.0-alpha.2
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/README.md +3 -1
- package/dist/client.cjs +7 -4
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +302 -68
- package/dist/client.d.mts +302 -68
- package/dist/client.mjs +7 -4
- package/dist/client.mjs.map +1 -1
- package/dist/generated/capi/_internal.gen.d.cts +120 -0
- package/dist/generated/capi/_internal.gen.d.mts +120 -0
- package/dist/generated/{shared → capi}/client/client.gen.cjs +1 -1
- package/dist/generated/capi/client/client.gen.cjs.map +1 -0
- package/dist/generated/{shared → capi}/client/client.gen.mjs +1 -1
- package/dist/generated/capi/client/client.gen.mjs.map +1 -0
- package/dist/generated/{shared → capi}/client/types.gen.d.cts +1 -1
- package/dist/generated/{shared → capi}/client/types.gen.d.mts +1 -1
- package/dist/generated/{shared → capi}/client/utils.gen.cjs +1 -1
- package/dist/generated/capi/client/utils.gen.cjs.map +1 -0
- package/dist/generated/{shared → capi}/client/utils.gen.d.cts +1 -1
- package/dist/generated/{shared → capi}/client/utils.gen.d.mts +1 -1
- package/dist/generated/{shared → capi}/client/utils.gen.mjs +1 -1
- package/dist/generated/capi/client/utils.gen.mjs.map +1 -0
- package/dist/generated/capi/client.gen.cjs +10 -0
- package/dist/generated/capi/client.gen.cjs.map +1 -0
- package/dist/generated/capi/client.gen.mjs +10 -0
- package/dist/generated/capi/client.gen.mjs.map +1 -0
- package/dist/generated/{shared → capi}/core/auth.gen.cjs +1 -1
- package/dist/generated/capi/core/auth.gen.cjs.map +1 -0
- package/dist/generated/{shared → capi}/core/auth.gen.d.cts +1 -1
- package/dist/generated/{shared → capi}/core/auth.gen.d.mts +1 -1
- package/dist/generated/{shared → capi}/core/auth.gen.mjs +1 -1
- package/dist/generated/capi/core/auth.gen.mjs.map +1 -0
- package/dist/generated/{shared → capi}/core/bodySerializer.gen.cjs +1 -1
- package/dist/generated/capi/core/bodySerializer.gen.cjs.map +1 -0
- package/dist/generated/{shared → capi}/core/bodySerializer.gen.d.cts +1 -1
- package/dist/generated/{shared → capi}/core/bodySerializer.gen.d.mts +1 -1
- package/dist/generated/{shared → capi}/core/bodySerializer.gen.mjs +1 -1
- package/dist/generated/capi/core/bodySerializer.gen.mjs.map +1 -0
- package/dist/generated/{shared → capi}/core/params.gen.cjs +1 -1
- package/dist/generated/capi/core/params.gen.cjs.map +1 -0
- package/dist/generated/{shared → capi}/core/params.gen.mjs +1 -1
- package/dist/generated/capi/core/params.gen.mjs.map +1 -0
- package/dist/generated/{shared → capi}/core/pathSerializer.gen.cjs +1 -1
- package/dist/generated/capi/core/pathSerializer.gen.cjs.map +1 -0
- package/dist/generated/{shared → capi}/core/pathSerializer.gen.d.cts +1 -1
- package/dist/generated/{shared → capi}/core/pathSerializer.gen.d.mts +1 -1
- package/dist/generated/{shared → capi}/core/pathSerializer.gen.mjs +1 -1
- package/dist/generated/capi/core/pathSerializer.gen.mjs.map +1 -0
- package/dist/generated/{shared → capi}/core/serverSentEvents.gen.cjs +1 -1
- package/dist/generated/capi/core/serverSentEvents.gen.cjs.map +1 -0
- package/dist/generated/{shared → capi}/core/serverSentEvents.gen.d.cts +1 -1
- package/dist/generated/{shared → capi}/core/serverSentEvents.gen.d.mts +1 -1
- package/dist/generated/{shared → capi}/core/serverSentEvents.gen.mjs +1 -1
- package/dist/generated/capi/core/serverSentEvents.gen.mjs.map +1 -0
- package/dist/generated/{shared → capi}/core/types.gen.d.cts +1 -1
- package/dist/generated/{shared → capi}/core/types.gen.d.mts +1 -1
- package/dist/generated/{shared → capi}/core/utils.gen.cjs +1 -1
- package/dist/generated/capi/core/utils.gen.cjs.map +1 -0
- package/dist/generated/{shared → capi}/core/utils.gen.mjs +1 -1
- package/dist/generated/capi/core/utils.gen.mjs.map +1 -0
- package/dist/generated/capi/sdk.gen.cjs +141 -0
- package/dist/generated/capi/sdk.gen.cjs.map +1 -0
- package/dist/generated/capi/sdk.gen.mjs +133 -0
- package/dist/generated/capi/sdk.gen.mjs.map +1 -0
- package/dist/generated/capi/types-aliased.gen.d.cts +181 -0
- package/dist/generated/capi/types-aliased.gen.d.mts +181 -0
- package/dist/generated/capi/types.gen.d.cts +919 -0
- package/dist/generated/capi/types.gen.d.mts +919 -0
- package/dist/generated/mapi/_internal.gen.d.cts +146 -0
- package/dist/generated/mapi/_internal.gen.d.mts +146 -0
- package/dist/generated/mapi/types.gen.d.cts +293 -0
- package/dist/generated/mapi/types.gen.d.mts +293 -0
- package/dist/generated/overlay/_internal.gen.d.cts +831 -0
- package/dist/generated/overlay/_internal.gen.d.mts +831 -0
- package/dist/generated/types/_utils.d.cts +7 -0
- package/dist/generated/types/_utils.d.mts +7 -0
- package/dist/generated/types/block.d.cts +29 -0
- package/dist/generated/types/block.d.mts +29 -0
- package/dist/generated/types/field.d.cts +64 -0
- package/dist/generated/types/field.d.mts +64 -0
- package/dist/generated/types/story.d.cts +19 -0
- package/dist/generated/types/story.d.mts +19 -0
- package/dist/index.d.cts +6 -3
- package/dist/index.d.mts +6 -3
- package/dist/resources/datasource-entries.cjs +2 -2
- package/dist/resources/datasource-entries.cjs.map +1 -1
- package/dist/resources/datasource-entries.mjs +2 -2
- package/dist/resources/datasource-entries.mjs.map +1 -1
- package/dist/resources/datasources.cjs +4 -4
- package/dist/resources/datasources.cjs.map +1 -1
- package/dist/resources/datasources.mjs +4 -4
- package/dist/resources/datasources.mjs.map +1 -1
- package/dist/resources/experiments.cjs +26 -0
- package/dist/resources/experiments.cjs.map +1 -0
- package/dist/resources/experiments.mjs +26 -0
- package/dist/resources/experiments.mjs.map +1 -0
- package/dist/resources/links.cjs +2 -2
- package/dist/resources/links.cjs.map +1 -1
- package/dist/resources/links.mjs +2 -2
- package/dist/resources/links.mjs.map +1 -1
- package/dist/resources/spaces.cjs +4 -4
- package/dist/resources/spaces.cjs.map +1 -1
- package/dist/resources/spaces.mjs +4 -4
- package/dist/resources/spaces.mjs.map +1 -1
- package/dist/resources/stories.cjs +10 -8
- package/dist/resources/stories.cjs.map +1 -1
- package/dist/resources/stories.d.cts +16 -13
- package/dist/resources/stories.d.mts +16 -13
- package/dist/resources/stories.mjs +10 -8
- package/dist/resources/stories.mjs.map +1 -1
- package/dist/resources/tags.cjs +2 -2
- package/dist/resources/tags.cjs.map +1 -1
- package/dist/resources/tags.mjs +2 -2
- package/dist/resources/tags.mjs.map +1 -1
- package/dist/utils/fetch-rel-uuids.cjs +2 -2
- package/dist/utils/fetch-rel-uuids.cjs.map +1 -1
- package/dist/utils/fetch-rel-uuids.mjs +2 -2
- package/dist/utils/fetch-rel-uuids.mjs.map +1 -1
- package/dist/utils/inline-relations.cjs.map +1 -1
- package/dist/utils/inline-relations.mjs.map +1 -1
- package/package.json +13 -19
- package/dist/generated/datasource_entries/client.gen.cjs +0 -10
- package/dist/generated/datasource_entries/client.gen.cjs.map +0 -1
- package/dist/generated/datasource_entries/client.gen.mjs +0 -10
- package/dist/generated/datasource_entries/client.gen.mjs.map +0 -1
- package/dist/generated/datasource_entries/sdk.gen.cjs +0 -21
- package/dist/generated/datasource_entries/sdk.gen.cjs.map +0 -1
- package/dist/generated/datasource_entries/sdk.gen.mjs +0 -21
- package/dist/generated/datasource_entries/sdk.gen.mjs.map +0 -1
- package/dist/generated/datasource_entries/types.gen.d.cts +0 -52
- package/dist/generated/datasource_entries/types.gen.d.mts +0 -52
- package/dist/generated/datasources/client.gen.cjs +0 -10
- package/dist/generated/datasources/client.gen.cjs.map +0 -1
- package/dist/generated/datasources/client.gen.mjs +0 -10
- package/dist/generated/datasources/client.gen.mjs.map +0 -1
- package/dist/generated/datasources/sdk.gen.cjs +0 -36
- package/dist/generated/datasources/sdk.gen.cjs.map +0 -1
- package/dist/generated/datasources/sdk.gen.mjs +0 -35
- package/dist/generated/datasources/sdk.gen.mjs.map +0 -1
- package/dist/generated/datasources/types.gen.d.cts +0 -82
- package/dist/generated/datasources/types.gen.d.mts +0 -82
- package/dist/generated/links/client.gen.cjs +0 -10
- package/dist/generated/links/client.gen.cjs.map +0 -1
- package/dist/generated/links/client.gen.mjs +0 -10
- package/dist/generated/links/client.gen.mjs.map +0 -1
- package/dist/generated/links/sdk.gen.cjs +0 -21
- package/dist/generated/links/sdk.gen.cjs.map +0 -1
- package/dist/generated/links/sdk.gen.mjs +0 -21
- package/dist/generated/links/sdk.gen.mjs.map +0 -1
- package/dist/generated/links/types.gen.d.cts +0 -125
- package/dist/generated/links/types.gen.d.mts +0 -125
- package/dist/generated/shared/client/client.gen.cjs.map +0 -1
- package/dist/generated/shared/client/client.gen.mjs.map +0 -1
- package/dist/generated/shared/client/utils.gen.cjs.map +0 -1
- package/dist/generated/shared/client/utils.gen.mjs.map +0 -1
- package/dist/generated/shared/core/auth.gen.cjs.map +0 -1
- package/dist/generated/shared/core/auth.gen.mjs.map +0 -1
- package/dist/generated/shared/core/bodySerializer.gen.cjs.map +0 -1
- package/dist/generated/shared/core/bodySerializer.gen.mjs.map +0 -1
- package/dist/generated/shared/core/params.gen.cjs.map +0 -1
- package/dist/generated/shared/core/params.gen.mjs.map +0 -1
- package/dist/generated/shared/core/pathSerializer.gen.cjs.map +0 -1
- package/dist/generated/shared/core/pathSerializer.gen.mjs.map +0 -1
- package/dist/generated/shared/core/serverSentEvents.gen.cjs.map +0 -1
- package/dist/generated/shared/core/serverSentEvents.gen.mjs.map +0 -1
- package/dist/generated/shared/core/utils.gen.cjs.map +0 -1
- package/dist/generated/shared/core/utils.gen.mjs.map +0 -1
- package/dist/generated/spaces/client.gen.cjs +0 -10
- package/dist/generated/spaces/client.gen.cjs.map +0 -1
- package/dist/generated/spaces/client.gen.mjs +0 -10
- package/dist/generated/spaces/client.gen.mjs.map +0 -1
- package/dist/generated/spaces/sdk.gen.cjs +0 -21
- package/dist/generated/spaces/sdk.gen.cjs.map +0 -1
- package/dist/generated/spaces/sdk.gen.mjs +0 -21
- package/dist/generated/spaces/sdk.gen.mjs.map +0 -1
- package/dist/generated/spaces/types.gen.d.cts +0 -26
- package/dist/generated/spaces/types.gen.d.mts +0 -26
- package/dist/generated/stories/client.gen.cjs +0 -10
- package/dist/generated/stories/client.gen.cjs.map +0 -1
- package/dist/generated/stories/client.gen.mjs +0 -10
- package/dist/generated/stories/client.gen.mjs.map +0 -1
- package/dist/generated/stories/index.d.mts +0 -1
- package/dist/generated/stories/sdk.gen.cjs +0 -36
- package/dist/generated/stories/sdk.gen.cjs.map +0 -1
- package/dist/generated/stories/sdk.gen.d.mts +0 -1
- package/dist/generated/stories/sdk.gen.mjs +0 -35
- package/dist/generated/stories/sdk.gen.mjs.map +0 -1
- package/dist/generated/stories/types.gen.d.cts +0 -607
- package/dist/generated/stories/types.gen.d.mts +0 -607
- package/dist/generated/tags/client.gen.cjs +0 -10
- package/dist/generated/tags/client.gen.cjs.map +0 -1
- package/dist/generated/tags/client.gen.mjs +0 -10
- package/dist/generated/tags/client.gen.mjs.map +0 -1
- package/dist/generated/tags/sdk.gen.cjs +0 -21
- package/dist/generated/tags/sdk.gen.cjs.map +0 -1
- package/dist/generated/tags/sdk.gen.mjs +0 -21
- package/dist/generated/tags/sdk.gen.mjs.map +0 -1
- package/dist/generated/tags/types.gen.d.cts +0 -29
- package/dist/generated/tags/types.gen.d.mts +0 -29
- /package/dist/generated/{shared → capi}/client/client.gen.d.mts +0 -0
- /package/dist/generated/{shared → capi}/client/index.cjs +0 -0
- /package/dist/generated/{shared → capi}/client/index.d.mts +0 -0
- /package/dist/generated/{shared → capi}/client/index.mjs +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getSpace } from "../generated/capi/sdk.gen.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/resources/spaces.ts
|
|
4
4
|
function createSpacesResource(deps) {
|
|
5
5
|
const { client, requestWithCache, asApiResponse, throttleManager } = deps;
|
|
6
6
|
return { get: async (options = {}) => {
|
|
7
|
-
const { signal, throwOnError, fetchOptions } = options;
|
|
7
|
+
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
8
8
|
const requestPath = "/v2/cdn/spaces/me";
|
|
9
|
-
return requestWithCache("GET", requestPath,
|
|
10
|
-
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(
|
|
9
|
+
return requestWithCache("GET", requestPath, query, (requestQuery) => {
|
|
10
|
+
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(getSpace({
|
|
11
11
|
client,
|
|
12
12
|
query: requestQuery,
|
|
13
13
|
signal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spaces.mjs","names":["getSpaceApi"],"sources":["../../src/resources/spaces.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"spaces.mjs","names":["getSpaceApi"],"sources":["../../src/resources/spaces.ts"],"sourcesContent":["import { getSpace as getSpaceApi } from '../generated/capi/sdk.gen';\nimport type { GetSpaceData, GetSpaceResponses } from '../generated/capi/types.gen';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../client';\n\nexport function createSpacesResource<DefaultThrowOnError extends boolean = false>(deps: ResourceDeps<DefaultThrowOnError>) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n get: async <ThrowOnError extends boolean = DefaultThrowOnError>(\n options: { query?: GetSpaceData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<GetSpaceResponses[200], ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/spaces/me';\n return requestWithCache<GetSpaceResponses[200], ThrowOnError>('GET', requestPath, query, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<GetSpaceResponses[200], ThrowOnError>(getSpaceApi({\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,qBAAkE,MAAyC;CACzH,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,KAAK,OACH,UAA6H,EAAE,KAChE;EAC/D,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;EAC3D,MAAM,cAAc;AACpB,SAAO,iBAAuD,OAAO,aAAa,QAAQ,iBAA0C;AAClI,UAAO,gBAAgB,QAAQ,aAAa,oBAC1C,cAAoDA,SAAY;IAC9D;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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_sdk_gen = require('../generated/
|
|
1
|
+
const require_sdk_gen = require('../generated/capi/sdk.gen.cjs');
|
|
2
2
|
const require_inline_relations = require('../utils/inline-relations.cjs');
|
|
3
3
|
|
|
4
4
|
//#region src/resources/stories.ts
|
|
@@ -15,9 +15,9 @@ function createStoriesResource(deps) {
|
|
|
15
15
|
} : typedQuery;
|
|
16
16
|
const requestPath = `/v2/cdn/stories/${identifier}`;
|
|
17
17
|
return requestWithCache("GET", requestPath, resolvedQuery, async (requestQuery) => {
|
|
18
|
-
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(require_sdk_gen.
|
|
18
|
+
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(require_sdk_gen.getStoryById({
|
|
19
19
|
client,
|
|
20
|
-
path: { identifier },
|
|
20
|
+
path: { id: identifier },
|
|
21
21
|
query: requestQuery,
|
|
22
22
|
signal,
|
|
23
23
|
...throwOnError === void 0 ? {} : { throwOnError },
|
|
@@ -27,7 +27,8 @@ function createStoriesResource(deps) {
|
|
|
27
27
|
} } : {}
|
|
28
28
|
})));
|
|
29
29
|
if (!inlineRelations || response.data === void 0) return response;
|
|
30
|
-
const
|
|
30
|
+
const storyData = response.data;
|
|
31
|
+
const resolved = await require_inline_relations.resolveRelationMap(storyData, requestQuery, {
|
|
31
32
|
client,
|
|
32
33
|
throttleManager
|
|
33
34
|
});
|
|
@@ -36,7 +37,7 @@ function createStoriesResource(deps) {
|
|
|
36
37
|
...response,
|
|
37
38
|
data: {
|
|
38
39
|
...response.data,
|
|
39
|
-
story: require_inline_relations.inlineStoryContent(
|
|
40
|
+
story: require_inline_relations.inlineStoryContent(storyData.story, resolved.relationPaths, resolved.relationMap)
|
|
40
41
|
}
|
|
41
42
|
};
|
|
42
43
|
}, inlineRelations ? { cacheKeyPrefix: "inline" } : void 0);
|
|
@@ -46,7 +47,7 @@ function createStoriesResource(deps) {
|
|
|
46
47
|
const typedQuery = query ?? {};
|
|
47
48
|
const requestPath = "/v2/cdn/stories";
|
|
48
49
|
return requestWithCache("GET", requestPath, typedQuery, async (requestQuery) => {
|
|
49
|
-
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(require_sdk_gen.
|
|
50
|
+
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(require_sdk_gen.listStories({
|
|
50
51
|
client,
|
|
51
52
|
query: requestQuery,
|
|
52
53
|
signal,
|
|
@@ -57,7 +58,8 @@ function createStoriesResource(deps) {
|
|
|
57
58
|
} } : {}
|
|
58
59
|
})));
|
|
59
60
|
if (!inlineRelations || response.data === void 0) return response;
|
|
60
|
-
const
|
|
61
|
+
const storiesData = response.data;
|
|
62
|
+
const resolved = await require_inline_relations.resolveRelationMap(storiesData, requestQuery, {
|
|
61
63
|
client,
|
|
62
64
|
throttleManager
|
|
63
65
|
});
|
|
@@ -66,7 +68,7 @@ function createStoriesResource(deps) {
|
|
|
66
68
|
...response,
|
|
67
69
|
data: {
|
|
68
70
|
...response.data,
|
|
69
|
-
stories: require_inline_relations.inlineStoriesContent(
|
|
71
|
+
stories: require_inline_relations.inlineStoriesContent(storiesData.stories, resolved.relationPaths, resolved.relationMap)
|
|
70
72
|
}
|
|
71
73
|
};
|
|
72
74
|
}, inlineRelations ? { cacheKeyPrefix: "inline" } : void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stories.cjs","names":["get","resolveRelationMap","inlineStoryContent","list","inlineStoriesContent"],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import { get, list } from '../generated/stories/sdk.gen';\nimport type { GetData, GetResponses, ListData, ListResponses } from '../generated/stories/types.gen';\nimport type {\n AssetFieldValue,\n BlokContent,\n MultilinkFieldValue,\n PluginFieldValue,\n RichtextFieldValue,\n StoryCapi,\n TableFieldValue,\n} from '../generated/stories';\nimport { inlineStoriesContent, inlineStoryContent, resolveRelationMap } from '../utils/inline-relations';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../client';\nimport type { Story as CapiStory, Block as Component, RootBlocks as RootComponents } from '@storyblok/schema';\n\ntype InlinedStoryContentField =\n | string\n | number\n | boolean\n | Array<string | AssetFieldValue | BlokContent | StoryWithInlinedRelations>\n | AssetFieldValue\n | MultilinkFieldValue\n | TableFieldValue\n | RichtextFieldValue\n | PluginFieldValue\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\n/** Splits `\"comp.field,comp2.field2\"` into a union of `{ component, field }`. */\ntype ParseRelations<T extends string> =\n T extends `${infer Comp}.${infer Field},${infer Rest}`\n ? { component: Comp; field: Field } | ParseRelations<Rest>\n : T extends `${infer Comp}.${infer Field}`\n ? { component: Comp; field: Field }\n : never;\n\n/** Extracts resolved field names for a given component name. */\ntype ResolvedFieldsFor<R extends string, ComponentName extends string> =\n Extract<ParseRelations<R>, { component: ComponentName }>['field'];\n\n/** A resolved relation: a full story typed to the component union. */\ntype ResolvedRelation<TComponents extends Component> =\n { [K in TComponents as K['name']]: CapiStory<K, TComponents> }[TComponents['name']];\n\n/**\n * Given a story type and a set of resolved field names, replaces\n * those fields with `ResolvedRelation<TComponents>` (a full story object).\n */\ntype WithResolvedRelations<\n TStory,\n TComponents extends Component,\n Fields extends string,\n> = TStory extends { content: infer C } ? Omit<TStory, 'content'> & {\n content: {\n [K in keyof C]: K extends Fields ? ResolvedRelation<TComponents> : C[K]\n };\n}\n : TStory;\n\n/**\n * Resolves to a narrowed component-derived story type when `TComponents` is a specific\n * Component union, or falls back to the generated StoryCapi / StoryWithInlinedRelations\n * when `TComponents` is the default Component base type (no type argument provided).\n *\n * When `ResolveRelations` is a string literal (e.g. `\"article.author\"`),\n * matched fields are widened from their schema type to `ResolvedRelation<TComponents>`\n * — a full story object typed to the component union.\n *\n * Uses a mapped-type approach instead of a distributive conditional with a\n * separate full-components parameter. This ensures the full `TComponents` union is\n * preserved even when DTS bundlers (like tsdown) inline the type alias —\n * a distributive conditional + default-parameter pattern would collapse\n * both parameters to the distributed single member after inlining.\n *\n * The mapped type `{ [K in TComponents as K[\"name\"]]: CapiStory<K, TComponents> }`\n * iterates each union member as `K` while keeping `TComponents` as the full union\n * for nested blok field resolution. The final indexed access\n * `[TComponents[\"name\"]]` produces the discriminated union of all story types.\n */\ntype StoryResult<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> =\n Component extends TComponents\n ? InlineRelations extends true ? StoryWithInlinedRelations : StoryCapi // fallback\n : ResolveRelationsRaw extends string\n ? {\n [K in RootComponents<TComponents> as K['name']]: WithResolvedRelations<\n CapiStory<K, TComponents>,\n TComponents,\n ResolvedFieldsFor<ResolveRelationsRaw, K['name']>\n >\n }[RootComponents<TComponents>['name']]\n : CapiStory<TComponents>;\n\ntype GetResponse<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> = Omit<GetResponses[200], 'story'> & {\n story: StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>;\n};\ntype ListResponse<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> = Omit<ListResponses[200], 'stories'> & {\n stories: Array<StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>>;\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<DefaultThrowOnError extends boolean = false> extends ResourceDeps<DefaultThrowOnError> {\n inlineRelations: boolean;\n}\n\nexport function createStoriesResource<\n TComponents extends Component = Component,\n InlineRelations extends boolean = false,\n DefaultThrowOnError extends boolean = false,\n>(\n deps: StoriesResourceDeps<DefaultThrowOnError>,\n) {\n const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;\n\n return {\n get: async <\n ThrowOnError extends boolean = DefaultThrowOnError,\n const ResolveRelationsStr extends string | undefined = undefined,\n >(\n identifier: StoryIdentifier,\n options: { query?: Omit<NonNullable<GetData['query']>, 'resolve_relations'> & { resolve_relations?: ResolveRelationsStr }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const typedQuery = (query ?? {}) as NonNullable<GetData['query']>;\n const resolvedQuery = typeof identifier === 'string' && UUID_RE.test(identifier) && !typedQuery.find_by\n ? { ...typedQuery, find_by: 'uuid' }\n : typedQuery;\n const requestPath = `/v2/cdn/stories/${identifier}`;\n return requestWithCache('GET', requestPath, resolvedQuery, async (requestQuery: Record<string, unknown>) => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse(get({\n client,\n path: { identifier },\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }))) satisfies ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>;\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 // `inlineStoryContent` operates on raw `StoryCapi` shapes and mutates relation fields\n // from UUID strings to full story objects. We cast to satisfy its parameter type.\n story: inlineStoryContent(response.data.story as StoryCapi, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n\n list: async <\n ThrowOnError extends boolean = DefaultThrowOnError,\n const ResolveRelationsStr extends string | undefined = undefined,\n >(\n options: { query?: Omit<NonNullable<ListData['query']>, 'resolve_relations'> & { resolve_relations?: ResolveRelationsStr }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<ListResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const typedQuery = (query ?? {}) as NonNullable<ListData['query']>;\n const requestPath = '/v2/cdn/stories';\n return requestWithCache('GET', requestPath, typedQuery, async (requestQuery: Record<string, unknown>) => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse(list({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }))) satisfies ApiResponse<ListResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>;\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 // `inlineStoriesContent` operates on raw `StoryCapi` shapes and mutates relation fields\n // from UUID strings to full story objects. We cast to satisfy its parameter type.\n stories: inlineStoriesContent(response.data.stories as StoryCapi[], resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n };\n}\n"],"mappings":";;;;AA6HA,MAAM,UAAU;AAMhB,SAAgB,sBAKd,MACA;CACA,MAAM,EAAE,QAAQ,kBAAkB,eAAe,iBAAiB,oBAAoB;AAEtF,QAAO;EACL,KAAK,OAIH,YACA,UAA8M,EAAE,KACzG;GACvG,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,aAAc,SAAS,EAAE;GAC/B,MAAM,gBAAgB,OAAO,eAAe,YAAY,QAAQ,KAAK,WAAW,IAAI,CAAC,WAAW,UAC5F;IAAE,GAAG;IAAY,SAAS;IAAQ,GAClC;GACJ,MAAM,cAAc,mBAAmB;AACvC,UAAO,iBAAiB,OAAO,aAAa,eAAe,OAAO,iBAA0C;IAC1G,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAAcA,oBAAI;KAChB;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;MAGZ,OAAOC,4CAAmB,SAAS,KAAK,OAAoB,SAAS,eAAe,SAAS,YAAY;MAC1G;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAGhE,MAAM,OAIJ,UAA+M,EAAE,KACzG;GACxG,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,aAAc,SAAS,EAAE;GAC/B,MAAM,cAAc;AACpB,UAAO,iBAAiB,OAAO,aAAa,YAAY,OAAO,iBAA0C;IACvG,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAAcC,qBAAK;KACjB;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;MAGZ,SAASG,8CAAqB,SAAS,KAAK,SAAwB,SAAS,eAAe,SAAS,YAAY;MAClH;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAEjE"}
|
|
1
|
+
{"version":3,"file":"stories.cjs","names":["getStoryById","resolveRelationMap","inlineStoryContent","listStories","inlineStoriesContent"],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import { getStoryById, listStories } from '../generated/capi/sdk.gen';\nimport type { GetStoryByIdData, GetStoryByIdResponses, ListStoriesData, ListStoriesResponses } from '../generated/capi/types.gen';\nimport type {\n AssetFieldValue,\n BlockContent as BlokContent,\n MultilinkFieldValue,\n PluginFieldValue,\n RichtextFieldValue,\n TableFieldValue,\n} from '../generated/types/field';\nimport { inlineStoriesContent, inlineStoryContent, resolveRelationMap } from '../utils/inline-relations';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../client';\nimport type { Block as Component, RootBlock as RootComponents } from '../generated/types/block';\nimport type { Story } from '../generated/types/story';\n\ntype InlinedStoryContentField =\n | string\n | number\n | boolean\n | Array<string | AssetFieldValue | BlokContent | StoryWithInlinedRelations>\n | AssetFieldValue\n | MultilinkFieldValue\n | TableFieldValue\n | RichtextFieldValue\n | PluginFieldValue\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<Story, 'content'> & {\n content: InlinedStoryContent;\n};\n\n/** Splits `\"comp.field,comp2.field2\"` into a union of `{ component, field }`. */\ntype ParseRelations<T extends string> =\n T extends `${infer Comp}.${infer Field},${infer Rest}`\n ? { component: Comp; field: Field } | ParseRelations<Rest>\n : T extends `${infer Comp}.${infer Field}`\n ? { component: Comp; field: Field }\n : never;\n\n/** Extracts resolved field names for a given component name. */\ntype ResolvedFieldsFor<R extends string, ComponentName extends string> =\n Extract<ParseRelations<R>, { component: ComponentName }>['field'];\n\n/** A resolved relation: a full story typed to the component union. */\ntype ResolvedRelation<TComponents extends Component> =\n { [K in TComponents as K['name']]: Story<K, TComponents> }[TComponents['name']];\n\n/**\n * Given a story type and a set of resolved field names, replaces\n * those fields with `ResolvedRelation<TComponents>` (a full story object).\n */\ntype WithResolvedRelations<\n TStory,\n TComponents extends Component,\n Fields extends string,\n> = TStory extends { content: infer C } ? Omit<TStory, 'content'> & {\n content: {\n [K in keyof C]: K extends Fields ? ResolvedRelation<TComponents> : C[K]\n };\n}\n : TStory;\n\n/**\n * Resolves to a narrowed component-derived story type when `TComponents` is a specific\n * Component union, or falls back to the generated Story / StoryWithInlinedRelations\n * when `TComponents` is the default Component base type (no type argument provided).\n *\n * When `ResolveRelations` is a string literal (e.g. `\"article.author\"`),\n * matched fields are widened from their schema type to `ResolvedRelation<TComponents>`\n * — a full story object typed to the component union.\n *\n * Uses a mapped-type approach instead of a distributive conditional with a\n * separate full-components parameter. This ensures the full `TComponents` union is\n * preserved even when DTS bundlers (like tsdown) inline the type alias —\n * a distributive conditional + default-parameter pattern would collapse\n * both parameters to the distributed single member after inlining.\n *\n * The mapped type `{ [K in TComponents as K[\"name\"]]: Story<K, TComponents> }`\n * iterates each union member as `K` while keeping `TComponents` as the full union\n * for nested blok field resolution. The final indexed access\n * `[TComponents[\"name\"]]` produces the discriminated union of all story types.\n */\ntype StoryResult<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> =\n Component extends TComponents\n ? InlineRelations extends true ? StoryWithInlinedRelations : Story // fallback\n : ResolveRelationsRaw extends string\n ? {\n [K in RootComponents<TComponents> as K['name']]: WithResolvedRelations<\n Story<K, TComponents>,\n TComponents,\n ResolvedFieldsFor<ResolveRelationsRaw, K['name']>\n >\n }[RootComponents<TComponents>['name']]\n : Story<TComponents>;\n\ntype GetResponse<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> = Omit<GetStoryByIdResponses[200], 'story'> & {\n story: StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>;\n};\ntype ListResponse<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> = Omit<ListStoriesResponses[200], 'stories'> & {\n stories: Array<StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>>;\n};\n\n/**\n * Internal relation-resolution shapes. The public response types expose the\n * generic `Story`, but relation inlining needs to read the API's sidecar\n * `rels`/`rel_uuids` fields off the raw payload. These three interfaces model\n * that wire shape so the `response.data` narrowing below stays in one place\n * instead of being scattered as inline casts.\n */\ninterface StoryRelationData {\n rels?: Story[];\n rel_uuids?: string[];\n}\n\ninterface StoryData extends StoryRelationData {\n story: Story;\n}\n\ninterface StoriesData extends StoryRelationData {\n stories: Story[];\n}\n\n/** The story identifier path param (full slug, numeric ID, or UUID), derived from the generated request type. */\ntype StoryIdentifier = GetStoryByIdData['path']['id'];\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<DefaultThrowOnError extends boolean = false> extends ResourceDeps<DefaultThrowOnError> {\n inlineRelations: boolean;\n}\n\nexport function createStoriesResource<\n TComponents extends Component = Component,\n InlineRelations extends boolean = false,\n DefaultThrowOnError extends boolean = false,\n>(\n deps: StoriesResourceDeps<DefaultThrowOnError>,\n) {\n const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;\n\n return {\n get: async <\n ThrowOnError extends boolean = DefaultThrowOnError,\n const ResolveRelationsStr extends string | undefined = undefined,\n >(\n identifier: StoryIdentifier,\n options: { query?: Omit<NonNullable<GetStoryByIdData['query']>, 'resolve_relations'> & { resolve_relations?: ResolveRelationsStr }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const typedQuery = (query ?? {}) as NonNullable<GetStoryByIdData['query']>;\n const resolvedQuery = typeof identifier === 'string' && UUID_RE.test(identifier) && !typedQuery.find_by\n ? { ...typedQuery, find_by: 'uuid' }\n : typedQuery;\n const requestPath = `/v2/cdn/stories/${identifier}`;\n return requestWithCache('GET', requestPath, resolvedQuery, async (requestQuery: Record<string, unknown>) => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse(getStoryById({\n client,\n path: { id: identifier },\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }))) satisfies ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>;\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n // Narrow to the internal relation shape to read the API's sidecar\n // `rels`/`rel_uuids`; consumers keep seeing the generic `Story`.\n const storyData = response.data as unknown as StoryData;\n const resolved = await resolveRelationMap(storyData, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n story: inlineStoryContent(storyData.story, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n\n list: async <\n ThrowOnError extends boolean = DefaultThrowOnError,\n const ResolveRelationsStr extends string | undefined = undefined,\n >(\n options: { query?: Omit<NonNullable<ListStoriesData['query']>, 'resolve_relations'> & { resolve_relations?: ResolveRelationsStr }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<ListResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const typedQuery = (query ?? {}) as NonNullable<ListStoriesData['query']>;\n const requestPath = '/v2/cdn/stories';\n return requestWithCache('GET', requestPath, typedQuery, async (requestQuery: Record<string, unknown>) => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse(listStories({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }))) satisfies ApiResponse<ListResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>;\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n // Narrow to the internal relation shape to read the API's sidecar\n // `rels`/`rel_uuids`; consumers keep seeing the generic `Story`.\n const storiesData = response.data as unknown as StoriesData;\n const resolved = await resolveRelationMap(storiesData, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n stories: inlineStoriesContent(storiesData.stories, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n };\n}\n"],"mappings":";;;;AAiJA,MAAM,UAAU;AAMhB,SAAgB,sBAKd,MACA;CACA,MAAM,EAAE,QAAQ,kBAAkB,eAAe,iBAAiB,oBAAoB;AAEtF,QAAO;EACL,KAAK,OAIH,YACA,UAAuN,EAAE,KAClH;GACvG,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,aAAc,SAAS,EAAE;GAC/B,MAAM,gBAAgB,OAAO,eAAe,YAAY,QAAQ,KAAK,WAAW,IAAI,CAAC,WAAW,UAC5F;IAAE,GAAG;IAAY,SAAS;IAAQ,GAClC;GACJ,MAAM,cAAc,mBAAmB;AACvC,UAAO,iBAAiB,OAAO,aAAa,eAAe,OAAO,iBAA0C;IAC1G,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAAcA,6BAAa;KACzB;KACA,MAAM,EAAE,IAAI,YAAY;KACxB,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;IAKT,MAAM,YAAY,SAAS;IAC3B,MAAM,WAAW,MAAMC,4CAAmB,WAAW,cAAc;KAAE;KAAQ;KAAiB,CAAC;AAC/F,QAAI,CAAC,SACH,QAAO;AAGT,WAAO;KACL,GAAG;KACH,MAAM;MACJ,GAAG,SAAS;MACZ,OAAOC,4CAAmB,UAAU,OAAO,SAAS,eAAe,SAAS,YAAY;MACzF;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAGhE,MAAM,OAIJ,UAAsN,EAAE,KAChH;GACxG,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,aAAc,SAAS,EAAE;GAC/B,MAAM,cAAc;AACpB,UAAO,iBAAiB,OAAO,aAAa,YAAY,OAAO,iBAA0C;IACvG,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAAcC,4BAAY;KACxB;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;IAKT,MAAM,cAAc,SAAS;IAC7B,MAAM,WAAW,MAAMF,4CAAmB,aAAa,cAAc;KAAE;KAAQ;KAAiB,CAAC;AACjG,QAAI,CAAC,SACH,QAAO;AAGT,WAAO;KACL,GAAG;KACH,MAAM;MACJ,GAAG,SAAS;MACZ,SAASG,8CAAqB,YAAY,SAAS,SAAS,eAAe,SAAS,YAAY;MACjG;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAEjE"}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GetStoryByIdData, GetStoryByIdResponses, ListStoriesData, ListStoriesResponses } from "../generated/capi/types.gen.cjs";
|
|
2
|
+
import { AssetFieldValue, MultilinkFieldValue, PluginFieldValue, RichtextFieldValue, TableFieldValue } from "../generated/overlay/_internal.gen.cjs";
|
|
3
|
+
import { Block, RootBlock } from "../generated/types/block.cjs";
|
|
4
|
+
import { BlockContent } from "../generated/types/field.cjs";
|
|
5
|
+
import { Story } from "../generated/types/story.cjs";
|
|
2
6
|
import { ApiResponse, FetchOptions, ResourceDeps } from "../client.cjs";
|
|
3
|
-
import { Block, RootBlocks, Story } from "@storyblok/schema";
|
|
4
7
|
|
|
5
8
|
//#region src/resources/stories.d.ts
|
|
6
|
-
type InlinedStoryContentField = string | number | boolean | Array<string | AssetFieldValue |
|
|
9
|
+
type InlinedStoryContentField = string | number | boolean | Array<string | AssetFieldValue | BlockContent | StoryWithInlinedRelations> | AssetFieldValue | MultilinkFieldValue | TableFieldValue | RichtextFieldValue | PluginFieldValue | StoryWithInlinedRelations | undefined;
|
|
7
10
|
interface InlinedStoryContent {
|
|
8
11
|
_uid: string;
|
|
9
12
|
component: string;
|
|
10
13
|
_editable?: string;
|
|
11
14
|
[key: string]: InlinedStoryContentField;
|
|
12
15
|
}
|
|
13
|
-
type StoryWithInlinedRelations = Omit<
|
|
16
|
+
type StoryWithInlinedRelations = Omit<Story, 'content'> & {
|
|
14
17
|
content: InlinedStoryContent;
|
|
15
18
|
};
|
|
16
19
|
/** Splits `"comp.field,comp2.field2"` into a union of `{ component, field }`. */
|
|
@@ -38,7 +41,7 @@ type WithResolvedRelations<TStory, TComponents extends Block, Fields extends str
|
|
|
38
41
|
} : TStory;
|
|
39
42
|
/**
|
|
40
43
|
* Resolves to a narrowed component-derived story type when `TComponents` is a specific
|
|
41
|
-
* Component union, or falls back to the generated
|
|
44
|
+
* Component union, or falls back to the generated Story / StoryWithInlinedRelations
|
|
42
45
|
* when `TComponents` is the default Component base type (no type argument provided).
|
|
43
46
|
*
|
|
44
47
|
* When `ResolveRelations` is a string literal (e.g. `"article.author"`),
|
|
@@ -51,26 +54,26 @@ type WithResolvedRelations<TStory, TComponents extends Block, Fields extends str
|
|
|
51
54
|
* a distributive conditional + default-parameter pattern would collapse
|
|
52
55
|
* both parameters to the distributed single member after inlining.
|
|
53
56
|
*
|
|
54
|
-
* The mapped type `{ [K in TComponents as K["name"]]:
|
|
57
|
+
* The mapped type `{ [K in TComponents as K["name"]]: Story<K, TComponents> }`
|
|
55
58
|
* iterates each union member as `K` while keeping `TComponents` as the full union
|
|
56
59
|
* for nested blok field resolution. The final indexed access
|
|
57
60
|
* `[TComponents["name"]]` produces the discriminated union of all story types.
|
|
58
61
|
*/
|
|
59
|
-
type StoryResult<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Block extends TComponents ? InlineRelations extends true ? StoryWithInlinedRelations :
|
|
60
|
-
type GetResponse<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Omit<
|
|
62
|
+
type StoryResult<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Block extends TComponents ? InlineRelations extends true ? StoryWithInlinedRelations : Story : ResolveRelationsRaw extends string ? { [K in RootBlock<TComponents> as K['name']]: WithResolvedRelations<Story<K, TComponents>, TComponents, ResolvedFieldsFor<ResolveRelationsRaw, K['name']>> }[RootBlock<TComponents>['name']] : Story<TComponents>;
|
|
63
|
+
type GetResponse<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Omit<GetStoryByIdResponses[200], 'story'> & {
|
|
61
64
|
story: StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>;
|
|
62
65
|
};
|
|
63
|
-
type ListResponse<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Omit<
|
|
66
|
+
type ListResponse<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Omit<ListStoriesResponses[200], 'stories'> & {
|
|
64
67
|
stories: Array<StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>>;
|
|
65
68
|
};
|
|
66
|
-
/**
|
|
67
|
-
type StoryIdentifier =
|
|
69
|
+
/** The story identifier path param (full slug, numeric ID, or UUID), derived from the generated request type. */
|
|
70
|
+
type StoryIdentifier = GetStoryByIdData['path']['id'];
|
|
68
71
|
interface StoriesResourceDeps<DefaultThrowOnError extends boolean = false> extends ResourceDeps<DefaultThrowOnError> {
|
|
69
72
|
inlineRelations: boolean;
|
|
70
73
|
}
|
|
71
74
|
declare function createStoriesResource<TComponents extends Block = Block, InlineRelations extends boolean = false, DefaultThrowOnError extends boolean = false>(deps: StoriesResourceDeps<DefaultThrowOnError>): {
|
|
72
75
|
get: <ThrowOnError extends boolean = DefaultThrowOnError, const ResolveRelationsStr extends string | undefined = undefined>(identifier: StoryIdentifier, options?: {
|
|
73
|
-
query?: Omit<NonNullable<
|
|
76
|
+
query?: Omit<NonNullable<GetStoryByIdData["query"]>, "resolve_relations"> & {
|
|
74
77
|
resolve_relations?: ResolveRelationsStr;
|
|
75
78
|
};
|
|
76
79
|
signal?: AbortSignal;
|
|
@@ -78,7 +81,7 @@ declare function createStoriesResource<TComponents extends Block = Block, Inline
|
|
|
78
81
|
fetchOptions?: FetchOptions;
|
|
79
82
|
}) => Promise<ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>>;
|
|
80
83
|
list: <ThrowOnError extends boolean = DefaultThrowOnError, const ResolveRelationsStr extends string | undefined = undefined>(options?: {
|
|
81
|
-
query?: Omit<NonNullable<
|
|
84
|
+
query?: Omit<NonNullable<ListStoriesData["query"]>, "resolve_relations"> & {
|
|
82
85
|
resolve_relations?: ResolveRelationsStr;
|
|
83
86
|
};
|
|
84
87
|
signal?: AbortSignal;
|
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { GetStoryByIdData, GetStoryByIdResponses, ListStoriesData, ListStoriesResponses } from "../generated/capi/types.gen.mjs";
|
|
2
|
+
import { AssetFieldValue, MultilinkFieldValue, PluginFieldValue, RichtextFieldValue, TableFieldValue } from "../generated/overlay/_internal.gen.mjs";
|
|
3
|
+
import { Block, RootBlock } from "../generated/types/block.mjs";
|
|
4
|
+
import { BlockContent } from "../generated/types/field.mjs";
|
|
5
|
+
import { Story } from "../generated/types/story.mjs";
|
|
2
6
|
import { ApiResponse, FetchOptions, ResourceDeps } from "../client.mjs";
|
|
3
|
-
import { Block, RootBlocks, Story } from "@storyblok/schema";
|
|
4
7
|
|
|
5
8
|
//#region src/resources/stories.d.ts
|
|
6
|
-
type InlinedStoryContentField = string | number | boolean | Array<string | AssetFieldValue |
|
|
9
|
+
type InlinedStoryContentField = string | number | boolean | Array<string | AssetFieldValue | BlockContent | StoryWithInlinedRelations> | AssetFieldValue | MultilinkFieldValue | TableFieldValue | RichtextFieldValue | PluginFieldValue | StoryWithInlinedRelations | undefined;
|
|
7
10
|
interface InlinedStoryContent {
|
|
8
11
|
_uid: string;
|
|
9
12
|
component: string;
|
|
10
13
|
_editable?: string;
|
|
11
14
|
[key: string]: InlinedStoryContentField;
|
|
12
15
|
}
|
|
13
|
-
type StoryWithInlinedRelations = Omit<
|
|
16
|
+
type StoryWithInlinedRelations = Omit<Story, 'content'> & {
|
|
14
17
|
content: InlinedStoryContent;
|
|
15
18
|
};
|
|
16
19
|
/** Splits `"comp.field,comp2.field2"` into a union of `{ component, field }`. */
|
|
@@ -38,7 +41,7 @@ type WithResolvedRelations<TStory, TComponents extends Block, Fields extends str
|
|
|
38
41
|
} : TStory;
|
|
39
42
|
/**
|
|
40
43
|
* Resolves to a narrowed component-derived story type when `TComponents` is a specific
|
|
41
|
-
* Component union, or falls back to the generated
|
|
44
|
+
* Component union, or falls back to the generated Story / StoryWithInlinedRelations
|
|
42
45
|
* when `TComponents` is the default Component base type (no type argument provided).
|
|
43
46
|
*
|
|
44
47
|
* When `ResolveRelations` is a string literal (e.g. `"article.author"`),
|
|
@@ -51,26 +54,26 @@ type WithResolvedRelations<TStory, TComponents extends Block, Fields extends str
|
|
|
51
54
|
* a distributive conditional + default-parameter pattern would collapse
|
|
52
55
|
* both parameters to the distributed single member after inlining.
|
|
53
56
|
*
|
|
54
|
-
* The mapped type `{ [K in TComponents as K["name"]]:
|
|
57
|
+
* The mapped type `{ [K in TComponents as K["name"]]: Story<K, TComponents> }`
|
|
55
58
|
* iterates each union member as `K` while keeping `TComponents` as the full union
|
|
56
59
|
* for nested blok field resolution. The final indexed access
|
|
57
60
|
* `[TComponents["name"]]` produces the discriminated union of all story types.
|
|
58
61
|
*/
|
|
59
|
-
type StoryResult<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Block extends TComponents ? InlineRelations extends true ? StoryWithInlinedRelations :
|
|
60
|
-
type GetResponse<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Omit<
|
|
62
|
+
type StoryResult<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Block extends TComponents ? InlineRelations extends true ? StoryWithInlinedRelations : Story : ResolveRelationsRaw extends string ? { [K in RootBlock<TComponents> as K['name']]: WithResolvedRelations<Story<K, TComponents>, TComponents, ResolvedFieldsFor<ResolveRelationsRaw, K['name']>> }[RootBlock<TComponents>['name']] : Story<TComponents>;
|
|
63
|
+
type GetResponse<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Omit<GetStoryByIdResponses[200], 'story'> & {
|
|
61
64
|
story: StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>;
|
|
62
65
|
};
|
|
63
|
-
type ListResponse<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Omit<
|
|
66
|
+
type ListResponse<TComponents extends Block, InlineRelations extends boolean, ResolveRelationsRaw extends string | undefined = undefined> = Omit<ListStoriesResponses[200], 'stories'> & {
|
|
64
67
|
stories: Array<StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>>;
|
|
65
68
|
};
|
|
66
|
-
/**
|
|
67
|
-
type StoryIdentifier =
|
|
69
|
+
/** The story identifier path param (full slug, numeric ID, or UUID), derived from the generated request type. */
|
|
70
|
+
type StoryIdentifier = GetStoryByIdData['path']['id'];
|
|
68
71
|
interface StoriesResourceDeps<DefaultThrowOnError extends boolean = false> extends ResourceDeps<DefaultThrowOnError> {
|
|
69
72
|
inlineRelations: boolean;
|
|
70
73
|
}
|
|
71
74
|
declare function createStoriesResource<TComponents extends Block = Block, InlineRelations extends boolean = false, DefaultThrowOnError extends boolean = false>(deps: StoriesResourceDeps<DefaultThrowOnError>): {
|
|
72
75
|
get: <ThrowOnError extends boolean = DefaultThrowOnError, const ResolveRelationsStr extends string | undefined = undefined>(identifier: StoryIdentifier, options?: {
|
|
73
|
-
query?: Omit<NonNullable<
|
|
76
|
+
query?: Omit<NonNullable<GetStoryByIdData["query"]>, "resolve_relations"> & {
|
|
74
77
|
resolve_relations?: ResolveRelationsStr;
|
|
75
78
|
};
|
|
76
79
|
signal?: AbortSignal;
|
|
@@ -78,7 +81,7 @@ declare function createStoriesResource<TComponents extends Block = Block, Inline
|
|
|
78
81
|
fetchOptions?: FetchOptions;
|
|
79
82
|
}) => Promise<ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>>;
|
|
80
83
|
list: <ThrowOnError extends boolean = DefaultThrowOnError, const ResolveRelationsStr extends string | undefined = undefined>(options?: {
|
|
81
|
-
query?: Omit<NonNullable<
|
|
84
|
+
query?: Omit<NonNullable<ListStoriesData["query"]>, "resolve_relations"> & {
|
|
82
85
|
resolve_relations?: ResolveRelationsStr;
|
|
83
86
|
};
|
|
84
87
|
signal?: AbortSignal;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getStoryById, listStories } from "../generated/capi/sdk.gen.mjs";
|
|
2
2
|
import { inlineStoriesContent, inlineStoryContent, resolveRelationMap } from "../utils/inline-relations.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/resources/stories.ts
|
|
@@ -15,9 +15,9 @@ function createStoriesResource(deps) {
|
|
|
15
15
|
} : typedQuery;
|
|
16
16
|
const requestPath = `/v2/cdn/stories/${identifier}`;
|
|
17
17
|
return requestWithCache("GET", requestPath, resolvedQuery, async (requestQuery) => {
|
|
18
|
-
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(
|
|
18
|
+
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(getStoryById({
|
|
19
19
|
client,
|
|
20
|
-
path: { identifier },
|
|
20
|
+
path: { id: identifier },
|
|
21
21
|
query: requestQuery,
|
|
22
22
|
signal,
|
|
23
23
|
...throwOnError === void 0 ? {} : { throwOnError },
|
|
@@ -27,7 +27,8 @@ function createStoriesResource(deps) {
|
|
|
27
27
|
} } : {}
|
|
28
28
|
})));
|
|
29
29
|
if (!inlineRelations || response.data === void 0) return response;
|
|
30
|
-
const
|
|
30
|
+
const storyData = response.data;
|
|
31
|
+
const resolved = await resolveRelationMap(storyData, requestQuery, {
|
|
31
32
|
client,
|
|
32
33
|
throttleManager
|
|
33
34
|
});
|
|
@@ -36,7 +37,7 @@ function createStoriesResource(deps) {
|
|
|
36
37
|
...response,
|
|
37
38
|
data: {
|
|
38
39
|
...response.data,
|
|
39
|
-
story: inlineStoryContent(
|
|
40
|
+
story: inlineStoryContent(storyData.story, resolved.relationPaths, resolved.relationMap)
|
|
40
41
|
}
|
|
41
42
|
};
|
|
42
43
|
}, inlineRelations ? { cacheKeyPrefix: "inline" } : void 0);
|
|
@@ -46,7 +47,7 @@ function createStoriesResource(deps) {
|
|
|
46
47
|
const typedQuery = query ?? {};
|
|
47
48
|
const requestPath = "/v2/cdn/stories";
|
|
48
49
|
return requestWithCache("GET", requestPath, typedQuery, async (requestQuery) => {
|
|
49
|
-
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(
|
|
50
|
+
const response = await throttleManager.execute(requestPath, requestQuery, () => asApiResponse(listStories({
|
|
50
51
|
client,
|
|
51
52
|
query: requestQuery,
|
|
52
53
|
signal,
|
|
@@ -57,7 +58,8 @@ function createStoriesResource(deps) {
|
|
|
57
58
|
} } : {}
|
|
58
59
|
})));
|
|
59
60
|
if (!inlineRelations || response.data === void 0) return response;
|
|
60
|
-
const
|
|
61
|
+
const storiesData = response.data;
|
|
62
|
+
const resolved = await resolveRelationMap(storiesData, requestQuery, {
|
|
61
63
|
client,
|
|
62
64
|
throttleManager
|
|
63
65
|
});
|
|
@@ -66,7 +68,7 @@ function createStoriesResource(deps) {
|
|
|
66
68
|
...response,
|
|
67
69
|
data: {
|
|
68
70
|
...response.data,
|
|
69
|
-
stories: inlineStoriesContent(
|
|
71
|
+
stories: inlineStoriesContent(storiesData.stories, resolved.relationPaths, resolved.relationMap)
|
|
70
72
|
}
|
|
71
73
|
};
|
|
72
74
|
}, inlineRelations ? { cacheKeyPrefix: "inline" } : void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stories.mjs","names":[],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import { get, list } from '../generated/stories/sdk.gen';\nimport type { GetData, GetResponses, ListData, ListResponses } from '../generated/stories/types.gen';\nimport type {\n AssetFieldValue,\n BlokContent,\n MultilinkFieldValue,\n PluginFieldValue,\n RichtextFieldValue,\n StoryCapi,\n TableFieldValue,\n} from '../generated/stories';\nimport { inlineStoriesContent, inlineStoryContent, resolveRelationMap } from '../utils/inline-relations';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../client';\nimport type { Story as CapiStory, Block as Component, RootBlocks as RootComponents } from '@storyblok/schema';\n\ntype InlinedStoryContentField =\n | string\n | number\n | boolean\n | Array<string | AssetFieldValue | BlokContent | StoryWithInlinedRelations>\n | AssetFieldValue\n | MultilinkFieldValue\n | TableFieldValue\n | RichtextFieldValue\n | PluginFieldValue\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\n/** Splits `\"comp.field,comp2.field2\"` into a union of `{ component, field }`. */\ntype ParseRelations<T extends string> =\n T extends `${infer Comp}.${infer Field},${infer Rest}`\n ? { component: Comp; field: Field } | ParseRelations<Rest>\n : T extends `${infer Comp}.${infer Field}`\n ? { component: Comp; field: Field }\n : never;\n\n/** Extracts resolved field names for a given component name. */\ntype ResolvedFieldsFor<R extends string, ComponentName extends string> =\n Extract<ParseRelations<R>, { component: ComponentName }>['field'];\n\n/** A resolved relation: a full story typed to the component union. */\ntype ResolvedRelation<TComponents extends Component> =\n { [K in TComponents as K['name']]: CapiStory<K, TComponents> }[TComponents['name']];\n\n/**\n * Given a story type and a set of resolved field names, replaces\n * those fields with `ResolvedRelation<TComponents>` (a full story object).\n */\ntype WithResolvedRelations<\n TStory,\n TComponents extends Component,\n Fields extends string,\n> = TStory extends { content: infer C } ? Omit<TStory, 'content'> & {\n content: {\n [K in keyof C]: K extends Fields ? ResolvedRelation<TComponents> : C[K]\n };\n}\n : TStory;\n\n/**\n * Resolves to a narrowed component-derived story type when `TComponents` is a specific\n * Component union, or falls back to the generated StoryCapi / StoryWithInlinedRelations\n * when `TComponents` is the default Component base type (no type argument provided).\n *\n * When `ResolveRelations` is a string literal (e.g. `\"article.author\"`),\n * matched fields are widened from their schema type to `ResolvedRelation<TComponents>`\n * — a full story object typed to the component union.\n *\n * Uses a mapped-type approach instead of a distributive conditional with a\n * separate full-components parameter. This ensures the full `TComponents` union is\n * preserved even when DTS bundlers (like tsdown) inline the type alias —\n * a distributive conditional + default-parameter pattern would collapse\n * both parameters to the distributed single member after inlining.\n *\n * The mapped type `{ [K in TComponents as K[\"name\"]]: CapiStory<K, TComponents> }`\n * iterates each union member as `K` while keeping `TComponents` as the full union\n * for nested blok field resolution. The final indexed access\n * `[TComponents[\"name\"]]` produces the discriminated union of all story types.\n */\ntype StoryResult<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> =\n Component extends TComponents\n ? InlineRelations extends true ? StoryWithInlinedRelations : StoryCapi // fallback\n : ResolveRelationsRaw extends string\n ? {\n [K in RootComponents<TComponents> as K['name']]: WithResolvedRelations<\n CapiStory<K, TComponents>,\n TComponents,\n ResolvedFieldsFor<ResolveRelationsRaw, K['name']>\n >\n }[RootComponents<TComponents>['name']]\n : CapiStory<TComponents>;\n\ntype GetResponse<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> = Omit<GetResponses[200], 'story'> & {\n story: StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>;\n};\ntype ListResponse<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> = Omit<ListResponses[200], 'stories'> & {\n stories: Array<StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>>;\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<DefaultThrowOnError extends boolean = false> extends ResourceDeps<DefaultThrowOnError> {\n inlineRelations: boolean;\n}\n\nexport function createStoriesResource<\n TComponents extends Component = Component,\n InlineRelations extends boolean = false,\n DefaultThrowOnError extends boolean = false,\n>(\n deps: StoriesResourceDeps<DefaultThrowOnError>,\n) {\n const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;\n\n return {\n get: async <\n ThrowOnError extends boolean = DefaultThrowOnError,\n const ResolveRelationsStr extends string | undefined = undefined,\n >(\n identifier: StoryIdentifier,\n options: { query?: Omit<NonNullable<GetData['query']>, 'resolve_relations'> & { resolve_relations?: ResolveRelationsStr }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const typedQuery = (query ?? {}) as NonNullable<GetData['query']>;\n const resolvedQuery = typeof identifier === 'string' && UUID_RE.test(identifier) && !typedQuery.find_by\n ? { ...typedQuery, find_by: 'uuid' }\n : typedQuery;\n const requestPath = `/v2/cdn/stories/${identifier}`;\n return requestWithCache('GET', requestPath, resolvedQuery, async (requestQuery: Record<string, unknown>) => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse(get({\n client,\n path: { identifier },\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }))) satisfies ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>;\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 // `inlineStoryContent` operates on raw `StoryCapi` shapes and mutates relation fields\n // from UUID strings to full story objects. We cast to satisfy its parameter type.\n story: inlineStoryContent(response.data.story as StoryCapi, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n\n list: async <\n ThrowOnError extends boolean = DefaultThrowOnError,\n const ResolveRelationsStr extends string | undefined = undefined,\n >(\n options: { query?: Omit<NonNullable<ListData['query']>, 'resolve_relations'> & { resolve_relations?: ResolveRelationsStr }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<ListResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const typedQuery = (query ?? {}) as NonNullable<ListData['query']>;\n const requestPath = '/v2/cdn/stories';\n return requestWithCache('GET', requestPath, typedQuery, async (requestQuery: Record<string, unknown>) => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse(list({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }))) satisfies ApiResponse<ListResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>;\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 // `inlineStoriesContent` operates on raw `StoryCapi` shapes and mutates relation fields\n // from UUID strings to full story objects. We cast to satisfy its parameter type.\n stories: inlineStoriesContent(response.data.stories as StoryCapi[], resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n };\n}\n"],"mappings":";;;;AA6HA,MAAM,UAAU;AAMhB,SAAgB,sBAKd,MACA;CACA,MAAM,EAAE,QAAQ,kBAAkB,eAAe,iBAAiB,oBAAoB;AAEtF,QAAO;EACL,KAAK,OAIH,YACA,UAA8M,EAAE,KACzG;GACvG,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,aAAc,SAAS,EAAE;GAC/B,MAAM,gBAAgB,OAAO,eAAe,YAAY,QAAQ,KAAK,WAAW,IAAI,CAAC,WAAW,UAC5F;IAAE,GAAG;IAAY,SAAS;IAAQ,GAClC;GACJ,MAAM,cAAc,mBAAmB;AACvC,UAAO,iBAAiB,OAAO,aAAa,eAAe,OAAO,iBAA0C;IAC1G,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAAc,IAAI;KAChB;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;MAGZ,OAAO,mBAAmB,SAAS,KAAK,OAAoB,SAAS,eAAe,SAAS,YAAY;MAC1G;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAGhE,MAAM,OAIJ,UAA+M,EAAE,KACzG;GACxG,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,aAAc,SAAS,EAAE;GAC/B,MAAM,cAAc;AACpB,UAAO,iBAAiB,OAAO,aAAa,YAAY,OAAO,iBAA0C;IACvG,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAAc,KAAK;KACjB;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;MAGZ,SAAS,qBAAqB,SAAS,KAAK,SAAwB,SAAS,eAAe,SAAS,YAAY;MAClH;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAEjE"}
|
|
1
|
+
{"version":3,"file":"stories.mjs","names":[],"sources":["../../src/resources/stories.ts"],"sourcesContent":["import { getStoryById, listStories } from '../generated/capi/sdk.gen';\nimport type { GetStoryByIdData, GetStoryByIdResponses, ListStoriesData, ListStoriesResponses } from '../generated/capi/types.gen';\nimport type {\n AssetFieldValue,\n BlockContent as BlokContent,\n MultilinkFieldValue,\n PluginFieldValue,\n RichtextFieldValue,\n TableFieldValue,\n} from '../generated/types/field';\nimport { inlineStoriesContent, inlineStoryContent, resolveRelationMap } from '../utils/inline-relations';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../client';\nimport type { Block as Component, RootBlock as RootComponents } from '../generated/types/block';\nimport type { Story } from '../generated/types/story';\n\ntype InlinedStoryContentField =\n | string\n | number\n | boolean\n | Array<string | AssetFieldValue | BlokContent | StoryWithInlinedRelations>\n | AssetFieldValue\n | MultilinkFieldValue\n | TableFieldValue\n | RichtextFieldValue\n | PluginFieldValue\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<Story, 'content'> & {\n content: InlinedStoryContent;\n};\n\n/** Splits `\"comp.field,comp2.field2\"` into a union of `{ component, field }`. */\ntype ParseRelations<T extends string> =\n T extends `${infer Comp}.${infer Field},${infer Rest}`\n ? { component: Comp; field: Field } | ParseRelations<Rest>\n : T extends `${infer Comp}.${infer Field}`\n ? { component: Comp; field: Field }\n : never;\n\n/** Extracts resolved field names for a given component name. */\ntype ResolvedFieldsFor<R extends string, ComponentName extends string> =\n Extract<ParseRelations<R>, { component: ComponentName }>['field'];\n\n/** A resolved relation: a full story typed to the component union. */\ntype ResolvedRelation<TComponents extends Component> =\n { [K in TComponents as K['name']]: Story<K, TComponents> }[TComponents['name']];\n\n/**\n * Given a story type and a set of resolved field names, replaces\n * those fields with `ResolvedRelation<TComponents>` (a full story object).\n */\ntype WithResolvedRelations<\n TStory,\n TComponents extends Component,\n Fields extends string,\n> = TStory extends { content: infer C } ? Omit<TStory, 'content'> & {\n content: {\n [K in keyof C]: K extends Fields ? ResolvedRelation<TComponents> : C[K]\n };\n}\n : TStory;\n\n/**\n * Resolves to a narrowed component-derived story type when `TComponents` is a specific\n * Component union, or falls back to the generated Story / StoryWithInlinedRelations\n * when `TComponents` is the default Component base type (no type argument provided).\n *\n * When `ResolveRelations` is a string literal (e.g. `\"article.author\"`),\n * matched fields are widened from their schema type to `ResolvedRelation<TComponents>`\n * — a full story object typed to the component union.\n *\n * Uses a mapped-type approach instead of a distributive conditional with a\n * separate full-components parameter. This ensures the full `TComponents` union is\n * preserved even when DTS bundlers (like tsdown) inline the type alias —\n * a distributive conditional + default-parameter pattern would collapse\n * both parameters to the distributed single member after inlining.\n *\n * The mapped type `{ [K in TComponents as K[\"name\"]]: Story<K, TComponents> }`\n * iterates each union member as `K` while keeping `TComponents` as the full union\n * for nested blok field resolution. The final indexed access\n * `[TComponents[\"name\"]]` produces the discriminated union of all story types.\n */\ntype StoryResult<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> =\n Component extends TComponents\n ? InlineRelations extends true ? StoryWithInlinedRelations : Story // fallback\n : ResolveRelationsRaw extends string\n ? {\n [K in RootComponents<TComponents> as K['name']]: WithResolvedRelations<\n Story<K, TComponents>,\n TComponents,\n ResolvedFieldsFor<ResolveRelationsRaw, K['name']>\n >\n }[RootComponents<TComponents>['name']]\n : Story<TComponents>;\n\ntype GetResponse<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> = Omit<GetStoryByIdResponses[200], 'story'> & {\n story: StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>;\n};\ntype ListResponse<\n TComponents extends Component,\n InlineRelations extends boolean,\n ResolveRelationsRaw extends string | undefined = undefined,\n> = Omit<ListStoriesResponses[200], 'stories'> & {\n stories: Array<StoryResult<TComponents, InlineRelations, ResolveRelationsRaw>>;\n};\n\n/**\n * Internal relation-resolution shapes. The public response types expose the\n * generic `Story`, but relation inlining needs to read the API's sidecar\n * `rels`/`rel_uuids` fields off the raw payload. These three interfaces model\n * that wire shape so the `response.data` narrowing below stays in one place\n * instead of being scattered as inline casts.\n */\ninterface StoryRelationData {\n rels?: Story[];\n rel_uuids?: string[];\n}\n\ninterface StoryData extends StoryRelationData {\n story: Story;\n}\n\ninterface StoriesData extends StoryRelationData {\n stories: Story[];\n}\n\n/** The story identifier path param (full slug, numeric ID, or UUID), derived from the generated request type. */\ntype StoryIdentifier = GetStoryByIdData['path']['id'];\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<DefaultThrowOnError extends boolean = false> extends ResourceDeps<DefaultThrowOnError> {\n inlineRelations: boolean;\n}\n\nexport function createStoriesResource<\n TComponents extends Component = Component,\n InlineRelations extends boolean = false,\n DefaultThrowOnError extends boolean = false,\n>(\n deps: StoriesResourceDeps<DefaultThrowOnError>,\n) {\n const { client, requestWithCache, asApiResponse, inlineRelations, throttleManager } = deps;\n\n return {\n get: async <\n ThrowOnError extends boolean = DefaultThrowOnError,\n const ResolveRelationsStr extends string | undefined = undefined,\n >(\n identifier: StoryIdentifier,\n options: { query?: Omit<NonNullable<GetStoryByIdData['query']>, 'resolve_relations'> & { resolve_relations?: ResolveRelationsStr }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const typedQuery = (query ?? {}) as NonNullable<GetStoryByIdData['query']>;\n const resolvedQuery = typeof identifier === 'string' && UUID_RE.test(identifier) && !typedQuery.find_by\n ? { ...typedQuery, find_by: 'uuid' }\n : typedQuery;\n const requestPath = `/v2/cdn/stories/${identifier}`;\n return requestWithCache('GET', requestPath, resolvedQuery, async (requestQuery: Record<string, unknown>) => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse(getStoryById({\n client,\n path: { id: identifier },\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }))) satisfies ApiResponse<GetResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>;\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n // Narrow to the internal relation shape to read the API's sidecar\n // `rels`/`rel_uuids`; consumers keep seeing the generic `Story`.\n const storyData = response.data as unknown as StoryData;\n const resolved = await resolveRelationMap(storyData, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n story: inlineStoryContent(storyData.story, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n\n list: async <\n ThrowOnError extends boolean = DefaultThrowOnError,\n const ResolveRelationsStr extends string | undefined = undefined,\n >(\n options: { query?: Omit<NonNullable<ListStoriesData['query']>, 'resolve_relations'> & { resolve_relations?: ResolveRelationsStr }; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<ListResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const typedQuery = (query ?? {}) as NonNullable<ListStoriesData['query']>;\n const requestPath = '/v2/cdn/stories';\n return requestWithCache('GET', requestPath, typedQuery, async (requestQuery: Record<string, unknown>) => {\n const response = await throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse(listStories({\n client,\n query: requestQuery,\n signal,\n ...(throwOnError === undefined ? {} : { throwOnError }),\n ...(fetchOptions ? { kyOptions: { ...client.getConfig().kyOptions, ...fetchOptions } } : {}),\n }))) satisfies ApiResponse<ListResponse<TComponents, InlineRelations, ResolveRelationsStr>, ThrowOnError>;\n\n if (!inlineRelations || response.data === undefined) {\n return response;\n }\n\n // Narrow to the internal relation shape to read the API's sidecar\n // `rels`/`rel_uuids`; consumers keep seeing the generic `Story`.\n const storiesData = response.data as unknown as StoriesData;\n const resolved = await resolveRelationMap(storiesData, requestQuery, { client, throttleManager });\n if (!resolved) {\n return response;\n }\n\n return {\n ...response,\n data: {\n ...response.data,\n stories: inlineStoriesContent(storiesData.stories, resolved.relationPaths, resolved.relationMap),\n },\n };\n }, inlineRelations ? { cacheKeyPrefix: 'inline' } : undefined);\n },\n };\n}\n"],"mappings":";;;;AAiJA,MAAM,UAAU;AAMhB,SAAgB,sBAKd,MACA;CACA,MAAM,EAAE,QAAQ,kBAAkB,eAAe,iBAAiB,oBAAoB;AAEtF,QAAO;EACL,KAAK,OAIH,YACA,UAAuN,EAAE,KAClH;GACvG,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,aAAc,SAAS,EAAE;GAC/B,MAAM,gBAAgB,OAAO,eAAe,YAAY,QAAQ,KAAK,WAAW,IAAI,CAAC,WAAW,UAC5F;IAAE,GAAG;IAAY,SAAS;IAAQ,GAClC;GACJ,MAAM,cAAc,mBAAmB;AACvC,UAAO,iBAAiB,OAAO,aAAa,eAAe,OAAO,iBAA0C;IAC1G,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAAc,aAAa;KACzB;KACA,MAAM,EAAE,IAAI,YAAY;KACxB,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;IAKT,MAAM,YAAY,SAAS;IAC3B,MAAM,WAAW,MAAM,mBAAmB,WAAW,cAAc;KAAE;KAAQ;KAAiB,CAAC;AAC/F,QAAI,CAAC,SACH,QAAO;AAGT,WAAO;KACL,GAAG;KACH,MAAM;MACJ,GAAG,SAAS;MACZ,OAAO,mBAAmB,UAAU,OAAO,SAAS,eAAe,SAAS,YAAY;MACzF;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAGhE,MAAM,OAIJ,UAAsN,EAAE,KAChH;GACxG,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;GAC3D,MAAM,aAAc,SAAS,EAAE;GAC/B,MAAM,cAAc;AACpB,UAAO,iBAAiB,OAAO,aAAa,YAAY,OAAO,iBAA0C;IACvG,MAAM,WAAW,MAAM,gBAAgB,QAAQ,aAAa,oBAC1D,cAAc,YAAY;KACxB;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;IAKT,MAAM,cAAc,SAAS;IAC7B,MAAM,WAAW,MAAM,mBAAmB,aAAa,cAAc;KAAE;KAAQ;KAAiB,CAAC;AACjG,QAAI,CAAC,SACH,QAAO;AAGT,WAAO;KACL,GAAG;KACH,MAAM;MACJ,GAAG,SAAS;MACZ,SAAS,qBAAqB,YAAY,SAAS,SAAS,eAAe,SAAS,YAAY;MACjG;KACF;MACA,kBAAkB,EAAE,gBAAgB,UAAU,GAAG,OAAU;;EAEjE"}
|
package/dist/resources/tags.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_sdk_gen = require('../generated/
|
|
1
|
+
const require_sdk_gen = require('../generated/capi/sdk.gen.cjs');
|
|
2
2
|
|
|
3
3
|
//#region src/resources/tags.ts
|
|
4
4
|
function createTagsResource(deps) {
|
|
@@ -7,7 +7,7 @@ function createTagsResource(deps) {
|
|
|
7
7
|
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
8
8
|
const requestPath = "/v2/cdn/tags";
|
|
9
9
|
return requestWithCache("GET", requestPath, query, (requestQuery) => {
|
|
10
|
-
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(require_sdk_gen.
|
|
10
|
+
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(require_sdk_gen.listTags({
|
|
11
11
|
client,
|
|
12
12
|
query: requestQuery,
|
|
13
13
|
signal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.cjs","names":["listTagsApi"],"sources":["../../src/resources/tags.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"tags.cjs","names":["listTagsApi"],"sources":["../../src/resources/tags.ts"],"sourcesContent":["import { listTags as listTagsApi } from '../generated/capi/sdk.gen';\nimport type { ListTagsData, ListTagsResponses } from '../generated/capi/types.gen';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../client';\n\nexport function createTagsResource<DefaultThrowOnError extends boolean = false>(deps: ResourceDeps<DefaultThrowOnError>) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n list: async <ThrowOnError extends boolean = DefaultThrowOnError>(\n options: { query?: ListTagsData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<ListTagsResponses[200], ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/tags';\n return requestWithCache<ListTagsResponses[200], ThrowOnError>('GET', requestPath, query, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<ListTagsResponses[200], ThrowOnError>(listTagsApi({\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,mBAAgE,MAAyC;CACvH,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,MAAM,OACJ,UAA6H,EAAE,KAChE;EAC/D,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;EAC3D,MAAM,cAAc;AACpB,SAAO,iBAAuD,OAAO,aAAa,QAAQ,iBAA0C;AAClI,UAAO,gBAAgB,QAAQ,aAAa,oBAC1C,cAAoDA,yBAAY;IAC9D;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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { listTags } from "../generated/capi/sdk.gen.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/resources/tags.ts
|
|
4
4
|
function createTagsResource(deps) {
|
|
@@ -7,7 +7,7 @@ function createTagsResource(deps) {
|
|
|
7
7
|
const { query = {}, signal, throwOnError, fetchOptions } = options;
|
|
8
8
|
const requestPath = "/v2/cdn/tags";
|
|
9
9
|
return requestWithCache("GET", requestPath, query, (requestQuery) => {
|
|
10
|
-
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(
|
|
10
|
+
return throttleManager.execute(requestPath, requestQuery, () => asApiResponse(listTags({
|
|
11
11
|
client,
|
|
12
12
|
query: requestQuery,
|
|
13
13
|
signal,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tags.mjs","names":["listTagsApi"],"sources":["../../src/resources/tags.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"tags.mjs","names":["listTagsApi"],"sources":["../../src/resources/tags.ts"],"sourcesContent":["import { listTags as listTagsApi } from '../generated/capi/sdk.gen';\nimport type { ListTagsData, ListTagsResponses } from '../generated/capi/types.gen';\nimport type { ApiResponse, FetchOptions, ResourceDeps } from '../client';\n\nexport function createTagsResource<DefaultThrowOnError extends boolean = false>(deps: ResourceDeps<DefaultThrowOnError>) {\n const { client, requestWithCache, asApiResponse, throttleManager } = deps;\n\n return {\n list: async <ThrowOnError extends boolean = DefaultThrowOnError>(\n options: { query?: ListTagsData['query']; signal?: AbortSignal; throwOnError?: ThrowOnError; fetchOptions?: FetchOptions } = {},\n ): Promise<ApiResponse<ListTagsResponses[200], ThrowOnError>> => {\n const { query = {}, signal, throwOnError, fetchOptions } = options;\n const requestPath = '/v2/cdn/tags';\n return requestWithCache<ListTagsResponses[200], ThrowOnError>('GET', requestPath, query, (requestQuery: Record<string, unknown>) => {\n return throttleManager.execute(requestPath, requestQuery, () =>\n asApiResponse<ListTagsResponses[200], ThrowOnError>(listTagsApi({\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,mBAAgE,MAAyC;CACvH,MAAM,EAAE,QAAQ,kBAAkB,eAAe,oBAAoB;AAErE,QAAO,EACL,MAAM,OACJ,UAA6H,EAAE,KAChE;EAC/D,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,cAAc,iBAAiB;EAC3D,MAAM,cAAc;AACpB,SAAO,iBAAuD,OAAO,aAAa,QAAQ,iBAA0C;AAClI,UAAO,gBAAgB,QAAQ,aAAa,oBAC1C,cAAoDA,SAAY;IAC9D;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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_sdk_gen = require('../generated/
|
|
1
|
+
const require_sdk_gen = require('../generated/capi/sdk.gen.cjs');
|
|
2
2
|
const require_array = require('./array.cjs');
|
|
3
3
|
|
|
4
4
|
//#region src/utils/fetch-rel-uuids.ts
|
|
@@ -25,7 +25,7 @@ const fetchMissingRelations = async ({ client, uuids, baseQuery, throttleManager
|
|
|
25
25
|
};
|
|
26
26
|
const chunks = require_array.chunkArray(uuids, UUID_CHUNK_SIZE);
|
|
27
27
|
return (await Promise.all(chunks.map((chunk) => throttleManager.execute("/v2/cdn/stories", queryContext, async () => {
|
|
28
|
-
const response = await require_sdk_gen.
|
|
28
|
+
const response = await require_sdk_gen.listStories({
|
|
29
29
|
client,
|
|
30
30
|
query: {
|
|
31
31
|
...queryContext,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-rel-uuids.cjs","names":["chunkArray","
|
|
1
|
+
{"version":3,"file":"fetch-rel-uuids.cjs","names":["chunkArray","listStories"],"sources":["../../src/utils/fetch-rel-uuids.ts"],"sourcesContent":["import type { Client } from '../generated/capi/client';\nimport { listStories } from '../generated/capi/sdk.gen';\nimport type { Story } from '../generated/types/story';\nimport type { ThrottleManager } from './rate-limit';\nimport { chunkArray } from './array';\n\nconst UUID_CHUNK_SIZE = 50;\nconst QUERY_CONTEXT_KEYS = new Set([\n 'cv',\n 'fallback_lang',\n 'from_release',\n 'language',\n 'resolve_assets',\n 'resolve_links',\n 'resolve_links_level',\n 'version',\n]);\n\nconst pickQueryContext = (baseQuery: Record<string, unknown>): Record<string, unknown> => {\n const query: Record<string, unknown> = {};\n for (const key of QUERY_CONTEXT_KEYS) {\n if (baseQuery[key] !== undefined) {\n query[key] = baseQuery[key];\n }\n }\n return query;\n};\n\ninterface FetchMissingRelationsOptions {\n client: Client;\n uuids: string[];\n baseQuery: Record<string, unknown>;\n throttleManager: ThrottleManager;\n}\n\nexport const fetchMissingRelations = async ({\n client,\n uuids,\n baseQuery,\n throttleManager,\n}: FetchMissingRelationsOptions): Promise<Story[]> => {\n const queryContext = { ...pickQueryContext(baseQuery), per_page: UUID_CHUNK_SIZE };\n const chunks = chunkArray(uuids, UUID_CHUNK_SIZE);\n\n const results = await Promise.all(\n chunks.map(chunk =>\n throttleManager.execute('/v2/cdn/stories', queryContext, async () => {\n const response = await listStories({\n client,\n query: {\n ...queryContext,\n by_uuids: chunk.join(','),\n per_page: UUID_CHUNK_SIZE,\n },\n });\n\n throttleManager.adaptToResponse(response.response);\n\n if (response.error !== undefined) {\n throw response.error;\n }\n\n if (response.data === undefined) {\n throw new Error('Failed to fetch missing relations.');\n }\n\n // SDK return shape is the raw `DraftStory | PublishedStory` union; cast\n // to the wrapper `Story` (public type) so callers don't have to know\n // about the spec-level discriminated form and get the benefits of the\n // generic `Story` with schema support.\n return response.data.stories as unknown as Story[];\n }),\n ),\n );\n\n return results.flat();\n};\n"],"mappings":";;;;AAMA,MAAM,kBAAkB;AACxB,MAAM,qBAAqB,IAAI,IAAI;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,oBAAoB,cAAgE;CACxF,MAAM,QAAiC,EAAE;AACzC,MAAK,MAAM,OAAO,mBAChB,KAAI,UAAU,SAAS,OACrB,OAAM,OAAO,UAAU;AAG3B,QAAO;;AAUT,MAAa,wBAAwB,OAAO,EAC1C,QACA,OACA,WACA,sBACoD;CACpD,MAAM,eAAe;EAAE,GAAG,iBAAiB,UAAU;EAAE,UAAU;EAAiB;CAClF,MAAM,SAASA,yBAAW,OAAO,gBAAgB;AAiCjD,SA/BgB,MAAM,QAAQ,IAC5B,OAAO,KAAI,UACT,gBAAgB,QAAQ,mBAAmB,cAAc,YAAY;EACnE,MAAM,WAAW,MAAMC,4BAAY;GACjC;GACA,OAAO;IACL,GAAG;IACH,UAAU,MAAM,KAAK,IAAI;IACzB,UAAU;IACX;GACF,CAAC;AAEF,kBAAgB,gBAAgB,SAAS,SAAS;AAElD,MAAI,SAAS,UAAU,OACrB,OAAM,SAAS;AAGjB,MAAI,SAAS,SAAS,OACpB,OAAM,IAAI,MAAM,qCAAqC;AAOvD,SAAO,SAAS,KAAK;GACrB,CACH,CACF,EAEc,MAAM"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { listStories } from "../generated/capi/sdk.gen.mjs";
|
|
2
2
|
import { chunkArray } from "./array.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/utils/fetch-rel-uuids.ts
|
|
@@ -25,7 +25,7 @@ const fetchMissingRelations = async ({ client, uuids, baseQuery, throttleManager
|
|
|
25
25
|
};
|
|
26
26
|
const chunks = chunkArray(uuids, UUID_CHUNK_SIZE);
|
|
27
27
|
return (await Promise.all(chunks.map((chunk) => throttleManager.execute("/v2/cdn/stories", queryContext, async () => {
|
|
28
|
-
const response = await
|
|
28
|
+
const response = await listStories({
|
|
29
29
|
client,
|
|
30
30
|
query: {
|
|
31
31
|
...queryContext,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-rel-uuids.mjs","names":[],"sources":["../../src/utils/fetch-rel-uuids.ts"],"sourcesContent":["import type { Client } from '../generated/
|
|
1
|
+
{"version":3,"file":"fetch-rel-uuids.mjs","names":[],"sources":["../../src/utils/fetch-rel-uuids.ts"],"sourcesContent":["import type { Client } from '../generated/capi/client';\nimport { listStories } from '../generated/capi/sdk.gen';\nimport type { Story } from '../generated/types/story';\nimport type { ThrottleManager } from './rate-limit';\nimport { chunkArray } from './array';\n\nconst UUID_CHUNK_SIZE = 50;\nconst QUERY_CONTEXT_KEYS = new Set([\n 'cv',\n 'fallback_lang',\n 'from_release',\n 'language',\n 'resolve_assets',\n 'resolve_links',\n 'resolve_links_level',\n 'version',\n]);\n\nconst pickQueryContext = (baseQuery: Record<string, unknown>): Record<string, unknown> => {\n const query: Record<string, unknown> = {};\n for (const key of QUERY_CONTEXT_KEYS) {\n if (baseQuery[key] !== undefined) {\n query[key] = baseQuery[key];\n }\n }\n return query;\n};\n\ninterface FetchMissingRelationsOptions {\n client: Client;\n uuids: string[];\n baseQuery: Record<string, unknown>;\n throttleManager: ThrottleManager;\n}\n\nexport const fetchMissingRelations = async ({\n client,\n uuids,\n baseQuery,\n throttleManager,\n}: FetchMissingRelationsOptions): Promise<Story[]> => {\n const queryContext = { ...pickQueryContext(baseQuery), per_page: UUID_CHUNK_SIZE };\n const chunks = chunkArray(uuids, UUID_CHUNK_SIZE);\n\n const results = await Promise.all(\n chunks.map(chunk =>\n throttleManager.execute('/v2/cdn/stories', queryContext, async () => {\n const response = await listStories({\n client,\n query: {\n ...queryContext,\n by_uuids: chunk.join(','),\n per_page: UUID_CHUNK_SIZE,\n },\n });\n\n throttleManager.adaptToResponse(response.response);\n\n if (response.error !== undefined) {\n throw response.error;\n }\n\n if (response.data === undefined) {\n throw new Error('Failed to fetch missing relations.');\n }\n\n // SDK return shape is the raw `DraftStory | PublishedStory` union; cast\n // to the wrapper `Story` (public type) so callers don't have to know\n // about the spec-level discriminated form and get the benefits of the\n // generic `Story` with schema support.\n return response.data.stories as unknown as Story[];\n }),\n ),\n );\n\n return results.flat();\n};\n"],"mappings":";;;;AAMA,MAAM,kBAAkB;AACxB,MAAM,qBAAqB,IAAI,IAAI;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAM,oBAAoB,cAAgE;CACxF,MAAM,QAAiC,EAAE;AACzC,MAAK,MAAM,OAAO,mBAChB,KAAI,UAAU,SAAS,OACrB,OAAM,OAAO,UAAU;AAG3B,QAAO;;AAUT,MAAa,wBAAwB,OAAO,EAC1C,QACA,OACA,WACA,sBACoD;CACpD,MAAM,eAAe;EAAE,GAAG,iBAAiB,UAAU;EAAE,UAAU;EAAiB;CAClF,MAAM,SAAS,WAAW,OAAO,gBAAgB;AAiCjD,SA/BgB,MAAM,QAAQ,IAC5B,OAAO,KAAI,UACT,gBAAgB,QAAQ,mBAAmB,cAAc,YAAY;EACnE,MAAM,WAAW,MAAM,YAAY;GACjC;GACA,OAAO;IACL,GAAG;IACH,UAAU,MAAM,KAAK,IAAI;IACzB,UAAU;IACX;GACF,CAAC;AAEF,kBAAgB,gBAAgB,SAAS,SAAS;AAElD,MAAI,SAAS,UAAU,OACrB,OAAM,SAAS;AAGjB,MAAI,SAAS,SAAS,OACpB,OAAM,IAAI,MAAM,qCAAqC;AAOvD,SAAO,SAAS,KAAK;GACrB,CACH,CACF,EAEc,MAAM"}
|