@enonic/nextjs-adapter 3.0.0-B3 → 3.0.0-B4
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.js.map +1 -1
- 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.map +1 -1
- package/guillotine/fetchContentPathsForAllLocales.js.map +1 -1
- package/guillotine/fetchContentPathsForLocale.js.map +1 -1
- package/guillotine/fetchFromApi.js.map +1 -1
- package/guillotine/fetchGuillotine.js.map +1 -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 +3 -4
- 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 +33 -0
- package/src/guillotine/fetchContentPathsForAllLocales.ts +21 -0
- package/src/guillotine/fetchContentPathsForLocale.ts +42 -0
- package/src/guillotine/fetchFromApi.ts +69 -0
- package/src/guillotine/fetchGuillotine.ts +61 -0
- package/src/guillotine/fetchMetaData.ts +32 -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 +58 -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.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.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,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
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
|
|
3
|
+
export type * from './component';
|
|
4
|
+
export type * from './componentProps';
|
|
5
|
+
export type * from './guillotine';
|
|
6
|
+
export type * from './i18n';
|
|
7
|
+
export type * from './next';
|
|
8
|
+
export type * from './util';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
// Shape of content base-data API body
|
|
12
|
+
export interface ContentApiBaseBody {
|
|
13
|
+
query?: string, // Override the default base-data query
|
|
14
|
+
variables?: { // GraphQL variables inserted into the query
|
|
15
|
+
path?: string, // Full content item _path
|
|
16
|
+
[key: string]: string | number | undefined,
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface ContentPathItem {
|
|
21
|
+
contentPath: string[]
|
|
22
|
+
locale: string,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export interface PathFragment {
|
|
26
|
+
index: number
|
|
27
|
+
region: string
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface PreviewParams {
|
|
31
|
+
contentPath: string[]
|
|
32
|
+
headers: Record<string, string>
|
|
33
|
+
params: Record<string, string>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface ProjectLocaleConfig {
|
|
37
|
+
default: boolean
|
|
38
|
+
project: string
|
|
39
|
+
site: string
|
|
40
|
+
locale: string
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type ProjectLocalesConfig = Record<string, ProjectLocaleConfig>;
|
|
44
|
+
|
|
45
|
+
export type SelectorName = 'contentType' | 'page' | 'component' | 'part' | 'layout' | 'macro';
|
|
46
|
+
|
|
47
|
+
export interface ServerSideParams
|
|
48
|
+
extends NodeJS.Dict<string | string[]> {
|
|
49
|
+
// String array catching a sub-path assumed to match the site-relative path of an XP content.
|
|
50
|
+
contentPath?: string[];
|
|
51
|
+
mode?: string;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface StaticContentProps extends Record<string, any> {
|
|
55
|
+
children?: React.ReactNode;
|
|
56
|
+
element?: string;
|
|
57
|
+
condition: boolean;
|
|
58
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type {Context, GuillotineRequestHeaders} from '../types';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
GUILLOTINE_REQUEST_HEADERS,
|
|
6
|
+
JSESSIONID_HEADER,
|
|
7
|
+
} from '../common/constants';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
export function buildGuillotineRequestHeaders({
|
|
11
|
+
context,
|
|
12
|
+
defaultLocale,
|
|
13
|
+
locale,
|
|
14
|
+
locales,
|
|
15
|
+
}: {
|
|
16
|
+
context: Context
|
|
17
|
+
defaultLocale: string
|
|
18
|
+
locale: string
|
|
19
|
+
locales: string[]
|
|
20
|
+
}): GuillotineRequestHeaders {
|
|
21
|
+
const guillotineRequestHeaders: GuillotineRequestHeaders = {
|
|
22
|
+
[GUILLOTINE_REQUEST_HEADERS.DEFAULT_LOCALE]: defaultLocale,
|
|
23
|
+
[GUILLOTINE_REQUEST_HEADERS.LOCALE]: locale,
|
|
24
|
+
[GUILLOTINE_REQUEST_HEADERS.LOCALES]: JSON.stringify(locales),
|
|
25
|
+
};
|
|
26
|
+
const jsessionid = context.headers?.get(JSESSIONID_HEADER);
|
|
27
|
+
if (jsessionid) {
|
|
28
|
+
guillotineRequestHeaders[GUILLOTINE_REQUEST_HEADERS.COOKIE] =
|
|
29
|
+
`${JSESSIONID_HEADER}=${jsessionid}`;
|
|
30
|
+
}
|
|
31
|
+
return guillotineRequestHeaders;
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const commonChars = (s1?: string, s2?: string) => {
|
|
2
|
+
let result = '';
|
|
3
|
+
if (!s1 || s1.length === 0 || !s2 || s2.length === 0) {
|
|
4
|
+
return result;
|
|
5
|
+
}
|
|
6
|
+
for (let i = 0; i < s1.length; i++) {
|
|
7
|
+
const s1Element = s1[i];
|
|
8
|
+
if (s2[i] === s1Element) {
|
|
9
|
+
result += s1Element;
|
|
10
|
+
} else {
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type {Context} from '../types';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import {RENDER_MODE} from '../common/constants';
|
|
5
|
+
import {API_URL} from '../common/env';
|
|
6
|
+
import {getProjectLocaleConfig} from './getProjectLocaleConfig';
|
|
7
|
+
import {fixDoubleSlashes} from './fixDoubleSlashes';
|
|
8
|
+
import {getRenderMode} from './getRenderMode';
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
export function getContentApiUrl(context: Context): string {
|
|
12
|
+
const project = getProjectLocaleConfig(context).project;
|
|
13
|
+
const branch = getRenderMode(context) === RENDER_MODE.NEXT
|
|
14
|
+
? 'master'
|
|
15
|
+
: getRenderMode(context) === RENDER_MODE.LIVE
|
|
16
|
+
? 'master'
|
|
17
|
+
: 'draft';
|
|
18
|
+
|
|
19
|
+
return fixDoubleSlashes(`${API_URL}/${project}/${branch}`);
|
|
20
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type {Context, ProjectLocaleConfig} from '../types';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import {PROJECT_ID_HEADER} from '../common/constants';
|
|
5
|
+
import {getProjectLocaleConfigById} from './getProjectLocaleConfigById';
|
|
6
|
+
import {getProjectLocaleConfigByLocale} from './getProjectLocaleConfigByLocale';
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
export function getProjectLocaleConfig(context: Context): ProjectLocaleConfig {
|
|
10
|
+
const projectId = context.headers?.get(PROJECT_ID_HEADER);
|
|
11
|
+
|
|
12
|
+
let config: ProjectLocaleConfig;
|
|
13
|
+
if (projectId) {
|
|
14
|
+
// first use project id header
|
|
15
|
+
config = getProjectLocaleConfigById(projectId, false);
|
|
16
|
+
}
|
|
17
|
+
if (!config) {
|
|
18
|
+
// next try to use locale from url
|
|
19
|
+
// it will fall back to default locale if not found
|
|
20
|
+
config = getProjectLocaleConfigByLocale(context.locale);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return config;
|
|
24
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type {ProjectLocaleConfig} from '../types';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import {getProjectLocaleConfigs} from './getProjectLocaleConfigs';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export function getProjectLocaleConfigById(projectId?: string, useDefault = true): ProjectLocaleConfig {
|
|
8
|
+
const configs = getProjectLocaleConfigs();
|
|
9
|
+
|
|
10
|
+
let config: ProjectLocaleConfig;
|
|
11
|
+
if (projectId) {
|
|
12
|
+
config = Object.values(configs).find(p => {
|
|
13
|
+
return p?.project?.toLowerCase() === projectId.toLowerCase();
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
if (!config && useDefault) {
|
|
17
|
+
config = Object.values(configs).find(c => c.default);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return config;
|
|
21
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type {ProjectLocaleConfig} from '../types';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import {getProjectLocaleConfigs} from './getProjectLocaleConfigs';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export function getProjectLocaleConfigByLocale(locale?: string, useDefault = true): ProjectLocaleConfig {
|
|
8
|
+
const configs = getProjectLocaleConfigs();
|
|
9
|
+
|
|
10
|
+
let config: ProjectLocaleConfig;
|
|
11
|
+
if (locale) {
|
|
12
|
+
config = configs[locale];
|
|
13
|
+
}
|
|
14
|
+
if (!config && useDefault) {
|
|
15
|
+
config = Object.values(configs).find(c => c.default);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return config;
|
|
19
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type {ProjectLocalesConfig} from '../types';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import {ENV_VARS} from '../common/constants';
|
|
5
|
+
import {PROJECTS} from '../common/env';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
// NOTE: Dissallowing slash and any whitespace in 2nd capture group.
|
|
9
|
+
const PROJECT_CONFIG_REGEXP = /^([\w-]+):([^/\s]+)(\/[\w.-]+)?$/i;
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export function getProjectLocaleConfigs(): ProjectLocalesConfig {
|
|
13
|
+
const str = PROJECTS;
|
|
14
|
+
if (!str?.length) {
|
|
15
|
+
throw new Error(`Did you forget to define "${ENV_VARS.PROJECTS}" environmental variable?
|
|
16
|
+
Format: <default-language>:<default-repository-name>/<default-site-path>,<language>:<repository-name>/<site-path>,...`);
|
|
17
|
+
}
|
|
18
|
+
return str.split(',').reduce((config, prjStr, index: number) => {
|
|
19
|
+
const trimmedprjStr = prjStr.trim();
|
|
20
|
+
if (!trimmedprjStr.length) {
|
|
21
|
+
return config;
|
|
22
|
+
}
|
|
23
|
+
const matches: RegExpExecArray = PROJECT_CONFIG_REGEXP.exec(trimmedprjStr);
|
|
24
|
+
if (!matches?.length) {
|
|
25
|
+
throw new Error(`Project "${prjStr}" doesn't match format: <default-language>:<default-repository-name>/<default-site-path>,<language>:<repository-name>/<site-path>`);
|
|
26
|
+
}
|
|
27
|
+
const [_full, lang, project, site] = matches;
|
|
28
|
+
config[lang] = {
|
|
29
|
+
default: index === 0,
|
|
30
|
+
project,
|
|
31
|
+
site,
|
|
32
|
+
locale: lang,
|
|
33
|
+
};
|
|
34
|
+
return config;
|
|
35
|
+
}, {});
|
|
36
|
+
}
|