@enonic/nextjs-adapter 3.0.0-B3 → 3.0.0-B5
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/LICENSE +201 -0
- package/baseMappings.js.map +1 -1
- package/client.js.map +1 -1
- package/common/ComponentRegistry.js.map +1 -1
- package/common/UrlProcessor.js.map +1 -1
- package/common/constants.d.ts +1 -1
- package/common/constants.js +1 -1
- package/common/constants.js.map +1 -1
- package/common/env.d.ts +1 -1
- package/common/env.js +2 -2
- package/common/env.js.map +1 -1
- package/guillotine/applyProcessors.js.map +1 -1
- package/guillotine/buildComponentTree.js.map +1 -1
- package/guillotine/buildErrorResponse.js.map +1 -1
- package/guillotine/buildPage.js.map +1 -1
- package/guillotine/collectComponentDescriptors.js.map +1 -1
- package/guillotine/combineMultipleQueries.js.map +1 -1
- package/guillotine/createMetaData.js.map +1 -1
- package/guillotine/fetchContent.js.map +1 -1
- package/guillotine/fetchContentData.js +4 -1
- package/guillotine/fetchContentData.js.map +1 -1
- package/guillotine/fetchContentPathsForAllLocales.js.map +1 -1
- package/guillotine/fetchContentPathsForLocale.js +1 -1
- package/guillotine/fetchContentPathsForLocale.js.map +1 -1
- package/guillotine/fetchFromApi.d.ts +2 -2
- package/guillotine/fetchFromApi.js +22 -13
- package/guillotine/fetchFromApi.js.map +1 -1
- package/guillotine/fetchGuillotine.d.ts +2 -2
- package/guillotine/fetchGuillotine.js +4 -4
- package/guillotine/fetchGuillotine.js.map +1 -1
- package/guillotine/fetchMetaData.js +4 -1
- package/guillotine/fetchMetaData.js.map +1 -1
- package/guillotine/getCleanContentPathArrayOrThrow400.js.map +1 -1
- package/guillotine/getComponentConfig.js.map +1 -1
- package/guillotine/getContentAndComponentPaths.js.map +1 -1
- package/guillotine/getMetaData.js.map +1 -1
- package/guillotine/getParentRegion.js.map +1 -1
- package/guillotine/getQueryAndVariables.js.map +1 -1
- package/guillotine/metadata/configQuery.js.map +1 -1
- package/guillotine/metadata/richTextQuery.js.map +1 -1
- package/guillotine/parseComponentPath.js.map +1 -1
- package/guillotine/prefixLayoutPath.js.map +1 -1
- package/guillotine/processComponentConfig.js.map +1 -1
- package/guillotine/restrictComponentsToPath.js.map +1 -1
- package/guillotine/validateData.js.map +1 -1
- package/guillotine/validateNotFound.js.map +1 -1
- package/guillotine/validateShortcut.js.map +1 -1
- package/i18n/LocaleContext.jsx.map +1 -1
- package/i18n/i18n.js.map +1 -1
- package/index.js.map +1 -1
- package/package.json +8 -9
- package/query/Shortcut.js.map +1 -1
- package/server.js +6 -0
- package/server.js.map +1 -1
- package/src/baseMappings.ts +53 -0
- package/src/client.ts +2 -0
- package/src/common/ComponentRegistry.ts +162 -0
- package/src/common/UrlProcessor.ts +142 -0
- package/src/common/constants.ts +85 -0
- package/src/common/env.ts +39 -0
- package/src/guillotine/applyProcessors.ts +38 -0
- package/src/guillotine/buildComponentTree.ts +63 -0
- package/src/guillotine/buildErrorResponse.ts +39 -0
- package/src/guillotine/buildPage.ts +15 -0
- package/src/guillotine/collectComponentDescriptors.ts +63 -0
- package/src/guillotine/combineMultipleQueries.ts +75 -0
- package/src/guillotine/createMetaData.ts +73 -0
- package/src/guillotine/fetchContent.ts +250 -0
- package/src/guillotine/fetchContentData.ts +32 -0
- package/src/guillotine/fetchContentPathsForAllLocales.ts +21 -0
- package/src/guillotine/fetchContentPathsForLocale.ts +42 -0
- package/src/guillotine/fetchFromApi.ts +76 -0
- package/src/guillotine/fetchGuillotine.ts +60 -0
- package/src/guillotine/fetchMetaData.ts +31 -0
- package/src/guillotine/getCleanContentPathArrayOrThrow400.ts +22 -0
- package/src/guillotine/getComponentConfig.ts +7 -0
- package/src/guillotine/getContentAndComponentPaths.ts +11 -0
- package/src/guillotine/getMetaData.ts +73 -0
- package/src/guillotine/getParentRegion.ts +59 -0
- package/src/guillotine/getQueryAndVariables.ts +52 -0
- package/src/guillotine/metadata/configQuery.ts +46 -0
- package/src/guillotine/metadata/richTextQuery.ts +34 -0
- package/src/guillotine/parseComponentPath.ts +29 -0
- package/src/guillotine/prefixLayoutPath.ts +16 -0
- package/src/guillotine/processComponentConfig.ts +38 -0
- package/src/guillotine/restrictComponentsToPath.ts +45 -0
- package/src/guillotine/validateData.ts +11 -0
- package/src/guillotine/validateNotFound.ts +20 -0
- package/src/guillotine/validateShortcut.ts +37 -0
- package/src/i18n/LocaleContext.tsx +54 -0
- package/src/i18n/i18n.ts +54 -0
- package/src/index.ts +42 -0
- package/src/query/Shortcut.ts +14 -0
- package/src/server.ts +5 -0
- package/src/types/component.ts +147 -0
- package/src/types/componentProps.ts +142 -0
- package/src/types/guillotine.ts +426 -0
- package/src/types/i18n.ts +8 -0
- package/src/types/index.ts +60 -0
- package/src/types/next.ts +7 -0
- package/src/types/util.ts +5 -0
- package/src/utils/addLineNumbers.ts +3 -0
- package/src/utils/buildGuillotineRequestHeaders.ts +32 -0
- package/src/utils/commonChars.ts +16 -0
- package/src/utils/fixDoubleSlashes.ts +3 -0
- package/src/utils/getContentApiUrl.ts +20 -0
- package/src/utils/getProjectLocaleConfig.ts +24 -0
- package/src/utils/getProjectLocaleConfigById.ts +21 -0
- package/src/utils/getProjectLocaleConfigByLocale.ts +19 -0
- package/src/utils/getProjectLocaleConfigs.ts +36 -0
- package/src/utils/getProjectLocales.ts +6 -0
- package/src/utils/getRenderMode.ts +14 -0
- package/src/utils/getRequestLocaleInfo.ts +29 -0
- package/src/utils/getXpBaseUrl.ts +12 -0
- package/src/utils/indent.ts +4 -0
- package/src/utils/sanitizeGraphqlName.ts +11 -0
- package/src/views/BaseComponent.tsx +153 -0
- package/src/views/BaseContent.tsx +47 -0
- package/src/views/BaseLayout.tsx +33 -0
- package/src/views/BaseMacro.tsx +94 -0
- package/src/views/BasePage.tsx +42 -0
- package/src/views/BasePart.tsx +34 -0
- package/src/views/Empty.tsx +5 -0
- package/src/views/Fragment.tsx +41 -0
- package/src/views/MainView.tsx +22 -0
- package/src/views/PropsView.tsx +38 -0
- package/src/views/Region.tsx +76 -0
- package/src/views/RichTextView.tsx +75 -0
- package/src/views/SingleComponent.tsx +19 -0
- package/src/views/StaticContent.tsx +39 -0
- package/src/views/Text.tsx +19 -0
- package/src/views/getClientHydratedHtml.tsx +12 -0
- package/src/views/macros/DefaultMacro.tsx +9 -0
- package/src/views/macros/DisableMacro.tsx +8 -0
- package/types/component.js.map +1 -1
- package/types/componentProps.js.map +1 -1
- package/types/guillotine.js.map +1 -1
- package/types/i18n.js.map +1 -1
- package/types/index.d.ts +7 -5
- package/types/index.js.map +1 -1
- package/types/next.js.map +1 -1
- package/types/util.js.map +1 -1
- package/utils/addLineNumbers.js.map +1 -1
- package/utils/buildGuillotineRequestHeaders.js.map +1 -1
- package/utils/commonChars.js.map +1 -1
- package/utils/fixDoubleSlashes.js.map +1 -1
- package/utils/getContentApiUrl.js.map +1 -1
- package/utils/getProjectLocaleConfig.js.map +1 -1
- package/utils/getProjectLocaleConfigById.js.map +1 -1
- package/utils/getProjectLocaleConfigByLocale.js.map +1 -1
- package/utils/getProjectLocaleConfigs.js +3 -3
- package/utils/getProjectLocaleConfigs.js.map +1 -1
- package/utils/getProjectLocales.js.map +1 -1
- package/utils/getRenderMode.js.map +1 -1
- package/utils/getRequestLocaleInfo.js.map +1 -1
- package/utils/getXpBaseUrl.js.map +1 -1
- package/utils/indent.js.map +1 -1
- package/utils/sanitizeGraphqlName.js.map +1 -1
- package/views/BaseComponent.jsx.map +1 -1
- package/views/BaseContent.jsx.map +1 -1
- package/views/BaseLayout.jsx.map +1 -1
- package/views/BaseMacro.jsx.map +1 -1
- package/views/BasePage.jsx.map +1 -1
- package/views/BasePart.jsx.map +1 -1
- package/views/Empty.jsx.map +1 -1
- package/views/Fragment.jsx.map +1 -1
- package/views/MainView.jsx.map +1 -1
- package/views/PropsView.jsx.map +1 -1
- package/views/Region.jsx.map +1 -1
- package/views/RichTextView.jsx.map +1 -1
- package/views/SingleComponent.jsx.map +1 -1
- package/views/StaticContent.jsx.map +1 -1
- package/views/Text.jsx.map +1 -1
- package/views/getClientHydratedHtml.jsx.map +1 -1
- package/views/macros/DefaultMacro.jsx.map +1 -1
- package/views/macros/DisableMacro.jsx.map +1 -1
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import type {XP_COMPONENT_TYPE} from '../common/constants';
|
|
2
|
+
import type {Context} from './next';
|
|
3
|
+
|
|
4
|
+
// Differs from ComponentDefinition to avoid storing catchAll on all components
|
|
5
|
+
// catchAll is calculated in getType instead
|
|
6
|
+
export interface ComponentDefinitionParams {
|
|
7
|
+
query?: SelectedQueryMaybeVariablesFunc
|
|
8
|
+
configQuery?: string
|
|
9
|
+
processor?: DataProcessor
|
|
10
|
+
view?: React.FunctionComponent<any>
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Object that configures the handling of a particular content type. All attributes are optional (see examples below), and missing values will fall back to default behavior:
|
|
15
|
+
* - 'query' (used in fetchContent.ts) Guillotine query for fetching content data, may also have a function that supplies guillotine variables. So, 'query' can EITHER be only a query string, OR also add a get-guillotine-variables function. In the latter case, 'query' can be an object with 'query' and 'variables' attributes, or an array where the query string is first and the get-variables function is second. Either way, the get-variables function takes two arguments: path (content path, mandatory) and context (next.js-supplied Context from getServerSideProps etc. Optional, and requires that fetchContent is called with the context, of course).
|
|
16
|
+
* - 'props' (used in fetchContent.ts) is a function for processing props after fetching them
|
|
17
|
+
* - 'view' (used in BasePage.tsx) is a React component: top-level content-type-specific rendering with the props first fetched from guillotine (and then optionally preprocessed with the function in 'props').
|
|
18
|
+
*/
|
|
19
|
+
export interface ComponentDefinition {
|
|
20
|
+
catchAll?: boolean; // will be set automatically depending on the binding
|
|
21
|
+
query?: SelectedQueryMaybeVariablesFunc,
|
|
22
|
+
configQuery?: string,
|
|
23
|
+
processor?: DataProcessor,
|
|
24
|
+
view?: React.FunctionComponent<any>
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface ComponentDescriptor {
|
|
28
|
+
type?: ComponentDefinition;
|
|
29
|
+
component?: PageComponent;
|
|
30
|
+
queryAndVariables?: QueryAndVariables;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type ComponentDictionary = Record<string,ComponentDefinitionParams>;
|
|
34
|
+
|
|
35
|
+
// NB! Always return null or empty object from processor for next is unable to serialize undefined
|
|
36
|
+
export type DataProcessor = (data: any, context?: Context, config?: any) => Promise<Record<string, any>>;
|
|
37
|
+
|
|
38
|
+
export interface FragmentData {
|
|
39
|
+
id: string;
|
|
40
|
+
fragment: {
|
|
41
|
+
components: PageComponent[];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ImageData {
|
|
46
|
+
ref: string;
|
|
47
|
+
image: {
|
|
48
|
+
id: string,
|
|
49
|
+
} | null,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface LayoutData {
|
|
53
|
+
descriptor: string;
|
|
54
|
+
config?: any;
|
|
55
|
+
|
|
56
|
+
[customKeysFromQuery: string]: any;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface LinkData {
|
|
60
|
+
ref: string,
|
|
61
|
+
media: {
|
|
62
|
+
content: {
|
|
63
|
+
id: string,
|
|
64
|
+
}
|
|
65
|
+
} | null,
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type MacroConfig = Record<string, any>;
|
|
69
|
+
|
|
70
|
+
export interface MacroData {
|
|
71
|
+
ref: string
|
|
72
|
+
name: string
|
|
73
|
+
descriptor: string
|
|
74
|
+
config: Record<string, MacroConfig>
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface PageComponent {
|
|
78
|
+
[key: string]: any; // keeps ts happy when accessing component data field by XP_COMPONENT_TYPE type
|
|
79
|
+
type: XP_COMPONENT_TYPE;
|
|
80
|
+
path: string;
|
|
81
|
+
page?: PageData;
|
|
82
|
+
part?: PartData;
|
|
83
|
+
layout?: LayoutData;
|
|
84
|
+
fragment?: FragmentData;
|
|
85
|
+
text?: TextData;
|
|
86
|
+
image?: any;
|
|
87
|
+
regions?: RegionTree;
|
|
88
|
+
data?: any;
|
|
89
|
+
error?: any;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface PageData {
|
|
93
|
+
descriptor: string;
|
|
94
|
+
config?: any;
|
|
95
|
+
template?: string | null;
|
|
96
|
+
regions?: RegionTree;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface PageRegion {
|
|
100
|
+
name: string;
|
|
101
|
+
components: PageComponent[];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface PartData {
|
|
105
|
+
descriptor: string;
|
|
106
|
+
config: any; // TODO NestedRecord?;
|
|
107
|
+
|
|
108
|
+
[customKeysFromQuery: string]: any;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface QueryAndVariables {
|
|
112
|
+
query: string
|
|
113
|
+
variables?: Record<string, any>
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export type QueryGetter = (path: string, context?: Context, config?: any) => string;
|
|
117
|
+
|
|
118
|
+
export type SelectedQueryMaybeVariablesFunc =
|
|
119
|
+
| string
|
|
120
|
+
| QueryGetter
|
|
121
|
+
| {
|
|
122
|
+
query: string | QueryGetter
|
|
123
|
+
variables: VariablesGetter
|
|
124
|
+
}
|
|
125
|
+
| [string | QueryGetter, VariablesGetter];
|
|
126
|
+
|
|
127
|
+
export type RegionTree = Record<string, PageRegion>;
|
|
128
|
+
|
|
129
|
+
export interface RichTextData {
|
|
130
|
+
processedHtml: string
|
|
131
|
+
links: LinkData[]
|
|
132
|
+
macros: MacroData[]
|
|
133
|
+
images: ImageData[]
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface TextData {
|
|
137
|
+
value: RichTextData;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// TODO: also access as arguments: dataAsJson, pageAsJson, configAsJson from the first (meta) call here?
|
|
141
|
+
// Another option could be to let the component or page controller pass those values to NextJS by a header
|
|
142
|
+
export type VariablesGetter = (path: string, context?: Context, config?: any) => VariablesGetterResult;
|
|
143
|
+
|
|
144
|
+
export interface VariablesGetterResult {
|
|
145
|
+
[variables: string]: any
|
|
146
|
+
path: string
|
|
147
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import {DOMNode} from 'html-react-parser';
|
|
2
|
+
import type {
|
|
3
|
+
RENDER_MODE,
|
|
4
|
+
XP_REQUEST_TYPE,
|
|
5
|
+
} from '../common/constants';
|
|
6
|
+
import type {
|
|
7
|
+
FragmentData,
|
|
8
|
+
LayoutData,
|
|
9
|
+
MacroConfig,
|
|
10
|
+
MacroData,
|
|
11
|
+
PageComponent,
|
|
12
|
+
PageData,
|
|
13
|
+
PartData,
|
|
14
|
+
RichTextData,
|
|
15
|
+
RegionTree,
|
|
16
|
+
} from './component';
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
export interface BaseComponentProps {
|
|
20
|
+
component: PageComponent;
|
|
21
|
+
meta: MetaData;
|
|
22
|
+
common?: any; // Content is passed down for optional consumption in componentviews.
|
|
23
|
+
// TODO: Use a react contextprovider instead of "manually" passing everything down
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface BaseLayoutProps {
|
|
27
|
+
component?: LayoutData;
|
|
28
|
+
path: string;
|
|
29
|
+
regions?: RegionTree;
|
|
30
|
+
common?: any;
|
|
31
|
+
meta: MetaData;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface BaseMacroProps {
|
|
35
|
+
data: MacroData;
|
|
36
|
+
meta: MetaData;
|
|
37
|
+
renderInEditMode?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface BasePageProps {
|
|
41
|
+
component?: PageData;
|
|
42
|
+
path?: string;
|
|
43
|
+
common?: any;
|
|
44
|
+
data?: any;
|
|
45
|
+
error?: string;
|
|
46
|
+
meta: MetaData;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface BasePartProps {
|
|
50
|
+
component?: PartData;
|
|
51
|
+
path: string;
|
|
52
|
+
common?: any;
|
|
53
|
+
data?: any;
|
|
54
|
+
error?: string;
|
|
55
|
+
meta: MetaData;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface FragmentProps {
|
|
59
|
+
page?: PageData;
|
|
60
|
+
component?: FragmentData;
|
|
61
|
+
common?: any;
|
|
62
|
+
meta: MetaData;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface LayoutProps {
|
|
66
|
+
layout: LayoutData;
|
|
67
|
+
path: string;
|
|
68
|
+
common: any;
|
|
69
|
+
meta: MetaData;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface MacroProps {
|
|
73
|
+
name: string;
|
|
74
|
+
config: MacroConfig;
|
|
75
|
+
meta: MetaData;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface MetaData {
|
|
79
|
+
type: string,
|
|
80
|
+
path: string,
|
|
81
|
+
requestType: XP_REQUEST_TYPE,
|
|
82
|
+
renderMode: RENDER_MODE,
|
|
83
|
+
requestedComponent?: PageComponent,
|
|
84
|
+
canRender: boolean,
|
|
85
|
+
catchAll: boolean,
|
|
86
|
+
apiUrl: string,
|
|
87
|
+
baseUrl: string,
|
|
88
|
+
locale: string,
|
|
89
|
+
defaultLocale: string,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface PageProps {
|
|
93
|
+
page: PageData;
|
|
94
|
+
path: string;
|
|
95
|
+
data?: any;
|
|
96
|
+
common?: any; // Content is passed down to componentviews. TODO: Use a react contextprovider instead?
|
|
97
|
+
meta: MetaData;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface PartProps {
|
|
101
|
+
part: PartData
|
|
102
|
+
path: string
|
|
103
|
+
data?: any
|
|
104
|
+
// Content is passed down to componentviews. TODO: Use a react contextprovider instead?
|
|
105
|
+
common?: any
|
|
106
|
+
meta: MetaData
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface RegionProps {
|
|
110
|
+
name: string
|
|
111
|
+
components?: PageComponent[]
|
|
112
|
+
className?: string
|
|
113
|
+
// Content is passed down for optional consumption in componentviews. TODO: Use a react contextprovider instead?
|
|
114
|
+
common?: any
|
|
115
|
+
meta: MetaData
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface RegionsProps {
|
|
119
|
+
page: PageData | null;
|
|
120
|
+
name?: string;
|
|
121
|
+
// Content is passed down for optional consumption in componentviews. TODO: Use a react contextprovider instead?
|
|
122
|
+
common?: any;
|
|
123
|
+
meta: MetaData;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export type Replacer = (
|
|
127
|
+
domNode: DOMNode,
|
|
128
|
+
data: RichTextData,
|
|
129
|
+
meta: MetaData,
|
|
130
|
+
renderMacroInEditMode: boolean
|
|
131
|
+
) => ReplacerResult;
|
|
132
|
+
|
|
133
|
+
export type ReplacerResult = JSX.Element | object | void | undefined | null | false;
|
|
134
|
+
|
|
135
|
+
export interface RichTextViewProps {
|
|
136
|
+
data: RichTextData
|
|
137
|
+
meta: MetaData
|
|
138
|
+
className?: string
|
|
139
|
+
tag?: string
|
|
140
|
+
renderMacroInEditMode?: boolean
|
|
141
|
+
customReplacer?: Replacer
|
|
142
|
+
}
|
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import type {PublishInfo} from '@enonic-types/core';
|
|
2
|
+
import type {PageComponent, PageData} from './component';
|
|
3
|
+
import type {MetaData} from './componentProps';
|
|
4
|
+
import type {Context} from './next';
|
|
5
|
+
import type {RecursivePartial} from './util';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
export interface GuillotineError {
|
|
9
|
+
errorType: string
|
|
10
|
+
locations: {
|
|
11
|
+
line: number
|
|
12
|
+
column: number
|
|
13
|
+
}[]
|
|
14
|
+
message: string
|
|
15
|
+
validationErrorType?: string
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// A specific observed error
|
|
19
|
+
// export interface GuillotineValidationError extends GuillotineError {
|
|
20
|
+
// errorType: 'ValidationError'
|
|
21
|
+
// validationErrorType: string // 'FieldUndefined'
|
|
22
|
+
// }
|
|
23
|
+
|
|
24
|
+
// export interface GuillotineErrorResponseJson {
|
|
25
|
+
// errors: GuillotineError[]
|
|
26
|
+
// }
|
|
27
|
+
|
|
28
|
+
// export interface GuillotineOkResponseJson<Data = Record<string,unknown>> {
|
|
29
|
+
// data: Data
|
|
30
|
+
// }
|
|
31
|
+
|
|
32
|
+
// export type GuillotineResponseJson<Data> = GuillotineOkResponseJson<Data> | GuillotineErrorResponseJson;
|
|
33
|
+
|
|
34
|
+
export interface GuillotineResponseJson<Guillotine = RecursivePartial<HeadlessCms>> {
|
|
35
|
+
// NOTE: guillotine is the actual field on the top Query, but can be used multiple times via aliases
|
|
36
|
+
data?: Record<string, Guillotine>
|
|
37
|
+
errors?: GuillotineError[]
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface GuillotineResponse<Data = Record<string,unknown>> {
|
|
41
|
+
json: () => Promise<GuillotineResponseJson<Data>>
|
|
42
|
+
text: () => Promise<string>
|
|
43
|
+
ok: boolean
|
|
44
|
+
status: number
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Sends one query to the guillotine API and asks for content type, then uses the type to select a second query and variables, which is sent to the API and fetches content data.
|
|
49
|
+
* @param contentPath string or string array: pre-split or slash-delimited _path to a content available on the API
|
|
50
|
+
* @returns FetchContentResult object: {data?: T, error?: {code, message}}
|
|
51
|
+
*/
|
|
52
|
+
export type ContentFetcher = (context: Context) => Promise<FetchContentResult>;
|
|
53
|
+
|
|
54
|
+
export interface ContentResult<Content = Record<string, unknown>> extends Result {
|
|
55
|
+
contents?: Content[]
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface FetchContentResult extends Result {
|
|
59
|
+
data: Record<string, any> | null
|
|
60
|
+
common: Record<string, any> | null
|
|
61
|
+
meta: MetaData
|
|
62
|
+
page: PageComponent | null
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Seems like NodeJS.fetch lowercases all headers, so we need to lowercase the
|
|
66
|
+
// header names here.
|
|
67
|
+
export interface GuillotineRequestHeaders {
|
|
68
|
+
Cookie?: string
|
|
69
|
+
locale: string
|
|
70
|
+
locales: string
|
|
71
|
+
'default-locale': string
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export type GuillotineResult = Result & Record<string, any>;
|
|
75
|
+
|
|
76
|
+
export interface MetaResult extends Result {
|
|
77
|
+
meta?: {
|
|
78
|
+
_path: string
|
|
79
|
+
type: string
|
|
80
|
+
pageAsJson?: PageData
|
|
81
|
+
components?: PageComponent[]
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export interface Result {
|
|
86
|
+
error?: {
|
|
87
|
+
code: string
|
|
88
|
+
message: string
|
|
89
|
+
} | null
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Types from Query Playground Docs:
|
|
93
|
+
|
|
94
|
+
interface AccessControlEntry {
|
|
95
|
+
principal: PrincipalKey
|
|
96
|
+
allow: [Permission]
|
|
97
|
+
deny: [Permission]
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
interface Attachment {
|
|
101
|
+
name: string
|
|
102
|
+
label: string
|
|
103
|
+
size: number
|
|
104
|
+
mimeType: string
|
|
105
|
+
attachmentUrl: string
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
type DateTime = string;
|
|
109
|
+
|
|
110
|
+
export interface Component {
|
|
111
|
+
type: ComponentType
|
|
112
|
+
path: string
|
|
113
|
+
page?: PageComponentData | null
|
|
114
|
+
layout?: LayoutComponentData | null
|
|
115
|
+
image?: ImageComponentData | null
|
|
116
|
+
part?: PartComponentData | null
|
|
117
|
+
text?: TextComponentData | null
|
|
118
|
+
fragment?: FragmentComponentData | null
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
type ComponentType = 'page' | 'layout' | 'image' | 'part' | 'text' | 'fragment';
|
|
122
|
+
|
|
123
|
+
interface Content {
|
|
124
|
+
_id: string // !
|
|
125
|
+
_name: string // !
|
|
126
|
+
_path: string // !
|
|
127
|
+
_references?: Content[]
|
|
128
|
+
_score?: number
|
|
129
|
+
creator?: PrincipalKey
|
|
130
|
+
modifier?: PrincipalKey
|
|
131
|
+
createdTime?: DateTime
|
|
132
|
+
modifiedTime?: DateTime
|
|
133
|
+
owner?: PrincipalKey
|
|
134
|
+
type?: string
|
|
135
|
+
contentType?: ContentType
|
|
136
|
+
displayName?: string
|
|
137
|
+
hasChildren?: boolean
|
|
138
|
+
language?: string
|
|
139
|
+
valid?: boolean
|
|
140
|
+
dataAsJson?: JSON
|
|
141
|
+
x?: ExtraData
|
|
142
|
+
xAsJson?: JSON
|
|
143
|
+
pageAsJson?: JSON
|
|
144
|
+
pageTemplate?: Content
|
|
145
|
+
components?: Component[]
|
|
146
|
+
attachments?: Attachment[]
|
|
147
|
+
publish?: PublishInfo
|
|
148
|
+
pageUrl?: string
|
|
149
|
+
site?: portal_Site
|
|
150
|
+
parent?: Content
|
|
151
|
+
children?: Content[]
|
|
152
|
+
childrenConnection?: ContentConnection
|
|
153
|
+
permissions?: Permissions
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
interface ContentConnection {
|
|
157
|
+
totalCount: Int
|
|
158
|
+
edges: ContentEdge[]
|
|
159
|
+
pageInfo: PageInfo
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
interface ContentEdge {
|
|
163
|
+
node: Content
|
|
164
|
+
cursor: string
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
interface ContentType {
|
|
168
|
+
name: string
|
|
169
|
+
displayName: string
|
|
170
|
+
description: string
|
|
171
|
+
superType: string
|
|
172
|
+
abstract: boolean
|
|
173
|
+
final: boolean
|
|
174
|
+
allowChildContent: boolean
|
|
175
|
+
contentDisplayNameScript: string
|
|
176
|
+
icon: Icon
|
|
177
|
+
form: FormItem[]
|
|
178
|
+
formAsJson: JSON
|
|
179
|
+
getInstances: Content[]
|
|
180
|
+
getInstanceConnection: ContentConnection
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
type ExtraData<App = Record<string,unknown>> = App & {
|
|
184
|
+
media: XData_media_ApplicationConfig
|
|
185
|
+
base: XData_base_ApplicationConfig
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
type Float = number;
|
|
189
|
+
|
|
190
|
+
interface FormItem {
|
|
191
|
+
formItemType: FormItemType
|
|
192
|
+
name: string
|
|
193
|
+
label: string
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
type FormItemType = 'ItemSet' | 'Layout' | 'Input' | 'OptionSet';
|
|
197
|
+
|
|
198
|
+
interface FragmentComponentData {
|
|
199
|
+
id: string
|
|
200
|
+
fragment: Content
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
interface GeoPoint {
|
|
204
|
+
value: string
|
|
205
|
+
latitude: Float
|
|
206
|
+
longitude: Float
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export interface HeadlessCms {
|
|
210
|
+
get?: Content
|
|
211
|
+
getChildren?: Content[]
|
|
212
|
+
getChildrenConnection?: ContentConnection
|
|
213
|
+
getPermissions?: Permissions
|
|
214
|
+
getSite?: portal_Site
|
|
215
|
+
getType?: ContentType
|
|
216
|
+
getTypes?: ContentType[]
|
|
217
|
+
query?: Content[]
|
|
218
|
+
queryConnection?: QueryContentConnection
|
|
219
|
+
queryDsl?: Content[]
|
|
220
|
+
queryDslConnection?: QueryDSLContentConnection
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
interface Icon {
|
|
224
|
+
mimeType: string
|
|
225
|
+
modifiedTime: string
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
interface Image {
|
|
229
|
+
image: Content
|
|
230
|
+
ref: string
|
|
231
|
+
style: ImageStyle
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
interface ImageComponentData {
|
|
235
|
+
id: string
|
|
236
|
+
caption?: string
|
|
237
|
+
image: media_Image
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
interface ImageStyle {
|
|
241
|
+
name: string
|
|
242
|
+
aspectRatio: string
|
|
243
|
+
filter: string
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
type Int = number;
|
|
247
|
+
|
|
248
|
+
type JSON = Record<string, unknown>;
|
|
249
|
+
|
|
250
|
+
interface LayoutComponentData {
|
|
251
|
+
descriptor: string
|
|
252
|
+
configAsJson: JSON | null
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
interface Link {
|
|
256
|
+
ref: string
|
|
257
|
+
uri: string
|
|
258
|
+
media: Media
|
|
259
|
+
content: Content
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
type LocalDateTime = string;
|
|
263
|
+
|
|
264
|
+
interface Macro_system_disable_DataConfig {
|
|
265
|
+
body: string
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
interface Macro_system_embed_DataConfig {
|
|
269
|
+
body: string
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
interface Macro {
|
|
273
|
+
ref: string
|
|
274
|
+
name: string
|
|
275
|
+
descriptor: string
|
|
276
|
+
config: MacroConfig
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
interface MacroConfig {
|
|
280
|
+
disable: Macro_system_disable_DataConfig
|
|
281
|
+
embed: Macro_system_embed_DataConfig
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
interface Media {
|
|
285
|
+
content: Content
|
|
286
|
+
intent: MediaIntentType
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
type MediaIntentType = 'download' | 'inline';
|
|
290
|
+
|
|
291
|
+
interface media_Image extends Content {
|
|
292
|
+
mediaUrl: string
|
|
293
|
+
imageUrl: string
|
|
294
|
+
data: media_Image_Data
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
interface media_Image_Data {
|
|
298
|
+
media: MediaUploader
|
|
299
|
+
caption: string
|
|
300
|
+
altText: string
|
|
301
|
+
artist: string[]
|
|
302
|
+
copyright: string
|
|
303
|
+
tags: string[]
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
interface MediaFocalPoint {
|
|
307
|
+
x: number
|
|
308
|
+
y: number
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
interface MediaUploader {
|
|
312
|
+
attachment: string
|
|
313
|
+
focalPoint: MediaFocalPoint
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
interface PageComponentData {
|
|
317
|
+
descriptor?: string
|
|
318
|
+
customized?: boolean
|
|
319
|
+
configAsJson?: JSON
|
|
320
|
+
template?: Content | null
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
interface PageInfo {
|
|
324
|
+
startCursor: string // !
|
|
325
|
+
endCursor: string // !
|
|
326
|
+
hasNext: boolean // !
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
interface PartComponentData<Config = Record<string, unknown>> {
|
|
330
|
+
descriptor: string
|
|
331
|
+
config: Config
|
|
332
|
+
configAsJson: JSON
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
type Permission = 'READ' | 'CREATE' | 'MODIFY' | 'DELETE' | 'PUBLISH' | 'READ_PERMISSIONS' | 'WRITE_PERMISSIONS';
|
|
336
|
+
|
|
337
|
+
interface Permissions {
|
|
338
|
+
inheritsPermissions: boolean
|
|
339
|
+
permissions: AccessControlEntry[]
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
interface portal_Site extends Content {
|
|
343
|
+
data: portal_Site_Data
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
interface portal_Site_Data {
|
|
347
|
+
description: string
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
type PrincipalType = 'user' | 'group' | 'role';
|
|
351
|
+
|
|
352
|
+
interface PrincipalKey {
|
|
353
|
+
value: string
|
|
354
|
+
type: PrincipalType
|
|
355
|
+
idProvider: string
|
|
356
|
+
principalId: string
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
interface QueryContentConnection extends ContentConnection {
|
|
360
|
+
aggregationsAsJson: JSON
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
interface QueryDSLContentConnection extends QueryContentConnection {
|
|
364
|
+
highlightAsJson: JSON
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
interface RichText {
|
|
368
|
+
raw: string
|
|
369
|
+
processedHtml: string
|
|
370
|
+
macrosAsJson: JSON
|
|
371
|
+
macros: Macro[]
|
|
372
|
+
images: Image[]
|
|
373
|
+
links: Link[]
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
interface TextComponentData {
|
|
377
|
+
value: RichText
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
interface XData_base_ApplicationConfig {
|
|
381
|
+
gpsInfo: XData_base_gpsInfo_DataConfig
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
interface XData_base_gpsInfo_DataConfig {
|
|
385
|
+
geoPoint: GeoPoint
|
|
386
|
+
altitude: String
|
|
387
|
+
direction: String
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
interface XData_media_ApplicationConfig {
|
|
391
|
+
imageInfo: XData_media_imageInfo_DataConfig
|
|
392
|
+
cameraInfo: XData_media_cameraInfo_DataConfig
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
interface XData_media_imageInfo_DataConfig {
|
|
396
|
+
pixelSize: number
|
|
397
|
+
imageHeight: number
|
|
398
|
+
imageWidth: number
|
|
399
|
+
contentType: string
|
|
400
|
+
description: string
|
|
401
|
+
byteSize: number
|
|
402
|
+
colorSpace: string[]
|
|
403
|
+
fileSource: string
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
interface XData_media_cameraInfo_DataConfig {
|
|
407
|
+
date: LocalDateTime
|
|
408
|
+
make: string
|
|
409
|
+
model: string
|
|
410
|
+
lens: string
|
|
411
|
+
iso: string
|
|
412
|
+
focalLength: string
|
|
413
|
+
focalLength35: string
|
|
414
|
+
exposureBias: string
|
|
415
|
+
aperture: string[]
|
|
416
|
+
shutterTime: string
|
|
417
|
+
flash: string
|
|
418
|
+
autoFlashCompensation: string
|
|
419
|
+
whiteBalance: string
|
|
420
|
+
exposureProgram: string
|
|
421
|
+
shootingMode: string
|
|
422
|
+
meteringMode: string
|
|
423
|
+
exposureMode: string
|
|
424
|
+
focusDistance: string
|
|
425
|
+
orientation: string
|
|
426
|
+
}
|