@sitecore-feaas/clientside 0.1.28 → 0.1.29

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 (156) hide show
  1. package/build/cdn.js +115 -0
  2. package/build/cdn.js.map +1 -0
  3. package/build/components/FEAASBase.js +212 -79
  4. package/build/components/FEAASBase.js.map +1 -1
  5. package/build/components/FEAASComponent.js +50 -17
  6. package/build/components/FEAASComponent.js.map +1 -1
  7. package/build/components/FEAASLoader.js +6 -0
  8. package/build/components/FEAASLoader.js.map +1 -1
  9. package/build/components/FEAASStylesheet.js +18 -13
  10. package/build/components/FEAASStylesheet.js.map +1 -1
  11. package/build/dom/component.js +34 -0
  12. package/build/dom/component.js.map +1 -0
  13. package/build/dom/data.js +105 -0
  14. package/build/dom/data.js.map +1 -0
  15. package/build/{dom.js → dom/rendering.js} +3 -194
  16. package/build/dom/rendering.js.map +1 -0
  17. package/build/dom/scripts.js +48 -0
  18. package/build/dom/scripts.js.map +1 -0
  19. package/build/dom/stylesheet.js +39 -0
  20. package/build/dom/stylesheet.js.map +1 -0
  21. package/build/fetch.js +72 -22
  22. package/build/fetch.js.map +1 -1
  23. package/build/{basic.js → headless.js} +11 -3
  24. package/build/headless.js.map +1 -0
  25. package/build/ui/FEAASContext.js +10 -3
  26. package/build/ui/FEAASContext.js.map +1 -1
  27. package/build/ui/FEAASEditor.js +5 -0
  28. package/build/ui/FEAASEditor.js.map +1 -1
  29. package/build/ui/FEAASPicker.js +7 -1
  30. package/build/ui/FEAASPicker.js.map +1 -1
  31. package/build/ui/index.js +1 -1
  32. package/build/ui/index.js.map +1 -1
  33. package/build/ui/react.js +6 -0
  34. package/build/ui/react.js.map +1 -0
  35. package/build/utils/promise.js +26 -0
  36. package/build/utils/promise.js.map +1 -0
  37. package/dist/browser/headless.esm.js +69 -0
  38. package/dist/browser/headless.esm.js.map +1 -0
  39. package/dist/browser/headless.js +69 -0
  40. package/dist/browser/headless.js.map +1 -0
  41. package/dist/browser/index.esm.js +3 -5
  42. package/dist/browser/index.esm.js.map +1 -1
  43. package/dist/browser/index.js +5 -5
  44. package/dist/browser/index.js.map +1 -1
  45. package/dist/browser/react.js +67 -0
  46. package/dist/browser/react.js.map +1 -0
  47. package/dist/node/headless.esm.js +67 -0
  48. package/dist/node/headless.esm.js.map +7 -0
  49. package/dist/node/headless.js +67 -0
  50. package/dist/node/headless.js.map +7 -0
  51. package/dist/node/index.esm.js +3 -3
  52. package/dist/node/index.esm.js.map +4 -4
  53. package/dist/node/index.js +3 -3
  54. package/dist/node/index.js.map +4 -4
  55. package/dist/node/react.js +67 -0
  56. package/dist/node/react.js.map +7 -0
  57. package/examples/index.html +0 -5
  58. package/package.json +23 -12
  59. package/scripts/build.js +17 -6
  60. package/scripts/test-setup.ts +1 -0
  61. package/src/cdn.ts +188 -0
  62. package/src/components/FEAASBase.tsx +234 -82
  63. package/src/components/FEAASComponent.tsx +56 -21
  64. package/src/components/FEAASLoader.tsx +4 -0
  65. package/src/components/FEAASStylesheet.tsx +14 -13
  66. package/src/dom/component.ts +35 -0
  67. package/src/dom/data.ts +124 -0
  68. package/src/{dom.ts → dom/rendering.ts} +4 -218
  69. package/src/dom/scripts.ts +47 -0
  70. package/src/dom/stylesheet.ts +48 -0
  71. package/src/fetch.ts +79 -25
  72. package/src/{basic.ts → headless.ts} +11 -2
  73. package/src/ui/FEAASContext.tsx +12 -4
  74. package/src/ui/FEAASEditor.tsx +5 -0
  75. package/src/ui/FEAASPicker.tsx +6 -2
  76. package/src/ui/index.ts +1 -1
  77. package/src/ui/react.tsx +8 -0
  78. package/src/utils/promise.ts +34 -0
  79. package/test/FEAASBase.test.tsx +195 -0
  80. package/test/FEAASComponent.test.tsx +284 -0
  81. package/test/FEAASContext.test.tsx +76 -0
  82. package/test/FEAASPicker.test.tsx +40 -0
  83. package/test/FEAASStylesheet.test.tsx +159 -0
  84. package/test/cdn.ts +39 -0
  85. package/test/{render.ts → dom.test.ts} +12 -6
  86. package/test/extras.ts +1 -1
  87. package/test/fetch.ts +254 -0
  88. package/test/tsconfig.json +4 -1
  89. package/types/cdn.d.ts +57 -0
  90. package/types/cdn.d.ts.map +1 -0
  91. package/types/components/FEAASBase.d.ts +220 -16
  92. package/types/components/FEAASBase.d.ts.map +1 -1
  93. package/types/components/FEAASComponent.d.ts +28 -7
  94. package/types/components/FEAASComponent.d.ts.map +1 -1
  95. package/types/components/FEAASLoader.d.ts +4 -0
  96. package/types/components/FEAASLoader.d.ts.map +1 -1
  97. package/types/components/FEAASStylesheet.d.ts +5 -13
  98. package/types/components/FEAASStylesheet.d.ts.map +1 -1
  99. package/types/dom/component.d.ts +6 -0
  100. package/types/dom/component.d.ts.map +1 -0
  101. package/types/dom/data.d.ts +15 -0
  102. package/types/dom/data.d.ts.map +1 -0
  103. package/types/dom/rendering.d.ts +20 -0
  104. package/types/dom/rendering.d.ts.map +1 -0
  105. package/types/dom/scripts.d.ts +4 -0
  106. package/types/dom/scripts.d.ts.map +1 -0
  107. package/types/dom/stylesheet.d.ts +8 -0
  108. package/types/dom/stylesheet.d.ts.map +1 -0
  109. package/types/fetch.d.ts +25 -11
  110. package/types/fetch.d.ts.map +1 -1
  111. package/types/headless.d.ts +24 -0
  112. package/types/headless.d.ts.map +1 -0
  113. package/types/tsbuildinfo +1 -1
  114. package/types/tsbuildinfo_ui +1 -1
  115. package/types/ui/FEAASContext.d.ts +15 -5
  116. package/types/ui/FEAASContext.d.ts.map +1 -1
  117. package/types/ui/FEAASEditor.d.ts +18 -0
  118. package/types/ui/FEAASEditor.d.ts.map +1 -1
  119. package/types/ui/FEAASPicker.d.ts +15 -3
  120. package/types/ui/FEAASPicker.d.ts.map +1 -1
  121. package/types/ui/index.d.ts +1 -1
  122. package/types/ui/index.d.ts.map +1 -1
  123. package/types/ui/react.d.ts +7 -0
  124. package/types/ui/react.d.ts.map +1 -0
  125. package/types/utils/promise.d.ts +8 -0
  126. package/types/utils/promise.d.ts.map +1 -0
  127. package/build/basic.js.map +0 -1
  128. package/build/cloud.js +0 -71
  129. package/build/cloud.js.map +0 -1
  130. package/build/dom.js.map +0 -1
  131. package/build/node.js +0 -10
  132. package/build/node.js.map +0 -1
  133. package/build/ui/node.js +0 -3
  134. package/build/ui/node.js.map +0 -1
  135. package/dist/browser/basic.esm.js +0 -69
  136. package/dist/browser/basic.esm.js.map +0 -1
  137. package/dist/browser/basic.js +0 -69
  138. package/dist/browser/basic.js.map +0 -1
  139. package/dist/node/basic.esm.js +0 -67
  140. package/dist/node/basic.esm.js.map +0 -7
  141. package/dist/node/basic.js +0 -67
  142. package/dist/node/basic.js.map +0 -7
  143. package/src/cloud.ts +0 -119
  144. package/src/node.ts +0 -10
  145. package/src/ui/node.ts +0 -2
  146. package/test/components.ts +0 -31
  147. package/types/basic.d.ts +0 -16
  148. package/types/basic.d.ts.map +0 -1
  149. package/types/cloud.d.ts +0 -39
  150. package/types/cloud.d.ts.map +0 -1
  151. package/types/dom.d.ts +0 -41
  152. package/types/dom.d.ts.map +0 -1
  153. package/types/node.d.ts +0 -4
  154. package/types/node.d.ts.map +0 -1
  155. package/types/ui/node.d.ts +0 -3
  156. package/types/ui/node.d.ts.map +0 -1
