@se-studio/contentful-rest-api 1.11.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +27 -1
  3. package/dist/api/article-type.d.ts.map +1 -1
  4. package/dist/api/article-type.js +10 -11
  5. package/dist/api/article-type.js.map +1 -1
  6. package/dist/api/banner.d.ts.map +1 -1
  7. package/dist/api/banner.js +5 -2
  8. package/dist/api/banner.js.map +1 -1
  9. package/dist/api/breadcrumb.d.ts.map +1 -1
  10. package/dist/api/breadcrumb.js +7 -21
  11. package/dist/api/breadcrumb.js.map +1 -1
  12. package/dist/api/helpers.d.ts +2 -0
  13. package/dist/api/helpers.d.ts.map +1 -1
  14. package/dist/api/helpers.js +21 -17
  15. package/dist/api/helpers.js.map +1 -1
  16. package/dist/api/index.d.ts +2 -2
  17. package/dist/api/index.d.ts.map +1 -1
  18. package/dist/api/index.js +2 -2
  19. package/dist/api/index.js.map +1 -1
  20. package/dist/api/links.d.ts.map +1 -1
  21. package/dist/api/links.js +87 -66
  22. package/dist/api/links.js.map +1 -1
  23. package/dist/api/listing-fetch-params.d.ts +5 -2
  24. package/dist/api/listing-fetch-params.d.ts.map +1 -1
  25. package/dist/api/listing-fetch-params.js +16 -2
  26. package/dist/api/listing-fetch-params.js.map +1 -1
  27. package/dist/api/navigation.d.ts +1 -0
  28. package/dist/api/navigation.d.ts.map +1 -1
  29. package/dist/api/navigation.js +1 -0
  30. package/dist/api/navigation.js.map +1 -1
  31. package/dist/api/page.d.ts.map +1 -1
  32. package/dist/api/page.js +1 -0
  33. package/dist/api/page.js.map +1 -1
  34. package/dist/api/person.d.ts.map +1 -1
  35. package/dist/api/person.js +10 -11
  36. package/dist/api/person.js.map +1 -1
  37. package/dist/api/redirects.d.ts.map +1 -1
  38. package/dist/api/redirects.js +5 -2
  39. package/dist/api/redirects.js.map +1 -1
  40. package/dist/api/tag-type.d.ts.map +1 -1
  41. package/dist/api/tag-type.js +6 -5
  42. package/dist/api/tag-type.js.map +1 -1
  43. package/dist/api/tag.d.ts.map +1 -1
  44. package/dist/api/tag.js +10 -11
  45. package/dist/api/tag.js.map +1 -1
  46. package/dist/api/template.d.ts.map +1 -1
  47. package/dist/api/template.js +3 -4
  48. package/dist/api/template.js.map +1 -1
  49. package/dist/api/types.d.ts +2 -0
  50. package/dist/api/types.d.ts.map +1 -1
  51. package/dist/client.d.ts.map +1 -1
  52. package/dist/client.js +12 -2
  53. package/dist/client.js.map +1 -1
  54. package/dist/converters/article.d.ts.map +1 -1
  55. package/dist/converters/article.js +11 -15
  56. package/dist/converters/article.js.map +1 -1
  57. package/dist/converters/customType.d.ts.map +1 -1
  58. package/dist/converters/customType.js +3 -11
  59. package/dist/converters/customType.js.map +1 -1
  60. package/dist/converters/index.d.ts +1 -1
  61. package/dist/converters/index.d.ts.map +1 -1
  62. package/dist/converters/index.js +1 -1
  63. package/dist/converters/index.js.map +1 -1
  64. package/dist/converters/navigationItem.d.ts +6 -0
  65. package/dist/converters/navigationItem.d.ts.map +1 -1
  66. package/dist/converters/navigationItem.js +24 -1
  67. package/dist/converters/navigationItem.js.map +1 -1
  68. package/dist/converters/page.js +3 -3
  69. package/dist/converters/page.js.map +1 -1
  70. package/dist/converters/pageVariantMerge.js +3 -3
  71. package/dist/converters/pageVariantMerge.js.map +1 -1
  72. package/dist/converters/person.js +3 -3
  73. package/dist/converters/person.js.map +1 -1
  74. package/dist/converters/tag.d.ts.map +1 -1
  75. package/dist/converters/tag.js +15 -19
  76. package/dist/converters/tag.js.map +1 -1
  77. package/dist/converters/template.d.ts.map +1 -1
  78. package/dist/converters/template.js +3 -4
  79. package/dist/converters/template.js.map +1 -1
  80. package/dist/index.d.ts +3 -3
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +2 -2
  83. package/dist/index.js.map +1 -1
  84. package/dist/navigation/cacheOptions.d.ts +2 -0
  85. package/dist/navigation/cacheOptions.d.ts.map +1 -1
  86. package/dist/navigation/cacheOptions.js +7 -0
  87. package/dist/navigation/cacheOptions.js.map +1 -1
  88. package/dist/navigation/enrichModelNavigation.d.ts +17 -0
  89. package/dist/navigation/enrichModelNavigation.d.ts.map +1 -0
  90. package/dist/navigation/enrichModelNavigation.js +53 -0
  91. package/dist/navigation/enrichModelNavigation.js.map +1 -0
  92. package/dist/navigation/linkIndex.d.ts +1 -0
  93. package/dist/navigation/linkIndex.d.ts.map +1 -1
  94. package/dist/navigation/linkIndex.js +22 -78
  95. package/dist/navigation/linkIndex.js.map +1 -1
  96. package/dist/navigation/listingLinkBundle.d.ts +22 -0
  97. package/dist/navigation/listingLinkBundle.d.ts.map +1 -0
  98. package/dist/navigation/listingLinkBundle.js +88 -0
  99. package/dist/navigation/listingLinkBundle.js.map +1 -0
  100. package/dist/navigation/registry.d.ts +1 -0
  101. package/dist/navigation/registry.d.ts.map +1 -1
  102. package/dist/navigation/registry.js +23 -6
  103. package/dist/navigation/registry.js.map +1 -1
  104. package/dist/navigation/requestCache.d.ts +18 -0
  105. package/dist/navigation/requestCache.d.ts.map +1 -0
  106. package/dist/navigation/requestCache.js +66 -0
  107. package/dist/navigation/requestCache.js.map +1 -0
  108. package/dist/revalidation/entry-handlers.d.ts +39 -0
  109. package/dist/revalidation/entry-handlers.d.ts.map +1 -0
  110. package/dist/revalidation/entry-handlers.js +103 -0
  111. package/dist/revalidation/entry-handlers.js.map +1 -0
  112. package/dist/revalidation/handlers.d.ts +4 -37
  113. package/dist/revalidation/handlers.d.ts.map +1 -1
  114. package/dist/revalidation/handlers.js +2 -100
  115. package/dist/revalidation/handlers.js.map +1 -1
  116. package/dist/telemetry/deriveOperation.d.ts +8 -0
  117. package/dist/telemetry/deriveOperation.d.ts.map +1 -0
  118. package/dist/telemetry/deriveOperation.js +59 -0
  119. package/dist/telemetry/deriveOperation.js.map +1 -0
  120. package/dist/telemetry/queryContext.d.ts +7 -0
  121. package/dist/telemetry/queryContext.d.ts.map +1 -0
  122. package/dist/telemetry/queryContext.js +9 -0
  123. package/dist/telemetry/queryContext.js.map +1 -0
  124. package/dist/telemetry/queryLog.d.ts +17 -0
  125. package/dist/telemetry/queryLog.d.ts.map +1 -0
  126. package/dist/telemetry/queryLog.js +54 -0
  127. package/dist/telemetry/queryLog.js.map +1 -0
  128. package/dist/types.d.ts +7 -0
  129. package/dist/types.d.ts.map +1 -1
  130. package/docs/llms.md +33 -3
  131. package/package.json +3 -2
