From f449ed9547eec37a50c1d9b25dc6a22e8e3a118c Mon Sep 17 00:00:00 2001 From: silverwind Date: Sun, 26 Jan 2025 14:31:44 +0100 Subject: [PATCH 1/3] Improve types --- src/text-expander-element.ts | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/text-expander-element.ts b/src/text-expander-element.ts index 6f0ca66..1b9589c 100644 --- a/src/text-expander-element.ts +++ b/src/text-expander-element.ts @@ -2,22 +2,30 @@ import Combobox from '@github/combobox-nav' import query from './query' import {InputRange} from 'dom-input-range' -type Match = { +export type TextExpanderMatch = { text: string key: string position: number } -type Result = { +export type TextExpanderResult = { fragment: HTMLElement matched: boolean } -type Key = { +export type TextExpanderKey = { key: string multiWord: boolean } +export type TextExpanderChangeEvent = Event & { + detail?: { + key: string + text: string + provide: (result: TextExpanderResult | Promise) => void + } +} + const states = new WeakMap() class TextExpander { @@ -31,7 +39,7 @@ class TextExpander { onblur: (event: Event) => void onmousedown: (event: Event) => void combobox: Combobox | null - match: Match | null + match: TextExpanderMatch | null justPasted: boolean lookBackIndex: number interactingWithList: boolean @@ -70,7 +78,7 @@ class TextExpander { } } - private activate(match: Match, menu: HTMLElement) { + private activate(match: TextExpanderMatch, menu: HTMLElement) { if (this.input !== document.activeElement && this.input !== document.activeElement?.shadowRoot?.activeElement) { return } @@ -218,7 +226,7 @@ class TextExpander { } } - findMatch(): Match | void { + findMatch(): TextExpanderMatch | void { const cursor = this.input.selectionEnd || 0 const text = this.input.value if (cursor <= this.lookBackIndex) { @@ -236,12 +244,14 @@ class TextExpander { } } - async notifyProviders(match: Match): Promise { - const providers: Array | Result> = [] - const provide = (result: Promise | Result) => providers.push(result) - const canceled = !this.expander.dispatchEvent( - new CustomEvent('text-expander-change', {cancelable: true, detail: {provide, text: match.text, key: match.key}}) - ) + async notifyProviders(match: TextExpanderMatch): Promise { + const providers: Array | TextExpanderResult> = [] + const provide = (result: Promise | TextExpanderResult) => providers.push(result) + const changeEvent = new CustomEvent('text-expander-change', { + cancelable: true, + detail: {provide, text: match.text, key: match.key} + }) as TextExpanderChangeEvent + const canceled = !this.expander.dispatchEvent(changeEvent) if (canceled) return const all = await Promise.all(providers) @@ -265,7 +275,7 @@ class TextExpander { } } export default class TextExpanderElement extends HTMLElement { - get keys(): Key[] { + get keys(): TextExpanderKey[] { const keysAttr = this.getAttribute('keys') const keys = keysAttr ? keysAttr.split(' ') : [] From c901e6892cc27f0ddee7dffb5ab42bce9d281ead Mon Sep 17 00:00:00 2001 From: silverwind Date: Sun, 26 Jan 2025 14:36:08 +0100 Subject: [PATCH 2/3] swap order to match --- src/text-expander-element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text-expander-element.ts b/src/text-expander-element.ts index 1b9589c..3194ee4 100644 --- a/src/text-expander-element.ts +++ b/src/text-expander-element.ts @@ -22,7 +22,7 @@ export type TextExpanderChangeEvent = Event & { detail?: { key: string text: string - provide: (result: TextExpanderResult | Promise) => void + provide: (result: Promise | TextExpanderResult) => void } } From 36c9443c8886427eb23bc0835c565024b21420b9 Mon Sep 17 00:00:00 2001 From: silverwind Date: Sun, 26 Jan 2025 14:39:17 +0100 Subject: [PATCH 3/3] make fragment optional --- src/text-expander-element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/text-expander-element.ts b/src/text-expander-element.ts index 3194ee4..dcb0126 100644 --- a/src/text-expander-element.ts +++ b/src/text-expander-element.ts @@ -9,7 +9,7 @@ export type TextExpanderMatch = { } export type TextExpanderResult = { - fragment: HTMLElement + fragment?: HTMLElement matched: boolean }