package/test/fetch.ts ADDED
@@ -0,0 +1,254 @@
1
+ import { vi, describe, it, assert, beforeAll, expect, beforeEach } from 'vitest'
2
+ import { CH1Node, serializeCH1RichText } from '../src/dom/data.js'
3
+ import { clearFetchCache, fetchAndRevalidate } from '../src/fetch.js'
4
+ const yesterday = new Date(2000, 1, 1, 0, 0, 0)
5
+ const yesterdayNoon = new Date(2000, 1, 2, 12, 0, 0)
6
+ const today = new Date(2000, 1, 2, 0, 0, 0)
7
+ const todayNoon = new Date(2000, 1, 2, 12, 0, 0)
8
+ describe('Fetch', () => {
9
+ beforeEach(() => {
10
+ // vi.useFakeTimers()
11
+ vi.setSystemTime(todayNoon)
12
+ clearFetchCache()
13
+ phases1.length = 0
14
+ phases2.length = 0
15
+ })
16
+ var phases1: [t: string, p: string][] = []
17
+ var phases2: [t: string, p: string][] = []
18
+ async function callback1(response: Response, phase: string) {
19
+ phases1.push([await response.clone().text(), phase])
20
+ }
21
+ async function callback2(response: Response, phase: string) {
22
+ phases2.push([await response.clone().text(), phase])
23
+ }
24
+ it('should deduplicate fresh requests', async () => {
25
+ const spy = vi.spyOn(global, 'fetch')
26
+ spy.mockImplementation(
27
+ async (url: string, options?: Parameters<typeof fetch>[1]) =>
28
+ new Response('A', {
29
+ headers: {
30
+ date: todayNoon.toUTCString()
31
+ }
32
+ })
33
+ )
34
+ await expect(
35
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
36
+ ).resolves.toEqual('A')
37
+ await expect(
38
+ fetchAndRevalidate('a', undefined, undefined, callback2).then((r) => r.clone().text())
39
+ ).resolves.toEqual('A')
40
+ expect(spy).toHaveBeenCalledTimes(1)
41
+ expect(phases1).toEqual([['A', 'initial']])
42
+ expect(phases2).toEqual([['A', 'initial']])
43
+ await expect(
44
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
45
+ ).resolves.toEqual('A')
46
+ expect(phases1).toEqual([
47
+ ['A', 'initial'],
48
+ ['A', 'initial']
49
+ ])
50
+ expect(phases2).toEqual([['A', 'initial']])
51
+ expect(spy).toHaveBeenCalledTimes(1)
52
+ clearFetchCache()
53
+ await expect(
54
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
55
+ ).resolves.toEqual('A')
56
+ expect(phases1).toEqual([
57
+ ['A', 'initial'],
58
+ ['A', 'initial'],
59
+ ['A', 'initial']
60
+ ])
61
+ expect(phases2).toEqual([['A', 'initial']])
62
+ await expect(
63
+ fetchAndRevalidate('a', undefined, undefined, callback2).then((r) => r.clone().text())
64
+ ).resolves.toEqual('A')
65
+ expect(phases1).toEqual([
66
+ ['A', 'initial'],
67
+ ['A', 'initial'],
68
+ ['A', 'initial']
69
+ ])
70
+ expect(phases2).toEqual([
71
+ ['A', 'initial'],
72
+ ['A', 'initial']
73
+ ])
74
+ expect(spy).toHaveBeenCalledTimes(2)
75
+ })
76
+ it('should deduplicate failing requests', async () => {
77
+ const spy = vi.spyOn(global, 'fetch')
78
+ spy.mockImplementation(
79
+ async (url: string, options?: Parameters<typeof fetch>[1]) =>
80
+ new Response('A', {
81
+ headers: {
82
+ date: todayNoon.toUTCString()
83
+ },
84
+ status: 400
85
+ })
86
+ )
87
+ expect(() =>
88
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
89
+ ).rejects.toEqual(new Error('Fetch failed'))
90
+ expect(() =>
91
+ fetchAndRevalidate('a', undefined, undefined, callback2).then((r) => r.clone().text())
92
+ ).rejects.toEqual(new Error('Fetch failed'))
93
+ expect(spy).toHaveBeenCalledTimes(1)
94
+ expect(phases1).toEqual([])
95
+ expect(phases2).toEqual([])
96
+ expect(() => fetchAndRevalidate('a').then((r) => r.clone().text())).rejects.toEqual(new Error('Fetch failed'))
97
+ clearFetchCache()
98
+ expect(() => fetchAndRevalidate('a').then((r) => r.clone().text())).rejects.toEqual(new Error('Fetch failed'))
99
+ expect(spy).toHaveBeenCalledTimes(2)
100
+ expect(() => fetchAndRevalidate('a').then((r) => r.clone().text())).rejects.toEqual(new Error('Fetch failed'))
101
+ expect(spy).toHaveBeenCalledTimes(2)
102
+ expect(phases1).toEqual([])
103
+ expect(phases2).toEqual([])
104
+ })
105
+ it('should deduplicate cached requests', async () => {
106
+ const spy = vi.spyOn(global, 'fetch')
107
+ spy.mockImplementation(async (url: string, options?: Parameters<typeof fetch>[1]) => {
108
+ if (options?.method == 'HEAD') {
109
+ return new Response('A', {
110
+ headers: {
111
+ date: yesterday.toUTCString()
112
+ }
113
+ })
114
+ } else {
115
+ return new Response('A', {
116
+ headers: {
117
+ date: yesterday.toUTCString()
118
+ }
119
+ })
120
+ }
121
+ })
122
+ await expect(
123
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
124
+ ).resolves.toEqual('A')
125
+ await expect(
126
+ fetchAndRevalidate('a', undefined, undefined, callback2).then((r) => r.clone().text())
127
+ ).resolves.toEqual('A')
128
+ expect(spy).toHaveBeenCalledTimes(2)
129
+ expect(phases1).toEqual([['A', 'initial']])
130
+ expect(phases2).toEqual([['A', 'initial']])
131
+ await expect(
132
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
133
+ ).resolves.toEqual('A')
134
+ expect(phases1).toEqual([
135
+ ['A', 'initial'],
136
+ ['A', 'initial']
137
+ ])
138
+ expect(phases2).toEqual([['A', 'initial']])
139
+ expect(spy).toHaveBeenCalledTimes(2)
140
+ clearFetchCache()
141
+ await expect(
142
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
143
+ ).resolves.toEqual('A')
144
+ expect(phases1).toEqual([
145
+ ['A', 'initial'],
146
+ ['A', 'initial'],
147
+ ['A', 'initial']
148
+ ])
149
+ expect(phases2).toEqual([['A', 'initial']])
150
+ await expect(
151
+ fetchAndRevalidate('a', undefined, undefined, callback2).then((r) => r.clone().text())
152
+ ).resolves.toEqual('A')
153
+ expect(phases1).toEqual([
154
+ ['A', 'initial'],
155
+ ['A', 'initial'],
156
+ ['A', 'initial']
157
+ ])
158
+ expect(phases2).toEqual([
159
+ ['A', 'initial'],
160
+ ['A', 'initial']
161
+ ])
162
+ expect(spy).toHaveBeenCalledTimes(4)
163
+ })
164
+ it('should deduplicate updated requests', async () => {
165
+ const spy = vi.spyOn(global, 'fetch')
166
+ spy.mockImplementation(async (url: string, options?: Parameters<typeof fetch>[1]) => {
167
+ if (options?.method == 'HEAD') {
168
+ return new Response('A', {
169
+ headers: {
170
+ 'last-modified': today.toUTCString(),
171
+ date: todayNoon.toUTCString()
172
+ }
173
+ })
174
+ } else if (options?.cache == 'reload') {
175
+ return new Response('B', {
176
+ headers: {
177
+ 'last-modified': today.toUTCString(),
178
+ date: today.toUTCString()
179
+ }
180
+ })
181
+ } else {
182
+ return new Response('A', {
183
+ headers: {
184
+ 'last-modified': yesterday.toUTCString(),
185
+ date: yesterday.toUTCString()
186
+ }
187
+ })
188
+ }
189
+ })
190
+ await expect(
191
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
192
+ ).resolves.toEqual('B')
193
+ await expect(
194
+ fetchAndRevalidate('a', undefined, undefined, callback2).then((r) => r.clone().text())
195
+ ).resolves.toEqual('B')
196
+ expect(spy).toHaveBeenCalledTimes(3)
197
+ expect(phases1).toEqual([
198
+ ['A', 'initial'],
199
+ ['B', 'updated']
200
+ ])
201
+ expect(phases2).toEqual([
202
+ ['A', 'initial'],
203
+ ['B', 'updated']
204
+ ])
205
+ await expect(
206
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
207
+ ).resolves.toEqual('B')
208
+ expect(phases1).toEqual([
209
+ ['A', 'initial'],
210
+ ['B', 'updated'],
211
+ ['A', 'initial'],
212
+ ['B', 'updated']
213
+ ])
214
+ expect(phases2).toEqual([
215
+ ['A', 'initial'],
216
+ ['B', 'updated']
217
+ ])
218
+ expect(spy).toHaveBeenCalledTimes(3)
219
+ clearFetchCache()
220
+ await expect(
221
+ fetchAndRevalidate('a', undefined, undefined, callback1).then((r) => r.clone().text())
222
+ ).resolves.toEqual('B')
223
+ expect(phases1).toEqual([
224
+ ['A', 'initial'],
225
+ ['B', 'updated'],
226
+ ['A', 'initial'],
227
+ ['B', 'updated'],
228
+ ['A', 'initial'],
229
+ ['B', 'updated']
230
+ ])
231
+ expect(phases2).toEqual([
232
+ ['A', 'initial'],
233
+ ['B', 'updated']
234
+ ])
235
+ await expect(
236
+ fetchAndRevalidate('a', undefined, undefined, callback2).then((r) => r.clone().text())
237
+ ).resolves.toEqual('B')
238
+ expect(phases1).toEqual([
239
+ ['A', 'initial'],
240
+ ['B', 'updated'],
241
+ ['A', 'initial'],
242
+ ['B', 'updated'],
243
+ ['A', 'initial'],
244
+ ['B', 'updated']
245
+ ])
246
+ expect(phases2).toEqual([
247
+ ['A', 'initial'],
248
+ ['B', 'updated'],
249
+ ['A', 'initial'],
250
+ ['B', 'updated']
251
+ ])
252
+ expect(spy).toHaveBeenCalledTimes(6)
253
+ })
254
+ })
@@ -8,8 +8,11 @@
8
8
  "references": [
9
9
  {
10
10
  "path": ".."
11
+ },
12
+ {
13
+ "path": "../src/ui"
11
14
  }
12
15
  ],
