@nascentdigital/funnel-editor-contentful 5.0.1 → 5.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/EditorApp.js +11 -9
  2. package/dist/EditorPageRouter.d.ts +1 -0
  3. package/dist/EditorPageRouter.js +40 -0
  4. package/dist/EntryEditor.js +30 -29
  5. package/dist/EntrySidebar.js +1 -1
  6. package/dist/asset/index.d.ts +1 -0
  7. package/dist/{core/api → asset}/index.js +1 -3
  8. package/dist/{core → asset}/repository/AssetRepository.js +3 -3
  9. package/dist/asset/repository/index.d.ts +1 -0
  10. package/dist/asset/repository/index.js +17 -0
  11. package/dist/collection/controller/{LocalCollectionController.d.ts → ContentfulCollectionController.d.ts} +17 -11
  12. package/dist/collection/controller/ContentfulCollectionController.js +278 -0
  13. package/dist/collection/controller/ContentfulCollectionControllerContainer.d.ts +5 -0
  14. package/dist/collection/controller/ContentfulCollectionControllerContainer.js +28 -0
  15. package/dist/collection/controller/index.d.ts +3 -4
  16. package/dist/collection/controller/index.js +3 -4
  17. package/dist/collection/controller/useContentfulCollectionController.d.ts +2 -0
  18. package/dist/collection/controller/useContentfulCollectionController.js +8 -0
  19. package/dist/{core → collection}/domain/Collection.d.ts +11 -2
  20. package/dist/{core → collection}/domain/Collection.js +75 -0
  21. package/dist/{core → collection}/domain/index.d.ts +0 -1
  22. package/dist/{core → collection}/domain/index.js +0 -1
  23. package/dist/collection/index.d.ts +1 -0
  24. package/dist/collection/index.js +1 -0
  25. package/dist/collection/repository/CollectionRepository.d.ts +49 -0
  26. package/dist/collection/repository/CollectionRepository.js +210 -0
  27. package/dist/collection/repository/index.d.ts +1 -0
  28. package/dist/collection/repository/index.js +17 -0
  29. package/dist/collection/screens/CollectionEditor.js +23 -6
  30. package/dist/core/client/ContentfulClientContainer.d.ts +8 -0
  31. package/dist/core/client/ContentfulClientContainer.js +43 -0
  32. package/dist/core/client/ContentfulClientContext.d.ts +8 -0
  33. package/dist/core/client/ContentfulClientContext.js +8 -0
  34. package/dist/core/client/index.d.ts +3 -0
  35. package/dist/core/client/index.js +19 -0
  36. package/dist/core/client/useContentfulClient.d.ts +4 -0
  37. package/dist/core/client/useContentfulClient.js +24 -0
  38. package/dist/core/contentful/ContentfulAsset.d.ts +3 -3
  39. package/dist/core/contentful/ContentfulAsset.js +5 -4
  40. package/dist/core/contentful/ContentfulCollection.d.ts +1 -1
  41. package/dist/core/contentful/ContentfulRefs.js +9 -9
  42. package/dist/core/index.d.ts +1 -2
  43. package/dist/core/index.js +1 -2
  44. package/dist/core/repository/CollectionSerializer.d.ts +1 -1
  45. package/dist/core/repository/CollectionSerializer.js +1 -1
  46. package/dist/core/repository/LocalCollectionRepository.d.ts +2 -2
  47. package/dist/core/repository/LocalPageRepository.d.ts +1 -1
  48. package/dist/core/repository/PageSerializer.d.ts +1 -1
  49. package/dist/core/repository/PageSerializer.js +2 -1
  50. package/dist/core/repository/RemoteCollectionRepository.d.ts +2 -2
  51. package/dist/core/repository/index.d.ts +0 -1
  52. package/dist/core/repository/index.js +0 -1
  53. package/dist/explore/components/Header.d.ts +26 -0
  54. package/dist/explore/components/Header.js +31 -0
  55. package/dist/explore/components/index.d.ts +1 -0
  56. package/dist/explore/components/index.js +17 -0
  57. package/dist/explore/index.d.ts +1 -0
  58. package/dist/explore/index.js +17 -0
  59. package/dist/explore/screens/Dashboard.d.ts +1 -0
  60. package/dist/explore/screens/Dashboard.js +22 -0
  61. package/dist/explore/screens/PageExplorer.d.ts +1 -0
  62. package/dist/explore/screens/PageExplorer.js +9 -0
  63. package/dist/explore/screens/SiteExplorer.d.ts +1 -0
  64. package/dist/explore/screens/SiteExplorer.js +24 -0
  65. package/dist/explore/screens/index.d.ts +3 -0
  66. package/dist/explore/screens/index.js +19 -0
  67. package/dist/page/controller/{LocalPageController.d.ts → ContentfulPageController.d.ts} +15 -9
  68. package/dist/page/controller/ContentfulPageController.js +277 -0
  69. package/dist/page/controller/ContentfulPageControllerContainer.d.ts +5 -0
  70. package/dist/page/controller/ContentfulPageControllerContainer.js +28 -0
  71. package/dist/page/controller/index.d.ts +3 -3
  72. package/dist/page/controller/index.js +3 -3
  73. package/dist/page/controller/useContentfulPageController.d.ts +2 -0
  74. package/dist/page/controller/useContentfulPageController.js +8 -0
  75. package/dist/{core → page}/domain/Page.d.ts +22 -11
  76. package/dist/{core → page}/domain/Page.js +138 -0
  77. package/dist/page/domain/index.d.ts +1 -0
  78. package/dist/page/domain/index.js +17 -0
  79. package/dist/page/index.d.ts +2 -0
  80. package/dist/page/index.js +2 -0
  81. package/dist/page/repository/PageRepository.d.ts +45 -0
  82. package/dist/page/repository/PageRepository.js +224 -0
  83. package/dist/page/repository/index.d.ts +1 -0
  84. package/dist/page/repository/index.js +17 -0
  85. package/dist/page/screens/PageEditor.js +23 -7
  86. package/package.json +8 -4
  87. package/dist/collection/controller/LocalCollectionController.js +0 -200
  88. package/dist/collection/controller/LocalCollectionControllerContainer.d.ts +0 -8
  89. package/dist/collection/controller/LocalCollectionControllerContainer.js +0 -36
  90. package/dist/collection/controller/LocalCollectionControllerContext.d.ts +0 -7
  91. package/dist/collection/controller/LocalCollectionControllerContext.js +0 -6
  92. package/dist/collection/controller/useLocalCollectionController.d.ts +0 -2
  93. package/dist/collection/controller/useLocalCollectionController.js +0 -10
  94. package/dist/core/api/EditorApiClient.d.ts +0 -7
  95. package/dist/core/api/EditorApiClient.js +0 -29
  96. package/dist/core/api/EditorApiContainer.d.ts +0 -5
  97. package/dist/core/api/EditorApiContainer.js +0 -16
  98. package/dist/core/api/EditorApiContext.d.ts +0 -7
  99. package/dist/core/api/EditorApiContext.js +0 -6
  100. package/dist/core/api/index.d.ts +0 -3
  101. package/dist/core/api/useEditorApi.d.ts +0 -2
  102. package/dist/core/api/useEditorApi.js +0 -12
  103. package/dist/page/controller/LocalPageController.js +0 -190
  104. package/dist/page/controller/LocalPageControllerContainer.d.ts +0 -8
  105. package/dist/page/controller/LocalPageControllerContainer.js +0 -36
  106. package/dist/page/controller/LocalPageControllerContext.d.ts +0 -7
  107. package/dist/page/controller/LocalPageControllerContext.js +0 -6
  108. package/dist/page/controller/useLocalPageController.d.ts +0 -2
  109. package/dist/page/controller/useLocalPageController.js +0 -10
  110. /package/dist/{core → asset}/repository/AssetRepository.d.ts +0 -0
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentfulPageController = void 0;
4
+ const funnel_core_1 = require("@nascentdigital/funnel-core");
5
+ const components_1 = require("@nascentdigital/funnel-editor/components");
6
+ const rxjs_1 = require("rxjs");
7
+ // class
8
+ class ContentfulPageController {
9
+ constructor(args) {
10
+ // initialize instance variables
11
+ this.pageRepository = args.pageRepository;
12
+ this._eventBus = new funnel_core_1.EventBus();
13
+ this._state = 'uninitialized';
14
+ }
15
+ get events$() {
16
+ return this._eventBus.events$.pipe((0, rxjs_1.filter)((e) => components_1.IPageController.Event.filter(e) || components_1.IPage.Event.filter(e)));
17
+ }
18
+ get saved$() {
19
+ return this._eventBus.events$.pipe((0, rxjs_1.filter)(components_1.IPageController.StateChangedEvent.filter), (0, rxjs_1.pairwise)(), (0, rxjs_1.filter)(([previous, current]) => previous.state === 'saving' && current.state === 'ready'));
20
+ }
21
+ get state() {
22
+ return this._state;
23
+ }
24
+ set state(value) {
25
+ // skip if unchanged
26
+ if (this._state === value) {
27
+ return;
28
+ }
29
+ // or update
30
+ this._state = value;
31
+ // raise event
32
+ this._eventBus.publish(components_1.IPageController.StateChangedEvent.create({
33
+ state: value,
34
+ controller: this
35
+ }));
36
+ // process queues if ready (might be noop)
37
+ if (value === 'ready') {
38
+ this.processQueues().catch(console.error);
39
+ }
40
+ }
41
+ get ready() {
42
+ const { _state } = this;
43
+ return _state !== 'uninitialized' && _state !== 'initializing';
44
+ }
45
+ get languages() {
46
+ var _a, _b;
47
+ return (_b = (_a = this._pageSummary) === null || _a === void 0 ? void 0 : _a.pages.map(page => page.language)) !== null && _b !== void 0 ? _b : [];
48
+ }
49
+ get pageSummary() {
50
+ return this._pageSummary;
51
+ }
52
+ set pageSummary(pageSummary) {
53
+ // skip if summary is the same
54
+ if (this._pageSummary === pageSummary) {
55
+ return;
56
+ }
57
+ // update summary
58
+ this._pageSummary = pageSummary;
59
+ // raise event
60
+ this.raiseEvent('pageSummary.changed');
61
+ }
62
+ get page() {
63
+ return this._page;
64
+ }
65
+ set page(page) {
66
+ // skip if page is the same
67
+ if (this._page === page) {
68
+ console.debug('[ContentfulPageController/setPage] skipping page set, same instance');
69
+ return;
70
+ }
71
+ // unbind previous page subscription (if any)
72
+ if (this._pageSubscription) {
73
+ this._pageSubscription.unsubscribe();
74
+ delete this._pageSubscription;
75
+ }
76
+ console.debug('[ContentfulPageController/setPage] new page instance set');
77
+ // update page
78
+ this._page = page;
79
+ // subscribe to page changes
80
+ if (page) {
81
+ // subscribe to page events
82
+ this._pageSubscription = page.events$
83
+ .pipe((0, rxjs_1.filter)(e => {
84
+ // handle page events
85
+ if (components_1.IPage.Event.filter(e)) {
86
+ return e.type === 'modified';
87
+ }
88
+ // or item/object/list events
89
+ else if (components_1.Item.Event.filter(e)
90
+ || components_1.Item.Event.filter(e)
91
+ || funnel_core_1.ObjectField.Event.filter(e)
92
+ || funnel_core_1.FieldList.Event.filter(e)) {
93
+ return e.type === 'changed';
94
+ }
95
+ // or field
96
+ else {
97
+ return funnel_core_1.Field.Event.filter(e) && (e.type === 'changed' || e.type === 'reset');
98
+ }
99
+ }), (0, rxjs_1.debounce)(e => {
100
+ return (0, rxjs_1.interval)(1000);
101
+ }))
102
+ .subscribe(async (e) => {
103
+ if (page.modified && this._page === page) {
104
+ await this.save(page);
105
+ }
106
+ });
107
+ }
108
+ // raise state change
109
+ this.raiseEvent('page.changed');
110
+ }
111
+ get pageSys() {
112
+ return this._pageSys;
113
+ }
114
+ set pageSys(sys) {
115
+ this._pageSys = sys;
116
+ }
117
+ async sync(updatedSys) {
118
+ // skip if there's no active page/sys
119
+ const { page, pageSys, state, pageRepository } = this;
120
+ if (!page || !pageSys) {
121
+ console.warn('[ContentfulPageController/sync] ignoring update before initial load');
122
+ return;
123
+ }
124
+ // or skip if page version is unchanged
125
+ else if (page.id === updatedSys.id && pageSys.version >= updatedSys.version) {
126
+ console.debug('[ContentfulPageController/sync] ignoring update - current version is fresh');
127
+ return;
128
+ }
129
+ // or ignore if booting up
130
+ else if (state === 'uninitialized' || state === 'initializing' || state === 'loading') {
131
+ console.debug('[ContentfulPageController/sync] ignoring sync while loading');
132
+ return;
133
+ }
134
+ // or queue if saving
135
+ else if (this.state === 'saving') {
136
+ console.debug('[ContentfulPageController/sync] queueing page sync - updated while saving');
137
+ this._queuedSync = updatedSys;
138
+ return;
139
+ }
140
+ // try to sync
141
+ try {
142
+ console.debug('[ContentfulPageController/sync] starting sync');
143
+ // update state
144
+ this.state = 'loading';
145
+ // perform sync
146
+ const result = await pageRepository.sync({ page, sys: updatedSys });
147
+ // update sys
148
+ this.pageSys = result.sys;
149
+ // update page (if unchanged)
150
+ if (this.page !== result.page) {
151
+ this.page = result.page;
152
+ }
153
+ // update summary (if any)
154
+ if (result.pageSummary) {
155
+ this.pageSummary = result.pageSummary;
156
+ }
157
+ console.debug('[ContentfulPageController/sync] sync complete');
158
+ // clear state
159
+ this.state = 'ready';
160
+ }
161
+ // catch error
162
+ catch (e) {
163
+ console.error('[ContentfulPageController/sync] sync failed', e);
164
+ this.state = 'error';
165
+ }
166
+ }
167
+ async load() {
168
+ // mark as loading (or initialing if loading for first time)
169
+ this.state = this._state === 'uninitialized'
170
+ ? 'initializing'
171
+ : 'loading';
172
+ // try to load page
173
+ try {
174
+ // fetch page
175
+ const { pageSummary, page, sys } = await this.pageRepository.load();
176
+ console.debug('[ContentfulPageController/load] fetched page', { pageSummary, page, sys });
177
+ // set page/summary
178
+ this.pageSummary = pageSummary;
179
+ this.page = page;
180
+ this._pageSys = sys;
181
+ // update state
182
+ this.state = 'ready';
183
+ }
184
+ // handle error
185
+ catch (e) {
186
+ console.error('[ContentfulPageController/load] failed to load page', e);
187
+ // set error state
188
+ this.state = 'error';
189
+ }
190
+ }
191
+ async create(target) {
192
+ throw new funnel_core_1.NotImplementedError();
193
+ }
194
+ async save(page) {
195
+ // ignore if not ready
196
+ if (this._state !== 'ready') {
197
+ console.debug(`[ContentfulPageController/save] queuing save while in "${this._state}" state`);
198
+ this._queuedSave = page;
199
+ return;
200
+ }
201
+ // clear save if queued
202
+ delete this._queuedSave;
203
+ // skip if page isn't modified
204
+ if (!page.modified) {
205
+ console.debug('[ContentfulPageController/save] ignore unmodified page');
206
+ return;
207
+ }
208
+ // try to save page
209
+ try {
210
+ console.debug('[ContentfulPageController/save] starting save');
211
+ // mark as syncing
212
+ page.syncing = true;
213
+ // update state
214
+ this.state = 'saving';
215
+ // save page
216
+ this.page = await this.pageRepository.save(page);
217
+ // update state
218
+ this.state = 'ready';
219
+ console.debug('[ContentfulPageController/save] save finished');
220
+ }
221
+ // handle error
222
+ catch (e) {
223
+ console.error('[ContentfulPageController/save] save failed', e);
224
+ // update state
225
+ this.state = 'error';
226
+ }
227
+ // complete
228
+ finally {
229
+ page.syncing = false;
230
+ }
231
+ }
232
+ async reload() {
233
+ throw new funnel_core_1.NotImplementedError();
234
+ }
235
+ async unpublish() {
236
+ throw new funnel_core_1.NotImplementedError();
237
+ }
238
+ async processQueues() {
239
+ // try to save (if queued)
240
+ const { _queuedSave, _page } = this;
241
+ if (_queuedSave) {
242
+ // nuke if page differs (keep going afterward)
243
+ if (_page !== _queuedSave) {
244
+ console.debug('[ContentfulPageController/processQueues] ignoring queued save for old page');
245
+ delete this._queuedSave;
246
+ }
247
+ // otherwise, try to save
248
+ else {
249
+ console.debug('[ContentfulPageController/processQueues] restarting queued save');
250
+ // save
251
+ this.save(_page).catch(console.error);
252
+ // stop processing
253
+ return;
254
+ }
255
+ }
256
+ // try to sync
257
+ const { _queuedSync, _pageSys } = this;
258
+ if (_queuedSync) {
259
+ // clear sync
260
+ delete this._queuedSync;
261
+ // reload if entity is different
262
+ if (_queuedSync.id !== (_pageSys === null || _pageSys === void 0 ? void 0 : _pageSys.id)) {
263
+ console.debug('[ContentfulPageController/processQueues] reloading on entity change');
264
+ this.load().catch(console.error);
265
+ }
266
+ // otherwise, try to sync
267
+ else {
268
+ console.debug('[ContentfulPageController/processQueues] retrying sync');
269
+ this.sync(_queuedSync).catch(console.error);
270
+ }
271
+ }
272
+ }
273
+ raiseEvent(type) {
274
+ this._eventBus.publish(components_1.IPageController.Event.create({ type, controller: this }));
275
+ }
276
+ }
277
+ exports.ContentfulPageController = ContentfulPageController;
@@ -0,0 +1,5 @@
1
+ import { PropsWithChildren } from 'react';
2
+ export declare function ContentfulPageControllerContainer({ children }: PageControllerContainer.Props): import("react/jsx-runtime").JSX.Element;
3
+ export declare namespace PageControllerContainer {
4
+ type Props = PropsWithChildren;
5
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentfulPageControllerContainer = ContentfulPageControllerContainer;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_apps_toolkit_1 = require("@contentful/react-apps-toolkit");
6
+ const components_1 = require("@nascentdigital/funnel-editor/components");
7
+ const react_1 = require("react");
8
+ const ContentfulPageController_1 = require("./ContentfulPageController");
9
+ // container
10
+ function ContentfulPageControllerContainer({ children }) {
11
+ // bind context
12
+ const pageRepository = (0, components_1.usePageRepository)();
13
+ const sdk = (0, react_apps_toolkit_1.useSDK)();
14
+ const context = (0, react_1.useMemo)(() => ({
15
+ controller: new ContentfulPageController_1.ContentfulPageController({ pageRepository })
16
+ }), [pageRepository]);
17
+ // listen to page changes
18
+ (0, react_1.useEffect)(() => {
19
+ // get controller
20
+ const { controller } = context;
21
+ // sync on change (return unsubscribe)
22
+ return sdk.entry.onSysChanged(sys => {
23
+ controller.sync(sys).catch(console.error);
24
+ });
25
+ }, [sdk, context]);
26
+ // render
27
+ return ((0, jsx_runtime_1.jsx)(components_1.PageControllerContext.Provider, { value: context, children: children }));
28
+ }
@@ -1,3 +1,3 @@
1
- export * from './LocalPageController';
2
- export * from './LocalPageControllerContainer';
3
- export * from './useLocalPageController';
1
+ export * from './ContentfulPageController';
2
+ export * from './ContentfulPageControllerContainer';
3
+ export * from './useContentfulPageController';
@@ -14,6 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./LocalPageController"), exports);
18
- __exportStar(require("./LocalPageControllerContainer"), exports);
19
- __exportStar(require("./useLocalPageController"), exports);
17
+ __exportStar(require("./ContentfulPageController"), exports);
18
+ __exportStar(require("./ContentfulPageControllerContainer"), exports);
19
+ __exportStar(require("./useContentfulPageController"), exports);
@@ -0,0 +1,2 @@
1
+ import { ContentfulPageController } from './ContentfulPageController';
2
+ export declare function useContentfulPageController(): ContentfulPageController;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useContentfulPageController = useContentfulPageController;
4
+ const components_1 = require("@nascentdigital/funnel-editor/components");
5
+ // hook
6
+ function useContentfulPageController() {
7
+ return (0, components_1.usePageController)();
8
+ }
@@ -1,4 +1,5 @@
1
- import { AssetClient } from '@nascentdigital/funnel-cms';
1
+ import { AssetClient, PageClient } from '@nascentdigital/funnel-cms';
2
+ import { ContentfulData, ContentfulPageData } from '@nascentdigital/funnel-cms/contentful';
2
3
  import { EventBus, FieldModel, Language, Schema } from '@nascentdigital/funnel-core';
3
4
  import { Asset, Block, IPage, PageSettings, Section, SectionBlock } from '@nascentdigital/funnel-editor/components';
4
5
  import { Observable } from 'rxjs';
@@ -35,6 +36,7 @@ export declare class Page implements IPage {
35
36
  private _syncing;
36
37
  private readonly _subscription;
37
38
  private _savingOn?;
39
+ readonly references: ReadonlyArray<ContentfulData.Link.Entry | ContentfulData.Link.Asset>;
38
40
  constructor(args: Page.ConstructorArgs);
39
41
  get events$(): Observable<IPage.Events>;
40
42
  get stable$(): Observable<boolean>;
@@ -75,6 +77,7 @@ export declare class Page implements IPage {
75
77
  get items(): Array<Block | Section>;
76
78
  get assets(): Asset[];
77
79
  get collections(): ReadonlyArray<Schema.Collection.Data.AsLink>;
80
+ get pages(): ReadonlyArray<Schema.Page.Data.AsRef>;
78
81
  get initialTags(): ReadonlySet<Schema.Tag<string, string>>;
79
82
  get tagGroups(): ReadonlyArray<Schema.TagGroup>;
80
83
  get tags(): ReadonlySet<Schema.Tag>;
@@ -101,6 +104,17 @@ export declare class Page implements IPage {
101
104
  private raiseEvent;
102
105
  }
103
106
  export declare namespace Page {
107
+ type Blocks = Block[];
108
+ type Content = Array<Block | Section>;
109
+ type Errors = {
110
+ page: Page;
111
+ items: Array<Block | Section>;
112
+ };
113
+ type Changes = {
114
+ page: Page;
115
+ items: Array<Block | Section>;
116
+ };
117
+ type Target = Block | SectionBlock | Section | FieldModel;
104
118
  type ConstructorArgs = {
105
119
  template: Schema.Page;
106
120
  eventBus: EventBus;
@@ -124,16 +138,13 @@ export declare namespace Page {
124
138
  updatedOn: number;
125
139
  publishedOn?: number;
126
140
  publication?: number;
141
+ references: ContentfulData.References;
127
142
  };
128
- type Blocks = Block[];
129
- type Content = Array<Block | Section>;
130
- type Errors = {
131
- page: Page;
132
- items: Array<Block | Section>;
143
+ type FromSchemaData = {
144
+ data: ContentfulPageData.ForSchema;
145
+ references?: Schema.Page.References;
146
+ eventBus?: EventBus;
133
147
  };
134
- type Changes = {
135
- page: Page;
136
- items: Array<Block | Section>;
137
- };
138
- type Target = Block | SectionBlock | Section | FieldModel;
148
+ function fromSchemaData({ data, references, eventBus }: FromSchemaData): Page;
149
+ function toUpdates(page: Page, savables: IPage.Savable[]): PageClient.Update.Args;
139
150
  }
@@ -1,4 +1,15 @@
1
1
  "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
2
13
  Object.defineProperty(exports, "__esModule", { value: true });
3
14
  exports.Page = void 0;
4
15
  const funnel_core_1 = require("@nascentdigital/funnel-core");
@@ -33,6 +44,7 @@ class Page {
33
44
  this._collections = (_c = args.collections) !== null && _c !== void 0 ? _c : [];
34
45
  this._initialTags = new Set(args.tags);
35
46
  this._tags = new Set(args.tags);
47
+ this.references = args.references;
36
48
  this._deletedBlocks = [];
37
49
  this._syncing = false;
38
50
  // bind content
@@ -253,6 +265,9 @@ class Page {
253
265
  get collections() {
254
266
  return this._collections;
255
267
  }
268
+ get pages() {
269
+ return this._pages;
270
+ }
256
271
  get initialTags() {
257
272
  return this._initialTags;
258
273
  }
@@ -491,3 +506,126 @@ class Page {
491
506
  }
492
507
  }
493
508
  exports.Page = Page;
509
+ // extension
510
+ (function (Page) {
511
+ function fromSchemaData({ data, references, eventBus }) {
512
+ // setup
513
+ const { snapshot, discover, content, tags } = data, pageArgs = __rest(data, ["snapshot", "discover", "content", "tags"]);
514
+ const { files = {}, collections = {}, pages = {} } = references !== null && references !== void 0 ? references : {};
515
+ const { discover: discoverSnapshot = {}, content: contentSnapshot = {} } = snapshot !== null && snapshot !== void 0 ? snapshot : {};
516
+ const template = funnel_core_1.Schema.Site.getPage(data.type, data.region);
517
+ eventBus = eventBus !== null && eventBus !== void 0 ? eventBus : new funnel_core_1.EventBus();
518
+ // create page
519
+ return new Page(Object.assign(Object.assign({}, pageArgs), { eventBus,
520
+ template, tags: components_1.TagSerializer.deserializeTags({
521
+ groups: template.tags,
522
+ tagsData: tags !== null && tags !== void 0 ? tags : []
523
+ }), discover: [
524
+ components_1.PageSerializer.deserializeBlock({
525
+ schema: funnel_core_1.Schema.Seo,
526
+ eventBus,
527
+ key: 'seo',
528
+ content: discover['seo'],
529
+ snapshot: discoverSnapshot['seo']
530
+ })
531
+ ], content: Object.entries(template.content).map(([key, schema]) => components_1.PageSerializer.deserializeContent({
532
+ key,
533
+ schema: schema.unwrap(),
534
+ eventBus,
535
+ content: content[key],
536
+ snapshot: contentSnapshot[key],
537
+ })), files: Object.values(files), collections: Object.values(collections), pages: Object.values(pages) }));
538
+ }
539
+ Page.fromSchemaData = fromSchemaData;
540
+ function toUpdates(page, savables) {
541
+ var _a, _b;
542
+ // root page updates
543
+ const { id, discover, content } = page;
544
+ const rootPageUpdates = [];
545
+ // name
546
+ if (page.initialName !== page.name) {
547
+ rootPageUpdates.push({
548
+ type: 'page',
549
+ property: 'name',
550
+ value: page.name
551
+ });
552
+ }
553
+ // tags
554
+ if (page.initialTags.symmetricDifference(page.tags).size > 0) {
555
+ rootPageUpdates.push({
556
+ type: 'page',
557
+ property: 'tags',
558
+ value: Array.from(page.tags).map(tag => tag.data)
559
+ });
560
+ }
561
+ // slug + url
562
+ if (page.initialSlug !== page.slug) {
563
+ rootPageUpdates.push({
564
+ type: 'page',
565
+ property: 'slug',
566
+ value: (_a = page.slug) !== null && _a !== void 0 ? _a : null
567
+ });
568
+ rootPageUpdates.push({
569
+ type: 'page',
570
+ property: 'url',
571
+ value: page.url
572
+ });
573
+ }
574
+ // preview
575
+ const previewBlock = page.getPreviewBlock();
576
+ if (previewBlock && previewBlock.modified) {
577
+ rootPageUpdates.push({
578
+ type: 'page',
579
+ property: 'preview',
580
+ value: previewBlock.value
581
+ });
582
+ }
583
+ // errors
584
+ if (page.initialErrors !== !page.valid) {
585
+ rootPageUpdates.push({
586
+ type: 'page',
587
+ property: 'errors',
588
+ value: !page.valid
589
+ });
590
+ }
591
+ // publication
592
+ if (page.initialPublication !== page.publication) {
593
+ rootPageUpdates.push({
594
+ type: 'page',
595
+ property: 'publication',
596
+ value: (_b = page.publication) !== null && _b !== void 0 ? _b : null
597
+ });
598
+ }
599
+ // aggregate other updates
600
+ return {
601
+ id,
602
+ updatedOn: page.updatedOn,
603
+ updates: [
604
+ ...rootPageUpdates,
605
+ ...discover.reduce((updates, block) => {
606
+ // try to update block
607
+ components_1.SerializePageUpdate.serializeBlockUpdate(updates, block, 'discover', savables);
608
+ // keep reducing
609
+ return updates;
610
+ }, []),
611
+ ...content.reduce((updates, item) => {
612
+ // handle block
613
+ if (item instanceof components_1.Block) {
614
+ components_1.SerializePageUpdate.serializeBlockUpdate(updates, item, 'content', savables);
615
+ }
616
+ // or section
617
+ else {
618
+ components_1.SerializePageUpdate.serializeSectionUpdate(updates, item, 'content', savables);
619
+ }
620
+ // keep reducing
621
+ return updates;
622
+ }, []),
623
+ ...page.deleteBlocks.map(block => ({
624
+ type: 'block.delete',
625
+ path: [block.area, block.key]
626
+ }))
627
+ ]
628
+ };
629
+ }
630
+ Page.toUpdates = toUpdates;
631
+ })(Page || (exports.Page = Page = {}));
@@ -0,0 +1 @@
1
+ export * from './Page';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Page"), exports);
@@ -1,2 +1,4 @@
1
+ export * from './domain';
2
+ export * from './repository';
1
3
  export * from './screens';
2
4
  export * from './controller';
@@ -14,5 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./domain"), exports);
18
+ __exportStar(require("./repository"), exports);
17
19
  __exportStar(require("./screens"), exports);
18
20
  __exportStar(require("./controller"), exports);
@@ -0,0 +1,45 @@
1
+ import { EditorAppSDK, EntrySys } from '@contentful/app-sdk';
2
+ import { ContentfulContentClient } from '@nascentdigital/funnel-cms/contentful';
3
+ import { Schema } from '@nascentdigital/funnel-core';
4
+ import { IPage, IPageRepository, PageSummary } from '@nascentdigital/funnel-editor/components';
5
+ import { Page } from '../domain';
6
+ export declare class PageRepository implements IPageRepository {
7
+ readonly sdk: EditorAppSDK;
8
+ readonly contentfulClient: ContentfulContentClient;
9
+ constructor(args: PageRepository.ConstructorArgs);
10
+ search(args: IPageRepository.Search.Args): Promise<IPageRepository.Search.Result>;
11
+ getOverview({ region }: IPageRepository.GetOverview.Args): Promise<IPageRepository.GetOverview.Result>;
12
+ create(args: IPageRepository.Create.Args): Promise<IPageRepository.Create.Result>;
13
+ createLanguage(args: IPageRepository.CreateLang.Args): Promise<IPageRepository.CreateLang.Result>;
14
+ load(sys?: EntrySys): Promise<PageRepository.Load.Result>;
15
+ save(page: Page): Promise<Page>;
16
+ sync({ page, sys }: PageRepository.Sync.Args): Promise<PageRepository.Sync.Result>;
17
+ unpublish(page: IPage): Promise<void>;
18
+ }
19
+ export declare namespace PageRepository {
20
+ type ConstructorArgs = {
21
+ sdk: EditorAppSDK;
22
+ contentfulClient: ContentfulContentClient;
23
+ };
24
+ namespace Load {
25
+ type Args = {
26
+ pageId?: Schema.Page.Id;
27
+ };
28
+ type Result = {
29
+ pageSummary: PageSummary;
30
+ page: Page;
31
+ sys: EntrySys;
32
+ };
33
+ }
34
+ namespace Sync {
35
+ type Args = {
36
+ page: Page;
37
+ sys: EntrySys;
38
+ };
39
+ type Result = {
40
+ pageSummary?: PageSummary;
41
+ page: Page;
42
+ sys: EntrySys;
43
+ };
44
+ }
45
+ }