@@ -1,31 +1,6 @@
1
- export interface BaseData {
2
- sys: {
3
- id: string;
4
- type: 'Entry' | 'DeletedEntry' | 'Asset' | 'DeletedAsset';
5
- space: {
6
- sys: {
7
- id: string;
8
- };
9
- };
10
- environment: {
11
- sys: {
12
- id: string;
13
- };
14
- };
15
- contentType: {
16
- sys: {
17
- id: string;
18
- };
19
- };
20
- };
21
- }
22
- interface SlugData extends BaseData {
23
- fields?: {
24
- slug?: {
25
- 'en-US': string;
26
- };
27
- };
28
- }
1
+ import type { BaseData, IContentTypeHandler } from './entry-handlers';
2
+ export type { BaseData, IContentTypeHandler } from './entry-handlers';
3
+ export { contentTypeHandlers, getPublishTagsForEntry } from './entry-handlers';
29
4
  export interface AssetData extends BaseData {
30
5
  fields?: {
31
6
  file?: {
@@ -37,16 +12,8 @@ export interface AssetData extends BaseData {
37
12
  };
38
13
  };
39
14
  }
40
- export interface IContentTypeHandler<TData extends BaseData, TExtracted> {
41
- extract(data: TData): TExtracted | Promise<TExtracted>;
42
- makeTags(extracted: TExtracted): (string | undefined)[] | undefined;
43
- getGlobalTags(): string[];
44
- rebuildSearch?: boolean;
45
- }
46
- export declare const contentTypeHandlers: Record<string, IContentTypeHandler<SlugData, string | null | undefined>>;
47
15
  export declare function revalidateAsset(content: AssetData, message: string, preview?: boolean): Promise<boolean>;
48
- export declare function revalidateEntry(handler: IContentTypeHandler<SlugData, string | null | undefined>, content: BaseData, contentType: string, preview?: boolean): Promise<boolean>;
16
+ export declare function revalidateEntry(handler: IContentTypeHandler<BaseData, string | null | undefined>, content: BaseData, contentType: string, preview?: boolean): Promise<boolean>;
49
17
  export declare function revalidateDeletedEntry(contentType: string, preview?: boolean): Promise<boolean>;
50
18
  export declare function revalidateDeletedAsset(assetId: string, preview?: boolean): Promise<boolean>;
51
- export {};
52
19
  //# sourceMappingURL=handlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/revalidation/handlers.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,QAAQ;IAEvB,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,OAAO,GAAG,cAAc,CAAC;QAC1D,KAAK,EAAE;YAAE,GAAG,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;QAC/B,WAAW,EAAE;YAAE,GAAG,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;QACrC,WAAW,EAAE;YAAE,GAAG,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAA;SAAE,CAAC;KACtC,CAAC;CACH;AAED,UAAU,QAAS,SAAQ,QAAQ;IACjC,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE;YACL,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;CACH;AAwCD,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE;YACL,CAAC,GAAG,EAAE,MAAM,GAAG;gBACb,GAAG,EAAE,MAAM,CAAC;gBACZ,QAAQ,EAAE,MAAM,CAAC;gBACjB,WAAW,EAAE,MAAM,CAAC;aACrB,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAWD,MAAM,WAAW,mBAAmB,CAAC,KAAK,SAAS,QAAQ,EAAE,UAAU;IACrE,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACvD,QAAQ,CAAC,SAAS,EAAE,UAAU,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC;IACpE,aAAa,IAAI,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA2CD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,MAAM,EACN,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAgEzD,CAAC;AAGF,wBAAsB,eAAe,CACnC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAclB;AAGD,wBAAsB,eAAe,CACnC,OAAO,EAAE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EACjE,OAAO,EAAE,QAAQ,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAclB;AAGD,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAGD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
1
+ {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/revalidation/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAItE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,EAAE;YACL,CAAC,GAAG,EAAE,MAAM,GAAG;gBACb,GAAG,EAAE,MAAM,CAAC;gBACZ,QAAQ,EAAE,MAAM,CAAC;gBACjB,WAAW,EAAE,MAAM,CAAC;aACrB,CAAC;SACH,CAAC;KACH,CAAC;CACH;AAID,wBAAsB,eAAe,CACnC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAclB;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EACjE,OAAO,EAAE,QAAQ,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAclB;AAED,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
@@ -1,102 +1,7 @@
1
1
  import { revalidateSingleTag, revalidateTags } from './server-utils.js';
2
- import { ArticleTag, ArticleTypeIndexTag, ArticleTypeTag, AssetTag, articleTag, articleTypeIndexTag, assetTag, BannerTag, CustomTypeTag, GlobalTag, LinkTag, LocationTag, locationTag, NavigationItemTag, NavigationTag, PageTag, PageVariantTag, PersonTag, pageTag, pageVariantTag, personTag, RedirectTag, TagTag, TagTypeTag, TemplateTag, tagTag, tagTypeTag, templateTag, } from './tags.js';
3
- // Default locale for Contentful
2
+ import { AssetTag, assetTag, GlobalTag } from './tags.js';
3
+ export { contentTypeHandlers, getPublishTagsForEntry } from './entry-handlers.js';
4
4
  const defaultLocale = 'en-US';
5
- // Content type handlers
6
- const articleTypeHandler = {
7
- extract: (data) => ({
8
- slug: data.fields?.slug?.[defaultLocale],
9
- }),
10
- makeTags: (extracted) => [extracted.slug ? articleTypeIndexTag(extracted.slug) : undefined],
11
- getGlobalTags: () => [ArticleTypeTag, ArticleTypeIndexTag],
12
- };
13
- const articleHandler = {
14
- extract: (data) => ({
15
- slug: data.fields?.slug?.[defaultLocale],
16
- }),
17
- makeTags: (extracted) => [extracted?.slug ? articleTag(extracted.slug) : undefined],
18
- getGlobalTags: () => [ArticleTag],
19
- rebuildSearch: true,
20
- };
21
- const pageVariantHandler = {
22
- extract: (data) => {
23
- const pageVariantSlug = data.fields?.slug?.[defaultLocale];
24
- return pageVariantSlug;
25
- },
26
- makeTags: (extracted) => [extracted ? pageVariantTag(extracted) : undefined],
27
- getGlobalTags: () => [PageVariantTag],
28
- };
29
- const templateHandler = {
30
- extract: (data) => data.fields?.cmsLabel?.[defaultLocale],
31
- makeTags: (extracted) => [extracted ? templateTag(extracted) : undefined],
32
- getGlobalTags: () => [TemplateTag],
33
- };
34
- // Content type handlers registry
35
- export const contentTypeHandlers = {
36
- page: {
37
- extract: (data) => data.fields?.slug?.[defaultLocale],
38
- makeTags: (extracted) => [extracted ? pageTag(extracted) : undefined],
39
- getGlobalTags: () => [PageTag],
40
- },
41
- pageVariant: pageVariantHandler,
42
- // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types
43
- article: articleHandler,
44
- // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types
45
- articleType: articleTypeHandler,
46
- person: {
47
- extract: (data) => data.fields?.slug?.[defaultLocale],
48
- makeTags: (extracted) => [extracted ? personTag(extracted) : undefined],
49
- getGlobalTags: () => [PersonTag],
50
- },
51
- tag: {
52
- extract: (data) => data.fields?.slug?.[defaultLocale],
53
- makeTags: (extracted) => [extracted ? tagTag(extracted) : undefined],
54
- getGlobalTags: () => [TagTag],
55
- },
56
- tagType: {
57
- extract: (data) => data.fields?.slug?.[defaultLocale],
58
- makeTags: (extracted) => [extracted ? tagTypeTag(extracted) : undefined],
59
- getGlobalTags: () => [TagTypeTag],
60
- },
61
- link: {
62
- extract: () => undefined,
63
- makeTags: () => undefined,
64
- getGlobalTags: () => [LinkTag],
65
- },
66
- // biome-ignore lint/suspicious/noExplicitAny: Any is ok for handlers with different types
67
- template: templateHandler,
68
- customType: {
69
- extract: () => undefined,
70
- makeTags: () => undefined,
71
- getGlobalTags: () => [CustomTypeTag],
72
- },
73
- navigation: {
74
- extract: () => undefined,
75
- makeTags: () => undefined,
76
- getGlobalTags: () => [NavigationTag],
77
- },
78
- navigationItem: {
79
- extract: () => undefined,
80
- makeTags: () => undefined,
81
- getGlobalTags: () => [NavigationItemTag],
82
- },
83
- banner: {
84
- extract: () => undefined,
85
- makeTags: () => undefined,
86
- getGlobalTags: () => [BannerTag],
87
- },
88
- redirect: {
89
- extract: () => undefined,
90
- makeTags: () => undefined,
91
- getGlobalTags: () => [RedirectTag],
92
- },
93
- location: {
94
- extract: (data) => data.fields?.slug?.[defaultLocale],
95
- makeTags: (extracted) => [extracted ? locationTag(extracted) : undefined],
96
- getGlobalTags: () => [LocationTag],
97
- },
98
- };
99
- // Asset revalidation handler
100
5
  export async function revalidateAsset(content, message, preview = false) {
101
6
  const id = content.sys.id;
102
7
  const fileName = content.fields?.file?.[defaultLocale]?.fileName;
@@ -109,7 +14,6 @@ export async function revalidateAsset(content, message, preview = false) {
109
14
  }
110
15
  return true;
111
16
  }
112
- // Entry revalidation handler
113
17
  export async function revalidateEntry(handler, content, contentType, preview = false) {
114
18
  const extracted = await Promise.resolve(handler.extract(content));
115
19
  const tags = handler.makeTags(extracted);
@@ -124,7 +28,6 @@ export async function revalidateEntry(handler, content, contentType, preview = f
124
28
  }
125
29
  return true;
126
30
  }
127
- // Revalidate deleted entry by content type (collection tags only)
128
31
  export async function revalidateDeletedEntry(contentType, preview = false) {
129
32
  const { getCacheTagsForProduction } = await import('./utils.js');
130
33
  const tags = getCacheTagsForProduction(contentType);
@@ -136,7 +39,6 @@ export async function revalidateDeletedEntry(contentType, preview = false) {
136
39
  }
137
40
  return true;
138
41
  }
139
- // Revalidate deleted asset by ID
140
42
  export async function revalidateDeletedAsset(assetId, preview = false) {
141
43
  const tags = [assetTag(assetId), AssetTag];
142
44
  if (preview) {
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/revalidation/handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/revalidation/handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CmsQueryContext } from './queryContext';
2
+ /** Human-readable operation label for a Contentful content type. */
3
+ export declare function operationLabel(contentType: string): string;
4
+ /** Link-list fetch label with optional pagination suffix. */
5
+ export declare function allLinksOperationLabel(contentType: string, page?: number): string;
6
+ /** Fallback operation + identifier derived from a Contentful REST URL. */
7
+ export declare function deriveOperationFromUrl(url: string): CmsQueryContext;
8
+ //# sourceMappingURL=deriveOperation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deriveOperation.d.ts","sourceRoot":"","sources":["../../src/telemetry/deriveOperation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAmBtD,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,6DAA6D;AAC7D,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjF;AAeD,0EAA0E;AAC1E,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAsBnE"}
@@ -0,0 +1,59 @@
1
+ const OPERATION_VERBS = {
2
+ page: 'Reading page',
3
+ pageVariant: 'Reading page variant',
4
+ article: 'Reading article',
5
+ articleType: 'Reading article type',
6
+ tag: 'Reading tag',
7
+ tagType: 'Reading tag type',
8
+ person: 'Reading person',
9
+ customType: 'Reading custom type',
10
+ template: 'Reading template',
11
+ banner: 'Reading banner',
12
+ redirect: 'Reading redirect',
13
+ navigation: 'Reading navigation',
14
+ navigationItem: 'Reading navigation item',
15
+ link: 'Reading link',
16
+ };
17
+ /** Human-readable operation label for a Contentful content type. */
18
+ export function operationLabel(contentType) {
19
+ return OPERATION_VERBS[contentType] ?? `Reading ${contentType}`;
20
+ }
21
+ /** Link-list fetch label with optional pagination suffix. */
22
+ export function allLinksOperationLabel(contentType, page) {
23
+ const base = `Reading all ${contentType} links`;
24
+ return page !== undefined && page > 1 ? `${base} (page ${page})` : base;
25
+ }
26
+ function slugFromSearchParams(params) {
27
+ const direct = params.get('fields.slug');
28
+ if (direct)
29
+ return direct;
30
+ for (const [key, value] of params.entries()) {
31
+ if (key.startsWith('fields.') && key.endsWith('.slug') && value) {
32
+ return value;
33
+ }
34
+ }
35
+ return undefined;
36
+ }
37
+ /** Fallback operation + identifier derived from a Contentful REST URL. */
38
+ export function deriveOperationFromUrl(url) {
39
+ try {
40
+ const parsed = new URL(url);
41
+ const assetMatch = parsed.pathname.match(/\/assets\/([^/]+)$/);
42
+ if (assetMatch?.[1]) {
43
+ return { operation: 'Reading asset', identifier: assetMatch[1] };
44
+ }
45
+ const contentType = parsed.searchParams.get('content_type');
46
+ const identifier = slugFromSearchParams(parsed.searchParams);
47
+ if (contentType) {
48
+ return {
49
+ operation: operationLabel(contentType),
50
+ ...(identifier ? { identifier } : {}),
51
+ };
52
+ }
53
+ return { operation: 'Reading Contentful' };
54
+ }
55
+ catch {
56
+ return { operation: 'Reading Contentful' };
57
+ }
58
+ }
59
+ //# sourceMappingURL=deriveOperation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deriveOperation.js","sourceRoot":"","sources":["../../src/telemetry/deriveOperation.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAA2B;IAC9C,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,sBAAsB;IACnC,OAAO,EAAE,iBAAiB;IAC1B,WAAW,EAAE,sBAAsB;IACnC,GAAG,EAAE,aAAa;IAClB,OAAO,EAAE,kBAAkB;IAC3B,MAAM,EAAE,gBAAgB;IACxB,UAAU,EAAE,qBAAqB;IACjC,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,kBAAkB;IAC5B,UAAU,EAAE,oBAAoB;IAChC,cAAc,EAAE,yBAAyB;IACzC,IAAI,EAAE,cAAc;CACrB,CAAC;AAEF,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,OAAO,eAAe,CAAC,WAAW,CAAC,IAAI,WAAW,WAAW,EAAE,CAAC;AAClE,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,IAAa;IACvE,MAAM,IAAI,GAAG,eAAe,WAAW,QAAQ,CAAC;IAChD,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1E,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAuB;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACzC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;YAChE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC/D,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAE7D,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO;gBACL,SAAS,EAAE,cAAc,CAAC,WAAW,CAAC;gBACtC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface CmsQueryContext {
2
+ operation: string;
3
+ identifier?: string;
4
+ }
5
+ export declare function withCmsQueryContext<T>(context: CmsQueryContext, fn: () => T): T;
6
+ export declare function getCmsQueryContext(): CmsQueryContext | undefined;
7
+ //# sourceMappingURL=queryContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryContext.d.ts","sourceRoot":"","sources":["../../src/telemetry/queryContext.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE/E;AAED,wBAAgB,kBAAkB,IAAI,eAAe,GAAG,SAAS,CAEhE"}
@@ -0,0 +1,9 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ const storage = new AsyncLocalStorage();
3
+ export function withCmsQueryContext(context, fn) {
4
+ return storage.run(context, fn);
5
+ }
6
+ export function getCmsQueryContext() {
7
+ return storage.getStore();
8
+ }
9
+ //# sourceMappingURL=queryContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryContext.js","sourceRoot":"","sources":["../../src/telemetry/queryContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAmB,CAAC;AAEzD,MAAM,UAAU,mBAAmB,CAAI,OAAwB,EAAE,EAAW;IAC1E,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,17 @@
1
+ export interface CmsQueryLogEntry {
2
+ url: string;
3
+ operation: string;
4
+ identifier?: string;
5
+ bytes: number;
6
+ ms: number;
7
+ }
8
+ export declare function isCmsQueryLoggingEnabled(): boolean;
9
+ /** Format byte count as a compact human-readable size (e.g. 23.5k, 1.2M). */
10
+ export declare function formatPayloadSize(bytes: number): string;
11
+ export declare function logCmsQuery(entry: Omit<CmsQueryLogEntry, 'operation' | 'identifier'> & Partial<Pick<CmsQueryLogEntry, 'operation' | 'identifier'>>): void;
12
+ /** Read response body bytes and return text for JSON parsing. */
13
+ export declare function readResponseBodyWithSize(response: Response): Promise<{
14
+ bytes: number;
15
+ text: string;
16
+ }>;
17
+ //# sourceMappingURL=queryLog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryLog.d.ts","sourceRoot":"","sources":["../../src/telemetry/queryLog.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,YAAY,CAAC,GACvD,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,GAAG,YAAY,CAAC,CAAC,GAC5D,IAAI,CAuBN;AAED,iEAAiE;AACjE,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAc1C"}
@@ -0,0 +1,54 @@
1
+ import { deriveOperationFromUrl } from './deriveOperation.js';
2
+ import { getCmsQueryContext } from './queryContext.js';
3
+ export function isCmsQueryLoggingEnabled() {
4
+ return process.env.LOG_CMS_QUERIES === '1';
5
+ }
6
+ /** Format byte count as a compact human-readable size (e.g. 23.5k, 1.2M). */
7
+ export function formatPayloadSize(bytes) {
8
+ if (bytes < 1024)
9
+ return `${bytes}`;
10
+ if (bytes < 1024 * 1024) {
11
+ const kb = bytes / 1024;
12
+ return kb >= 100 ? `${Math.round(kb)}k` : `${kb.toFixed(1)}k`;
13
+ }
14
+ const mb = bytes / (1024 * 1024);
15
+ return mb >= 100 ? `${Math.round(mb)}M` : `${mb.toFixed(1)}M`;
16
+ }
17
+ export function logCmsQuery(entry) {
18
+ if (!isCmsQueryLoggingEnabled())
19
+ return;
20
+ const context = getCmsQueryContext();
21
+ const derived = deriveOperationFromUrl(entry.url);
22
+ const payload = {
23
+ url: entry.url,
24
+ operation: entry.operation ?? context?.operation ?? derived.operation,
25
+ ...(entry.identifier !== undefined
26
+ ? entry.identifier
27
+ ? { identifier: entry.identifier }
28
+ : {}
29
+ : context?.identifier
30
+ ? { identifier: context.identifier }
31
+ : derived.identifier
32
+ ? { identifier: derived.identifier }
33
+ : {}),
34
+ bytes: entry.bytes,
35
+ ms: entry.ms,
36
+ };
37
+ console.log(`[CMS query] ${JSON.stringify(payload)}`);
38
+ }
39
+ /** Read response body bytes and return text for JSON parsing. */
40
+ export async function readResponseBodyWithSize(response) {
41
+ const contentLength = response.headers.get('content-length');
42
+ if (contentLength) {
43
+ const parsed = Number.parseInt(contentLength, 10);
44
+ const text = await response.text();
45
+ return {
46
+ bytes: Number.isNaN(parsed) ? Buffer.byteLength(text, 'utf8') : parsed,
47
+ text,
48
+ };
49
+ }
50
+ const buffer = await response.arrayBuffer();
51
+ const text = new TextDecoder().decode(buffer);
52
+ return { bytes: buffer.byteLength, text };
53
+ }
54
+ //# sourceMappingURL=queryLog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryLog.js","sourceRoot":"","sources":["../../src/telemetry/queryLog.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -52,6 +52,11 @@ export interface FetchOptions {
52
52
  * `listing` — metadata/links only (no nav or content trees). Default for bulk link fetches.
53
53
  */
54
54
  fetchProfile?: CmsFetchProfile;
55
+ /**
56
+ * `bundled` (default) — resolve menu/footer via Contentful includes during conversion.
57
+ * `flat` — stub nav root ids during conversion; assemble full trees post-convert via registry.
58
+ */
59
+ navigationResolution?: NavigationResolution;
55
60
  /** Pagination page size for `contentfulAllArticleLinks`. Default 100. */
56
61
  pageSize?: number;
57
62
  /**
@@ -61,6 +66,8 @@ export interface FetchOptions {
61
66
  }
62
67
  /** CMS fetch profile: full page render vs lightweight listing/metadata. */
63
68
  export type CmsFetchProfile = 'page' | 'listing';
69
+ /** How menu/footer are resolved on page-profile entity fetches. */
70
+ export type NavigationResolution = 'flat' | 'bundled';
64
71
  /**
65
72
  * Error information for failed content conversion
66
73
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;IACnC,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,0BAA0B;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC;;;OAGG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,2EAA2E;AAC3E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,0BAA0B;IAC1B,IAAI,EAAE,CAAC,CAAC;IACR,iDAAiD;IACjD,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;IACnC,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,0BAA0B;IAC1B,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC;;;OAGG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;IAC/B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,2EAA2E;AAC3E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,CAAC;AAEjD,mEAAmE;AACnE,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,SAAS,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,0BAA0B;IAC1B,IAAI,EAAE,CAAC,CAAC;IACR,iDAAiD;IACjD,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB"}
package/docs/llms.md CHANGED
@@ -65,12 +65,18 @@ const allPersonLinks = await contentfulAllPersonLinks(config);
65
65
 
66
66
  ## Flat navigation
67
67
 
68
- Assemble menus without Contentful include depth. **Use `getNavigation` from `createAppHelpers` only** — registry/link-index fetchers are not exported.
68
+ Assemble menus without Contentful include depth.
69
+
70
+ **Page renders (preferred):** `navigationResolution: 'flat'` on `FetchOptions` — converters stub nav root ids; post-convert step calls registry + link index and rebuilds `model.menu` / `model.footer` / `model.icons`. Set in app `buildOptions`. Default is `'bundled'`.
69
71
 
70
72
  ```ts
71
- import { createAppHelpers } from '@se-studio/core-ui';
73
+ buildFetchOptions({ navigationResolution: 'flat', ...options }, preview);
74
+ ```
72
75
 
73
- const { getNavigation } = createAppHelpers({ /* converterContext, getConfig, buildOptions, buildInformation */ });
76
+ **Ad hoc:** `getNavigation` from `createAppHelpers` only registry/link-index fetchers are not exported.
77
+
78
+ ```ts
79
+ const { getNavigation } = createAppHelpers({ /* ... */ });
74
80
  const menu = await getNavigation(mainNavEntryId);
75
81
  ```
