Skip to content

Commit 312788d

Browse files
author
arshia11d
committed
feat(Lit): Add utility to query connected instances of a component
1 parent 1634377 commit 312788d

File tree

5 files changed

+66
-3
lines changed

5 files changed

+66
-3
lines changed

package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/Lit/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@a11d/lit",
3-
"version": "0.5.9",
3+
"version": "0.6.0",
44
"description": "A thin wrapper around the Lit library",
55
"repository": {
66
"type": "git",

packages/Lit/query/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './query.js'
22
export * from './queryAll.js'
3-
export * from './queryAllAsNodeList.js'
3+
export * from './queryAllAsNodeList.js'
4+
export * from './queryConnectedInstances.js'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { Component } from '@a11d/lit'
2+
import { queryConnectedInstances } from './queryConnectedInstances.js'
3+
4+
class QueryConnectedInstancesTestComponent extends Component {
5+
@queryConnectedInstances() static readonly connectedInstances: Set<QueryConnectedInstancesTestComponent>
6+
}
7+
8+
customElements.define('test-query-connected-instances-test-component', QueryConnectedInstancesTestComponent)
9+
10+
describe('queryConnectedInstances', () => {
11+
it('should create a getter that returns the same instance of a Set ', () => {
12+
expect(QueryConnectedInstancesTestComponent.connectedInstances).toBeInstanceOf(Set)
13+
expect(QueryConnectedInstancesTestComponent.connectedInstances).toBe(QueryConnectedInstancesTestComponent.connectedInstances)
14+
})
15+
16+
it('should add the instance to the Set when connected', () => {
17+
const instance = new QueryConnectedInstancesTestComponent()
18+
expect(QueryConnectedInstancesTestComponent.connectedInstances).not.toContain(instance)
19+
document.body.append(instance)
20+
expect(QueryConnectedInstancesTestComponent.connectedInstances).toContain(instance)
21+
instance.remove()
22+
expect(QueryConnectedInstancesTestComponent.connectedInstances).not.toContain(instance)
23+
document.body.append(instance)
24+
expect(QueryConnectedInstancesTestComponent.connectedInstances).toContain(instance)
25+
instance.remove()
26+
expect(QueryConnectedInstancesTestComponent.connectedInstances).not.toContain(instance)
27+
})
28+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { LitElement } from 'lit'
2+
3+
const propertyName = Symbol('ConnectedInstances')
4+
5+
/**
6+
* Decorator that adds a property of type "Set" to a component class
7+
* which contains all connected instances of that component.
8+
*
9+
* @ssr true
10+
*
11+
* @example
12+
* ```
13+
* export class Foo extends Component {
14+
* //` @queryConnectedInstances() static readonly instances!: Set<Foo>
15+
* }
16+
* ```
17+
*/
18+
export function queryConnectedInstances() {
19+
return (elementConstructor: typeof LitElement, propertyKey: string) => {
20+
Object.defineProperty(elementConstructor, propertyName, { value: new Set<LitElement>() })
21+
22+
elementConstructor.addInitializer(element => element.addController({
23+
hostConnected: () => (element.constructor as any)[propertyName].add(element),
24+
hostDisconnected: () => (element.constructor as any)[propertyName].delete(element)
25+
}))
26+
27+
Object.defineProperty(elementConstructor, propertyKey, {
28+
configurable: false,
29+
get(this: typeof LitElement) {
30+
return (this as any)[propertyName]
31+
},
32+
})
33+
}
34+
}

0 commit comments

Comments
 (0)