element-vir 4.0.0 → 4.1.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/dist/augments/type.d.ts +1 -0
- package/dist/augments/type.js +1 -0
- package/dist/functional-element/define-functional-element.js +28 -24
- package/dist/functional-element/directives/assign-with-clean-up.directive.js +3 -0
- package/dist/functional-element/directives/assign.directive.js +1 -0
- package/dist/functional-element/directives/listen.directive.d.ts +10 -25
- package/dist/functional-element/directives/listen.directive.js +7 -14
- package/dist/functional-element/directives/on-dom-created.directive.js +1 -0
- package/dist/functional-element/directives/on-resize.directive.js +4 -3
- package/dist/functional-element/element-events.d.ts +7 -26
- package/dist/functional-element/element-events.js +12 -33
- package/dist/functional-element/functional-element.d.ts +3 -1
- package/dist/functional-element/functional-element.js +2 -0
- package/dist/functional-element/render-callback.d.ts +5 -3
- package/dist/functional-element/render-callback.js +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/template-transforms/transform-template.js +3 -4
- package/dist/template-transforms/vir-html/html-transform.js +1 -1
- package/dist/typed-event/typed-event.d.ts +19 -0
- package/dist/typed-event/typed-event.js +30 -0
- package/package.json +12 -12
- package/dist/functional-element/directives/named-listen.directive.d.ts +0 -15
- package/dist/functional-element/directives/named-listen.directive.js +0 -42
- package/index.html +0 -14
- package/jest/jest.config.ts +0 -32
- package/jest/jest.setup.ts +0 -12
- package/jest/read-tsconfig.ts +0 -27
- package/public/index.css +0 -7
- package/vite/always-reload-plugin.ts +0 -90
- package/vite/vite.config.ts +0 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare type NonEmptyString<T> = T extends '' ? never : T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -5,32 +5,36 @@ import { createPropertyDescriptorMap, createPropertyProxy, } from './element-pro
|
|
|
5
5
|
import { FunctionalElementBaseClass, } from './functional-element';
|
|
6
6
|
import { createRenderParams } from './render-callback';
|
|
7
7
|
export function defineFunctionalElement(functionalElementInit) {
|
|
8
|
-
var _a;
|
|
9
8
|
const eventsMap = createEventDescriptorMap(functionalElementInit.events);
|
|
10
|
-
const anonymousClass =
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
9
|
+
const anonymousClass = class extends FunctionalElementBaseClass {
|
|
10
|
+
static tagName = functionalElementInit.tagName;
|
|
11
|
+
static styles = functionalElementInit.styles || css ``;
|
|
12
|
+
createRenderParams() {
|
|
13
|
+
return createRenderParams(this, eventsMap);
|
|
14
|
+
}
|
|
15
|
+
static events = eventsMap;
|
|
16
|
+
static renderCallback = functionalElementInit.renderCallback;
|
|
17
|
+
static props = createPropertyDescriptorMap(functionalElementInit.props);
|
|
18
|
+
initCalled = false;
|
|
19
|
+
render() {
|
|
20
|
+
const renderParams = this.createRenderParams();
|
|
21
|
+
if (!this.initCalled && functionalElementInit.initCallback) {
|
|
22
|
+
functionalElementInit.initCallback(renderParams);
|
|
23
|
+
this.initCalled = true;
|
|
20
24
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
return functionalElementInit.renderCallback(renderParams);
|
|
26
|
+
}
|
|
27
|
+
instanceProps = createPropertyProxy(functionalElementInit.props, this);
|
|
28
|
+
constructor() {
|
|
29
|
+
super();
|
|
30
|
+
const initProps = functionalElementInit.props || {};
|
|
31
|
+
Object.keys(initProps).forEach((propName) => {
|
|
32
|
+
const functionalElementInstance = this;
|
|
33
|
+
property()(functionalElementInstance, propName);
|
|
34
|
+
functionalElementInstance[propName] = initProps[propName];
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
};
|
|
34
38
|
window.customElements.define(functionalElementInit.tagName, anonymousClass);
|
|
35
39
|
return anonymousClass;
|
|
36
40
|
}
|
|
@@ -10,6 +10,9 @@ export function assignWithCleanup(propertyDescriptor, value, cleanupCallback) {
|
|
|
10
10
|
return assignWithCleanupDirective(propertyDescriptor.propName, value, cleanupCallback);
|
|
11
11
|
}
|
|
12
12
|
class AssignWithCleanupDirectiveClass extends AsyncDirective {
|
|
13
|
+
element;
|
|
14
|
+
lastValue;
|
|
15
|
+
lastCallback;
|
|
13
16
|
constructor(partInfo) {
|
|
14
17
|
super(partInfo);
|
|
15
18
|
this.element = extractFunctionalElement(partInfo, 'assign');
|
|
@@ -9,6 +9,7 @@ export function assign(propertyDescriptor, value) {
|
|
|
9
9
|
return assignDirective(propertyDescriptor.propName, value);
|
|
10
10
|
}
|
|
11
11
|
const assignDirective = directive(class extends Directive {
|
|
12
|
+
element;
|
|
12
13
|
constructor(partInfo) {
|
|
13
14
|
super(partInfo);
|
|
14
15
|
this.element = extractFunctionalElement(partInfo, 'assign');
|
|
@@ -1,28 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { DirectiveResult } from 'lit/directive.js';
|
|
2
|
+
import { DefinedTypedEvent, TypedEvent } from '../../typed-event/typed-event';
|
|
3
3
|
/**
|
|
4
|
-
* Listen to
|
|
4
|
+
* Listen to events. These can be native DOM events (use a string for the inputType argument) or
|
|
5
|
+
* typed events (pass in a return value from defineTypedEvent).
|
|
5
6
|
*
|
|
6
|
-
* @param
|
|
7
|
-
* MyFunctionalElement.events.eventName) or from a
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* is properly typed, the event given to this callback will also be typed.
|
|
7
|
+
* @param definedTypedEvent Needs to come either from a functional element (like
|
|
8
|
+
* MyFunctionalElement.events.eventName) or from a typed event created via the defineTypedEvent function.
|
|
9
|
+
* @param listener The callback to fire when an event is caught. Assuming the definedTypedEvent
|
|
10
|
+
* input is properly typed, the event given to this callback will also be typed.
|
|
11
11
|
*/
|
|
12
|
-
export declare function listen<
|
|
13
|
-
|
|
14
|
-
readonly element: HTMLElement;
|
|
15
|
-
lastListenerMetaData: ListenerMetaData<unknown> | undefined;
|
|
16
|
-
resetListener(listenerMetaData: ListenerMetaData<any>): void;
|
|
17
|
-
createListenerMetaData(eventType: string, callback: (event: ElementEvent<string, unknown>) => void): ListenerMetaData<unknown>;
|
|
18
|
-
render(eventObject: EventDescriptor<string, any>, callback: (event: ElementEvent<any, any>) => void): symbol;
|
|
19
|
-
readonly _$isConnected: boolean;
|
|
20
|
-
update(_part: import("lit-html").Part, props: unknown[]): unknown;
|
|
21
|
-
};
|
|
22
|
-
}>;
|
|
23
|
-
declare type ListenerMetaData<EventDetail> = {
|
|
24
|
-
eventType: string;
|
|
25
|
-
callback: (event: ElementEvent<string, EventDetail>) => void;
|
|
26
|
-
listener: (event: any) => void;
|
|
27
|
-
};
|
|
28
|
-
export {};
|
|
12
|
+
export declare function listen<TypedEventTypeNameGeneric extends string, TypedEventDetailGeneric, NativeElementEventNameGeneric extends keyof HTMLElementEventMap>(eventType: DefinedTypedEvent<TypedEventTypeNameGeneric, TypedEventDetailGeneric>, listener: (event: TypedEvent<TypedEventTypeNameGeneric, TypedEventDetailGeneric>) => void): DirectiveResult<any>;
|
|
13
|
+
export declare function listen<TypedEventTypeNameGeneric extends string, TypedEventDetailGeneric, NativeElementEventNameGeneric extends keyof HTMLElementEventMap>(eventType: NativeElementEventNameGeneric, listener: (event: HTMLElementEventMap[NativeElementEventNameGeneric]) => void): DirectiveResult<any>;
|
|
@@ -1,23 +1,16 @@
|
|
|
1
1
|
import { noChange } from 'lit';
|
|
2
2
|
import { directive, Directive } from 'lit/directive.js';
|
|
3
3
|
import { extractElement } from './directive-util';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
*
|
|
7
|
-
* @param eventDescriptor Needs to come either from a functional element (like
|
|
8
|
-
* MyFunctionalElement.events.eventName) or from a custom element event created via the
|
|
9
|
-
* createCustomEvent function.
|
|
10
|
-
* @param listener The callback to fire when an event is caught. Assuming the eventDescriptor input
|
|
11
|
-
* is properly typed, the event given to this callback will also be typed.
|
|
12
|
-
*/
|
|
13
|
-
export function listen(eventDescriptor, listener) {
|
|
14
|
-
return listenDirective(eventDescriptor, listener);
|
|
4
|
+
export function listen(eventType, listener) {
|
|
5
|
+
return listenDirective(eventType, listener);
|
|
15
6
|
}
|
|
16
7
|
/**
|
|
17
8
|
* The directive generics here are not strong enough to maintain their values. Thus, the directive
|
|
18
9
|
* call is wrapped in the function above.
|
|
19
10
|
*/
|
|
20
11
|
const listenDirective = directive(class extends Directive {
|
|
12
|
+
element;
|
|
13
|
+
lastListenerMetaData;
|
|
21
14
|
constructor(partInfo) {
|
|
22
15
|
super(partInfo);
|
|
23
16
|
this.element = extractElement(partInfo, 'listen', HTMLElement);
|
|
@@ -33,11 +26,11 @@ const listenDirective = directive(class extends Directive {
|
|
|
33
26
|
return {
|
|
34
27
|
eventType,
|
|
35
28
|
callback,
|
|
36
|
-
listener: (event) =>
|
|
29
|
+
listener: (event) => this.lastListenerMetaData?.callback(event),
|
|
37
30
|
};
|
|
38
31
|
}
|
|
39
|
-
render(
|
|
40
|
-
const eventType =
|
|
32
|
+
render(eventTypeInput, callback) {
|
|
33
|
+
const eventType = typeof eventTypeInput === 'string' ? eventTypeInput : eventTypeInput.type;
|
|
41
34
|
if (typeof eventType !== 'string') {
|
|
42
35
|
throw new Error(`Cannot listen to an event with a name that is not a string. Given event name: "${eventType}"`);
|
|
43
36
|
}
|
|
@@ -3,6 +3,7 @@ import { assertsIsElementPartInfo } from './directive-util';
|
|
|
3
3
|
const directiveName = 'onDomCreated';
|
|
4
4
|
/** Only fires once, when the element has been created. */
|
|
5
5
|
export const onDomCreated = directive(class extends Directive {
|
|
6
|
+
element;
|
|
6
7
|
constructor(partInfo) {
|
|
7
8
|
super(partInfo);
|
|
8
9
|
assertsIsElementPartInfo(partInfo, directiveName);
|
|
@@ -2,19 +2,20 @@ import { directive, Directive } from 'lit/directive.js';
|
|
|
2
2
|
import { assertsIsElementPartInfo } from './directive-util';
|
|
3
3
|
const directiveName = 'onResize';
|
|
4
4
|
export const onResize = directive(class extends Directive {
|
|
5
|
+
element;
|
|
6
|
+
resizeObserver = new ResizeObserver((entries) => this.fireCallback(entries));
|
|
7
|
+
callback;
|
|
5
8
|
constructor(partInfo) {
|
|
6
9
|
super(partInfo);
|
|
7
|
-
this.resizeObserver = new ResizeObserver((entries) => this.fireCallback(entries));
|
|
8
10
|
assertsIsElementPartInfo(partInfo, directiveName);
|
|
9
11
|
}
|
|
10
12
|
fireCallback(entries) {
|
|
11
|
-
var _a;
|
|
12
13
|
const resizeEntry = entries[0];
|
|
13
14
|
if (!resizeEntry) {
|
|
14
15
|
console.error(entries);
|
|
15
16
|
throw new Error(`${directiveName} observation triggered but the first entry was empty.`);
|
|
16
17
|
}
|
|
17
|
-
|
|
18
|
+
this.callback?.({ target: resizeEntry.target, contentRect: resizeEntry.contentRect });
|
|
18
19
|
}
|
|
19
20
|
update(partInfo, [callback]) {
|
|
20
21
|
assertsIsElementPartInfo(partInfo, directiveName);
|
|
@@ -1,29 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
export declare type
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export declare function eventInit<T>(): new () => ElementEvent<string, T>;
|
|
6
|
-
export declare type EventInitInfo<EventNameGeneric extends string> = {
|
|
7
|
-
eventName: EventNameGeneric;
|
|
8
|
-
};
|
|
9
|
-
export declare class ElementEvent<EventName extends string, EventValue> extends CustomEvent<EventValue> {
|
|
10
|
-
readonly eventInitInfo: EventInitInfo<EventName>;
|
|
11
|
-
readonly eventName: string;
|
|
12
|
-
constructor(eventInitInfo: EventInitInfo<EventName>, initDetail: EventValue);
|
|
13
|
-
}
|
|
14
|
-
export declare function defineCustomEvent<EventName extends string, EventValue>(eventName: EventName): (new (eventValue: EventValue) => ElementEvent<EventName, EventValue>) & EventDescriptor<EventName, EventValue>;
|
|
15
|
-
export declare type EventExtraProperties<DetailType> = {
|
|
16
|
-
/**
|
|
17
|
-
* The event constructor property is needed in order to store sufficient type data for event
|
|
18
|
-
* listeners to work.
|
|
19
|
-
*/
|
|
20
|
-
eventConstructor: new (outputObject: EventDescriptor<string, DetailType>, initDetail: DetailType) => ElementEvent<string, DetailType>;
|
|
21
|
-
};
|
|
22
|
-
export declare type EventObjectEventDetailExtractor<EventObjectGeneric extends EventDescriptor<any, any>> = EventObjectGeneric extends EventDescriptor<string, infer R> ? R : never;
|
|
23
|
-
export declare type ElementEventDetailExtractor<ElementEventGeneric extends ElementEvent<any, any>> = ElementEventGeneric extends ElementEvent<string, infer R> ? R : never;
|
|
24
|
-
export declare type EventInitMapEventDetailExtractor<Property extends keyof EventsInitGeneric, EventsInitGeneric extends EventsInitMap> = InstanceType<EventsInitGeneric[Property]> extends ElementEvent<string, infer R> ? R : never;
|
|
25
|
-
export declare type EventDescriptor<EventNameGeneric extends string, DetailType> = EventInitInfo<EventNameGeneric> & EventExtraProperties<DetailType>;
|
|
1
|
+
import { DefinedTypedEvent, DefinedTypedEventNameDefinition, TypedEvent } from '../typed-event/typed-event';
|
|
2
|
+
export declare type EventsInitMap = Record<string, DefinedTypedEventNameDefinition<any>>;
|
|
3
|
+
export declare function defineElementEvent<EventDetailGeneric>(): DefinedTypedEventNameDefinition<EventDetailGeneric>;
|
|
4
|
+
export declare type EventInitMapEventDetailExtractor<EventTypeNameGeneric extends keyof EventsInitGeneric, EventsInitGeneric extends EventsInitMap> = EventsInitGeneric[EventTypeNameGeneric] extends DefinedTypedEventNameDefinition<infer R> ? R : never;
|
|
26
5
|
export declare type EventDescriptorMap<EventsInitGeneric extends EventsInitMap> = {
|
|
27
|
-
[
|
|
6
|
+
[CurrentEventTypeName in keyof EventsInitGeneric]: DefinedTypedEvent<CurrentEventTypeName extends string ? CurrentEventTypeName : never, EventInitMapEventDetailExtractor<CurrentEventTypeName, EventsInitGeneric>>;
|
|
28
7
|
};
|
|
8
|
+
export declare type EventObjectEventDetailExtractor<EventObjectGeneric extends DefinedTypedEvent<any, any>> = EventObjectGeneric extends DefinedTypedEvent<string, infer R> ? R : never;
|
|
9
|
+
export declare type ElementEventDetailExtractor<ElementEventGeneric extends TypedEvent<any, any>> = ElementEventGeneric extends TypedEvent<string, infer R> ? R : never;
|
|
29
10
|
export declare function createEventDescriptorMap<EventsInitGeneric extends EventsInitMap>(eventsInit: EventsInitGeneric | undefined): EventDescriptorMap<EventsInitGeneric>;
|
|
@@ -1,45 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
return customEventElement;
|
|
5
|
-
}
|
|
6
|
-
export class ElementEvent extends CustomEvent {
|
|
7
|
-
constructor(eventInitInfo, initDetail) {
|
|
8
|
-
super(String(eventInitInfo.eventName), { detail: initDetail, bubbles: true, composed: true });
|
|
9
|
-
this.eventInitInfo = eventInitInfo;
|
|
10
|
-
this.eventName = String(this.eventInitInfo.eventName);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
export function defineCustomEvent(eventName) {
|
|
14
|
-
var _a;
|
|
15
|
-
return _a = class extends ElementEvent {
|
|
16
|
-
constructor(eventValue) {
|
|
17
|
-
super({ eventName: eventName }, eventValue);
|
|
18
|
-
window.ElementEvent = ElementEvent;
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
_a.eventName = eventName,
|
|
22
|
-
// this allows sub classes of ElementEvent to be directly listened to
|
|
23
|
-
_a.eventConstructor = ElementEvent.constructor,
|
|
24
|
-
_a;
|
|
1
|
+
import { defineTypedEvent, } from '../typed-event/typed-event';
|
|
2
|
+
export function defineElementEvent() {
|
|
3
|
+
return defineTypedEvent();
|
|
25
4
|
}
|
|
26
5
|
export function createEventDescriptorMap(eventsInit) {
|
|
27
6
|
if (!eventsInit) {
|
|
28
7
|
return {};
|
|
29
8
|
}
|
|
30
9
|
return Object.keys(eventsInit)
|
|
31
|
-
.filter((
|
|
32
|
-
if (typeof
|
|
33
|
-
throw new Error(`Expected event key of type string but got type "${typeof
|
|
10
|
+
.filter((currentElementEventKey) => {
|
|
11
|
+
if (typeof currentElementEventKey !== 'string') {
|
|
12
|
+
throw new Error(`Expected event key of type string but got type "${typeof currentElementEventKey}" for key ${currentElementEventKey}`);
|
|
13
|
+
}
|
|
14
|
+
if (currentElementEventKey === '') {
|
|
15
|
+
throw new Error(`Got empty string for events key.`);
|
|
34
16
|
}
|
|
35
17
|
return true;
|
|
36
18
|
})
|
|
37
|
-
.reduce((accum,
|
|
38
|
-
const eventObject =
|
|
39
|
-
|
|
40
|
-
eventConstructor: eventsInit[currentKey],
|
|
41
|
-
};
|
|
42
|
-
accum[currentKey] = eventObject;
|
|
19
|
+
.reduce((accum, currentElementEventKey) => {
|
|
20
|
+
const eventObject = defineTypedEvent()(currentElementEventKey);
|
|
21
|
+
accum[currentElementEventKey] = eventObject;
|
|
43
22
|
return accum;
|
|
44
23
|
}, {});
|
|
45
24
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CSSResult, LitElement, TemplateResult } from 'lit';
|
|
2
2
|
import { EventDescriptorMap, EventsInitMap } from './element-events';
|
|
3
3
|
import { ElementPropertyDescriptorMap, PropertyInitMapBase } from './element-properties';
|
|
4
|
-
import { RenderCallback } from './render-callback';
|
|
4
|
+
import { InitCallback, RenderCallback } from './render-callback';
|
|
5
5
|
export declare type CustomElementTagName = `${string}-${string}`;
|
|
6
6
|
export declare type FunctionalElementInit<PropertyInitGeneric extends PropertyInitMapBase, EventsInitGeneric extends EventsInitMap> = {
|
|
7
7
|
/**
|
|
@@ -15,6 +15,8 @@ export declare type FunctionalElementInit<PropertyInitGeneric extends PropertyIn
|
|
|
15
15
|
props?: PropertyInitGeneric | undefined;
|
|
16
16
|
/** Initializer for events that the element can dispatch. (These can be thought of as "outputs".) */
|
|
17
17
|
events?: EventsInitGeneric | undefined;
|
|
18
|
+
/** Called as part of the first renderCallback call, before the first renderCallback call. */
|
|
19
|
+
initCallback?: InitCallback<PropertyInitGeneric, EventsInitGeneric>;
|
|
18
20
|
renderCallback: RenderCallback<PropertyInitGeneric, EventsInitGeneric>;
|
|
19
21
|
};
|
|
20
22
|
export declare abstract class FunctionalElementBaseClass<PropertyInitGeneric extends PropertyInitMapBase> extends LitElement {
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { TemplateResult } from 'lit';
|
|
2
|
-
import {
|
|
2
|
+
import { TypedEvent } from '../typed-event/typed-event';
|
|
3
|
+
import { EventDescriptorMap, EventInitMapEventDetailExtractor, EventsInitMap } from './element-events';
|
|
3
4
|
import { PropertyInitMapBase } from './element-properties';
|
|
4
5
|
import { FunctionalElementInstance } from './functional-element';
|
|
5
6
|
export declare type RenderCallback<PropertyInitGeneric extends PropertyInitMapBase, EventsInitGeneric extends EventsInitMap> = (params: RenderParams<PropertyInitGeneric, EventsInitGeneric>) => TemplateResult | Promise<TemplateResult>;
|
|
7
|
+
export declare type InitCallback<PropertyInitGeneric extends PropertyInitMapBase, EventsInitGeneric extends EventsInitMap> = (params: RenderParams<PropertyInitGeneric, EventsInitGeneric>) => void;
|
|
6
8
|
export declare type RenderParams<PropertyInitGeneric extends PropertyInitMapBase, EventsInitGeneric extends EventsInitMap> = {
|
|
7
9
|
props: PropertyInitGeneric;
|
|
8
10
|
events: EventDescriptorMap<EventsInitGeneric>;
|
|
9
11
|
host: FunctionalElementInstance<PropertyInitGeneric>;
|
|
10
|
-
|
|
12
|
+
dispatch: <EventTypeNameGeneric extends keyof EventsInitGeneric>(event: TypedEvent<EventTypeNameGeneric extends string ? EventTypeNameGeneric : never, EventInitMapEventDetailExtractor<EventTypeNameGeneric, EventsInitGeneric>>) => boolean;
|
|
11
13
|
/**
|
|
12
14
|
* Same as dispatchElementEvent but without the extra types. This allows you to emit any events,
|
|
13
15
|
* even events from other custom elements.
|
|
14
16
|
*/
|
|
15
|
-
|
|
17
|
+
genericDispatch: (event: Event) => boolean;
|
|
16
18
|
};
|
|
17
19
|
export declare function createRenderParams<PropertyInitGeneric extends PropertyInitMapBase, EventsInitGeneric extends EventsInitMap>(element: FunctionalElementInstance<PropertyInitGeneric>, eventsMap: EventDescriptorMap<EventsInitGeneric>): RenderParams<PropertyInitGeneric, EventsInitGeneric>;
|
|
@@ -4,8 +4,8 @@ export function createRenderParams(element, eventsMap) {
|
|
|
4
4
|
* These two dispatch properties do the same thing but their interfaces are different.
|
|
5
5
|
* DispatchEvent's type interface is much stricter.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
dispatch: (event) => element.dispatchEvent(event),
|
|
8
|
+
genericDispatch: (event) => element.dispatchEvent(event),
|
|
9
9
|
host: element,
|
|
10
10
|
props: element.instanceProps,
|
|
11
11
|
events: eventsMap,
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ export * from './functional-element/define-functional-element';
|
|
|
2
2
|
export * from './functional-element/directives/assign-with-clean-up.directive';
|
|
3
3
|
export * from './functional-element/directives/assign.directive';
|
|
4
4
|
export * from './functional-element/directives/listen.directive';
|
|
5
|
-
export * from './functional-element/directives/named-listen.directive';
|
|
6
5
|
export * from './functional-element/directives/on-dom-created.directive';
|
|
7
6
|
export * from './functional-element/directives/on-resize.directive';
|
|
8
7
|
export * from './functional-element/element-events';
|
|
@@ -12,3 +11,4 @@ export * from './functional-element/render-callback';
|
|
|
12
11
|
export { requireAllCustomElementsToBeFunctionalElement } from './require-functional-element';
|
|
13
12
|
export * from './template-transforms/vir-css/vir-css';
|
|
14
13
|
export * from './template-transforms/vir-html/vir-html';
|
|
14
|
+
export * from './typed-event/typed-event';
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,6 @@ export * from './functional-element/define-functional-element';
|
|
|
2
2
|
export * from './functional-element/directives/assign-with-clean-up.directive';
|
|
3
3
|
export * from './functional-element/directives/assign.directive';
|
|
4
4
|
export * from './functional-element/directives/listen.directive';
|
|
5
|
-
export * from './functional-element/directives/named-listen.directive';
|
|
6
5
|
export * from './functional-element/directives/on-dom-created.directive';
|
|
7
6
|
export * from './functional-element/directives/on-resize.directive';
|
|
8
7
|
export * from './functional-element/element-events';
|
|
@@ -12,3 +11,4 @@ export * from './functional-element/render-callback';
|
|
|
12
11
|
export { requireAllCustomElementsToBeFunctionalElement } from './require-functional-element';
|
|
13
12
|
export * from './template-transforms/vir-css/vir-css';
|
|
14
13
|
export * from './template-transforms/vir-html/vir-html';
|
|
14
|
+
export * from './typed-event/typed-event';
|
|
@@ -17,7 +17,7 @@ export function makeCheckTransform(name, check, transform) {
|
|
|
17
17
|
const transformedTemplateStrings = new WeakMap();
|
|
18
18
|
export function getTransformedTemplate(templateStringsKey, values, fallbackTransform) {
|
|
19
19
|
const alreadyTransformedTemplateStrings = transformedTemplateStrings.get(templateStringsKey);
|
|
20
|
-
const templateTransform = alreadyTransformedTemplateStrings
|
|
20
|
+
const templateTransform = alreadyTransformedTemplateStrings ?? fallbackTransform();
|
|
21
21
|
if (!alreadyTransformedTemplateStrings) {
|
|
22
22
|
transformedTemplateStrings.set(templateStringsKey, templateTransform);
|
|
23
23
|
}
|
|
@@ -29,7 +29,6 @@ export function transformTemplate(inputTemplateStrings, inputValues, checksAndTr
|
|
|
29
29
|
const newRaws = [];
|
|
30
30
|
const valueDeletions = [];
|
|
31
31
|
inputTemplateStrings.forEach((currentTemplateString, index) => {
|
|
32
|
-
var _a;
|
|
33
32
|
const lastNewStringsIndex = newStrings.length - 1;
|
|
34
33
|
const lastNewString = newStrings[lastNewStringsIndex];
|
|
35
34
|
const currentValueIndex = index - 1;
|
|
@@ -37,9 +36,9 @@ export function transformTemplate(inputTemplateStrings, inputValues, checksAndTr
|
|
|
37
36
|
let validTransform;
|
|
38
37
|
assertValidString && assertValidString(currentTemplateString);
|
|
39
38
|
if (typeof lastNewString === 'string') {
|
|
40
|
-
validTransform =
|
|
39
|
+
validTransform = checksAndTransforms.find((checkAndTransform) => {
|
|
41
40
|
return checkAndTransform.check(lastNewString, currentTemplateString, currentValue);
|
|
42
|
-
})
|
|
41
|
+
})?.transform;
|
|
43
42
|
if (validTransform) {
|
|
44
43
|
newStrings[lastNewStringsIndex] =
|
|
45
44
|
lastNewString + validTransform(currentValue) + currentTemplateString;
|
|
@@ -5,7 +5,7 @@ import { makeCheckTransform, transformTemplate, } from '../transform-template';
|
|
|
5
5
|
const htmlChecksAndTransforms = [
|
|
6
6
|
makeCheckTransform('tag name interpolation', (lastNewString, currentLitString, currentValue) => {
|
|
7
7
|
const shouldHaveTagNameHere = (lastNewString.trim().endsWith('<') && !!currentLitString.match(/^[\s\n>]/)) ||
|
|
8
|
-
(
|
|
8
|
+
(lastNewString?.trim().endsWith('</') && currentLitString.trim().startsWith('>'));
|
|
9
9
|
const staticTagName = hasStaticTagName(currentValue);
|
|
10
10
|
if (shouldHaveTagNameHere && !staticTagName) {
|
|
11
11
|
console.error({
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NonEmptyString } from '../augments/type';
|
|
2
|
+
export declare class TypedEvent<EventTypeNameGeneric extends string = '', EventDetailGeneric = undefined> extends CustomEvent<EventDetailGeneric> {
|
|
3
|
+
readonly _type: EventTypeNameGeneric;
|
|
4
|
+
get type(): EventTypeNameGeneric;
|
|
5
|
+
constructor(type: EventTypeNameGeneric | {
|
|
6
|
+
type: EventTypeNameGeneric;
|
|
7
|
+
}, value: EventDetailGeneric);
|
|
8
|
+
}
|
|
9
|
+
export declare type DefinedTypedEventNameDefinition<EventDetailGeneric> = <EventTypeNameGeneric extends string>(eventType: NonEmptyString<EventTypeNameGeneric>) => DefinedTypedEvent<EventTypeNameGeneric, EventDetailGeneric>;
|
|
10
|
+
export declare type DefinedTypedEvent<EventTypeNameGeneric extends string, EventDetailGeneric> = (new (eventValue: EventDetailGeneric) => TypedEvent<EventTypeNameGeneric, EventDetailGeneric>) & {
|
|
11
|
+
type: EventTypeNameGeneric;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Defined a typed event. Make sure to use currying and call this function twice! Typescript's
|
|
15
|
+
* generic restrictions require this setup to get the types right without excessive verbosity.
|
|
16
|
+
*
|
|
17
|
+
* Example: const myCustomEvent = defineTypedEvent<number>()('my-custom-event')
|
|
18
|
+
*/
|
|
19
|
+
export declare function defineTypedEvent<EventDetailGeneric>(): <EventTypeNameGeneric extends string>(eventType: NonEmptyString<EventTypeNameGeneric>) => DefinedTypedEvent<EventTypeNameGeneric, EventDetailGeneric>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export class TypedEvent extends CustomEvent {
|
|
2
|
+
_type = '';
|
|
3
|
+
get type() {
|
|
4
|
+
return this._type;
|
|
5
|
+
}
|
|
6
|
+
constructor(type, value) {
|
|
7
|
+
super(typeof type === 'string' ? type : type.type, {
|
|
8
|
+
detail: value,
|
|
9
|
+
bubbles: true,
|
|
10
|
+
composed: true,
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Defined a typed event. Make sure to use currying and call this function twice! Typescript's
|
|
16
|
+
* generic restrictions require this setup to get the types right without excessive verbosity.
|
|
17
|
+
*
|
|
18
|
+
* Example: const myCustomEvent = defineTypedEvent<number>()('my-custom-event')
|
|
19
|
+
*/
|
|
20
|
+
export function defineTypedEvent() {
|
|
21
|
+
return (eventType) => {
|
|
22
|
+
return class extends TypedEvent {
|
|
23
|
+
static type = eventType;
|
|
24
|
+
_type = eventType;
|
|
25
|
+
constructor(value) {
|
|
26
|
+
super(eventType, value);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "element-vir",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"custom",
|
|
6
6
|
"web",
|
|
@@ -25,28 +25,28 @@
|
|
|
25
25
|
"main": "dist/index.js",
|
|
26
26
|
"types": "dist/index.d.ts",
|
|
27
27
|
"scripts": {
|
|
28
|
-
"compile": "tsc",
|
|
28
|
+
"compile": "rm -rf dist && tsc",
|
|
29
29
|
"format": "virmator format write",
|
|
30
|
-
"jest": "jest --config ./jest/jest.config.ts",
|
|
31
|
-
"prepublishOnly": "npm run test:full",
|
|
30
|
+
"jest": "jest --config ./src/jest/jest.config.ts",
|
|
31
|
+
"prepublishOnly": "npm run compile && npm run test:full",
|
|
32
32
|
"spellcheck": "virmator spellcheck",
|
|
33
|
-
"start": "npm install && vite --force --config ./vite/vite.config.ts",
|
|
33
|
+
"start": "npm install && vite --force --config ./src/vite/vite.config.ts",
|
|
34
34
|
"test": "npm run type-check && npm run jest",
|
|
35
35
|
"test:full": "npm test && npm run spellcheck && virmator format check && npm run update-docs -- --check",
|
|
36
36
|
"type-check": "tsc --noEmit",
|
|
37
37
|
"update-docs": "virmator code-in-markdown README.md --index src/index.ts"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"augment-vir": "^1.
|
|
41
|
-
"lit": "^2.
|
|
40
|
+
"augment-vir": "^1.5.1",
|
|
41
|
+
"lit": "^2.2.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/jest": "^27.4.0",
|
|
45
|
-
"jest": "^27.
|
|
45
|
+
"jest": "^27.5.1",
|
|
46
46
|
"ts-jest": "^27.1.3",
|
|
47
|
-
"ts-node": "^10.
|
|
48
|
-
"typescript": "^4.5.
|
|
49
|
-
"virmator": "^1.
|
|
50
|
-
"vite": "^2.
|
|
47
|
+
"ts-node": "^10.5.0",
|
|
48
|
+
"typescript": "^4.5.5",
|
|
49
|
+
"virmator": "^1.4.4",
|
|
50
|
+
"vite": "^2.8.4"
|
|
51
51
|
}
|
|
52
52
|
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { DirectiveResult } from 'lit/directive.js';
|
|
2
|
-
/**
|
|
3
|
-
* Listen to events. First parameter is just a string for an event name/type, vs. the more
|
|
4
|
-
* complicated first parameter type for the "listen" directive. If the given eventName is a native
|
|
5
|
-
* DOM event, the event type given to the callback will be the event type associated with that
|
|
6
|
-
* native event type. Otherwise, specific event types given to the callback are unknown.
|
|
7
|
-
*
|
|
8
|
-
* If you are listening to your custom events, it is better to use the "listen" directive directly
|
|
9
|
-
* so your callbacks are more tightly typed.
|
|
10
|
-
*
|
|
11
|
-
* @param eventName Name of the event to listen to.
|
|
12
|
-
* @param listener The callback to fire when an event is caught.
|
|
13
|
-
*/
|
|
14
|
-
export declare function namedListen<EventName extends keyof HTMLElementEventMap>(eventName: EventName, listener: (event: HTMLElementEventMap[EventName]) => void): DirectiveResult;
|
|
15
|
-
export declare function namedListen<EventName extends string>(eventName: EventName, listener: (event: Event) => void): DirectiveResult;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { noChange } from 'lit';
|
|
2
|
-
import { directive, Directive } from 'lit/directive.js';
|
|
3
|
-
import { extractElement } from './directive-util';
|
|
4
|
-
export function namedListen(eventName, listener) {
|
|
5
|
-
return listenDirective(eventName, listener);
|
|
6
|
-
}
|
|
7
|
-
const listenDirective = directive(class extends Directive {
|
|
8
|
-
constructor(partInfo) {
|
|
9
|
-
super(partInfo);
|
|
10
|
-
this.element = extractElement(partInfo, 'listen', HTMLElement);
|
|
11
|
-
}
|
|
12
|
-
resetListener(listenerMetaData) {
|
|
13
|
-
if (this.lastListenerMetaData) {
|
|
14
|
-
this.element.removeEventListener(this.lastListenerMetaData.eventType, this.lastListenerMetaData.listener);
|
|
15
|
-
}
|
|
16
|
-
this.element.addEventListener(listenerMetaData.eventType, listenerMetaData.listener);
|
|
17
|
-
this.lastListenerMetaData = listenerMetaData;
|
|
18
|
-
}
|
|
19
|
-
createListenerMetaData(eventType, callback) {
|
|
20
|
-
return {
|
|
21
|
-
eventType,
|
|
22
|
-
callback,
|
|
23
|
-
listener: (event) => { var _a; return (_a = this.lastListenerMetaData) === null || _a === void 0 ? void 0 : _a.callback(event); },
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
render(eventName, callback) {
|
|
27
|
-
if (typeof eventName !== 'string') {
|
|
28
|
-
throw new Error(`Cannot listen to an event with a name that is not a string. Given event name: "${eventName}"`);
|
|
29
|
-
}
|
|
30
|
-
if (this.lastListenerMetaData && this.lastListenerMetaData.eventType === eventName) {
|
|
31
|
-
/**
|
|
32
|
-
* Store the callback here so we don't have to update the attached listener every
|
|
33
|
-
* time the callback is updated.
|
|
34
|
-
*/
|
|
35
|
-
this.lastListenerMetaData.callback = callback;
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
this.resetListener(this.createListenerMetaData(eventName, callback));
|
|
39
|
-
}
|
|
40
|
-
return noChange;
|
|
41
|
-
}
|
|
42
|
-
});
|
package/index.html
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html>
|
|
3
|
-
<head>
|
|
4
|
-
<title>Element Vir Test</title>
|
|
5
|
-
<script type="module" src="/src/test/elements/app.element.ts"></script>
|
|
6
|
-
<link rel="stylesheet" type="text/css" href="/index.css" />
|
|
7
|
-
<script>
|
|
8
|
-
console.log('yo');
|
|
9
|
-
</script>
|
|
10
|
-
</head>
|
|
11
|
-
<body>
|
|
12
|
-
<element-vir-test-app></element-vir-test-app>
|
|
13
|
-
</body>
|
|
14
|
-
</html>
|
package/jest/jest.config.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import {dirname, join} from 'path';
|
|
2
|
-
import {pathsToModuleNameMapper} from 'ts-jest';
|
|
3
|
-
import {InitialOptionsTsJest} from 'ts-jest/dist/types';
|
|
4
|
-
import {findTsConfigFile, getTsconfigPathAliases} from './read-tsconfig';
|
|
5
|
-
|
|
6
|
-
const repoRootDir = dirname(__dirname);
|
|
7
|
-
|
|
8
|
-
const config: InitialOptionsTsJest = {
|
|
9
|
-
preset: 'ts-jest',
|
|
10
|
-
testEnvironment: 'jsdom',
|
|
11
|
-
verbose: false,
|
|
12
|
-
// type tests are caught by the typescript compiler
|
|
13
|
-
testPathIgnorePatterns: ['.type.test.ts'],
|
|
14
|
-
rootDir: repoRootDir,
|
|
15
|
-
silent: false,
|
|
16
|
-
moduleNameMapper: pathsToModuleNameMapper(getTsconfigPathAliases(), {
|
|
17
|
-
prefix: '<rootDir>/',
|
|
18
|
-
}) as Record<string, string | string[]>,
|
|
19
|
-
roots: [join(repoRootDir, 'src')],
|
|
20
|
-
setupFilesAfterEnv: [join(__dirname, 'jest.setup.ts')],
|
|
21
|
-
globals: {
|
|
22
|
-
'ts-jest': {
|
|
23
|
-
tsconfig: findTsConfigFile(),
|
|
24
|
-
diagnostics: {
|
|
25
|
-
warnOnly: true,
|
|
26
|
-
ignoreCodes: ['TS151001'],
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
export default config;
|
package/jest/jest.setup.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {CustomConsole, LogMessage, LogType} from '@jest/console';
|
|
2
|
-
|
|
3
|
-
function simpleFormatter(type: LogType, message: LogMessage): string {
|
|
4
|
-
const consoleIndent = ' ';
|
|
5
|
-
|
|
6
|
-
return message
|
|
7
|
-
.split(/\n/)
|
|
8
|
-
.map((line) => consoleIndent + line)
|
|
9
|
-
.join('\n');
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
global.console = new CustomConsole(process.stdout, process.stderr, simpleFormatter);
|
package/jest/read-tsconfig.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import {dirname} from 'path';
|
|
2
|
-
import {findConfigFile, parseJsonConfigFileContent, readConfigFile, sys as tsSys} from 'typescript';
|
|
3
|
-
|
|
4
|
-
export function findTsConfigFile(): string {
|
|
5
|
-
const dirToCheck = __dirname;
|
|
6
|
-
const configFileName = findConfigFile(dirToCheck, tsSys.fileExists, 'tsconfig.json');
|
|
7
|
-
if (!configFileName) {
|
|
8
|
-
throw new Error(
|
|
9
|
-
`Could not find tsconfig.json file from starting search at "${dirToCheck}"`,
|
|
10
|
-
);
|
|
11
|
-
}
|
|
12
|
-
return configFileName;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function getTsconfigPathAliases() {
|
|
16
|
-
const configFileName = findTsConfigFile();
|
|
17
|
-
|
|
18
|
-
if (!configFileName) {
|
|
19
|
-
throw new Error(`Failed to find tsconfig.`);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const configFile = readConfigFile(configFileName, tsSys.readFile);
|
|
23
|
-
const tsConfig = parseJsonConfigFileContent(configFile.config, tsSys, dirname(configFileName));
|
|
24
|
-
const tsConfigPaths = tsConfig.options.paths || {};
|
|
25
|
-
|
|
26
|
-
return tsConfigPaths;
|
|
27
|
-
}
|
package/public/index.css
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import {existsSync, lstatSync, readlinkSync} from 'fs';
|
|
3
|
-
import {relative} from 'path';
|
|
4
|
-
import {PluginOption} from 'vite';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Include actual paths and symlinked target paths if they exist.
|
|
8
|
-
*
|
|
9
|
-
* This is needed because when removing files from the watcher, sym links have be removed with the
|
|
10
|
-
* path to the symlink itself AND the path to the symlink target or the path will still be watched.
|
|
11
|
-
*/
|
|
12
|
-
function mapToActualPaths(paths: Readonly<string[]>): Readonly<string[]> {
|
|
13
|
-
return paths.reduce((accum, path) => {
|
|
14
|
-
if (existsSync(path)) {
|
|
15
|
-
if (lstatSync(path).isSymbolicLink()) {
|
|
16
|
-
console.info('reading symlink from', path);
|
|
17
|
-
// sym links AND the original path both need to be included
|
|
18
|
-
return accum.concat(readlinkSync(path), path);
|
|
19
|
-
} else {
|
|
20
|
-
return accum.concat(path);
|
|
21
|
-
}
|
|
22
|
-
} else {
|
|
23
|
-
return accum;
|
|
24
|
-
}
|
|
25
|
-
}, [] as string[]);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* There are similar plugins out there that try to do this but they aren't aggressive enough. This
|
|
30
|
-
* plugin literally always reloads on save, no questions asked.
|
|
31
|
-
*/
|
|
32
|
-
export function alwaysReloadPlugin(
|
|
33
|
-
config: Partial<{
|
|
34
|
-
exclusions: string[];
|
|
35
|
-
/** Inclusions apply after exclusions so they will override exclusions. */
|
|
36
|
-
inclusions: string[];
|
|
37
|
-
root: string;
|
|
38
|
-
}> = {},
|
|
39
|
-
): PluginOption {
|
|
40
|
-
return {
|
|
41
|
-
name: 'alwaysReloadPlugin',
|
|
42
|
-
apply: 'serve',
|
|
43
|
-
config: () => ({server: {watch: {disableGlobbing: false}}}),
|
|
44
|
-
configureServer({watcher, ws, config: {logger}}) {
|
|
45
|
-
const {root = process.cwd(), inclusions = [], exclusions = []} = config;
|
|
46
|
-
let callingAlready = false;
|
|
47
|
-
let loggedAlready = false;
|
|
48
|
-
|
|
49
|
-
const reloadCallback = (path: string) => {
|
|
50
|
-
if (!loggedAlready) {
|
|
51
|
-
loggedAlready = true;
|
|
52
|
-
// log watched stuff so that we can make sure it's not watching too much
|
|
53
|
-
// console.info({watched: watcher.getWatched()});
|
|
54
|
-
}
|
|
55
|
-
// prevent duplicate calls cause the watcher is very eager to call callbacks multiple times in a row
|
|
56
|
-
if (!callingAlready) {
|
|
57
|
-
callingAlready = true;
|
|
58
|
-
ws.send({
|
|
59
|
-
type: 'full-reload',
|
|
60
|
-
path: '*',
|
|
61
|
-
});
|
|
62
|
-
logger.info(
|
|
63
|
-
`${chalk.green('page reload')} ${chalk.dim(relative(root, path))}`,
|
|
64
|
-
{clear: true, timestamp: true},
|
|
65
|
-
);
|
|
66
|
-
/**
|
|
67
|
-
* Debounce reloads calls so that they don't get spammed. If you're saving
|
|
68
|
-
* faster than this, then what the heck are you doing anyway?
|
|
69
|
-
*/
|
|
70
|
-
setTimeout(() => {
|
|
71
|
-
callingAlready = false;
|
|
72
|
-
}, 100);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
if (exclusions.length) {
|
|
77
|
-
watcher.unwatch(mapToActualPaths(exclusions));
|
|
78
|
-
// ignore macOS file system metadata stuff
|
|
79
|
-
watcher.unwatch('./**/.DS_Store');
|
|
80
|
-
}
|
|
81
|
-
if (inclusions.length) {
|
|
82
|
-
watcher.add(inclusions);
|
|
83
|
-
}
|
|
84
|
-
if (!watcher.listeners('change').includes(reloadCallback)) {
|
|
85
|
-
watcher.on('change', reloadCallback);
|
|
86
|
-
watcher.on('add', reloadCallback);
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
}
|
package/vite/vite.config.ts
DELETED