76
82
 
@@ -298,6 +304,30 @@ import {
298
304
  } from '@se-studio/contentful-rest-api';
299
305
  ```
300
306
 
307
+ ## Query logging (dev)
308
+
309
+ Set `LOG_CMS_QUERIES=1` to emit structured per-fetch lines:
310
+
311
+ ```
312
+ [CMS query] {"url":"...","operation":"Reading article","identifier":"my-slug","bytes":24064,"ms":45}
313
+ ```
314
+
315
+ Merge with Next.js dev fetch cache lines (`(cache hit|miss)`) after the fact:
316
+
317
+ ```bash
318
+ pnpm dev 2>&1 | tee dev.log
319
+ pnpm --filter @se-studio/contentful-rest-api consolidate-cms-logs -- dev.log
320
+ # => Reading article my-slug - 23.5k (cached) in 12ms
321
+ ```
322
+
323
+ For reliable URL matching, enable full fetch URLs in the app's `next.config.js`:
324
+
325
+ ```js
326
+ logging: { fetches: { fullUrl: true } }
327
+ ```
328
+
329
+ Related: `LOG_CMS=1` (conversion warnings), `LOG_CMS_FETCH=1` (raw URLs only).
330
+
301
331
  ## Important Constraints
302
332
 
303
333
  - Always supply `spaceId`, `accessToken`, and `environment`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@se-studio/contentful-rest-api",
3
- "version": "1.11.0",
3
+ "version": "1.13.0",
4
4
  "description": "Type-safe Contentful REST API client with caching and rate limiting for Next.js applications",
5
5
  "repository": {
6
6
  "type": "git",
@@ -78,7 +78,8 @@
78
78
  "dev": "tsc --project tsconfig.build.json --watch",
79
79
  "type-check": "tsc --noEmit",
80
80
  "lint": "biome lint .",
81
- "test": "vitest run",
81
+ "test": "vitest run && node --test scripts/cms-query-log-consolidate.test.mjs",
82
+ "consolidate-cms-logs": "node scripts/consolidate-cms-query-logs.mjs",
82
83
  "clean": "rm -rf dist .turbo *.tsbuildinfo",
83
84
  "extract-single-page": "bash -c 'set -a && source ../../.env.local && set +a && tsx scripts/extract-page.ts \"$@\"' --",
84
85
  "extract-single-article": "bash -c 'set -a && source ../../.env.local && set +a && tsx scripts/extract-article.ts \"$@\"' --"