@basmilius/homey-common 0.0.7 → 0.0.9

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/app.d.ts CHANGED
@@ -5,7 +5,7 @@ import type { Language } from "./types";
5
5
  export declare class App<TApp extends App<any>> extends Homey.App {
6
6
  #private;
7
7
  get registry(): Registry<TApp>;
8
- constructor();
8
+ constructor(...args: any[]);
9
9
  }
10
10
  export declare class Shortcuts<TApp extends App<TApp>> {
11
11
  #private;
package/dist/index.js CHANGED
@@ -26,6 +26,11 @@ class Registry {
26
26
  action(action) {
27
27
  this.#actions.push(new action(this.#app));
28
28
  }
29
+ actionFunction(id, onRun) {
30
+ const action = this.#app.homey.flow.getActionCard(id);
31
+ action.registerRunListener(onRun);
32
+ this.#app.homey.log(`Flow card actionFunction#${id} has been registered.`);
33
+ }
29
34
  autocompleteProvider(autocompleteProvider) {
30
35
  this.#autocompleteProviders.push(new autocompleteProvider(this.#app));
31
36
  }
@@ -55,8 +60,8 @@ class App extends Homey.App {
55
60
  return this.#registry;
56
61
  }
57
62
  #registry;
58
- constructor() {
59
- super();
63
+ constructor(...args) {
64
+ super(...args);
60
65
  this.#registry = new Registry(this);
61
66
  }
62
67
  }
@@ -183,13 +188,13 @@ class FlowEntity extends Shortcuts {
183
188
  }
184
189
  #getCard() {
185
190
  if (this instanceof FlowActionEntity) {
186
- return this.homey.flow.getActionCard(this.actionId);
191
+ return this.flow.getActionCard(this.actionId);
187
192
  }
188
193
  if (this instanceof FlowConditionEntity) {
189
- return this.homey.flow.getConditionCard(this.conditionId);
194
+ return this.flow.getConditionCard(this.conditionId);
190
195
  }
191
196
  if (this instanceof FlowTriggerEntity) {
192
- return this.homey.flow.getTriggerCard(this.triggerId);
197
+ return this.flow.getTriggerCard(this.triggerId);
193
198
  }
194
199
  throw new Error(`Flow card type ${this.constructor.name} not found.`);
195
200
  }
@@ -313,5 +318,5 @@ export {
313
318
  App
314
319
  };
315
320
 
316
- //# debugId=F678478C65BCBA4D64756E2164756E21
321
+ //# debugId=6178FFA514A4A87A64756E2164756E21
317
322
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -2,13 +2,13 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/app.ts", "../src/registry.ts", "../src/decorator.ts", "../src/flow.ts", "../src/data/index.ts"],
4
4
  "sourcesContent": [
5
- "import Homey from 'homey';\nimport type HomeyNS from 'homey/lib/Homey';\nimport { Registry } from './registry';\nimport type { Language } from './types';\n\nexport class App<TApp extends App<any>> extends Homey.App {\n get registry(): Registry<TApp> {\n return this.#registry;\n }\n\n readonly #registry: Registry<TApp>;\n\n constructor() {\n super();\n\n this.#registry = new Registry<TApp>(this as unknown as TApp);\n }\n}\n\nexport class Shortcuts<TApp extends App<TApp>> {\n get app(): TApp {\n return this.#app;\n }\n\n get homey(): HomeyNS {\n return this.app.homey;\n }\n\n get registry(): Registry<TApp> {\n return this.app.registry;\n }\n\n get dashboards(): HomeyNS['dashboards'] {\n return this.homey.dashboards;\n }\n\n get flow(): HomeyNS['flow'] {\n return this.homey.flow;\n }\n\n get settings(): HomeyNS['settings'] {\n return this.homey.settings;\n }\n\n get language(): Language {\n return this.homey.i18n.getLanguage() as Language;\n }\n\n readonly #app: TApp;\n\n constructor(app: TApp) {\n this.#app = app;\n }\n\n async notify(message: string): Promise<void> {\n await this.homey.notifications.createNotification({\n excerpt: message\n });\n }\n\n log(...args: any[]): void {\n this.homey.log(...args);\n }\n\n realtime(event: string, data: any = undefined): void {\n this.homey.api.realtime(event, data);\n }\n\n translate(key: string, tags?: Record<string, string | number>): string {\n return this.homey.__(key, tags);\n }\n\n clearInterval(interval: NodeJS.Timeout): void {\n this.homey.clearInterval(interval);\n }\n\n setInterval(callback: Function, ms: number): NodeJS.Timeout {\n return this.homey.setInterval(callback, ms);\n }\n\n clearTimeout(interval: NodeJS.Timeout): void {\n this.homey.clearTimeout(interval);\n }\n\n setTimeout(callback: Function, ms: number): NodeJS.Timeout {\n return this.homey.setTimeout(callback, ms);\n }\n}\n",
6
- "import type { App } from './app';\nimport type { FlowActionEntity, FlowAutocompleteProvider, FlowConditionEntity, FlowTriggerEntity } from './flow';\nimport type { Action, AutocompleteProvider, Condition, Trigger } from './types';\n\nexport class Registry<TApp extends App<TApp>> {\n get actions(): FlowActionEntity<TApp>[] {\n return this.#actions;\n }\n\n get autocompleteProviders(): FlowAutocompleteProvider<TApp>[] {\n return this.#autocompleteProviders;\n }\n\n get conditions(): FlowConditionEntity<TApp>[] {\n return this.#conditions;\n }\n\n get triggers(): FlowTriggerEntity<TApp>[] {\n return this.#triggers;\n }\n\n readonly #app: TApp;\n readonly #actions: FlowActionEntity<TApp>[] = [];\n readonly #autocompleteProviders: FlowAutocompleteProvider<TApp>[] = [];\n readonly #conditions: FlowConditionEntity<TApp>[] = [];\n readonly #triggers: FlowTriggerEntity<TApp>[] = [];\n\n constructor(app: TApp) {\n this.#app = app;\n }\n\n action<TEntity extends FlowActionEntity<TApp>>(action: Action<TApp, TEntity>): void {\n this.#actions.push(new action(this.#app));\n }\n\n autocompleteProvider<TEntity extends FlowAutocompleteProvider<TApp>>(autocompleteProvider: AutocompleteProvider<TApp, TEntity>): void {\n this.#autocompleteProviders.push(new autocompleteProvider(this.#app));\n }\n\n condition<TEntity extends FlowConditionEntity<TApp>>(condition: Condition<TApp, TEntity>): void {\n this.#conditions.push(new condition(this.#app));\n }\n\n trigger<TEntity extends FlowTriggerEntity<TApp>>(trigger: Trigger<TApp, TEntity>): void {\n this.#triggers.push(new trigger(this.#app));\n }\n\n findAction<TEntity extends FlowActionEntity<TApp>>(action: Action<TApp, TEntity>): TEntity | undefined {\n return this.#actions.find(a => a instanceof action) as TEntity;\n }\n\n findAutocompleteProvider<TEntity extends FlowAutocompleteProvider<TApp>>(autocompleteProvider: AutocompleteProvider<TApp, TEntity>): TEntity | undefined {\n return this.#autocompleteProviders.find(a => a instanceof autocompleteProvider) as TEntity;\n }\n\n findCondition<TEntity extends FlowConditionEntity<TApp>>(condition: Condition<TApp, TEntity>): TEntity | undefined {\n return this.#conditions.find(a => a instanceof condition) as TEntity;\n }\n\n findTrigger<TEntity extends FlowTriggerEntity<TApp>>(trigger: Trigger<TApp, TEntity>): TEntity | undefined {\n return this.#triggers.find(a => a instanceof trigger) as TEntity;\n }\n}\n",
5
+ "import Homey from 'homey';\nimport type HomeyNS from 'homey/lib/Homey';\nimport { Registry } from './registry';\nimport type { Language } from './types';\n\nexport class App<TApp extends App<any>> extends Homey.App {\n get registry(): Registry<TApp> {\n return this.#registry;\n }\n\n readonly #registry: Registry<TApp>;\n\n constructor(...args: any[]) {\n super(...args);\n\n this.#registry = new Registry<TApp>(this as unknown as TApp);\n }\n}\n\nexport class Shortcuts<TApp extends App<TApp>> {\n get app(): TApp {\n return this.#app;\n }\n\n get homey(): HomeyNS {\n return this.app.homey;\n }\n\n get registry(): Registry<TApp> {\n return this.app.registry;\n }\n\n get dashboards(): HomeyNS['dashboards'] {\n return this.homey.dashboards;\n }\n\n get flow(): HomeyNS['flow'] {\n return this.homey.flow;\n }\n\n get settings(): HomeyNS['settings'] {\n return this.homey.settings;\n }\n\n get language(): Language {\n return this.homey.i18n.getLanguage() as Language;\n }\n\n readonly #app: TApp;\n\n constructor(app: TApp) {\n this.#app = app;\n }\n\n async notify(message: string): Promise<void> {\n await this.homey.notifications.createNotification({\n excerpt: message\n });\n }\n\n log(...args: any[]): void {\n this.homey.log(...args);\n }\n\n realtime(event: string, data: any = undefined): void {\n this.homey.api.realtime(event, data);\n }\n\n translate(key: string, tags?: Record<string, string | number>): string {\n return this.homey.__(key, tags);\n }\n\n clearInterval(interval: NodeJS.Timeout): void {\n this.homey.clearInterval(interval);\n }\n\n setInterval(callback: Function, ms: number): NodeJS.Timeout {\n return this.homey.setInterval(callback, ms);\n }\n\n clearTimeout(interval: NodeJS.Timeout): void {\n this.homey.clearTimeout(interval);\n }\n\n setTimeout(callback: Function, ms: number): NodeJS.Timeout {\n return this.homey.setTimeout(callback, ms);\n }\n}\n",
6
+ "import type { App } from './app';\nimport type { FlowActionEntity, FlowAutocompleteProvider, FlowConditionEntity, FlowTriggerEntity } from './flow';\nimport type { Action, AutocompleteProvider, Condition, Trigger } from './types';\n\nexport class Registry<TApp extends App<TApp>> {\n get actions(): FlowActionEntity<TApp>[] {\n return this.#actions;\n }\n\n get autocompleteProviders(): FlowAutocompleteProvider<TApp>[] {\n return this.#autocompleteProviders;\n }\n\n get conditions(): FlowConditionEntity<TApp>[] {\n return this.#conditions;\n }\n\n get triggers(): FlowTriggerEntity<TApp>[] {\n return this.#triggers;\n }\n\n readonly #app: TApp;\n readonly #actions: FlowActionEntity<TApp>[] = [];\n readonly #autocompleteProviders: FlowAutocompleteProvider<TApp>[] = [];\n readonly #conditions: FlowConditionEntity<TApp>[] = [];\n readonly #triggers: FlowTriggerEntity<TApp>[] = [];\n\n constructor(app: TApp) {\n this.#app = app;\n }\n\n action<TEntity extends FlowActionEntity<TApp>>(action: Action<TApp, TEntity>): void {\n this.#actions.push(new action(this.#app));\n }\n\n actionFunction<TArgs = any, TResult = any>(id: string, onRun: (args: TArgs) => TResult): void {\n const action = this.#app.homey.flow.getActionCard(id);\n action.registerRunListener(onRun);\n\n this.#app.homey.log(`Flow card actionFunction#${id} has been registered.`);\n }\n\n autocompleteProvider<TEntity extends FlowAutocompleteProvider<TApp>>(autocompleteProvider: AutocompleteProvider<TApp, TEntity>): void {\n this.#autocompleteProviders.push(new autocompleteProvider(this.#app));\n }\n\n condition<TEntity extends FlowConditionEntity<TApp>>(condition: Condition<TApp, TEntity>): void {\n this.#conditions.push(new condition(this.#app));\n }\n\n trigger<TEntity extends FlowTriggerEntity<TApp>>(trigger: Trigger<TApp, TEntity>): void {\n this.#triggers.push(new trigger(this.#app));\n }\n\n findAction<TEntity extends FlowActionEntity<TApp>>(action: Action<TApp, TEntity>): TEntity | undefined {\n return this.#actions.find(a => a instanceof action) as TEntity;\n }\n\n findAutocompleteProvider<TEntity extends FlowAutocompleteProvider<TApp>>(autocompleteProvider: AutocompleteProvider<TApp, TEntity>): TEntity | undefined {\n return this.#autocompleteProviders.find(a => a instanceof autocompleteProvider) as TEntity;\n }\n\n findCondition<TEntity extends FlowConditionEntity<TApp>>(condition: Condition<TApp, TEntity>): TEntity | undefined {\n return this.#conditions.find(a => a instanceof condition) as TEntity;\n }\n\n findTrigger<TEntity extends FlowTriggerEntity<TApp>>(trigger: Trigger<TApp, TEntity>): TEntity | undefined {\n return this.#triggers.find(a => a instanceof trigger) as TEntity;\n }\n}\n",
7
7
  "import type { Constructor } from './types';\n\nexport function action(id: string) {\n return <T extends Constructor>(ActionClass: T): T => {\n return class extends ActionClass {\n get actionId(): string {\n return id;\n }\n };\n };\n}\n\nexport function autocomplete(id: string) {\n return <T extends Constructor>(AutocompleteClass: T): T => {\n return class extends AutocompleteClass {\n get autocompleteId(): string {\n return id;\n }\n };\n };\n}\n\nexport function condition(id: string) {\n return <T extends Constructor>(ConditionClass: T): T => {\n return class extends ConditionClass {\n get conditionId(): string {\n return id;\n }\n };\n };\n}\n\nexport function trigger(id: string) {\n return <T extends Constructor>(TriggerClass: T): T => {\n return class extends TriggerClass {\n get triggerId(): string {\n return id;\n }\n };\n };\n}\n",
8
- "import type Homey from 'homey';\nimport { type App, Shortcuts } from './app';\nimport type { AutocompleteProvider, FlowCardType } from './types';\n\nexport abstract class FlowEntity<TApp extends App<TApp>, TCard extends Homey.FlowCard, TArgs = unknown, TState = unknown, TResult = unknown> extends Shortcuts<TApp> {\n get card(): TCard {\n return this.#card;\n }\n\n get id(): string {\n return this.#card.id;\n }\n\n get type(): FlowCardType {\n return this.#card.type;\n }\n\n readonly #card: TCard;\n\n constructor(app: TApp) {\n super(app);\n\n this.#card = this.#getCard();\n\n this.onInit()\n .then()\n .catch(console.error.bind(console));\n }\n\n async onInit(): Promise<void> {\n this.#card.registerRunListener(this.onRun.bind(this));\n this.#card.on('update', this.onUpdate.bind(this));\n\n this.log(`onInit() -> Flow card ${this.type}#${this.id} has been registered.`);\n }\n\n abstract onRun(args: TArgs, state: TState): Promise<TResult>;\n\n async onUpdate(): Promise<void> {\n }\n\n registerAutocomplete<TAutocomplete extends FlowAutocompleteProvider<TApp>>(name: string, autocompleteProvider: AutocompleteProvider<TApp, TAutocomplete>): void {\n const provider = this.registry.findAutocompleteProvider(autocompleteProvider);\n\n if (!provider) {\n throw new Error(`Unable to register autocomplete for ${this.type}#${this.id}. The provider was not registered.`);\n }\n\n this.#card.registerArgumentAutocompleteListener(name, provider.find.bind(provider));\n }\n\n #getCard(): TCard {\n if (this instanceof FlowActionEntity) {\n return this.homey.flow.getActionCard((this as any).actionId) as unknown as TCard;\n }\n\n if (this instanceof FlowConditionEntity) {\n return this.homey.flow.getConditionCard((this as any).conditionId) as unknown as TCard;\n }\n\n if (this instanceof FlowTriggerEntity) {\n return this.homey.flow.getTriggerCard((this as any).triggerId) as unknown as TCard;\n }\n\n throw new Error(`Flow card type ${this.constructor.name} not found.`);\n }\n}\n\nexport abstract class FlowActionEntity<TApp extends App<TApp>, TArgs = unknown, TState = unknown, TResult = unknown> extends FlowEntity<TApp, Homey.FlowCardAction, TArgs, TState, TResult> {\n}\n\nexport abstract class FlowConditionEntity<TApp extends App<TApp>, TArgs = unknown, TState = unknown> extends FlowEntity<TApp, Homey.FlowCardCondition, TArgs, TState, boolean> {\n}\n\nexport abstract class FlowTriggerEntity<TApp extends App<TApp>, TArgs = unknown, TState = unknown> extends FlowEntity<TApp, Homey.FlowCardTrigger, TArgs, TState, boolean> {\n async trigger(state: TState, tokens?: Record<string, unknown>): Promise<any> {\n return this.card.trigger(tokens, state as object);\n }\n}\n\nexport abstract class FlowAutocompleteProvider<TApp extends App<TApp>> extends Shortcuts<TApp> {\n abstract find(query: string, args: Record<string, unknown>): Promise<Homey.FlowCard.ArgumentAutocompleteResults>;\n\n async update(): Promise<void> {\n }\n\n async onInit(): Promise<void> {\n this.homey.log(`onInit() -> Autocomplete provider ${(this as any).autocompleteId} has been registered.`);\n await this.update();\n }\n}\n",
8
+ "import type Homey from 'homey';\nimport { type App, Shortcuts } from './app';\nimport type { AutocompleteProvider, FlowCardType } from './types';\n\nexport abstract class FlowEntity<TApp extends App<TApp>, TCard extends Homey.FlowCard, TArgs = unknown, TState = unknown, TResult = unknown> extends Shortcuts<TApp> {\n get card(): TCard {\n return this.#card;\n }\n\n get id(): string {\n return this.#card.id;\n }\n\n get type(): FlowCardType {\n return this.#card.type;\n }\n\n readonly #card: TCard;\n\n constructor(app: TApp) {\n super(app);\n\n this.#card = this.#getCard();\n\n this.onInit()\n .then()\n .catch(console.error.bind(console));\n }\n\n async onInit(): Promise<void> {\n this.#card.registerRunListener(this.onRun.bind(this));\n this.#card.on('update', this.onUpdate.bind(this));\n\n this.log(`onInit() -> Flow card ${this.type}#${this.id} has been registered.`);\n }\n\n abstract onRun(args: TArgs, state: TState): Promise<TResult>;\n\n async onUpdate(): Promise<void> {\n }\n\n registerAutocomplete<TAutocomplete extends FlowAutocompleteProvider<TApp>>(name: string, autocompleteProvider: AutocompleteProvider<TApp, TAutocomplete>): void {\n const provider = this.registry.findAutocompleteProvider(autocompleteProvider);\n\n if (!provider) {\n throw new Error(`Unable to register autocomplete for ${this.type}#${this.id}. The provider was not registered.`);\n }\n\n this.#card.registerArgumentAutocompleteListener(name, provider.find.bind(provider));\n }\n\n #getCard(): TCard {\n if (this instanceof FlowActionEntity) {\n return this.flow.getActionCard((this as any).actionId) as unknown as TCard;\n }\n\n if (this instanceof FlowConditionEntity) {\n return this.flow.getConditionCard((this as any).conditionId) as unknown as TCard;\n }\n\n if (this instanceof FlowTriggerEntity) {\n return this.flow.getTriggerCard((this as any).triggerId) as unknown as TCard;\n }\n\n throw new Error(`Flow card type ${this.constructor.name} not found.`);\n }\n}\n\nexport abstract class FlowActionEntity<TApp extends App<TApp>, TArgs = unknown, TState = unknown, TResult = unknown> extends FlowEntity<TApp, Homey.FlowCardAction, TArgs, TState, TResult> {\n}\n\nexport abstract class FlowConditionEntity<TApp extends App<TApp>, TArgs = unknown, TState = unknown> extends FlowEntity<TApp, Homey.FlowCardCondition, TArgs, TState, boolean> {\n}\n\nexport abstract class FlowTriggerEntity<TApp extends App<TApp>, TArgs = unknown, TState = unknown> extends FlowEntity<TApp, Homey.FlowCardTrigger, TArgs, TState, boolean> {\n async trigger(state: TState, tokens?: Record<string, unknown>): Promise<any> {\n return this.card.trigger(tokens, state as object);\n }\n}\n\nexport abstract class FlowAutocompleteProvider<TApp extends App<TApp>> extends Shortcuts<TApp> {\n abstract find(query: string, args: Record<string, unknown>): Promise<Homey.FlowCard.ArgumentAutocompleteResults>;\n\n async update(): Promise<void> {\n }\n\n async onInit(): Promise<void> {\n this.homey.log(`onInit() -> Autocomplete provider ${(this as any).autocompleteId} has been registered.`);\n await this.update();\n }\n}\n",
9
9
  "import _colors from './colors.json';\nimport _icons from './icons.json';\n\nexport const colors = _colors;\n\nexport const icons = _icons.map(icon => ({\n id: icon[0],\n name: icon[1],\n unicode: icon[2]\n}));\n"
10
10
  ],
11
- "mappings": "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",
12
- "debugId": "F678478C65BCBA4D64756E2164756E21",
11
+ "mappings": "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",
12
+ "debugId": "6178FFA514A4A87A64756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -9,6 +9,10 @@ export declare class Registry<TApp extends App<TApp>> {
9
9
  get triggers(): FlowTriggerEntity<TApp>[];
10
10
  constructor(app: TApp);
11
11
  action<TEntity extends FlowActionEntity<TApp>>(action: Action<TApp, TEntity>): void;
12
+ actionFunction<
13
+ TArgs = any,
14
+ TResult = any
15
+ >(id: string, onRun: (args: TArgs) => TResult): void;
12
16
  autocompleteProvider<TEntity extends FlowAutocompleteProvider<TApp>>(autocompleteProvider: AutocompleteProvider<TApp, TEntity>): void;
13
17
  condition<TEntity extends FlowConditionEntity<TApp>>(condition: Condition<TApp, TEntity>): void;
14
18
  trigger<TEntity extends FlowTriggerEntity<TApp>>(trigger: Trigger<TApp, TEntity>): void;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@basmilius/homey-common",
3
3
  "description": "Common code shared across my Homey apps.",
4
- "version": "0.0.7",
4
+ "version": "0.0.9",
5
5
  "license": "MIT",
6
6
  "funding": "https://github.com/sponsors/basmilius",
7
7
  "author": {
package/src/app.ts CHANGED
@@ -10,8 +10,8 @@ export class App<TApp extends App<any>> extends Homey.App {
10
10
 
11
11
  readonly #registry: Registry<TApp>;
12
12
 
13
- constructor() {
14
- super();
13
+ constructor(...args: any[]) {
14
+ super(...args);
15
15
 
16
16
  this.#registry = new Registry<TApp>(this as unknown as TApp);
17
17
  }
package/src/flow.ts CHANGED
@@ -51,15 +51,15 @@ export abstract class FlowEntity<TApp extends App<TApp>, TCard extends Homey.Flo
51
51
 
52
52
  #getCard(): TCard {
53
53
  if (this instanceof FlowActionEntity) {
54
- return this.homey.flow.getActionCard((this as any).actionId) as unknown as TCard;
54
+ return this.flow.getActionCard((this as any).actionId) as unknown as TCard;
55
55
  }
56
56
 
57
57
  if (this instanceof FlowConditionEntity) {
58
- return this.homey.flow.getConditionCard((this as any).conditionId) as unknown as TCard;
58
+ return this.flow.getConditionCard((this as any).conditionId) as unknown as TCard;
59
59
  }
60
60
 
61
61
  if (this instanceof FlowTriggerEntity) {
62
- return this.homey.flow.getTriggerCard((this as any).triggerId) as unknown as TCard;
62
+ return this.flow.getTriggerCard((this as any).triggerId) as unknown as TCard;
63
63
  }
64
64
 
65
65
  throw new Error(`Flow card type ${this.constructor.name} not found.`);
package/src/registry.ts CHANGED
@@ -33,6 +33,13 @@ export class Registry<TApp extends App<TApp>> {
33
33
  this.#actions.push(new action(this.#app));
34
34
  }
35
35
 
36
+ actionFunction<TArgs = any, TResult = any>(id: string, onRun: (args: TArgs) => TResult): void {
37
+ const action = this.#app.homey.flow.getActionCard(id);
38
+ action.registerRunListener(onRun);
39
+
40
+ this.#app.homey.log(`Flow card actionFunction#${id} has been registered.`);
41
+ }
42
+
36
43
  autocompleteProvider<TEntity extends FlowAutocompleteProvider<TApp>>(autocompleteProvider: AutocompleteProvider<TApp, TEntity>): void {
37
44
  this.#autocompleteProviders.push(new autocompleteProvider(this.#app));
38
45
  }