@remix-run/ui 0.6.0 → 0.7.0
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/README.md +52 -14
- package/dist/runtime/component.d.ts +2 -1
- package/dist/runtime/component.js.map +1 -1
- package/dist/runtime/navigation.d.ts +1 -2
- package/dist/runtime/navigation.js +1 -4
- package/dist/runtime/navigation.js.map +1 -1
- package/dist/runtime/run.d.ts +3 -3
- package/dist/runtime/run.js +41 -3
- package/dist/runtime/run.js.map +1 -1
- package/package.json +1 -1
- package/src/runtime/component.ts +2 -1
- package/src/runtime/navigation.ts +1 -3
- package/src/runtime/run.ts +50 -6
package/README.md
CHANGED
|
@@ -81,10 +81,10 @@ function Actions() {
|
|
|
81
81
|
|
|
82
82
|
## Frame Navigation
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
`run()` progressively enhances same-origin links and forms using a default `resolveFrame` that
|
|
85
|
+
fetches the frame source:
|
|
85
86
|
|
|
86
87
|
```tsx
|
|
87
|
-
import type { ResolveFrameOptions } from 'remix/ui'
|
|
88
88
|
import { run } from 'remix/ui'
|
|
89
89
|
|
|
90
90
|
let app = run({
|
|
@@ -92,20 +92,44 @@ let app = run({
|
|
|
92
92
|
let mod = await import(moduleUrl)
|
|
93
93
|
return mod[exportName]
|
|
94
94
|
},
|
|
95
|
-
async resolveFrame(src, options) {
|
|
96
|
-
return fetch(src, {
|
|
97
|
-
headers: { Accept: 'text/html', 'X-Remix-Frame': 'true' },
|
|
98
|
-
method: options?.method,
|
|
99
|
-
body: getRequestBody(options),
|
|
100
|
-
signal: options?.signal,
|
|
101
|
-
})
|
|
102
|
-
},
|
|
103
95
|
})
|
|
104
96
|
|
|
105
|
-
|
|
97
|
+
await app.ready()
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The default resolver is equivalent to:
|
|
101
|
+
|
|
102
|
+
```js
|
|
103
|
+
async function resolveFrame(src, options) {
|
|
104
|
+
let response = await fetch(src, {
|
|
105
|
+
body: getRequestBody(options),
|
|
106
|
+
headers: { Accept: 'text/html' },
|
|
107
|
+
method: options?.method,
|
|
108
|
+
signal: options?.signal,
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
if (!response.ok) {
|
|
112
|
+
throw new Error(`Failed to resolve frame: ${response.status} ${response.statusText}`.trimEnd())
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return response
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function getRequestBody(options) {
|
|
106
119
|
let formData = options?.formData
|
|
107
|
-
if (!formData) return
|
|
108
|
-
|
|
120
|
+
if (!formData || options?.method?.toLowerCase() === 'get') return
|
|
121
|
+
|
|
122
|
+
if (options?.encType === 'text/plain') {
|
|
123
|
+
let body = ''
|
|
124
|
+
for (let [name, value] of formData) {
|
|
125
|
+
name = normalizeLineBreaks(name)
|
|
126
|
+
value = normalizeLineBreaks(typeof value === 'string' ? value : value.name)
|
|
127
|
+
body += `${name}=${value}\r\n`
|
|
128
|
+
}
|
|
129
|
+
return new Blob([body], { type: 'text/plain' })
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (options?.encType !== 'application/x-www-form-urlencoded') return formData
|
|
109
133
|
|
|
110
134
|
let body = new URLSearchParams()
|
|
111
135
|
for (let [name, value] of formData) {
|
|
@@ -114,9 +138,23 @@ function getRequestBody(options?: ResolveFrameOptions): BodyInit | undefined {
|
|
|
114
138
|
return body
|
|
115
139
|
}
|
|
116
140
|
|
|
117
|
-
|
|
141
|
+
function normalizeLineBreaks(value) {
|
|
142
|
+
return value.replace(/\r\n|\r|\n/g, '\r\n')
|
|
143
|
+
}
|
|
118
144
|
```
|
|
119
145
|
|
|
146
|
+
The default resolver requests HTML. GET form values are already encoded in `src`;
|
|
147
|
+
`application/x-www-form-urlencoded` submissions use `URLSearchParams`, `text/plain` submissions use
|
|
148
|
+
CRLF-delimited text, and `multipart/form-data` submissions use `FormData`. Pass a custom
|
|
149
|
+
`resolveFrame` when the server requires additional headers, another body encoding, or a different
|
|
150
|
+
response policy.
|
|
151
|
+
|
|
152
|
+
Add `rmx-document` to a link or form to leave its navigation to the browser.
|
|
153
|
+
|
|
154
|
+
The default resolver rejects non-OK responses with an error containing their status and status text.
|
|
155
|
+
A custom `resolveFrame` may return a `Response` with any status when it wants Remix UI to render the
|
|
156
|
+
response body.
|
|
157
|
+
|
|
120
158
|
Forms remain ordinary HTML forms before the runtime starts. Add `rmx-target` to reload a named frame, or `rmx-document` to require a full-document submission:
|
|
121
159
|
|
|
122
160
|
```tsx
|
|
@@ -120,7 +120,8 @@ export type FrameContent = ReadableStream<Uint8Array> | string | RemixNode;
|
|
|
120
120
|
/**
|
|
121
121
|
* Value returned by a browser frame resolver.
|
|
122
122
|
*
|
|
123
|
-
*
|
|
123
|
+
* Response bodies are rendered as frame content regardless of status. The default browser resolver
|
|
124
|
+
* rejects non-OK responses before returning them. When `fetch()` followed a redirect, the response's
|
|
124
125
|
* final URL updates the frame source and browser URL for a top-frame navigation.
|
|
125
126
|
*/
|
|
126
127
|
export type FrameResolution = FrameContent | Response;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/runtime/component.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/runtime/component.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,10 +20,9 @@ export declare function navigate(href: string, options?: NavigationOptions): Pro
|
|
|
20
20
|
* Starts listening for Navigation API transitions and routes them through frame reloads.
|
|
21
21
|
*
|
|
22
22
|
* @param signal Abort signal used to remove the listener.
|
|
23
|
-
* @param canResolveFrames Whether the runtime has a resolver that can handle intercepted navigations.
|
|
24
23
|
* @returns void
|
|
25
24
|
*/
|
|
26
|
-
export declare function startNavigationListener(signal: AbortSignal
|
|
25
|
+
export declare function startNavigationListener(signal: AbortSignal): void;
|
|
27
26
|
export declare function startNavigationListenerImpl(signal: AbortSignal, options: {
|
|
28
27
|
getTopFrame: typeof getTopFrame;
|
|
29
28
|
getNamedFrame: typeof getNamedFrame;
|
|
@@ -23,12 +23,9 @@ export async function navigate(href, options) {
|
|
|
23
23
|
* Starts listening for Navigation API transitions and routes them through frame reloads.
|
|
24
24
|
*
|
|
25
25
|
* @param signal Abort signal used to remove the listener.
|
|
26
|
-
* @param canResolveFrames Whether the runtime has a resolver that can handle intercepted navigations.
|
|
27
26
|
* @returns void
|
|
28
27
|
*/
|
|
29
|
-
export function startNavigationListener(signal
|
|
30
|
-
if (!canResolveFrames)
|
|
31
|
-
return;
|
|
28
|
+
export function startNavigationListener(signal) {
|
|
32
29
|
return startNavigationListenerImpl(signal, {
|
|
33
30
|
getTopFrame,
|
|
34
31
|
getNamedFrame,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/runtime/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,EAAE,4BAA4B,EAAuB,MAAM,sBAAsB,CAAA;AAsCxF,MAAM,gCAAgC,GAAG,uBAAuB,CAAA;AAChE,MAAM,+BAA+B,GAAG,gBAAgB,CAAA;AAYxD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,OAA2B;IACtE,IAAI,KAAK,GAAG;QACV,MAAM,EAAE,OAAO,EAAE,MAAM;QACvB,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,IAAI;QACzB,WAAW,EAAE,OAAO,EAAE,WAAW,KAAK,KAAK;QAC3C,IAAI,EAAE,IAAI;KACe,CAAA;IAC3B,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IACvF,MAAM,UAAU,CAAC,QAAQ,CAAA;AAC3B,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../../src/runtime/navigation.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/run.d.ts
CHANGED
|
@@ -16,8 +16,8 @@ export interface RunInit {
|
|
|
16
16
|
/**
|
|
17
17
|
* Resolves browser-loaded `<Frame>` content.
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
* Defaults to fetching the frame source as HTML with the submitted form data,
|
|
20
|
+
* method, encoding, and abort signal.
|
|
21
21
|
*/
|
|
22
22
|
resolveFrame?: ResolveFrame;
|
|
23
23
|
}
|
|
@@ -56,7 +56,7 @@ export declare function getNamedFrame(name: string): FrameHandle;
|
|
|
56
56
|
/**
|
|
57
57
|
* Starts the client-side Remix component runtime for the current document.
|
|
58
58
|
*
|
|
59
|
-
* @param init Runtime
|
|
59
|
+
* @param init Runtime options for loading modules and customizing frame resolution.
|
|
60
60
|
* @returns The running application runtime.
|
|
61
61
|
*/
|
|
62
62
|
export declare function run(init: RunInit): AppRuntime;
|
package/dist/runtime/run.js
CHANGED
|
@@ -25,17 +25,55 @@ const namedFrames = new Map();
|
|
|
25
25
|
export function getNamedFrame(name) {
|
|
26
26
|
return namedFrames.get(name) ?? getTopFrame();
|
|
27
27
|
}
|
|
28
|
+
// Frame reloads can receive raw FormData without going through form navigation. Encode it here so
|
|
29
|
+
// manual reloads use the requested form encoding instead of always sending multipart bodies.
|
|
30
|
+
function getRequestBody(options) {
|
|
31
|
+
let formData = options?.formData;
|
|
32
|
+
if (!formData || options?.method?.toLowerCase() === 'get')
|
|
33
|
+
return;
|
|
34
|
+
if (options?.encType === 'text/plain') {
|
|
35
|
+
let body = '';
|
|
36
|
+
for (let [name, value] of formData) {
|
|
37
|
+
name = normalizeLineBreaks(name);
|
|
38
|
+
value = normalizeLineBreaks(typeof value === 'string' ? value : value.name);
|
|
39
|
+
body += `${name}=${value}\r\n`;
|
|
40
|
+
}
|
|
41
|
+
return new Blob([body], { type: 'text/plain' });
|
|
42
|
+
}
|
|
43
|
+
if (options?.encType !== 'application/x-www-form-urlencoded')
|
|
44
|
+
return formData;
|
|
45
|
+
let body = new URLSearchParams();
|
|
46
|
+
for (let [name, value] of formData) {
|
|
47
|
+
body.append(name, typeof value === 'string' ? value : value.name);
|
|
48
|
+
}
|
|
49
|
+
return body;
|
|
50
|
+
}
|
|
51
|
+
function normalizeLineBreaks(value) {
|
|
52
|
+
return value.replace(/\r\n|\r|\n/g, '\r\n');
|
|
53
|
+
}
|
|
54
|
+
async function defaultResolveFrame(src, options) {
|
|
55
|
+
let response = await fetch(src, {
|
|
56
|
+
body: getRequestBody(options),
|
|
57
|
+
headers: { Accept: 'text/html' },
|
|
58
|
+
method: options?.method,
|
|
59
|
+
signal: options?.signal,
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw new Error(`Failed to resolve frame: ${response.status} ${response.statusText}`.trimEnd());
|
|
63
|
+
}
|
|
64
|
+
return response;
|
|
65
|
+
}
|
|
28
66
|
/**
|
|
29
67
|
* Starts the client-side Remix component runtime for the current document.
|
|
30
68
|
*
|
|
31
|
-
* @param init Runtime
|
|
69
|
+
* @param init Runtime options for loading modules and customizing frame resolution.
|
|
32
70
|
* @returns The running application runtime.
|
|
33
71
|
*/
|
|
34
72
|
export function run(init) {
|
|
35
73
|
let styleManager = createStyleManager();
|
|
36
74
|
let errorTarget = new TypedEventTarget();
|
|
37
75
|
let scheduler = createScheduler(document, errorTarget, styleManager);
|
|
38
|
-
let resolveFrame = init.resolveFrame ??
|
|
76
|
+
let resolveFrame = init.resolveFrame ?? defaultResolveFrame;
|
|
39
77
|
topFrame = createFrame(document, {
|
|
40
78
|
src: document.location.href,
|
|
41
79
|
errorTarget,
|
|
@@ -57,7 +95,7 @@ export function run(init) {
|
|
|
57
95
|
return namedFrames.get(name);
|
|
58
96
|
},
|
|
59
97
|
};
|
|
60
|
-
startNavigationListener(appController.signal
|
|
98
|
+
startNavigationListener(appController.signal);
|
|
61
99
|
let readyPromise = topFrame.ready().catch((error) => {
|
|
62
100
|
errorTarget.dispatchEvent(createComponentErrorEvent(error));
|
|
63
101
|
throw error;
|
package/dist/runtime/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,YAAY,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAG5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AA4C1D,IAAI,QAAe,CAAA;AACnB;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAC7D,OAAO,QAAQ,CAAC,MAAM,CAAA;AACxB,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAA;AAClD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAA;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,IAAa;IAC/B,IAAI,YAAY,GAAG,kBAAkB,EAAE,CAAA;IACvC,IAAI,WAAW,GAAG,IAAI,gBAAgB,EAAsB,CAAA;IAC5D,IAAI,SAAS,GAAG,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;IAEpE,IAAI,YAAY,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/runtime/component.ts
CHANGED
|
@@ -143,7 +143,8 @@ export type FrameContent = ReadableStream<Uint8Array> | string | RemixNode
|
|
|
143
143
|
/**
|
|
144
144
|
* Value returned by a browser frame resolver.
|
|
145
145
|
*
|
|
146
|
-
*
|
|
146
|
+
* Response bodies are rendered as frame content regardless of status. The default browser resolver
|
|
147
|
+
* rejects non-OK responses before returning them. When `fetch()` followed a redirect, the response's
|
|
147
148
|
* final URL updates the frame source and browser URL for a top-frame navigation.
|
|
148
149
|
*/
|
|
149
150
|
export type FrameResolution = FrameContent | Response
|
|
@@ -72,11 +72,9 @@ export async function navigate(href: string, options?: NavigationOptions) {
|
|
|
72
72
|
* Starts listening for Navigation API transitions and routes them through frame reloads.
|
|
73
73
|
*
|
|
74
74
|
* @param signal Abort signal used to remove the listener.
|
|
75
|
-
* @param canResolveFrames Whether the runtime has a resolver that can handle intercepted navigations.
|
|
76
75
|
* @returns void
|
|
77
76
|
*/
|
|
78
|
-
export function startNavigationListener(signal: AbortSignal
|
|
79
|
-
if (!canResolveFrames) return
|
|
77
|
+
export function startNavigationListener(signal: AbortSignal) {
|
|
80
78
|
return startNavigationListenerImpl(signal, {
|
|
81
79
|
getTopFrame,
|
|
82
80
|
getNamedFrame,
|
package/src/runtime/run.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { createStyleManager } from '../style/index.ts'
|
|
|
4
4
|
import type { FrameHandle, Handle } from './component.ts'
|
|
5
5
|
import { createComponentErrorEvent } from './error-event.ts'
|
|
6
6
|
import type { ComponentErrorEvent } from './error-event.ts'
|
|
7
|
-
import type { LoadModule, ResolveFrame } from './frame.ts'
|
|
7
|
+
import type { LoadModule, ResolveFrame, ResolveFrameOptions } from './frame.ts'
|
|
8
8
|
import { startNavigationListener } from './navigation.ts'
|
|
9
9
|
import { TypedEventTarget } from './typed-event-target.ts'
|
|
10
10
|
|
|
@@ -23,8 +23,8 @@ export interface RunInit {
|
|
|
23
23
|
/**
|
|
24
24
|
* Resolves browser-loaded `<Frame>` content.
|
|
25
25
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* Defaults to fetching the frame source as HTML with the submitted form data,
|
|
27
|
+
* method, encoding, and abort signal.
|
|
28
28
|
*/
|
|
29
29
|
resolveFrame?: ResolveFrame
|
|
30
30
|
}
|
|
@@ -72,10 +72,54 @@ export function getNamedFrame(name: string): FrameHandle {
|
|
|
72
72
|
return namedFrames.get(name) ?? getTopFrame()
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
+
// Frame reloads can receive raw FormData without going through form navigation. Encode it here so
|
|
76
|
+
// manual reloads use the requested form encoding instead of always sending multipart bodies.
|
|
77
|
+
function getRequestBody(options?: ResolveFrameOptions): BodyInit | undefined {
|
|
78
|
+
let formData = options?.formData
|
|
79
|
+
if (!formData || options?.method?.toLowerCase() === 'get') return
|
|
80
|
+
|
|
81
|
+
if (options?.encType === 'text/plain') {
|
|
82
|
+
let body = ''
|
|
83
|
+
for (let [name, value] of formData) {
|
|
84
|
+
name = normalizeLineBreaks(name)
|
|
85
|
+
value = normalizeLineBreaks(typeof value === 'string' ? value : value.name)
|
|
86
|
+
body += `${name}=${value}\r\n`
|
|
87
|
+
}
|
|
88
|
+
return new Blob([body], { type: 'text/plain' })
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (options?.encType !== 'application/x-www-form-urlencoded') return formData
|
|
92
|
+
|
|
93
|
+
let body = new URLSearchParams()
|
|
94
|
+
for (let [name, value] of formData) {
|
|
95
|
+
body.append(name, typeof value === 'string' ? value : value.name)
|
|
96
|
+
}
|
|
97
|
+
return body
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function normalizeLineBreaks(value: string): string {
|
|
101
|
+
return value.replace(/\r\n|\r|\n/g, '\r\n')
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function defaultResolveFrame(src: string, options?: ResolveFrameOptions): Promise<Response> {
|
|
105
|
+
let response = await fetch(src, {
|
|
106
|
+
body: getRequestBody(options),
|
|
107
|
+
headers: { Accept: 'text/html' },
|
|
108
|
+
method: options?.method,
|
|
109
|
+
signal: options?.signal,
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
if (!response.ok) {
|
|
113
|
+
throw new Error(`Failed to resolve frame: ${response.status} ${response.statusText}`.trimEnd())
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return response
|
|
117
|
+
}
|
|
118
|
+
|
|
75
119
|
/**
|
|
76
120
|
* Starts the client-side Remix component runtime for the current document.
|
|
77
121
|
*
|
|
78
|
-
* @param init Runtime
|
|
122
|
+
* @param init Runtime options for loading modules and customizing frame resolution.
|
|
79
123
|
* @returns The running application runtime.
|
|
80
124
|
*/
|
|
81
125
|
export function run(init: RunInit): AppRuntime {
|
|
@@ -83,7 +127,7 @@ export function run(init: RunInit): AppRuntime {
|
|
|
83
127
|
let errorTarget = new TypedEventTarget<AppRuntimeEventMap>()
|
|
84
128
|
let scheduler = createScheduler(document, errorTarget, styleManager)
|
|
85
129
|
|
|
86
|
-
let resolveFrame
|
|
130
|
+
let resolveFrame = init.resolveFrame ?? defaultResolveFrame
|
|
87
131
|
|
|
88
132
|
topFrame = createFrame(document, {
|
|
89
133
|
src: document.location.href,
|
|
@@ -107,7 +151,7 @@ export function run(init: RunInit): AppRuntime {
|
|
|
107
151
|
return namedFrames.get(name)
|
|
108
152
|
},
|
|
109
153
|
}
|
|
110
|
-
startNavigationListener(appController.signal
|
|
154
|
+
startNavigationListener(appController.signal)
|
|
111
155
|
let readyPromise = topFrame.ready().catch((error) => {
|
|
112
156
|
errorTarget.dispatchEvent(createComponentErrorEvent(error))
|
|
113
157
|
throw error
|