@se-studio/contentful-rest-api 1.29.0 → 2.0.1
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/CHANGELOG.md +20 -0
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +2 -2
- package/dist/api/context.js.map +1 -1
- package/dist/api/index.d.ts +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/named-download.d.ts +27 -0
- package/dist/api/named-download.d.ts.map +1 -0
- package/dist/api/named-download.js +111 -0
- package/dist/api/named-download.js.map +1 -0
- package/dist/api/person-type.d.ts +12 -0
- package/dist/api/person-type.d.ts.map +1 -0
- package/dist/api/person-type.js +77 -0
- package/dist/api/person-type.js.map +1 -0
- package/dist/api/server-asset.d.ts +12 -0
- package/dist/api/server-asset.d.ts.map +1 -1
- package/dist/api/server-asset.js +91 -33
- package/dist/api/server-asset.js.map +1 -1
- package/dist/baseTypes/basePersonType.d.ts +69 -1
- package/dist/baseTypes/basePersonType.d.ts.map +1 -1
- package/dist/converters/helpers.d.ts +5 -5
- package/dist/converters/helpers.d.ts.map +1 -1
- package/dist/converters/helpers.js.map +1 -1
- package/dist/converters/index.d.ts +0 -1
- package/dist/converters/index.d.ts.map +1 -1
- package/dist/converters/index.js +0 -1
- package/dist/converters/index.js.map +1 -1
- package/dist/converters/link.d.ts.map +1 -1
- package/dist/converters/link.js +4 -1
- package/dist/converters/link.js.map +1 -1
- package/dist/converters/person.d.ts.map +1 -1
- package/dist/converters/person.js +39 -17
- package/dist/converters/person.js.map +1 -1
- package/dist/converters/personType.d.ts +13 -0
- package/dist/converters/personType.d.ts.map +1 -0
- package/dist/converters/personType.js +84 -0
- package/dist/converters/personType.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/revalidation/entry-handlers.d.ts.map +1 -1
- package/dist/revalidation/entry-handlers.js +12 -4
- package/dist/revalidation/entry-handlers.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/telemetry/deriveOperation.d.ts.map +1 -1
- package/dist/telemetry/deriveOperation.js +1 -0
- package/dist/telemetry/deriveOperation.js.map +1 -1
- package/docs/llms.md +14 -11
- package/package.json +2 -2
- package/dist/api/document.d.ts +0 -8
- package/dist/api/document.d.ts.map +0 -1
- package/dist/api/document.js +0 -84
- package/dist/api/document.js.map +0 -1
- package/dist/baseTypes/baseDocument.d.ts +0 -70
- package/dist/baseTypes/baseDocument.d.ts.map +0 -1
- package/dist/baseTypes/baseDocument.js +0 -2
- package/dist/baseTypes/baseDocument.js.map +0 -1
- package/dist/converters/document.d.ts +0 -14
- package/dist/converters/document.d.ts.map +0 -1
- package/dist/converters/document.js +0 -51
- package/dist/converters/document.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @se-studio/contentful-rest-api
|
|
2
2
|
|
|
3
|
+
## 2.0.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- e947c0f: cms-edit add places new sections on a person type index or person page. Publishing an index template or directory schema refreshes person type pages.
|
|
8
|
+
- Person type directories now render like article type indexes. A person type can carry index page content and index schema, and personPageTopContent, personPageIndexed, and personPageHidden apply to every person of that type. personTemplate is read as personPageTemplate once migration 35 renames the field.
|
|
9
|
+
- Updated dependencies
|
|
10
|
+
- @se-studio/core-data-types@2.0.1
|
|
11
|
+
|
|
12
|
+
## 2.0.0
|
|
13
|
+
|
|
14
|
+
### Major Changes
|
|
15
|
+
|
|
16
|
+
- f1e0e8c: Remove the unused document content-type API. A download link can opt into `/download/{filename}` with `urlCalculators.namedDownload` and `createNamedDownloadHandler`. Sites that do not set the calculator keep `/download/{assetId}/{filename}`.
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- Updated dependencies [f1e0e8c]
|
|
21
|
+
- @se-studio/core-data-types@2.0.0
|
|
22
|
+
|
|
3
23
|
## 1.29.0
|
|
4
24
|
|
|
5
25
|
### Minor Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,oBAAoB,EAKpB,cAAc,EACf,MAAM,uBAAuB,CAAC;AAe/B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,cAAc,GAAG,oBAAoB,CA0C/F"}
|
package/dist/api/context.js
CHANGED
|
@@ -3,13 +3,13 @@ import { baseBannerConverter } from '../converters/banner.js';
|
|
|
3
3
|
import { baseCollectionConverter } from '../converters/collection.js';
|
|
4
4
|
import { baseComponentConverter } from '../converters/component.js';
|
|
5
5
|
import { baseCustomTypeConverter, baseCustomTypeLinkConverter } from '../converters/customType.js';
|
|
6
|
-
import { baseDocumentConverter } from '../converters/document.js';
|
|
7
6
|
import { baseExternalComponentConverter } from '../converters/externalComponent.js';
|
|
8
7
|
import { baseHtmlComponentConverter } from '../converters/htmlComponent.js';
|
|
9
8
|
import { baseLinkConverter } from '../converters/link.js';
|
|
10
9
|
import { baseNavigationItemConverter } from '../converters/navigationItem.js';
|
|
11
10
|
import { basePageConverter, basePageLinkConverter, basePageVariantLinkConverter, } from '../converters/page.js';
|
|
12
11
|
import { basePersonConverter, basePersonLinkConverter } from '../converters/person.js';
|
|
12
|
+
import { basePersonTypeConverter } from '../converters/personType.js';
|
|
13
13
|
import { baseRedirectConverter } from '../converters/redirect.js';
|
|
14
14
|
import { baseTagConverter, baseTagLinkConverter } from '../converters/tag.js';
|
|
15
15
|
import { baseTagTypeConverter, baseTagTypeLinkConverter } from '../converters/tagType.js';
|
|
@@ -55,6 +55,7 @@ export function createBaseConverterContext(urlCalculators) {
|
|
|
55
55
|
navigationItemResolver: baseNavigationItemConverter,
|
|
56
56
|
articleResolver: baseArticleConverter,
|
|
57
57
|
articleTypeResolver: baseArticleTypeConverter,
|
|
58
|
+
personTypeResolver: basePersonTypeConverter,
|
|
58
59
|
tagResolver: baseTagConverter,
|
|
59
60
|
tagTypeResolver: baseTagTypeConverter,
|
|
60
61
|
personResolver: basePersonConverter,
|
|
@@ -62,7 +63,6 @@ export function createBaseConverterContext(urlCalculators) {
|
|
|
62
63
|
componentResolver: baseComponentConverter,
|
|
63
64
|
collectionResolver: baseCollectionConverter,
|
|
64
65
|
bannerResolver: baseBannerConverter,
|
|
65
|
-
documentResolver: baseDocumentConverter,
|
|
66
66
|
redirectResolver: baseRedirectConverter,
|
|
67
67
|
linkResolver,
|
|
68
68
|
contentResolver,
|
package/dist/api/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"AACA,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/api/context.ts"],"names":[],"mappings":"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"}
|
package/dist/api/index.d.ts
CHANGED
|
@@ -14,7 +14,6 @@ export { type BreadcrumbLookup, type BreadcrumbLookupEntry, getBreadcrumbLookup,
|
|
|
14
14
|
export { type AnyEntryRestResult, contentfulAnyEntryRest, contentfulComponentRest, } from './componentPreview';
|
|
15
15
|
export { createBaseConverterContext } from './context';
|
|
16
16
|
export { contentfulCustomTypeRest } from './custom-type';
|
|
17
|
-
export { contentfulDocumentsRest } from './document';
|
|
18
17
|
export { ARTICLE_LINK_FIELDS, ARTICLE_LINK_FIELDS_LIGHT, ARTICLE_LISTING_FIELDS, buildFetchOptions, coreGetContentfulConfig, getDefaultInclude, getListingLinkFetchParams, resolveIncludeDepth, } from './helpers';
|
|
19
18
|
export { contentfulAllArticleLinks, contentfulAllArticleLinksForIntegrity, contentfulAllArticleTypeLinks, contentfulAllCustomTypeLinks, contentfulAllPageLinks, contentfulAllPersonLinks, contentfulAllTagLinks, contentfulAllTagTypeLinks, } from './links';
|
|
20
19
|
export type { CmsContentType, ConverterResolutionScope } from './listing-fetch-params';
|
|
@@ -22,6 +21,7 @@ export { getResolutionScope, getResolutionScopeFromOptions, LISTING_RESOLUTION_S
|
|
|
22
21
|
export { buildFlatNavigationCacheOptions, FLAT_NAV_CACHE_TAGS, getNavigation, withFlatNavRequestCache, } from './navigation';
|
|
23
22
|
export { type AfterVariantMerge, contentfulPageRest, type PageFetchOptions, } from './page';
|
|
24
23
|
export { contentfulPersonRest, type PersonFetchOptions } from './person';
|
|
24
|
+
export { contentfulPersonTypeRest, type PersonTypeFetchOptions } from './person-type';
|
|
25
25
|
export { type BuiltinPreviewContentType, getPreviewEntryInfo, type PreviewContentType, type PreviewEntryInclude, type PreviewEntryInfo, type PreviewEntryResolveInput, type PreviewEntryResolver, slugPreviewResolver, } from './preview';
|
|
26
26
|
export { contentfulRedirectsRest } from './redirects';
|
|
27
27
|
export { filterRelatedArticles } from './related-articles';
|
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EACL,gBAAgB,EAChB,sCAAsC,EACtC,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,KAAK,uBAAuB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,kBAAkB,EACvB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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"}
|
package/dist/api/index.js
CHANGED
|
@@ -15,7 +15,6 @@ export { contentfulAnyEntryRest, contentfulComponentRest, } from './componentPre
|
|
|
15
15
|
// Context
|
|
16
16
|
export { createBaseConverterContext } from './context.js';
|
|
17
17
|
export { contentfulCustomTypeRest } from './custom-type.js';
|
|
18
|
-
export { contentfulDocumentsRest } from './document.js';
|
|
19
18
|
// Internal helpers (exported for extension by projects)
|
|
20
19
|
export { ARTICLE_LINK_FIELDS, ARTICLE_LINK_FIELDS_LIGHT, ARTICLE_LISTING_FIELDS, buildFetchOptions, coreGetContentfulConfig, getDefaultInclude, getListingLinkFetchParams, resolveIncludeDepth, } from './helpers.js';
|
|
21
20
|
// All links fetchers
|
|
@@ -24,6 +23,7 @@ export { getResolutionScope, getResolutionScopeFromOptions, LISTING_RESOLUTION_S
|
|
|
24
23
|
export { buildFlatNavigationCacheOptions, FLAT_NAV_CACHE_TAGS, getNavigation, withFlatNavRequestCache, } from './navigation.js';
|
|
25
24
|
export { contentfulPageRest, } from './page.js';
|
|
26
25
|
export { contentfulPersonRest } from './person.js';
|
|
26
|
+
export { contentfulPersonTypeRest } from './person-type.js';
|
|
27
27
|
// Preview
|
|
28
28
|
export { getPreviewEntryInfo, slugPreviewResolver, } from './preview.js';
|
|
29
29
|
export { contentfulRedirectsRest } from './redirects.js';
|
package/dist/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,gBAAgB,EAChB,sCAAsC,GAGvC,MAAM,sBAAsB,CAAC;AAC9B,yBAAyB;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAgC,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EAIzB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAGL,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,UAAU;AACV,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,gBAAgB,EAChB,sCAAsC,GAGvC,MAAM,sBAAsB,CAAC;AAC9B,yBAAyB;AACzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAAgC,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,2BAA2B,EAC3B,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EAIzB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAGL,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,UAAU;AACV,OAAO,EAAE,0BAA0B,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,wDAAwD;AACxD,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,qBAAqB;AACrB,OAAO,EACL,yBAAyB,EACzB,qCAAqC,EACrC,6BAA6B,EAC7B,4BAA4B,EAC5B,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,+BAA+B,EAC/B,mBAAmB,EACnB,aAAa,EACb,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,OAAO,EAEL,kBAAkB,GAEnB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,oBAAoB,EAA2B,MAAM,UAAU,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAA+B,MAAM,eAAe,CAAC;AACtF,UAAU;AACV,OAAO,EAEL,mBAAmB,EAMnB,mBAAmB,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,mBAAmB;AACnB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,UAAU;AACV,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,EACnC,4BAA4B,EAC5B,8BAA8B,EAC9B,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAwB,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAA4B,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAyB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ContentfulConfig, FetchOptions } from '../types';
|
|
2
|
+
export interface NamedDownloadFile {
|
|
3
|
+
assetId: string;
|
|
4
|
+
fileName: string;
|
|
5
|
+
contentType: string;
|
|
6
|
+
url: string;
|
|
7
|
+
size?: number;
|
|
8
|
+
}
|
|
9
|
+
export type NamedDownloadResolution = {
|
|
10
|
+
status: 'found';
|
|
11
|
+
file: NamedDownloadFile;
|
|
12
|
+
} | {
|
|
13
|
+
status: 'missing';
|
|
14
|
+
} | {
|
|
15
|
+
status: 'ambiguous';
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* One filename may be used by several links when they point at the same asset.
|
|
19
|
+
* Two different assets with that filename is not a match.
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveNamedDownload(filename: string, files: readonly NamedDownloadFile[]): NamedDownloadResolution;
|
|
22
|
+
/**
|
|
23
|
+
* Loads link entries that have `downloadAsset` set and returns the one asset
|
|
24
|
+
* whose filename matches. Does not query the asset library by filename.
|
|
25
|
+
*/
|
|
26
|
+
export declare function findNamedDownloadAsset(config: ContentfulConfig, filename: string, options?: FetchOptions): Promise<NamedDownloadResolution>;
|
|
27
|
+
//# sourceMappingURL=named-download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"named-download.d.ts","sourceRoot":"","sources":["../../src/api/named-download.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,uBAAuB,GAC/B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAA;CAAE,GAC5C;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAE5B;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,iBAAiB,EAAE,GAClC,uBAAuB,CAWzB;AAmED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,YAAiC,GACzC,OAAO,CAAC,uBAAuB,CAAC,CA8ClC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { getContentfulClient } from '../client.js';
|
|
2
|
+
import { getCacheTags } from '../revalidation/utils.js';
|
|
3
|
+
import { withCmsQueryContext } from '../telemetry/queryContext.js';
|
|
4
|
+
/**
|
|
5
|
+
* One filename may be used by several links when they point at the same asset.
|
|
6
|
+
* Two different assets with that filename is not a match.
|
|
7
|
+
*/
|
|
8
|
+
export function resolveNamedDownload(filename, files) {
|
|
9
|
+
const matches = new Map();
|
|
10
|
+
for (const file of files) {
|
|
11
|
+
if (file.fileName !== filename)
|
|
12
|
+
continue;
|
|
13
|
+
if (!matches.has(file.assetId))
|
|
14
|
+
matches.set(file.assetId, file);
|
|
15
|
+
}
|
|
16
|
+
if (matches.size === 0)
|
|
17
|
+
return { status: 'missing' };
|
|
18
|
+
if (matches.size > 1)
|
|
19
|
+
return { status: 'ambiguous' };
|
|
20
|
+
const file = matches.values().next().value;
|
|
21
|
+
if (!file)
|
|
22
|
+
return { status: 'missing' };
|
|
23
|
+
return { status: 'found', file };
|
|
24
|
+
}
|
|
25
|
+
function asFile(value) {
|
|
26
|
+
if (!value || typeof value !== 'object')
|
|
27
|
+
return undefined;
|
|
28
|
+
const record = value;
|
|
29
|
+
if (typeof record.fileName === 'string' || typeof record.url === 'string') {
|
|
30
|
+
return record;
|
|
31
|
+
}
|
|
32
|
+
const localized = record['en-US'] ?? Object.values(record)[0];
|
|
33
|
+
return asFile(localized);
|
|
34
|
+
}
|
|
35
|
+
function assetIdFromDownloadField(value) {
|
|
36
|
+
if (!value || typeof value !== 'object')
|
|
37
|
+
return undefined;
|
|
38
|
+
const record = value;
|
|
39
|
+
const sys = record.sys;
|
|
40
|
+
if (typeof sys?.id === 'string' && sys.id.length > 0)
|
|
41
|
+
return sys.id;
|
|
42
|
+
return assetIdFromDownloadField(record['en-US']);
|
|
43
|
+
}
|
|
44
|
+
function filesFromPage(page) {
|
|
45
|
+
const assets = new Map();
|
|
46
|
+
for (const asset of page.includes?.Asset ?? []) {
|
|
47
|
+
const assetId = asset.sys?.id;
|
|
48
|
+
const file = asFile(asset.fields?.file);
|
|
49
|
+
if (!assetId || !file?.fileName || !file.url || !file.contentType)
|
|
50
|
+
continue;
|
|
51
|
+
assets.set(assetId, {
|
|
52
|
+
assetId,
|
|
53
|
+
fileName: file.fileName,
|
|
54
|
+
contentType: file.contentType,
|
|
55
|
+
url: file.url.startsWith('//') ? `https:${file.url}` : file.url,
|
|
56
|
+
size: file.details?.size,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const files = [];
|
|
60
|
+
for (const item of page.items ?? []) {
|
|
61
|
+
const assetId = assetIdFromDownloadField(item.fields?.downloadAsset);
|
|
62
|
+
if (!assetId)
|
|
63
|
+
continue;
|
|
64
|
+
const file = assets.get(assetId);
|
|
65
|
+
if (file)
|
|
66
|
+
files.push(file);
|
|
67
|
+
}
|
|
68
|
+
return files;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Loads link entries that have `downloadAsset` set and returns the one asset
|
|
72
|
+
* whose filename matches. Does not query the asset library by filename.
|
|
73
|
+
*/
|
|
74
|
+
export async function findNamedDownloadAsset(config, filename, options = { preview: false }) {
|
|
75
|
+
const preview = options.preview;
|
|
76
|
+
const client = getContentfulClient(config, preview);
|
|
77
|
+
const tags = [
|
|
78
|
+
...getCacheTags('link', undefined, preview),
|
|
79
|
+
...getCacheTags('asset', undefined, preview),
|
|
80
|
+
];
|
|
81
|
+
const pageSize = 100;
|
|
82
|
+
let skip = 0;
|
|
83
|
+
const files = [];
|
|
84
|
+
for (;;) {
|
|
85
|
+
const pageNumber = Math.floor(skip / pageSize) + 1;
|
|
86
|
+
const page = await withCmsQueryContext({
|
|
87
|
+
operation: pageNumber > 1 ? `Reading download links (page ${pageNumber})` : 'Reading download links',
|
|
88
|
+
}, () => client.getEntries({
|
|
89
|
+
content_type: 'link',
|
|
90
|
+
'fields.downloadAsset[exists]': true,
|
|
91
|
+
include: 1,
|
|
92
|
+
locale: options.locale ?? 'en-US',
|
|
93
|
+
limit: pageSize,
|
|
94
|
+
skip,
|
|
95
|
+
}, {
|
|
96
|
+
...options,
|
|
97
|
+
next: {
|
|
98
|
+
...options.next,
|
|
99
|
+
tags: [...tags, ...(options.next?.tags ?? [])],
|
|
100
|
+
revalidate: options.next?.revalidate,
|
|
101
|
+
},
|
|
102
|
+
}));
|
|
103
|
+
files.push(...filesFromPage(page));
|
|
104
|
+
const total = typeof page.total === 'number' ? page.total : files.length;
|
|
105
|
+
skip += page.items?.length ?? 0;
|
|
106
|
+
if (skip >= total || (page.items?.length ?? 0) === 0)
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
return resolveNamedDownload(filename, files);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=named-download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"named-download.js","sourceRoot":"","sources":["../../src/api/named-download.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IBasePersonType } from '@se-studio/core-data-types';
|
|
2
|
+
import type { BaseConverterContext } from '../converters/helpers';
|
|
3
|
+
import type { CmsResponse, ContentfulConfig, FetchOptions } from '../types';
|
|
4
|
+
export type PersonTypeFetchOptions = FetchOptions;
|
|
5
|
+
/**
|
|
6
|
+
* Fetches a person type directory from Contentful by slug.
|
|
7
|
+
*
|
|
8
|
+
* Page fetches use include 7 so index sections resolve. Listing fetches stay
|
|
9
|
+
* shallow and omit the body. An explicit `options.include` wins.
|
|
10
|
+
*/
|
|
11
|
+
export declare function contentfulPersonTypeRest(context: BaseConverterContext, config: ContentfulConfig, slug: string, options: PersonTypeFetchOptions): Promise<CmsResponse<IBasePersonType | null>>;
|
|
12
|
+
//# sourceMappingURL=person-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person-type.d.ts","sourceRoot":"","sources":["../../src/api/person-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAKlE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAIlE,OAAO,KAAK,EAAY,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAWtF,MAAM,MAAM,sBAAsB,GAAG,YAAY,CAAC;AAKlD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,oBAAoB,EAC7B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,CAuF9C"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { getContentfulClient } from '../client.js';
|
|
2
|
+
import { enrichAllAssets } from '../converters/enrichAssets.js';
|
|
3
|
+
import { finalizeModelIconsAndNavigation } from '../navigation/enrichModelNavigation.js';
|
|
4
|
+
import { getCacheTags } from '../revalidation/utils.js';
|
|
5
|
+
import { withCmsQueryContext } from '../telemetry/queryContext.js';
|
|
6
|
+
import { withRetry } from '../utils/index.js';
|
|
7
|
+
import { convertAllAssets, convertAllIncludes, convertAllRawAssets, createFullConverterContext, operationLabel, } from './helpers.js';
|
|
8
|
+
const PERSON_TYPE_PAGE_INCLUDE = 7;
|
|
9
|
+
const PERSON_TYPE_LISTING_INCLUDE = 1;
|
|
10
|
+
/**
|
|
11
|
+
* Fetches a person type directory from Contentful by slug.
|
|
12
|
+
*
|
|
13
|
+
* Page fetches use include 7 so index sections resolve. Listing fetches stay
|
|
14
|
+
* shallow and omit the body. An explicit `options.include` wins.
|
|
15
|
+
*/
|
|
16
|
+
export async function contentfulPersonTypeRest(context, config, slug, options) {
|
|
17
|
+
const client = getContentfulClient(config, options.preview);
|
|
18
|
+
const cacheTags = getCacheTags('personType', slug, options?.preview);
|
|
19
|
+
const requestOptions = {
|
|
20
|
+
...options,
|
|
21
|
+
next: {
|
|
22
|
+
...options?.next,
|
|
23
|
+
tags: cacheTags,
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const fetchFn = async () => {
|
|
27
|
+
const fetchProfile = options.fetchProfile ?? 'page';
|
|
28
|
+
const personTypeInclude = options.include ??
|
|
29
|
+
(fetchProfile === 'listing' ? PERSON_TYPE_LISTING_INCLUDE : PERSON_TYPE_PAGE_INCLUDE);
|
|
30
|
+
const response = await withCmsQueryContext({ operation: operationLabel('personType'), identifier: slug }, () => client.getEntries({
|
|
31
|
+
content_type: 'personType',
|
|
32
|
+
'fields.slug': slug,
|
|
33
|
+
include: personTypeInclude,
|
|
34
|
+
locale: options?.locale,
|
|
35
|
+
limit: 1,
|
|
36
|
+
}, requestOptions));
|
|
37
|
+
const personTypeEntry = response.items[0];
|
|
38
|
+
if (!personTypeEntry?.fields) {
|
|
39
|
+
return { data: null, errors: [] };
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const assets = convertAllAssets(response, context, options);
|
|
43
|
+
const rawAssets = convertAllRawAssets(response);
|
|
44
|
+
const includes = convertAllIncludes(response);
|
|
45
|
+
const externalVideoEmbeds = await enrichAllAssets(assets, includes, options);
|
|
46
|
+
const fullContext = createFullConverterContext(context, includes, assets, rawAssets, externalVideoEmbeds, options);
|
|
47
|
+
let converted = context.personTypeResolver(fullContext, personTypeEntry);
|
|
48
|
+
if (converted) {
|
|
49
|
+
converted = await finalizeModelIconsAndNavigation(converted, context, config, options);
|
|
50
|
+
}
|
|
51
|
+
if (fullContext.errors.length > 0 &&
|
|
52
|
+
typeof process !== 'undefined' &&
|
|
53
|
+
process.env?.NODE_ENV === 'production') {
|
|
54
|
+
console.error('CMS conversion errors for personType:', {
|
|
55
|
+
entryId: personTypeEntry.sys.id,
|
|
56
|
+
slug,
|
|
57
|
+
errors: fullContext.errors,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return { data: converted, errors: fullContext.errors };
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
const cmsError = {
|
|
64
|
+
entryId: personTypeEntry.sys.id || 'unknown',
|
|
65
|
+
entryType: personTypeEntry.sys.contentType?.sys?.id,
|
|
66
|
+
message: error instanceof Error ? error.message : 'Unknown conversion error',
|
|
67
|
+
error,
|
|
68
|
+
};
|
|
69
|
+
return { data: null, errors: [cmsError] };
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
if (options?.retry) {
|
|
73
|
+
return await withRetry(fetchFn, options.retry);
|
|
74
|
+
}
|
|
75
|
+
return await fetchFn();
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=person-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person-type.js","sourceRoot":"","sources":["../../src/api/person-type.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,8 @@ export interface DownloadRouteParams {
|
|
|
48
48
|
* Filename comes from Contentful so only one path identity exists per asset.
|
|
49
49
|
*/
|
|
50
50
|
export declare function buildCanonicalDownloadPath(assetId: string, canonicalFilename: string): string;
|
|
51
|
+
/** Public path for a download link, keyed by the asset filename. */
|
|
52
|
+
export declare function buildNamedDownloadPath(filename: string): string;
|
|
51
53
|
/**
|
|
52
54
|
* Creates a Next.js App Router GET handler for downloading/viewing Contentful assets.
|
|
53
55
|
*
|
|
@@ -64,4 +66,14 @@ export declare function buildCanonicalDownloadPath(assetId: string, canonicalFil
|
|
|
64
66
|
* @returns GET handler function for Next.js route
|
|
65
67
|
*/
|
|
66
68
|
export declare function createDownloadHandler(config: DownloadHandlerConfig): (request: NextRequest, { params }: DownloadRouteParams) => Promise<Response>;
|
|
69
|
+
export interface NamedDownloadRouteParams {
|
|
70
|
+
params: Promise<{
|
|
71
|
+
filename: string;
|
|
72
|
+
}>;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* GET handler for `/download/{filename}`.
|
|
76
|
+
* Serves a file only when a link entry's download asset has that filename.
|
|
77
|
+
*/
|
|
78
|
+
export declare function createNamedDownloadHandler(config: DownloadHandlerConfig): (request: NextRequest, { params }: NamedDownloadRouteParams) => Promise<Response>;
|
|
67
79
|
//# sourceMappingURL=server-asset.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-asset.d.ts","sourceRoot":"","sources":["../../src/api/server-asset.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"server-asset.d.ts","sourceRoot":"","sources":["../../src/api/server-asset.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIjD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,gBAAgB,CAAC;IAEnD;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAcD;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED,oEAAoE;AACpE,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AA2DD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,aAItD,WAAW,cACR,mBAAmB,KAC9B,OAAO,CAAC,QAAQ,CAAC,CAsDrB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,qBAAqB,aAI3D,WAAW,cACR,wBAAwB,KACnC,OAAO,CAAC,QAAQ,CAAC,CA+BrB"}
|
package/dist/api/server-asset.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import 'server-only';
|
|
2
2
|
import { contentfulAssetRest, isBrowserViewable } from './asset.js';
|
|
3
|
+
import { findNamedDownloadAsset } from './named-download.js';
|
|
3
4
|
function decodeFilenameParam(filename) {
|
|
4
5
|
try {
|
|
5
6
|
return decodeURIComponent(filename);
|
|
@@ -18,6 +19,47 @@ function stripTrailingSlash(url) {
|
|
|
18
19
|
export function buildCanonicalDownloadPath(assetId, canonicalFilename) {
|
|
19
20
|
return `/download/${assetId}/${encodeURIComponent(canonicalFilename)}`;
|
|
20
21
|
}
|
|
22
|
+
/** Public path for a download link, keyed by the asset filename. */
|
|
23
|
+
export function buildNamedDownloadPath(filename) {
|
|
24
|
+
return `/download/${encodeURIComponent(filename)}`;
|
|
25
|
+
}
|
|
26
|
+
async function proxyContentfulFile(options) {
|
|
27
|
+
const { request, file, canonicalPath, baseUrl, revalidate } = options;
|
|
28
|
+
const requestUrl = new URL(request.url);
|
|
29
|
+
const requestOrigin = stripTrailingSlash(requestUrl.origin);
|
|
30
|
+
const canonicalOrigin = baseUrl ? stripTrailingSlash(baseUrl) : requestOrigin;
|
|
31
|
+
const redirectLocation = `${requestOrigin}${canonicalPath}`;
|
|
32
|
+
const canonicalAbsolute = `${canonicalOrigin}${canonicalPath}`;
|
|
33
|
+
if (options.redirectWhenQuery !== false && requestUrl.search.length > 0) {
|
|
34
|
+
return new Response(null, {
|
|
35
|
+
status: 301,
|
|
36
|
+
headers: {
|
|
37
|
+
Location: redirectLocation,
|
|
38
|
+
'Cache-Control': 'public, max-age=3600',
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
const assetUrl = file.url.startsWith('//') ? `https:${file.url}` : file.url;
|
|
43
|
+
const fileResponse = await fetch(assetUrl, {
|
|
44
|
+
cache: 'no-store',
|
|
45
|
+
});
|
|
46
|
+
if (!fileResponse.ok) {
|
|
47
|
+
return Response.json({ error: 'Failed to fetch file' }, { status: 502 });
|
|
48
|
+
}
|
|
49
|
+
const headers = new Headers();
|
|
50
|
+
headers.set('Content-Type', file.contentType);
|
|
51
|
+
const disposition = isBrowserViewable(file.contentType) ? 'inline' : 'attachment';
|
|
52
|
+
headers.set('Content-Disposition', `${disposition}; filename="${file.fileName}"`);
|
|
53
|
+
if (file.size) {
|
|
54
|
+
headers.set('Content-Length', String(file.size));
|
|
55
|
+
}
|
|
56
|
+
headers.set('Cache-Control', `public, max-age=${revalidate}, s-maxage=${revalidate}`);
|
|
57
|
+
headers.set('Link', `<${canonicalAbsolute}>; rel="canonical"`);
|
|
58
|
+
return new Response(fileResponse.body, {
|
|
59
|
+
status: 200,
|
|
60
|
+
headers,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
21
63
|
/**
|
|
22
64
|
* Creates a Next.js App Router GET handler for downloading/viewing Contentful assets.
|
|
23
65
|
*
|
|
@@ -52,53 +94,69 @@ export function createDownloadHandler(config) {
|
|
|
52
94
|
const canonicalFilename = typeof file.fileName === 'string' && file.fileName.length > 0
|
|
53
95
|
? file.fileName
|
|
54
96
|
: decodedFilename;
|
|
55
|
-
const requestUrl = new URL(request.url);
|
|
56
|
-
const requestOrigin = stripTrailingSlash(requestUrl.origin);
|
|
57
|
-
const canonicalOrigin = baseUrl ? stripTrailingSlash(baseUrl) : requestOrigin;
|
|
58
97
|
const canonicalPath = buildCanonicalDownloadPath(assetId, canonicalFilename);
|
|
59
|
-
// Redirects stay on the host that received the request (preview/local safe).
|
|
60
|
-
const redirectLocation = `${requestOrigin}${canonicalPath}`;
|
|
61
|
-
// Canonical signal prefers configured production baseUrl when provided.
|
|
62
|
-
const canonicalAbsolute = `${canonicalOrigin}${canonicalPath}`;
|
|
63
|
-
const hasQuery = requestUrl.search.length > 0;
|
|
64
98
|
const filenameMismatch = decodedFilename !== canonicalFilename;
|
|
65
|
-
if (
|
|
99
|
+
if (filenameMismatch) {
|
|
100
|
+
const requestOrigin = stripTrailingSlash(new URL(request.url).origin);
|
|
66
101
|
return new Response(null, {
|
|
67
102
|
status: 301,
|
|
68
103
|
headers: {
|
|
69
|
-
Location:
|
|
70
|
-
// Short cache so corrected identity propagates quickly after renames.
|
|
104
|
+
Location: `${requestOrigin}${canonicalPath}`,
|
|
71
105
|
'Cache-Control': 'public, max-age=3600',
|
|
72
106
|
},
|
|
73
107
|
});
|
|
74
108
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
109
|
+
return proxyContentfulFile({
|
|
110
|
+
request,
|
|
111
|
+
file: {
|
|
112
|
+
url: file.url,
|
|
113
|
+
contentType: file.contentType,
|
|
114
|
+
fileName: canonicalFilename,
|
|
115
|
+
size: file.details?.size,
|
|
116
|
+
},
|
|
117
|
+
canonicalPath,
|
|
118
|
+
baseUrl,
|
|
119
|
+
revalidate,
|
|
81
120
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
console.error('[Download] Error proxying file:', error);
|
|
124
|
+
return Response.json({ error: 'Internal server error' }, { status: 500 });
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* GET handler for `/download/{filename}`.
|
|
130
|
+
* Serves a file only when a link entry's download asset has that filename.
|
|
131
|
+
*/
|
|
132
|
+
export function createNamedDownloadHandler(config) {
|
|
133
|
+
const { getConfig, revalidate = 86400, preview = false, baseUrl } = config;
|
|
134
|
+
return async function GET(request, { params }) {
|
|
135
|
+
// Next decodes this segment once. Decoding again changes a name that contains %XX.
|
|
136
|
+
const { filename } = await params;
|
|
137
|
+
try {
|
|
138
|
+
const resolution = await findNamedDownloadAsset(getConfig(preview), filename, {
|
|
139
|
+
preview,
|
|
140
|
+
next: { revalidate },
|
|
141
|
+
});
|
|
142
|
+
if (resolution.status !== 'found') {
|
|
143
|
+
return Response.json({ error: 'Asset not found' }, { status: 404 });
|
|
91
144
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
145
|
+
return proxyContentfulFile({
|
|
146
|
+
request,
|
|
147
|
+
file: {
|
|
148
|
+
url: resolution.file.url,
|
|
149
|
+
contentType: resolution.file.contentType,
|
|
150
|
+
fileName: resolution.file.fileName,
|
|
151
|
+
size: resolution.file.size,
|
|
152
|
+
},
|
|
153
|
+
canonicalPath: buildNamedDownloadPath(resolution.file.fileName),
|
|
154
|
+
baseUrl,
|
|
155
|
+
revalidate,
|
|
98
156
|
});
|
|
99
157
|
}
|
|
100
158
|
catch (error) {
|
|
101
|
-
console.error('[Download] Error proxying file:', error);
|
|
159
|
+
console.error('[Download] Error proxying named file:', error);
|
|
102
160
|
return Response.json({ error: 'Internal server error' }, { status: 500 });
|
|
103
161
|
}
|
|
104
162
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-asset.js","sourceRoot":"","sources":["../../src/api/server-asset.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"server-asset.js","sourceRoot":"","sources":["../../src/api/server-asset.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAiD1D,SAAS,mBAAmB,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAe,EAAE,iBAAyB;IACnF,OAAO,aAAa,OAAO,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,OAAO,aAAa,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;AACrD,CAAC;AASD,KAAK,UAAU,mBAAmB,CAAC,OAOlC;IACC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,kBAAkB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAC9E,MAAM,gBAAgB,GAAG,GAAG,aAAa,GAAG,aAAa,EAAE,CAAC;IAC5D,MAAM,iBAAiB,GAAG,GAAG,eAAe,GAAG,aAAa,EAAE,CAAC;IAE/D,IAAI,OAAO,CAAC,iBAAiB,KAAK,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;YACxB,MAAM,EAAE,GAAG;YACX,OAAO,EAAE;gBACP,QAAQ,EAAE,gBAAgB;gBAC1B,eAAe,EAAE,sBAAsB;aACxC;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAC5E,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QACzC,KAAK,EAAE,UAAU;KACH,CAAC,CAAC;IAElB,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACrB,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,WAAW,eAAe,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IAClF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,mBAAmB,UAAU,cAAc,UAAU,EAAE,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,iBAAiB,oBAAoB,CAAC,CAAC;IAE/D,OAAO,IAAI,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE;QACrC,MAAM,EAAE,GAAG;QACX,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA6B;IACjE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE3E,OAAO,KAAK,UAAU,GAAG,CACvB,OAAoB,EACpB,EAAE,MAAM,EAAuB;QAE/B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC;QAC3C,MAAM,eAAe,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAE5C,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,gBAAgB,EAAE,OAAO,EAAE;gBACjE,OAAO;gBACP,IAAI,EAAE,EAAE,UAAU,EAAE;aACrB,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACzB,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;YAC9B,mEAAmE;YACnE,MAAM,iBAAiB,GACrB,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAC3D,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACf,CAAC,CAAC,eAAe,CAAC;YAEtB,MAAM,aAAa,GAAG,0BAA0B,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;YAC7E,MAAM,gBAAgB,GAAG,eAAe,KAAK,iBAAiB,CAAC;YAE/D,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;gBACtE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;oBACxB,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE;wBACP,QAAQ,EAAE,GAAG,aAAa,GAAG,aAAa,EAAE;wBAC5C,eAAe,EAAE,sBAAsB;qBACxC;iBACF,CAAC,CAAC;YACL,CAAC;YAED,OAAO,mBAAmB,CAAC;gBACzB,OAAO;gBACP,IAAI,EAAE;oBACJ,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,QAAQ,EAAE,iBAAiB;oBAC3B,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI;iBACzB;gBACD,aAAa;gBACb,OAAO;gBACP,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAA6B;IACtE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE3E,OAAO,KAAK,UAAU,GAAG,CACvB,OAAoB,EACpB,EAAE,MAAM,EAA4B;QAEpC,mFAAmF;QACnF,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE;gBAC5E,OAAO;gBACP,IAAI,EAAE,EAAE,UAAU,EAAE;aACrB,CAAC,CAAC;YAEH,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBAClC,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,mBAAmB,CAAC;gBACzB,OAAO;gBACP,IAAI,EAAE;oBACJ,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG;oBACxB,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW;oBACxC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ;oBAClC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI;iBAC3B;gBACD,aAAa,EAAE,sBAAsB,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAC/D,OAAO;gBACP,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;YAC9D,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|