13
- "include": ["./**/*.ts", "./**/*.tsx"],
16
+ "include": ["./**/*.ts", "./**/*.tsx", "../scripts/setup.ts"],
14
17
  "exclude": []
15
18
  }
package/types/cdn.d.ts ADDED
@@ -0,0 +1,57 @@
1
+ import { ValidatableRequestPhase } from './fetch.js';
2
+ export declare const DEFAULT_CDN_URL = "https://feaascomponentsapidev.blob.core.windows.net";
3
+ export type FEAASCDNComponentParams = {
4
+ cdn?: string;
5
+ revision?: 'staging' | 'published' | 'saved' | number;
6
+ library: string;
7
+ component: string;
8
+ version: string;
9
+ /** @deprecated Use `cdn` instead */
10
+ hostname?: string;
11
+ };
12
+ export type FEAASCDNComponentSource = {
13
+ src: string;
14
+ };
15
+ export type FEAASCDNComponentParamsCustomizations = {
16
+ instance?: string;
17
+ };
18
+ export type FEAASCDNComponentProps = (FEAASCDNComponentParams | FEAASCDNComponentSource) & FEAASCDNComponentParamsCustomizations;
19
+ export interface FEAASCDNStylesheetParams {
20
+ cdn?: string;
21
+ library: string;
22
+ revision?: 'staging' | 'published' | 'saved' | number;
23
+ /** @deprecated Use `cdn` instead */
24
+ hostname?: string;
25
+ }
26
+ export type FEAASCDNStylesheetSource = {
27
+ src: string;
28
+ };
29
+ export type FEAASCDNStylesheetProps = FEAASCDNStylesheetParams | FEAASCDNStylesheetSource;
30
+ export declare function parseComponentSource(source: string): FEAASCDNComponentParams;
31
+ export declare function getComponentSource(props: FEAASCDNComponentParams): string;
32
+ export declare function getStylesheetSource(props: FEAASCDNStylesheetParams): string;
33
+ export declare function parseStylesheetSource(source: string): FEAASCDNStylesheetParams;
34
+ export declare function getComponentURL(props: FEAASCDNComponentProps): string;
35
+ export declare function getStylesheetURL(props: FEAASCDNStylesheetProps): string;
36
+ export declare function fetchAndRevalidateComponent(props: FEAASCDNComponentProps, callback?: (html: string) => void, dontRevalidate?: boolean): Promise<import("./fetch.js").ValidatableRequest & Required<Pick<import("./fetch.js").ValidatableRequest, "response">>>;
37
+ /** Fetches HTML of a component. */
38
+ export declare function fetchComponent(props: FEAASCDNComponentProps | string): Promise<{
39
+ template: string;
40
+ lastModified: string;
41
+ cdn?: string;
42
+ revision?: number | "staging" | "published" | "saved";
43
+ library: string;
44
+ component: string;
45
+ version: string;
46
+ /** @deprecated Use `cdn` instead */
47
+ hostname?: string;
48
+ instance?: string;
49
+ } | {
50
+ template: string;
51
+ lastModified: string;
52
+ src: string;
53
+ instance?: string;
54
+ }>;
55
+ export type ValidatableStylesheetCallback = (css: string, phase: ValidatableRequestPhase) => void;
56
+ export declare function fetchAndRevalidateStylesheet(props: FEAASCDNStylesheetProps | string, callback: ValidatableStylesheetCallback): Promise<Response>;
57
+ //# sourceMappingURL=cdn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdn.d.ts","sourceRoot":"","sources":["../src/cdn.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,uBAAuB,EACxB,MAAM,YAAY,CAAA;AAEnB,eAAO,MAAM,eAAe,wDAAwD,CAAA;AACpF,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAA;IACrD,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IAEf,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AACD,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AACD,MAAM,MAAM,qCAAqC,GAAG;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AACD,MAAM,MAAM,sBAAsB,GAAG,CAAC,uBAAuB,GAAG,uBAAuB,CAAC,GACtF,qCAAqC,CAAA;AAEvC,MAAM,WAAW,wBAAwB;IACvC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAA;IAErD,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AACD,MAAM,MAAM,uBAAuB,GAAG,wBAAwB,GAAG,wBAAwB,CAAA;AAEzF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAM5E;AACD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,UAahE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,UAIlE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CAM9E;AACD,wBAAgB,eAAe,CAAC,KAAK,EAAE,sBAAsB,UAS5D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,UAS9D;AAED,wBAAsB,2BAA2B,CAC/C,KAAK,EAAE,sBAAsB,EAC7B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EACjC,cAAc,UAAQ,0HA8CvB;AAED,mCAAmC;AACnC,wBAAsB,cAAc,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM;;;;;;;;IAvIzE,oCAAoC;;;;;;;;GAkJrC;AAED,MAAM,MAAM,6BAA6B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAA;AACjG,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,uBAAuB,GAAG,MAAM,EACvC,QAAQ,EAAE,6BAA6B,qBAoBxC"}
@@ -1,13 +1,37 @@
1
- import { ReactElement, ReactNode } from 'react';
1
+ import type { ReactElement, ReactNode } from 'react';
2
2
  import type ReactDOMClient from 'react-dom/client';
