Skip to content

Commit 9854936

Browse files
committed
upgrade element code to support define() & React
1 parent b91ae57 commit 9854936

File tree

5 files changed

+111
-43
lines changed

5 files changed

+111
-43
lines changed

custom-elements.json

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,42 @@
99
{
1010
"kind": "class",
1111
"description": "",
12-
"name": "AutocompleteElement",
12+
"name": "AutoCompleteEvent",
1313
"members": [
14+
{
15+
"kind": "field",
16+
"name": "relatedTarget",
17+
"type": {
18+
"text": "HTMLInputElement"
19+
},
20+
"default": "relatedTarget"
21+
}
22+
],
23+
"superclass": {
24+
"name": "Event",
25+
"module": "src/auto-complete-element.ts"
26+
}
27+
},
28+
{
29+
"kind": "class",
30+
"description": "",
31+
"name": "AutoCompleteElement",
32+
"members": [
33+
{
34+
"kind": "method",
35+
"name": "define",
36+
"static": true,
37+
"parameters": [
38+
{
39+
"name": "tag",
40+
"default": "'auto-complete'"
41+
},
42+
{
43+
"name": "registry",
44+
"default": "customElements"
45+
}
46+
]
47+
},
1448
{
1549
"kind": "method",
1650
"name": "setCSPTrustedTypesPolicy",
@@ -123,7 +157,7 @@
123157
{
124158
"name": "auto-complete-change",
125159
"type": {
126-
"text": "AutocompleteEvent"
160+
"text": "AutoCompleteEvent"
127161
}
128162
}
129163
],
@@ -141,24 +175,31 @@
141175
"superclass": {
142176
"name": "HTMLElement"
143177
},
144-
"tagName": "auto-complete",
145178
"customElement": true
146179
}
147180
],
148181
"exports": [
149182
{
150183
"kind": "js",
151-
"name": "default",
184+
"name": "AutoCompleteEvent",
152185
"declaration": {
153-
"name": "AutocompleteElement",
186+
"name": "AutoCompleteEvent",
154187
"module": "src/auto-complete-element.ts"
155188
}
156189
},
157190
{
158-
"kind": "custom-element-definition",
159-
"name": "auto-complete",
191+
"kind": "js",
192+
"name": "AutoCompleteElement",
193+
"declaration": {
194+
"name": "AutoCompleteElement",
195+
"module": "src/auto-complete-element.ts"
196+
}
197+
},
198+
{
199+
"kind": "js",
200+
"name": "default",
160201
"declaration": {
161-
"name": "AutocompleteElement",
202+
"name": "AutoCompleteElement",
162203
"module": "src/auto-complete-element.ts"
163204
}
164205
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {AutoCompleteElement} from './auto-complete-element.js'
2+
3+
const root = (typeof globalThis !== 'undefined' ? globalThis : window) as typeof window
4+
try {
5+
// Lowercase C is here for backwards compat
6+
root.AutocompleteElement = root.AutoCompleteElement = AutoCompleteElement.define()
7+
} catch (e: unknown) {
8+
if (
9+
!(root.DOMException && e instanceof DOMException && e.name === 'NotSupportedError') &&
10+
!(e instanceof ReferenceError)
11+
) {
12+
throw e
13+
}
14+
}
15+
16+
type JSXBase = JSX.IntrinsicElements extends {span: unknown}
17+
? JSX.IntrinsicElements
18+
: Record<string, Record<string, unknown>>
19+
declare global {
20+
interface Window {
21+
AutoCompleteElement: typeof AutoCompleteElement
22+
AutocompleteElement: typeof AutoCompleteElement
23+
}
24+
interface HTMLElementTagNameMap {
25+
'auto-complete': AutoCompleteElement
26+
}
27+
namespace JSX {
28+
interface IntrinsicElements {
29+
['auto-complete']: JSXBase['span'] & Partial<Omit<AutoCompleteElement, keyof HTMLElement>>
30+
}
31+
}
32+
}
33+
34+
export default AutoCompleteElement
35+
export * from './auto-complete-element.js'

src/auto-complete-element.ts

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
import Autocomplete from './autocomplete.js'
2-
import AutocompleteEvent from './auto-complete-event.js'
2+
const HTMLElement = globalThis.HTMLElement || (null as unknown as (typeof window)['HTMLElement'])
3+
4+
type AutoCompleteEventInit = EventInit & {
5+
relatedTarget: HTMLInputElement
6+
}
7+
8+
export class AutoCompleteEvent extends Event {
9+
relatedTarget: HTMLInputElement
10+
11+
constructor(type: 'auto-complete-change', {relatedTarget, ...init}: AutoCompleteEventInit) {
12+
super(type, init)
13+
this.relatedTarget = relatedTarget
14+
}
15+
}
316

417
const state = new WeakMap()
518

@@ -16,8 +29,12 @@ interface CSPTrustedHTMLToStringable {
1629

1730
let cspTrustedTypesPolicyPromise: Promise<CSPTrustedTypesPolicy> | null = null
1831

19-
// eslint-disable-next-line custom-elements/file-name-matches-element
20-
export default class AutocompleteElement extends HTMLElement {
32+
export class AutoCompleteElement extends HTMLElement {
33+
static define(tag = 'auto-complete', registry = customElements) {
34+
registry.define(tag, this)
35+
return this
36+
}
37+
2138
static setCSPTrustedTypesPolicy(policy: CSPTrustedTypesPolicy | Promise<CSPTrustedTypesPolicy> | null): void {
2239
cspTrustedTypesPolicyPromise = policy === null ? policy : Promise.resolve(policy)
2340
}
@@ -155,7 +172,7 @@ export default class AutocompleteElement extends HTMLElement {
155172
autocomplete.input.value = newValue
156173
}
157174
this.dispatchEvent(
158-
new AutocompleteEvent('auto-complete-change', {
175+
new AutoCompleteEvent('auto-complete-change', {
159176
bubbles: true,
160177
relatedTarget: autocomplete.input,
161178
}),
@@ -165,17 +182,4 @@ export default class AutocompleteElement extends HTMLElement {
165182
}
166183
}
167184

168-
declare global {
169-
interface Window {
170-
AutocompleteElement: typeof AutocompleteElement
171-
}
172-
interface HTMLElementTagNameMap {
173-
'auto-complete': AutocompleteElement
174-
}
175-
}
176-
177-
if (!window.customElements.get('auto-complete')) {
178-
window.AutocompleteElement = AutocompleteElement
179-
// eslint-disable-next-line custom-elements/tag-name-matches-class
180-
window.customElements.define('auto-complete', AutocompleteElement)
181-
}
185+
export default AutoCompleteElement

src/auto-complete-event.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +0,0 @@
1-
type AutocompleteEventType = 'auto-complete-change'
2-
3-
type AutocompleteEventInit = CustomEventInit & {
4-
relatedTarget: HTMLInputElement
5-
}
6-
7-
export default class AutocompleteEvent extends CustomEvent<null> {
8-
relatedTarget: HTMLInputElement
9-
10-
constructor(type: AutocompleteEventType, init: AutocompleteEventInit) {
11-
super(type, init)
12-
this.relatedTarget = init.relatedTarget
13-
}
14-
}

src/index.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
import AutoCompleteElement from './auto-complete-element.js'
2-
export {AutoCompleteElement, AutoCompleteElement as default}
3-
export {default as AutocompleteEvent} from './auto-complete-event.js'
1+
import {AutoCompleteElement} from './auto-complete-element-define.js'
2+
3+
export {AutoCompleteElement}
4+
export default AutoCompleteElement
5+
export * from './auto-complete-element-define.js'

0 commit comments

Comments
 (0)