-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathfetchModel.ts
71 lines (66 loc) · 2.43 KB
/
fetchModel.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
* Copyright 2022 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
import { ModelManager } from '@adobe/aem-spa-page-model-manager';
import { Utils } from '../utils/Utils';
import { sanitizeUrl } from '@braintree/sanitize-url';
import { ModelProps } from '../types/AEMModel';
type RequireAtLeastOne<T> = { [K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>> }[keyof T];
export interface Path {
cqPath: string;
pagePath: string;
}
export type FetchProps = RequireAtLeastOne<Path> & {
forceReload?: boolean;
host?: string;
options?: {
headers?: HeadersInit;
};
itemPath?: string;
};
/**
* Fetch the model for a given path from AEM
*
* @param {Object} options
* @param options.cqPath Complete path to component on AEM
* @param options.pagePath Path to page containing the desired component
* @param options.itemPath Path to item within the page defined by pagePath
* @param options.host Host information of the AEM instance if fetch is to be done prior to ModelManager init
* @param options.options Fetch request options is fetching model using host
* @returns The fetched model transformed into usable props
*/
export async function fetchModel({
cqPath,
forceReload = false,
pagePath,
itemPath,
host,
options,
}: FetchProps): Promise<ModelProps> {
let model = {},
data;
if (cqPath || pagePath) {
const path = (cqPath && sanitizeUrl(cqPath)) || Utils.getCQPath({ pagePath, itemPath });
if (host) {
const hostURL = sanitizeUrl(`${host}/${path}`).replace(/\/+/g, '/');
const response = await fetch(`${hostURL}.model.json`, options);
if (response.ok) {
data = await response.json();
}
} else {
data = await ModelManager.getData({ path, forceReload }).catch((err: Error) => console.error(err));
}
if (data && Object.keys(data).length) {
model = Utils.modelToProps(data);
}
}
return model;
}