3
+ import type ReactDOM from 'react-dom';
3
4
  import type React from 'react';
5
+ import { ControlledPromise } from '../utils/promise.js';
4
6
  export type OptionalExcept<T, K extends keyof T> = Pick<T, K> & Partial<Omit<T, K>>;
5
7
  declare var WebComponent: {
6
8
  new (): HTMLElement;
7
9
  prototype: HTMLElement;
8
10
  };
11
+ export interface ReactPayload {
12
+ React: typeof React;
13
+ ReactDOM: typeof ReactDOM;
14
+ ReactDOMClient: typeof ReactDOMClient;
15
+ }
16
+ /**
17
+ * FEAASBase is a superclass for FEAAS components with optional react support.
18
+ *
19
+ * Initialization lifecycle:
20
+ *
21
+ * - `set(props)`
22
+ * - `load() => payload`
23
+ * - `onLoad?(payload)`
24
+ * - `update()`
25
+ * - `render(payload, props)`
26
+ * - `whenRendered`
27
+ * - - / If needs to reload, e.g. bypass cache /
28
+ * - - `onLoad(newPayload) `
29
+ * - - `whenRendered`
30
+ * - `whenLoaded`
31
+ */
9
32
  export declare class FEAASBase<Props = any, Payload = any> extends WebComponent {
10
33
  static observedAttributes: string[];
34
+ defaultProps: Partial<Props>;
11
35
  /** Return attributes as parsed values */
12
36
  getProps(context?: HTMLElement): any;
13
37
  /** Properties parsed in current tick */
@@ -17,10 +41,11 @@ export declare class FEAASBase<Props = any, Payload = any> extends WebComponent
17
41
  nextRender: number;
18
42
  /** Is/was component in the dom? */
19
43
  connected: boolean;
20
- /** Result of lazy loading */
21
- payload: Payload;
22
44
  refs: Record<string, FEAASBase>;
23
45
  descendants: FEAASBase[];
46
+ /** Result of lazy loading */
47
+ payload: Payload;
48
+ whenLoaded: ControlledPromise<Payload>;
24
49
  constructor();
25
50
  /** Attaches shadow root if getShadowRootOptions any settings, or uses element itself */
26
51
  getRoot(): FEAASBase | HTMLElement | ShadowRoot;
@@ -28,19 +53,21 @@ export declare class FEAASBase<Props = any, Payload = any> extends WebComponent
28
53
  attributeChangedCallback(name: string, oldValue: string, newValue: string): void;
29
54
  /** Components parses its attributes when connected, and schedules rendeirng */
30
55
  connectedCallback(): void;
56
+ disconnectedCallback(): void;
31
57
  /**
32
58
  * Web components are initialized depth-first, making child elements render before its parents. This could here
33
59
  * attempts to avoid this and inverts the initialization logic, so that children are initialized in the context of its
34
60
  * already-initialized parents.
35
61
  *
36
- * FEAAS components dispatch `feaasConnected` event that allows components to store references to each other. In
37
- * addition it allows external scripts to listen for initialization of FEAAS components
62
+ * FEAAS components dispatch `feaasMount` event that allows components to store references to each other. In addition
63
+ * it allows external scripts to listen for initialization of FEAAS components
38
64
  */
39
- initialize(): boolean;
65
+ mount(): void;
66
+ log(...args: any): void;
67
+ /** Nothing special happens on unmount, except setting a flag */
68
+ unmount(): void;
40
69
  getParent(onlyFeaas?: boolean): HTMLElement;
41
70
  getElements(root?: HTMLElement | ShadowRoot, onlyFeaas?: boolean): HTMLElement[];
42
- /** Nothing special happens on disconnect, except setting a flag */
43
- disconnectedCallback(): void;
44
71
  /** Catch-all event handler that dispatches events to callback */
45
72
  handleEvent(event: Event): void;
46
73
  /** Act on children element being removed */
@@ -53,22 +80,196 @@ export declare class FEAASBase<Props = any, Payload = any> extends WebComponent
53
80
  * are set
54
81
  */
55
82
  isReadyToLoad(): boolean;
83
+ /** Generic error handler */
84
+ onError(error: Error, where?: string, handled?: boolean): boolean;
85
+ shouldUpdateOnLoad(): boolean;
86
+ onLoad: (payload: Payload) => void;
56
87
  /** Load lazy component & render */
57
- reify(): Promise<void>;
88
+ advance(): Promise<void>;
89
+ flush(): void;
58
90
  /** Invoke preloading logic that needs to finish before component can render */
59
91
  load(): Promise<any>;
60
- /** Payload is inside onLoad callback. For web components that use react, it has to provide React & ReactDOM props */
61
- onLoad: (payload: Payload) => void;
62
92
  /**
63
93
  * Component-specific logic that updates the DOM. Default render implementation assume react rendering, in that case
64
94
  * the component needs to provide React & ReactDOM references in its payload. Web component redefine its render to not
65
95
  * use react at all
66
96
  */
67
- update(nested?: boolean): any;
97
+ update(): any;
68
98
  invokeReactRendering(): ReactNode;
69
- reactWrapper: (props?: any) => ReactNode;
99
+ reactWrapper: React.FunctionComponent;
100
+ reactErrorBoundary: new (...args: any) => React.Component<{
101
+ children: any;
102
+ slot: string;
103
+ }, {
104
+ error: Error;
105
+ }>;
70
106
  reactRoot: ReactDOMClient.Root;
71
- getReactWrapper(target?: FEAASBase, displayName?: string): (props?: any) => any;
107
+ getReactErrorBoundary(target?: FEAASBase, displayName?: string): (new (...args: any) => React.Component<{
108
+ children: any;
109
+ slot: string;
110
+ }, {
111
+ error: Error;
112
+ }, any>) | {
113
+ new (props: {
114
+ children: any;
115
+ slot: string;
116
+ } | Readonly<{
117
+ children: any;
118
+ slot: string;
119
+ }>): {
120
+ state: {
121
+ error: Error;
122
+ };
123
+ componentDidCatch(error: Error, errorInfo: any): void;
124
+ render(): any;
125
+ context: unknown;
126
+ setState<K extends "error">(state: {
127
+ error: Error;
128
+ } | ((prevState: Readonly<{
129
+ error: Error;
130
+ }>, props: Readonly<{
131
+ children: any;
132
+ slot: string;
133
+ }>) => {
134
+ error: Error;
135
+ } | Pick<{
136
+ error: Error;
137
+ }, K>) | Pick<{
138
+ error: Error;
139
+ }, K>, callback?: () => void): void;
140
+ forceUpdate(callback?: () => void): void;
141
+ readonly props: Readonly<{
142
+ children: any;
143
+ slot: string;
144
+ }>;
145
+ refs: {
146
+ [key: string]: React.ReactInstance;
147
+ };
148
+ componentDidMount?(): void;
149
+ shouldComponentUpdate?(nextProps: Readonly<{
150
+ children: any;
151
+ slot: string;
152
+ }>, nextState: Readonly<{
153
+ error: Error;
154
+ }>, nextContext: any): boolean;
155
+ componentWillUnmount?(): void;
156
+ getSnapshotBeforeUpdate?(prevProps: Readonly<{
157
+ children: any;
158
+ slot: string;
159
+ }>, prevState: Readonly<{
160
+ error: Error;
161
+ }>): any;
162
+ componentDidUpdate?(prevProps: Readonly<{
163
+ children: any;
164
+ slot: string;
165
+ }>, prevState: Readonly<{
166
+ error: Error;
167
+ }>, snapshot?: any): void;
168
+ componentWillMount?(): void;
169
+ UNSAFE_componentWillMount?(): void;
170
+ componentWillReceiveProps?(nextProps: Readonly<{
171
+ children: any;
172
+ slot: string;
173
+ }>, nextContext: any): void;
174
+ UNSAFE_componentWillReceiveProps?(nextProps: Readonly<{
175
+ children: any;
176
+ slot: string;
177
+ }>, nextContext: any): void;
178
+ componentWillUpdate?(nextProps: Readonly<{
179
+ children: any;
180
+ slot: string;
181
+ }>, nextState: Readonly<{
182
+ error: Error;
183
+ }>, nextContext: any): void;
184
+ UNSAFE_componentWillUpdate?(nextProps: Readonly<{
185
+ children: any;
186
+ slot: string;
187
+ }>, nextState: Readonly<{
188
+ error: Error;
189
+ }>, nextContext: any): void;
190
+ };
191
+ new (props: {
192
+ children: any;
193
+ slot: string;
194
+ }, context: any): {
195
+ state: {
196
+ error: Error;
197
+ };
198
+ componentDidCatch(error: Error, errorInfo: any): void;
199
+ render(): any;
200
+ context: unknown;
201
+ setState<K extends "error">(state: {
202
+ error: Error;
203
+ } | ((prevState: Readonly<{
204
+ error: Error;
205
+ }>, props: Readonly<{
206
+ children: any;
207
+ slot: string;
208
+ }>) => {
209
+ error: Error;
210
+ } | Pick<{
211
+ error: Error;
212
+ }, K>) | Pick<{
213
+ error: Error;
214
+ }, K>, callback?: () => void): void;
215
+ forceUpdate(callback?: () => void): void;
216
+ readonly props: Readonly<{
217
+ children: any;
218
+ slot: string;
219
+ }>;
220
+ refs: {
221
+ [key: string]: React.ReactInstance;
222
+ };
223
+ componentDidMount?(): void;
224
+ shouldComponentUpdate?(nextProps: Readonly<{
225
+ children: any;
226
+ slot: string;
227
+ }>, nextState: Readonly<{
228
+ error: Error;
229
+ }>, nextContext: any): boolean;
230
+ componentWillUnmount?(): void;
231
+ getSnapshotBeforeUpdate?(prevProps: Readonly<{
232
+ children: any;
233
+ slot: string;
234
+ }>, prevState: Readonly<{
235
+ error: Error;
236
+ }>): any;
237
+ componentDidUpdate?(prevProps: Readonly<{
238
+ children: any;
239
+ slot: string;
240
+ }>, prevState: Readonly<{
241
+ error: Error;
242
+ }>, snapshot?: any): void;
243
+ componentWillMount?(): void;
244
+ UNSAFE_componentWillMount?(): void;
245
+ componentWillReceiveProps?(nextProps: Readonly<{
246
+ children: any;
247
+ slot: string;
248
+ }>, nextContext: any): void;
249
+ UNSAFE_componentWillReceiveProps?(nextProps: Readonly<{
250
+ children: any;
251
+ slot: string;
252
+ }>, nextContext: any): void;
253
+ componentWillUpdate?(nextProps: Readonly<{
254
+ children: any;
255
+ slot: string;
256
+ }>, nextState: Readonly<{
257
+ error: Error;
258
+ }>, nextContext: any): void;
259
+ UNSAFE_componentWillUpdate?(nextProps: Readonly<{
260
+ children: any;
261
+ slot: string;
262
+ }>, nextState: Readonly<{
263
+ error: Error;
264
+ }>, nextContext: any): void;
265
+ };
266
+ getDerivedStateFromError(error: Error): {
267
+ error: Error;
268
+ };
269
+ contextType?: React.Context<any>;
270
+ };
271
+ getReactElement(target?: FEAASBase, props?: any): JSX.Element;
272
+ getReactWrapper(target?: FEAASBase, displayName?: string): React.FunctionComponent<{}>;
72
273
  uid: string;
73
274
  getUID(): string;
74
275
  forceUpdateReact: (node?: ReactNode) => void;
@@ -81,12 +282,15 @@ export declare class FEAASBase<Props = any, Payload = any> extends WebComponent
81
282
  getShadowRoot(): ShadowRoot;
82
283
  getReactRootElement(): HTMLElement | ShadowRoot;
83
284
  /** Set props and return values on new next tick */
84
- set(overrides?: Partial<Props>): void;
285
+ set(overrides?: Partial<Props>): this;
286
+ import(path: string): Promise<Payload>;
85
287
  /** Schedule rendering on next tick, to batch multiple attribute changes */
288
+ initialized: boolean;
289
+ whenRendered: ControlledPromise<this>;
86
290
  scheduleRender(): void;
87
291
  formatURL(src: string, hostname: string): string;
88
292
  getContextAttribute(name: string, element?: this): string;
89
- static register(tagName: string): void;
293
+ static register(tagName: string, win?: Window): void;
90
294
  }
91
295
  export { FEAASBase as Base };
92
296
  //# sourceMappingURL=FEAASBase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FEAASBase.d.ts","sourceRoot":"","sources":["../../src/components/FEAASBase.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FEAASBase.d.ts","sourceRoot":"","sources":["../../src/components/FEAASBase.tsx"],"names":[],"mappings":"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"}